dsh-vscode-mode 0.1.28 → 0.1.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/client.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","names":["React","React","React","React","KEY_PREFIX","React","React","React","React","React","React","React","React","createPortal","React","React","React","React","React"],"sources":["../src/shared/rpc.ts","../src/client/rpc.ts","../src/client/sidebarBridge.ts","../src/client/events.ts","../src/client/monaco/loader.ts","../src/client/monaco/diffRender.ts","../src/shared/diff.ts","../src/client/state/records.ts","../src/client/state/regions.ts","../src/client/ui/QuickOpen.ts","../src/client/ui/shared.ts","../src/client/ui/DiffLauncher.ts","../src/client/sidebar/SidebarView.ts","../src/client/diffDockStore.ts","../src/client/diffDock.ts","../src/client/editorLayout.ts","../src/client/fileReveal.ts","../src/client/state/viewStateCache.ts","../src/client/ui/EditorView.ts","../src/client/ui/DiffBadge.ts","../src/client/ui/DiffBox.ts","../src/client/ui/ConversationDiffDock.ts","../src/client/compat.ts","../src/client/fileOpeners.ts","../src/client/settingsContext.ts","../src/client/ui/McpSettings.ts","../src/client/openPathRouter.ts","../src/client/ui/SideEditorTab.ts","../src/client/addToConversation.ts","../src/client/sidebar/registry.ts","../src/client/ui/menuPosition.ts","../src/client/ui/ContextMenu.ts","../src/client/sidebar/contextMenu.ts","../src/client/state/explorerCache.ts","../src/client/sidebar/panels/FileExplorer.ts","../src/client/sidebar/panels/index.ts","../src/client/sidebar/menuItems.ts","../src/client/outline/parse.ts","../src/client/outline/sources.ts","../src/client/outline/OutlinePanel.tsx","../src/client/outline/index.ts","../src/client/index.ts"],"sourcesContent":["/**\n * dsh-vscode-mode RPC contract — method names, per-method request/ok payloads,\n * and the typed handler map shared by the host dispatcher and the client\n * fetch wrapper. 载荷形状与历史实现一字不差,仅把隐式约定类型化。\n *\n * Purity rule: no node/react imports (same as types.ts).\n * 作者 ddj 2026-08-20\n */\nimport type {\n ArchiveBatch,\n ArchiveEntry,\n RecordView,\n StaleHunk,\n} from './types.js'\nimport type { MpcConfig, MpcProject, MpcProjectSaveInput, MpcServer } from './mcp.js'\nimport type { CompatReport, DevFormInfo } from './compat.js'\n\n/** webServer 精确路由。 */\nexport const RPC_PATH = '/edrv/rpc'\n\n/** 决策作用域:call=整条记录,hunk=单个差异块。 */\nexport type RpcScope = 'call' | 'hunk'\n\n/** 目录树单项(edrv.listDir 返回;path 相对工作区根,'/' 分隔)。 */\nexport interface TreeEntry {\n name: string\n path: string\n type: 'file' | 'directory' | 'other'\n size?: number\n}\n\n/** 一条批量决策项(decideBatch 的 items 元素,与 accept/reject 单条参数同构)。 */\nexport interface DecideItem {\n callId: string\n scope?: RpcScope\n hunkIndex?: number\n decision: 'accepted' | 'rejected'\n}\n\n/** 批量决策逐项结果。 */\nexport interface DecideResult {\n callId: string\n ok: boolean\n error?: string\n record?: RecordView\n}\n\n/** 每个方法的请求参数(sessionId 为公共可选字段)。 */\nexport interface RpcRequestMap {\n 'edrv.list': { sessionId?: string; callIds?: string[]; skipStale?: boolean }\n 'edrv.accept': { sessionId?: string; callId: string; scope?: RpcScope; hunkIndex?: number }\n 'edrv.reject': { sessionId?: string; callId: string; scope?: RpcScope; hunkIndex?: number }\n 'edrv.decideBatch': { sessionId?: string; items: DecideItem[] }\n 'edrv.read': { sessionId?: string; path: string }\n 'edrv.original': { sessionId?: string; path: string }\n 'edrv.save': { sessionId?: string; path: string; content: string }\n 'edrv.archiveList': { sessionId?: string }\n 'edrv.archiveRead': { sessionId?: string; path?: string }\n 'edrv.rollback': { sessionId?: string; path: string; batch?: number }\n 'edrv.debug': { sessionId?: string; text: string }\n 'edrv.searchFiles': { sessionId?: string; query: string }\n 'edrv.listDir': { sessionId?: string; path: string }\n 'edrv.revealInExplorer': { sessionId?: string; path: string }\n 'mcp.list': {}\n 'mcp.save': { config: MpcConfig }\n 'mcp.remove': { id: string }\n 'mcp.toggle': { id: string; enabled: boolean }\n 'mcp.refresh': { id: string }\n 'mcp.projects': {}\n 'mcp.projectSave': MpcProjectSaveInput\n 'mcp.projectRemove': { workspacePath: string; serverName: string }\n 'mcp.projectToggle': { workspacePath: string; serverName: string; enabled: boolean }\n 'mcp.projectRefresh': { workspacePath: string; serverName: string }\n 'vscode.fileOpenSettingsGet': {}\n 'vscode.fileOpenSettingsUpdate': { fileOpenTool: string; expectedRevision?: number }\n 'vscode.devFormGet': {}\n 'vscode.devFormSet': { enabled: boolean; path?: string }\n 'compat': {}\n}\n\nexport type RpcMethod = keyof RpcRequestMap\n\n/** 每个方法成功(ok:true)时的附加载荷。 */\nexport interface RpcOkMap {\n 'edrv.list': { records: RecordView[] }\n 'edrv.accept': { record: RecordView }\n 'edrv.reject': { record: RecordView }\n 'edrv.decideBatch': { results: DecideResult[] }\n 'edrv.read': { content: string; size: number }\n 'edrv.original': { content: string; size: number; stale: StaleHunk[]; fallback: boolean }\n 'edrv.save': object\n 'edrv.archiveList': { entries: ArchiveEntry[] }\n 'edrv.archiveRead': { batches: ArchiveBatch[] }\n 'edrv.rollback': { path: string; batch: number | null }\n 'edrv.debug': object\n 'edrv.searchFiles': { files: string[]; truncated: boolean }\n 'edrv.listDir': { root: string; path: string; entries: TreeEntry[] }\n 'edrv.revealInExplorer': { revealed: string }\n 'mcp.list': { servers: MpcServer[] }\n 'mcp.save': { server: MpcServer }\n 'mcp.remove': object\n 'mcp.toggle': { server: MpcServer }\n 'mcp.refresh': { server: MpcServer }\n 'mcp.projects': { projects: MpcProject[] }\n 'mcp.projectSave': { project: MpcProject }\n 'mcp.projectRemove': { project: MpcProject }\n 'mcp.projectToggle': { project: MpcProject }\n 'mcp.projectRefresh': { project: MpcProject }\n 'vscode.fileOpenSettingsGet': { fileOpenTool: string; revision?: number }\n 'vscode.fileOpenSettingsUpdate': { fileOpenTool: string; revision?: number }\n 'vscode.devFormGet': { devForm: DevFormInfo }\n 'vscode.devFormSet': { devForm: DevFormInfo; restart: boolean }\n 'compat': { report: CompatReport }\n}\n\n/** 统一响应:{ok:true, ...payload} 或 {ok:false, error}。 */\nexport type RpcResult<M extends RpcMethod> =\n | ({ ok: true } & RpcOkMap[M])\n | { ok: false; error: string }\n\n/** 每个方法的 handler 签名(host 分发表与 client 类型检查共用)。 */\nexport type RpcHandler<M extends RpcMethod> = (\n args: RpcRequestMap[M],\n) => Promise<RpcResult<M>>\n\n/** host RPC 分发表:method → handler。 */\nexport type RpcHandlerMap = {\n [M in RpcMethod]: RpcHandler<M>\n}\n","/**\n * dsh-vscode-mode client — 类型化 RPC 包装 + 诊断日志。\n * 迁移自原 src/client/index.ts 的 rpc/dbg,语义不改。\n * 作者 ddj 2026-08-20\n */\nimport { RPC_PATH } from '../shared/rpc.js'\nimport type { RpcMethod, RpcRequestMap, RpcResult } from '../shared/rpc.js'\n\n/** 同源 RPC 调用(host /edrv/rpc 精确路由)。 */\nexport function rpc<M extends RpcMethod>(method: M, args: RpcRequestMap[M]): Promise<RpcResult<M>> {\n return fetch(RPC_PATH, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ method, args }),\n }).then((res) => res.json()) as Promise<RpcResult<M>>\n}\n\n/**\n * 诊断日志:统一走 host edrv.debug 落盘,避免 console 刷屏。\n * @author ddj 2026年08月20号\n * @param sessionId 会话 id\n * @param text 日志文本\n */\nexport function dbg(sessionId: string | undefined, text: string): void {\n try {\n rpc('edrv.debug', { sessionId, text }).catch(() => {})\n } catch (e) { /* 日志失败忽略 */ }\n}\n","/**\n * dsh-vscode-mode client — 侧边栏编辑区桥:可选探测 dsh-better-sidebar 的\n * ctx.betterSidebar 服务,并注册「文件编辑」Tab(单实例)。\n * 可选依赖模式:服务缺失时调用方回退到中央页签形态;本模块不注册任何东西。\n * 纯逻辑(探测/初始打开解析/角标计数)可单测,DOM/事件仅存在于 install 路径。\n * 作者 ddj 2026年08月25号\n */\n\nimport React from 'react'\n\n/** betterSidebar 服务名(ctx.get 用;不要加进 inject——缺失会让插件停靠等待)。 */\nexport const BETTER_SIDEBAR_SERVICE = 'betterSidebar'\n/** 本插件在侧边栏注册的 Tab 类型 id(亦是 SidebarTab.type)。 */\nexport const SIDE_TAB_ID = 'edrv-editor'\n/** 侧边栏 Tab 标题。 */\nexport const SIDE_TAB_TITLE = '文件编辑'\n/** 推荐安装命令(提示条/兼容性报告共用)。 */\nexport const SIDEBAR_INSTALL_CMD = 'dsh plugin --profile web add dsh-better-sidebar'\n\n/** Tab 元数据(openTab 种子随 Tab 持久化,创建路径用它恢复初始打开)。 */\nexport interface SideEditorMeta {\n /** 待打开的工作区相对/绝对路径。 */\n openPath?: string\n /** 打开后聚焦首个差异。 */\n focusDiff?: boolean\n}\n\n/**\n * betterSidebar 服务的最小结构面(结构性探测,不 import 第三方类型)。\n */\nexport interface SidebarServiceLike {\n registerTab: (descriptor: unknown) => () => void\n openTab: (seed: { type: string; title?: string; path?: string; meta?: unknown }, scope?: { sessionId: string; cwd?: string }) => void\n isTabEnabled?: (id: string) => boolean\n features?: readonly string[]\n}\n\n/**\n * 解析 Tab 挂载时的初始打开请求(创建路径读 tab.path/meta,聚焦路径走窗口事件)。\n * @author ddj 2026年08月25号\n * @param tab 侧边栏 Tab(path/meta 为可选字段)\n * @returns 待打开路径与是否聚焦差异\n */\nexport function resolveInitialOpen(tab: { path?: string; meta?: unknown } | null | undefined): { path: string | null; focusDiff: boolean } {\n const meta = (tab?.meta ?? {}) as SideEditorMeta\n const path = typeof tab?.path === 'string' && tab.path ? tab.path : (typeof meta?.openPath === 'string' ? meta.openPath : null)\n return { path: path || null, focusDiff: meta?.focusDiff === true }\n}\n\n/** 会话级待处理差异文件数缓存(Tab 角标同步读取;EditorView 侧栏形态写入)。 */\nconst sidePending = new Map<string, number>()\n\n/**\n * 写入会话的待处理差异文件数(0 视为清除,不显示角标)。\n * @author ddj 2026年08月25号\n * @param sessionId 会话 id\n * @param count 待处理差异文件数\n */\nexport function setSidePending(sessionId: string, count: number): void {\n if (!sessionId) return\n const value = Number.isFinite(count) ? Math.max(0, Math.floor(count)) : 0\n if (value > 0) sidePending.set(sessionId, value)\n else sidePending.delete(sessionId)\n}\n\n/**\n * 读取会话的待处理差异文件数(角标用)。\n * @author ddj 2026年08月25号\n * @param sessionId 会话 id\n * @returns 非负计数\n */\nexport function getSidePending(sessionId?: string): number {\n if (!sessionId) return 0\n return sidePending.get(sessionId) ?? 0\n}\n\n/** 模块级侧栏打开路由(events.ts 优先走它;未注册 = 旧页签形态)。 */\nlet ensureSideEditor: ((path: string | null, focusDiff: boolean) => boolean) | null = null\n\n/** 待消费的初始打开(Tab 组件尚未挂载时暂存;按会话匹配,挂载时取走)。 */\nlet pendingOpen: { sessionId: string; path: string | null; focusDiff: boolean } | null = null\n/** Tab 组件当前是否有挂载实例(有则直接投递窗口事件,无则暂存待消费)。 */\nlet sideEditorMounted = false\n\n/**\n * 注册/撤销侧栏打开路由。\n * @author ddj 2026年08月25号\n * @param fn 路由函数或 null\n */\nexport function setEnsureSideEditor(fn: ((path: string | null, focusDiff: boolean) => boolean) | null): void {\n ensureSideEditor = fn\n}\n\n/**\n * 标记侧栏编辑器组件挂载状态(SideEditorTab 挂载/卸载时调用)。\n * @author ddj 2026年08月25号\n * @param mounted 是否已挂载\n */\nexport function setSideEditorMounted(mounted: boolean): void {\n sideEditorMounted = mounted\n}\n\n/**\n * 暂存指定会话的待消费初始打开(Tab 组件未挂载时由 install 路径调用)。\n * @author ddj 2026年08月25号\n * @param sessionId 会话 id\n * @param path 待打开路径(可空)\n * @param focusDiff 是否聚焦首个差异\n */\nexport function stagePendingSideOpen(sessionId: string, path: string | null, focusDiff: boolean): void {\n if (!sessionId) return\n pendingOpen = { sessionId, path: path || null, focusDiff: focusDiff === true }\n}\n\n/**\n * 取走指定会话的待消费初始打开(SideEditorTab 挂载时读取;不存在返回 null)。\n * @author ddj 2026年08月25号\n * @param sessionId 会话 id\n * @returns 待打开请求或 null\n */\nexport function takePendingSideOpen(sessionId?: string): { path: string | null; focusDiff: boolean } | null {\n if (!pendingOpen || !sessionId || pendingOpen.sessionId !== sessionId) return null\n const value = { path: pendingOpen.path, focusDiff: pendingOpen.focusDiff }\n pendingOpen = null\n return value\n}\n\n/**\n * 打开/聚焦侧栏编辑器(打开路径可选;返回是否已被侧栏形态接管)。\n * @author ddj 2026年08月25号\n * @param path 待打开路径(可空)\n * @param focusDiff 是否聚焦首个差异\n * @returns 是否路由成功\n */\nexport function routeSideEditor(path: string | null, focusDiff: boolean): boolean {\n if (typeof ensureSideEditor !== 'function') return false\n try {\n return ensureSideEditor(path, focusDiff) === true\n } catch (error) {\n console.warn('[dsh-vscode-mode] 侧栏编辑器打开失败(' + String(error) + '),已回退')\n return false\n }\n}\n\n/**\n * 结构化探测 betterSidebar 服务(可选依赖:缺失/降级返回 undefined)。\n * @author ddj 2026年08月25号\n * @param ctx 客户端服务上下文\n * @returns 服务结构面或 undefined\n */\nexport function detectSidebarService(ctx: { get: (name: string) => unknown }): SidebarServiceLike | undefined {\n try {\n const service = ctx.get(BETTER_SIDEBAR_SERVICE) as SidebarServiceLike | undefined\n if (!service || typeof service.registerTab !== 'function' || typeof service.openTab !== 'function') return undefined\n return service\n } catch {\n return undefined\n }\n}\n\n/**\n * 注册侧边栏「文件编辑」Tab 并接管打开路由。\n * Tab 被用户在 better-sidebar 设置里禁用时,打开路由降级为回退回调(中央页签)。\n * @author ddj 2026年08月25号\n * @param options 装配参数(组件依赖 + 活动会话解析 + 回退注册)\n * @returns 卸载器(反注册 Tab + 撤销路由)\n */\nexport function installSideEditor(options: {\n service: SidebarServiceLike\n renderTab: (props: Record<string, unknown>) => unknown\n activeSession: () => { sessionId?: string; cwd?: string } | undefined\n registerLegacyFallback: () => void\n}): () => void {\n const { service, renderTab, activeSession, registerLegacyFallback } = options\n let fallbackInstalled = false\n const open = (path: string | null, focusDiff: boolean): boolean => {\n if (typeof service.isTabEnabled === 'function' && !service.isTabEnabled(SIDE_TAB_ID)) {\n if (!fallbackInstalled) {\n fallbackInstalled = true\n try { registerLegacyFallback() } catch (error) { console.warn('[dsh-vscode-mode] 回退注册失败(' + String(error) + ')') }\n }\n return false\n }\n const scope = activeSession()\n const sessionId = scope?.sessionId\n if (!sessionId) return false\n try {\n service.openTab({\n type: SIDE_TAB_ID,\n title: SIDE_TAB_TITLE,\n ...(path ? { path } : {}),\n meta: { openPath: path || undefined, focusDiff },\n }, { sessionId, cwd: scope?.cwd })\n } catch (error) {\n console.warn('[dsh-vscode-mode] openTab 失败(' + String(error) + ')')\n return false\n }\n if (sideEditorMounted) {\n // 已挂载:窗口事件直达 EditorView 监听器\n window.dispatchEvent(new CustomEvent('edrv:open-editor', { detail: { path, focusDiff } }))\n } else {\n // 未挂载(面板折叠卸载/首次创建):暂存待消费,挂载时由 SideEditorTab 取走\n stagePendingSideOpen(sessionId, path, focusDiff)\n }\n return true\n }\n let tabDisposer: (() => void) | null = null\n try {\n tabDisposer = service.registerTab({\n id: SIDE_TAB_ID,\n title: SIDE_TAB_TITLE,\n icon: codeIcon,\n single: true,\n badge: (_ctx: unknown, scope: { sessionId?: string }) => getSidePending(scope?.sessionId) || null,\n component: renderTab,\n })\n } catch (error) {\n console.warn('[dsh-vscode-mode] 侧边栏 Tab 注册失败(' + String(error) + ')')\n // 注册失败 = 侧栏形态不可用:立即回退中央页签,不接管打开路由\n if (!fallbackInstalled) {\n fallbackInstalled = true\n try { registerLegacyFallback() } catch (inner) { console.warn('[dsh-vscode-mode] 回退注册失败(' + String(inner) + ')') }\n }\n return () => {}\n }\n setEnsureSideEditor(open)\n return () => {\n if (typeof tabDisposer === 'function') tabDisposer()\n setEnsureSideEditor(null)\n }\n}\n\n/**\n * 侧边栏 Tab 图标(内联 SVG 代码括号,不依赖图标包)。\n * @author ddj 2026年08月25号\n * @param size 边长(px)\n * @returns 图标元素\n */\nfunction codeIcon(size: number): unknown {\n return React.createElement('svg', {\n width: size, height: size, viewBox: '0 0 16 16', fill: 'none', 'aria-hidden': true, focusable: false,\n },\n React.createElement('path', {\n d: 'M5.5 4.5 2.5 8l3 3.5M10.5 4.5 13.5 8l-3 3.5',\n stroke: 'currentColor', strokeWidth: 1.4, strokeLinecap: 'round', strokeLinejoin: 'round',\n }))\n}\n","/**\n * dsh-vscode-mode client — 跨组件/跨 slot 的窗口事件助手。\n * 迁移自原 src/client/index.ts 的 openEditorView 与事件派发,语义不改;\n * 侧边栏形态(sidebarBridge 已注册路由)优先,否则回退 DOM 页签点击。\n * 作者 ddj 2026-08-20\n */\nimport { routeSideEditor } from './sidebarBridge.js'\n\n/**\n * 选择中央「文件编辑」页签(DOM 级,无需 store actions)。仅旧页签形态使用。\n * @author ddj 2026年08月26号\n */\nfunction selectEditorTab(): void {\n const tabs = Array.from(document.querySelectorAll('div[role=\"tablist\"] button[role=\"tab\"]'))\n for (const tab of tabs) {\n if (tab.textContent && tab.textContent.includes('文件编辑')) {\n (tab as HTMLButtonElement).click()\n break\n }\n }\n}\n\n/**\n * 打开「文件编辑」:侧边栏形态路由优先,旧形态回退中央页签。\n * @author ddj 2026年08月26号\n * @param path 要打开的路径(可空)\n */\nexport function openEditorView(path: string | null): void {\n if (routeSideEditor(path ?? null, false)) return\n selectEditorTab()\n const target = path ?? null\n setTimeout(() => {\n window.dispatchEvent(new CustomEvent('edrv:open-editor', { detail: { path: target } }))\n }, 80)\n}\n\n/**\n * 打开文件编辑页并聚焦指定文件的首个差异(侧边栏形态自动展开面板)。\n * @author ddj 2026年08月26号\n * @param path 待聚焦的差异文件路径\n */\nexport function openDiffView(path: string): void {\n if (routeSideEditor(path, true)) return\n selectEditorTab()\n setTimeout(() => {\n window.dispatchEvent(new CustomEvent('edrv:open-editor', {\n detail: { path, focusDiff: true },\n }))\n }, 80)\n}\n\n/** 差异状态变化:触发角标/DiffBox 重拉。 */\nexport function emitRefresh(): void {\n window.dispatchEvent(new CustomEvent('edrv:refresh'))\n}\n\n/** 打开指定路径到编辑区页签。 */\nexport function emitOpenEditor(path: string): void {\n window.dispatchEvent(new CustomEvent('edrv:open-editor', { detail: { path } }))\n}\n\n/**\n * 拉起 DiffLauncher。\n * @author ddj 2026年08月26号\n * @param tab 可选的目标页签\n */\nexport function emitShowLauncher(tab?: 'pending' | 'archive'): void {\n window.dispatchEvent(new CustomEvent('edrv:show-launcher', { detail: { tab } }))\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — Monaco 加载与语言映射(AMD 构建,离线随包分发)。\n * 迁移自原 src/client/index.ts 的 MONACO_BASE/LANG_BY_EXT/langOf/loadMonaco,语义不改。\n * 作者 ddj 2026-08-20\n */\n\nexport const MONACO_BASE = '/edrv/vendor/monaco/vs'\nlet monacoPromise = null\nlet monacoStage = { phase: 'idle', progress: 0, message: '准备加载 Monaco…' }\nconst stageListeners = new Set()\n\n/**\n * Monaco 加载阶段:这是阶段进度而非网络字节进度,避免误导用户。\n * @author ddj 2026年08月22号\n */\nexport const MONACO_STAGES = {\n loader: { progress: 18, message: '加载 Monaco 引导模块…' },\n core: { progress: 72, message: '加载编辑器核心模块…' },\n ready: { progress: 100, message: 'Monaco 编辑器已就绪' },\n error: { progress: 0, message: 'Monaco 编辑器加载失败' },\n}\n\n/**\n * 发布 Monaco 加载阶段,监听器异常不得影响编辑器加载。\n * @author ddj 2026年08月22号\n * @param phase 阶段名\n * @param progress 阶段百分比\n * @param message 用户可读状态\n */\nfunction publishStage(phase, progress, message) {\n monacoStage = { phase, progress, message }\n for (const listener of stageListeners) {\n try { listener(monacoStage) } catch (error) { /* UI 回调异常忽略 */ }\n }\n}\n\n/**\n * 订阅 Monaco 加载阶段。\n * @author ddj 2026年08月22号\n * @param listener 阶段回调\n * @returns 取消订阅函数\n */\nfunction subscribeStage(listener) {\n if (typeof listener !== 'function') return () => {}\n stageListeners.add(listener)\n listener(monacoStage)\n return () => stageListeners.delete(listener)\n}\n\n/** 扩展名 → Monaco language id(常见语言;未知回退 plaintext)。 */\nexport const LANG_BY_EXT = {\n js: 'javascript', jsx: 'javascript', mjs: 'javascript', cjs: 'javascript',\n ts: 'typescript', tsx: 'typescript', mts: 'typescript', cts: 'typescript',\n json: 'json', jsonc: 'json', md: 'markdown', markdown: 'markdown', mdx: 'mdx',\n css: 'css', scss: 'scss', less: 'less', html: 'html', htm: 'html', vue: 'html', xml: 'xml',\n yaml: 'yaml', yml: 'yaml', toml: 'ini', ini: 'ini', cfg: 'ini',\n py: 'python', sh: 'shell', bash: 'shell', zsh: 'shell', ps1: 'powershell',\n lua: 'lua', java: 'java', c: 'c', h: 'c', cpp: 'cpp', cc: 'cpp', cxx: 'cpp', hpp: 'cpp',\n cs: 'csharp', go: 'go', rs: 'rust', rb: 'ruby', php: 'php', sql: 'sql',\n swift: 'swift', kt: 'kotlin', kts: 'kotlin', dart: 'dart', dockerfile: 'dockerfile'\n}\n\n/**\n * 路径 → Monaco language id:取 basename 扩展名(dockerfile/Dockerfile 特判)。\n * @author ddj 2026年08月20号\n * @param path 文件路径\n * @returns language id\n */\nexport function langOf(path) {\n const base = String(path || '').split(/[\\\\/]/).pop() || ''\n if (/^dockerfile$/i.test(base)) return 'dockerfile'\n const dot = base.lastIndexOf('.')\n if (dot <= 0) return 'plaintext'\n return LANG_BY_EXT[base.slice(dot + 1).toLowerCase()] ?? 'plaintext'\n}\n\n/**\n * 加载 Monaco Editor(AMD 构建,随插件包离线分发):注入 loader.js → require.config → editor.main。\n * @author ddj 2026年08月20号\n * @returns Promise<object> window.monaco\n */\nexport function loadMonaco(onProgress) {\n const unsubscribe = subscribeStage(onProgress)\n if (!monacoPromise) {\n publishStage('loader', MONACO_STAGES.loader.progress, MONACO_STAGES.loader.message)\n monacoPromise = new Promise((resolve, reject) => {\n const fail = (error) => {\n monacoPromise = null\n publishStage('error', MONACO_STAGES.error.progress, MONACO_STAGES.error.message)\n reject(error)\n }\n const boot = () => {\n try {\n window.require.config({ paths: { vs: MONACO_BASE } })\n publishStage('core', MONACO_STAGES.core.progress, MONACO_STAGES.core.message)\n window.require(['vs/editor/editor.main'], () => {\n publishStage('ready', MONACO_STAGES.ready.progress, MONACO_STAGES.ready.message)\n resolve(window.monaco)\n }, (err) => fail(new Error('Monaco 模块加载失败:' + String(err))))\n } catch (error) {\n fail(error)\n }\n }\n const existing = document.querySelector('script[data-edrv-monaco-loader]')\n if (existing) boot()\n else {\n const s = document.createElement('script')\n s.src = MONACO_BASE + '/loader.js'\n s.dataset.edrvMonacoLoader = '1'\n s.onload = boot\n s.onerror = () => fail(new Error('Monaco loader 加载失败'))\n document.head.appendChild(s)\n }\n })\n }\n return monacoPromise.finally(unsubscribe)\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — 行内差异自绘(新增行绿底 + glyph margin '+';删除块 view zone 红底)。\n * 迁移自原 src/client/index.ts 的 diff-render effect,语义不改。\n * 作者 ddj 2026-08-20\n */\n\n/**\n * 差异渲染器(每 EditorView 挂载一个,内部持有 zone/decoration 状态)。\n * @param log 诊断日志函数((sessionId, text) => void)\n */\nexport function createDiffRenderer(log) {\n let viewZoneIds = []\n let decorations = []\n\n /**\n * 渲染当前 pending 差异:绿底 decoration + 删除块 view zones + '-' 号 overlay(滚动同步)。\n * @param monaco window.monaco\n * @param editor Monaco 编辑器实例\n * @param pendingRegions 待处理差异区域\n * @param sessionId 会话 id\n */\n const render = (monaco, editor, pendingRegions, sessionId) => {\n // 空渲染且无残留(5s 轮询 setRecords 常触发):无需清理时直接跳过,\n // 不打 begin 日志、不做无谓 DOM 操作;有 zone/decoration 残留时仍需走清理。\n if (!pendingRegions.length && viewZoneIds.length === 0 && decorations.length === 0) return\n const renderT0 = Date.now()\n const callIdAttr = (callId, idx) => String(callId) + ':' + String(idx)\n log(sessionId, '[diff-render] begin regs=' + pendingRegions.length + ' ' + pendingRegions.map((r) => callIdAttr(r.callId, r.idx) + '@' + (r.start ?? '?') + '-' + (r.end ?? '?') + '(-' + (r.oldLines ? r.oldLines.length : 0) + '/+' + (r.newLines ? r.newLines.length : 0) + ')').join('|'))\n\n const decos = []\n for (const r of pendingRegions) {\n if (r.start === undefined || r.end === undefined) continue\n if (r.newLines && r.newLines.length) {\n decos.push({\n range: new monaco.Range(r.start, 1, Math.max(r.start, r.end - 1), 1),\n options: { isWholeLine: true, className: 'edrv-mn-add-line', linesDecorationsClassName: 'edrv-mn-gutter-add' },\n })\n }\n }\n decorations = editor.deltaDecorations(decorations, decos)\n\n // 删除块 view zones(红底 + 正文;- 号由独立 overlay 层渲染,定位在 decoration 列与 + 同列,\n // 不受 view zone 容器定位/裁剪影响;滚动用 translateY 同步)\n let createdZones = []\n editor.changeViewZones((accessor) => {\n for (const id of viewZoneIds) { try { accessor.removeZone(id) } catch (e) { /* 已移除 */ } }\n viewZoneIds = []\n const zones = []\n for (const r of pendingRegions) {\n if (r.create) continue\n const oldLines = r.oldLines && r.oldLines.length ? r.oldLines : null\n if (!oldLines) continue\n const after = Math.max(0, (r.start ?? 1) - 1)\n const domNode = document.createElement('div')\n domNode.className = 'edrv-del-zone'\n domNode.dataset.edrvHunk = callIdAttr(r.callId, r.idx)\n for (const t of oldLines) {\n const row = document.createElement('div')\n row.className = 'edrv-del-row'\n const text = document.createElement('span')\n text.className = 'edrv-del-text'\n text.textContent = t\n row.appendChild(text)\n domNode.appendChild(row)\n }\n const id = accessor.addZone({\n afterLineNumber: after,\n heightInLines: oldLines.length,\n domNode,\n suppressMouseDown: false,\n })\n viewZoneIds.push(id)\n zones.push({ domNode, after, n: oldLines.length })\n }\n createdZones = zones\n })\n\n if (createdZones.length) {\n const root = editor.getDomNode()\n if (root) {\n let overlay = root.querySelector('.edrv-minus-overlay')\n if (!overlay) {\n overlay = document.createElement('div')\n overlay.className = 'edrv-minus-overlay'\n root.appendChild(overlay)\n }\n overlay.innerHTML = ''\n const lineH = editor.getOption(monaco.editor.EditorOption.lineHeight) || 20\n let li = null\n try { li = editor.getLayoutInfo() } catch (e) { /* ignore */ }\n const rawLeft = li ? li.decorationsLeft : 0\n const width = li && li.decorationsWidth > 0 ? li.decorationsWidth : 16\n // decorationsLeft 是 Monaco 内部坐标,需限制在宿主根节点内,避免窄窗口/边框\n // 或布局尚未完成时把减号绘制到编辑器左、右边界之外。\n const maxLeft = Math.max(0, root.clientWidth - width)\n // 字符本身有少量字体侧向留白;给标记列留出 4px 内缩,避免减号半个\n // 字符落到 Monaco 根节点左边框外,同时仍限制右侧不越界。\n const markerInset = 12\n const left = Math.max(0, Math.min(maxLeft, rawLeft + markerInset))\n const lineCount = editor.getModel().getLineCount()\n let itemIdx = 0\n let zi = 0\n for (const z of createdZones) {\n // 用 Monaco 坐标 API 计算 view zone 顶部,避免离屏 zone DOM 未布局导致 getBoundingClientRect 为 0\n const anchor = Math.min(z.after + 1, lineCount)\n let zoneBottom = editor.getTopForLineNumber(anchor)\n if (z.after >= lineCount) zoneBottom += lineH\n const zoneTop = zoneBottom - z.n * lineH\n for (let i = 0; i < z.n; i++) {\n const item = document.createElement('div')\n item.className = 'edrv-minus-item'\n // 使用 CSS 线段代替文本字符,避免不同字体的侧向留白把 “-” 绘制到边界外。\n item.textContent = ''\n item.style.width = width + 'px'\n item.style.height = lineH + 'px'\n item.dataset.zone = String(zi)\n item.dataset.row = String(i)\n item.style.top = (zoneTop + i * lineH) + 'px'\n item.style.left = left + 'px'\n overlay.appendChild(item)\n itemIdx++\n }\n zi++\n }\n log(sessionId, '[diff-render] placed zones=' + createdZones.length + ' items=' + itemIdx + ' left=' + left + ' w=' + width + ' t+' + (Date.now() - renderT0) + 'ms')\n // 滚动同步:overlay 随内容滚动(内容坐标 - scrollTop)\n const syncScroll = () => {\n const s2 = editor.getScrollTop() || 0\n if (overlay) overlay.style.transform = 'translateY(' + (-s2) + 'px)'\n }\n syncScroll()\n overlay.__edrvSync = syncScroll\n if (!overlay.__edrvBound) {\n overlay.__edrvBound = true\n editor.onDidScrollChange(syncScroll)\n }\n // 已可见的 zone 用真实 DOM 坐标做一次微调(离屏 zone 仍保留坐标 API 位置)\n setTimeout(() => {\n try {\n const edRect = root.getBoundingClientRect()\n const st = editor.getScrollTop() || 0\n const items = overlay.querySelectorAll('.edrv-minus-item')\n let correctedLeft = left\n try {\n const layout = editor.getLayoutInfo()\n const markerWidth = layout.decorationsWidth > 0 ? layout.decorationsWidth : width\n correctedLeft = Math.max(0, Math.min(Math.max(0, root.clientWidth - markerWidth), (layout.decorationsLeft || 0) + 12))\n } catch (e) { /* 保留首次布局计算结果 */ }\n for (const item of items) {\n item.style.left = correctedLeft + 'px'\n const zIndex = Number(item.dataset.zone)\n const rIndex = Number(item.dataset.row)\n const z = createdZones[zIndex]\n if (!z || !z.domNode.isConnected) continue\n const rowEl = z.domNode.querySelectorAll('.edrv-del-row')[rIndex]\n if (!rowEl) continue\n const rowRect = rowEl.getBoundingClientRect()\n if (rowRect.height > 0) {\n item.style.top = (rowRect.top - edRect.top + st) + 'px'\n }\n }\n } catch (e) { log(sessionId, '[diff-render] correct fail ' + String(e)) }\n }, 50)\n }\n } else {\n const root = editor.getDomNode()\n const overlay = root && root.querySelector('.edrv-minus-overlay')\n if (overlay) overlay.innerHTML = ''\n }\n }\n\n /** 卸载清理(EditorView unmount 时调用)。 */\n const dispose = () => {\n viewZoneIds = []\n decorations = []\n }\n\n return { render, dispose }\n}\n","/**\n * dsh-vscode-mode shared diff primitives — 快照指纹、hunk 规范化与安全定位。\n * 不依赖 Node/React,host 与 browser 共用,避免各层用不同 indexOf 语义。\n * 作者 ddj 2026-08-24\n */\nimport type { Hunk, RecordBase } from './types.js'\n\n/** 文件读取状态,区分真实空文件与无法读取/过大的文件。 */\nexport type ReadState =\n | { kind: 'content'; content: string }\n | { kind: 'missing' }\n | { kind: 'unavailable' }\n\n/** 文本中的一个半开区间 [start,end)。 */\nexport interface TextRange {\n start: number\n end: number\n}\n\n/** 一条 hunk 在当前内容中的定位结果。 */\nexport interface HunkLocation extends TextRange {\n idx: number\n hunk: Hunk\n matched: boolean\n}\n\n/** 统一取对应 hunk;callHunk 只用于旧记录缺失 hunks 时兼容。 */\nexport function preciseHunk(record: Pick<RecordBase, 'hunks' | 'callHunk'>, idx: number): Hunk | null {\n return hunkOf(record, idx)\n}\n\n/** 轻量、确定性的字符串指纹;不引入 Node crypto。 */\nexport function fingerprint(text: string | null | undefined): string | null {\n if (typeof text !== 'string') return null\n let hash = 2166136261\n for (let i = 0; i < text.length; i++) {\n hash ^= text.charCodeAt(i)\n hash = Math.imul(hash, 16777619)\n }\n return 'fnv1a:' + (hash >>> 0).toString(16) + ':' + text.length\n}\n\n/** 取记录第 idx 个有效 hunk;只有记录缺 hunk 时才回退 callHunk。 */\nexport function hunkOf(record: Pick<RecordBase, 'hunks' | 'callHunk'>, idx: number): Hunk | null {\n const hunk = Array.isArray(record.hunks) ? record.hunks[idx] : undefined\n if (hunk && typeof hunk.newText === 'string') return hunk\n if (idx === 0 && record.callHunk && typeof record.callHunk.newText === 'string') return record.callHunk\n return null\n}\n\n/** hunk 是否表示没有实际内容变化。 */\nexport function isNoopHunk(hunk: Hunk | null | undefined): boolean {\n return !!hunk && hunk.oldText !== null && hunk.oldText === hunk.newText\n}\n\n/** splitLines 的空文本语义:真实空文件没有一行变更内容。 */\nexport function splitLines(text: string): string[] {\n return text.length ? text.split('\\n') : []\n}\n\n/** 为执行后 hunk 写入快照坐标;空 newText 通过 before/after 公共边界定位删除点。 */\nexport function annotateHunk(hunk: Hunk, before: string | null, after: string | null): Hunk {\n return annotateHunks([hunk], before, after)[0]\n}\n\n/** 按文件顺序为多 hunk 写入不重复的 after 坐标。 */\nexport function annotateHunks(hunks: Hunk[], before: string | null, after: string | null): Hunk[] {\n if (typeof after !== 'string') return hunks\n let cursor = 0\n return hunks.map((hunk) => {\n if (hunk.newText.length > 0) {\n const start = after.indexOf(hunk.newText, cursor)\n if (start >= 0) {\n cursor = start + hunk.newText.length\n return { ...hunk, afterStart: start, afterEnd: cursor }\n }\n return hunk\n }\n if (hunks.length !== 1 || typeof before !== 'string' || before === after || hunk.oldText === null) return hunk\n const prefix = commonPrefix(before, after)\n const suffix = commonSuffix(before, after, prefix)\n const removedStart = prefix\n const removedEnd = Math.max(removedStart, before.length - suffix)\n return { ...hunk, afterStart: removedStart, afterEnd: removedStart, beforeStart: removedStart, beforeEnd: removedEnd }\n })\n}\n\n/** 计算两个文本的最长公共前缀长度。 */\nfunction commonPrefix(left: string, right: string): number {\n const limit = Math.min(left.length, right.length)\n let i = 0\n while (i < limit && left.charCodeAt(i) === right.charCodeAt(i)) i++\n return i\n}\n\n/** 计算不与 prefix 重叠的最长公共后缀长度。 */\nfunction commonSuffix(left: string, right: string, prefix: number): number {\n const limit = Math.min(left.length, right.length) - prefix\n let i = 0\n while (i < limit && left.charCodeAt(left.length - 1 - i) === right.charCodeAt(right.length - 1 - i)) i++\n return i\n}\n\n/** 计算 index 前的 0 基行数。 */\nexport function lineBefore(text: string, index: number): number {\n let n = 0\n const end = Math.max(0, Math.min(index, text.length))\n for (let i = 0; i < end; i++) if (text.charCodeAt(i) === 10) n++\n return n\n}\n\n/** 找出文本的全部非重叠出现位置。 */\nfunction allMatches(content: string, needle: string): TextRange[] {\n if (!needle.length) return []\n const out: TextRange[] = []\n let from = 0\n while (from <= content.length - needle.length) {\n const at = content.indexOf(needle, from)\n if (at < 0) break\n out.push({ start: at, end: at + needle.length })\n from = at + Math.max(1, needle.length)\n }\n return out\n}\n\n/**\n * 从 after 快照定位所有 hunk,按 hunk 顺序优先选未占用且靠近前一块的候选。\n * 若 hunk 带 afterStart/afterEnd,则优先验证快照坐标,避免重复文本错配。\n * @author ddj 2026年08月24号\n * @param content 当前文件内容\n * @param hunks 待定位 hunk\n * @returns 每个 hunk 一个结果,matched=false 表示冲突/stale\n */\nexport function locateHunks(content: string, hunks: Hunk[]): HunkLocation[] {\n const locations: HunkLocation[] = []\n let cursor = 0\n const occupied: TextRange[] = []\n for (let idx = 0; idx < hunks.length; idx++) {\n const hunk = hunks[idx]\n const newText = hunk.newText\n const snapshot = Number.isInteger(hunk.afterStart) && Number.isInteger(hunk.afterEnd)\n ? { start: hunk.afterStart as number, end: hunk.afterEnd as number }\n : null\n const snapshotMatches = snapshot && snapshot.start >= 0 && snapshot.end >= snapshot.start\n && (newText.length === 0 || content.slice(snapshot.start, snapshot.end) === newText)\n ? snapshot\n : null\n const candidates = snapshotMatches ? [snapshotMatches] : allMatches(content, newText)\n const candidate = candidates.find((range) => range.start >= cursor && !occupied.some((used) => overlaps(range, used)))\n ?? candidates.find((range) => !occupied.some((used) => overlaps(range, used)))\n if (candidate) {\n locations.push({ idx, hunk, ...candidate, matched: true })\n occupied.push(candidate)\n cursor = Math.max(cursor, candidate.end)\n continue\n }\n if (newText.length === 0 && hunk.afterStart === undefined && hunk.afterEnd === undefined && content.length === 0) {\n const point = { start: 0, end: 0 }\n locations.push({ idx, hunk, ...point, matched: true })\n continue\n }\n if (newText.length === 0 && hunk.afterStart !== undefined && hunk.afterEnd !== undefined\n && hunk.afterStart === hunk.afterEnd && hunk.afterStart >= 0 && hunk.afterStart <= content.length) {\n const point = { start: hunk.afterStart, end: hunk.afterEnd }\n if (!occupied.some((used) => overlaps(point, used))) {\n locations.push({ idx, hunk, ...point, matched: true })\n occupied.push(point)\n cursor = Math.max(cursor, point.end)\n continue\n }\n }\n locations.push({ idx, hunk, start: -1, end: -1, matched: false })\n }\n return locations\n}\n\n/** 判断两个半开区间是否重叠。零长度区间只与同一位置的零长度区间重叠。 */\nfunction overlaps(left: TextRange, right: TextRange): boolean {\n if (left.start === left.end || right.start === right.end) return left.start === right.start && left.end === right.end\n return left.start < right.end && right.start < left.end\n}\n\n/** 在可定位区间上执行一次 hunk 反向替换。 */\nexport function replaceRange(content: string, location: HunkLocation, reverse = false): string | null {\n if (!location.matched || location.start < 0) return null\n const replacement = reverse ? (location.hunk.oldText ?? '') : location.hunk.newText\n return content.slice(0, location.start) + replacement + content.slice(location.end)\n}\n\n/** 按当前内容中出现的位置从后向前应用 hunk,避免前块长度变化影响后块。 */\nexport function applyLocations(content: string, locations: HunkLocation[], reverse = false): { content: string; stale: number[] } {\n const stale = locations.filter((location) => !location.matched).map((location) => location.idx)\n let out = content\n const matched = locations.filter((location) => location.matched).sort((a, b) => b.start - a.start)\n for (const location of matched) {\n const next = replaceRange(out, location, reverse)\n if (next === null) stale.push(location.idx)\n else out = next\n }\n return { content: out, stale: stale.sort((a, b) => a - b) }\n}\n","/**\n * dsh-vscode-mode client — 记录/差异状态纯函数(可单测)。\n * 迁移自原 src/client/index.ts 前段,语义一字不改。\n * 作者 ddj 2026-08-20\n */\nimport type { CallHunk, Hunk, RecordView } from '../../shared/types.js'\nimport { preciseHunk } from '../../shared/diff.js'\n\n/** 差异决策状态。 */\nexport const ST = { PENDING: 'pending', ACCEPTED: 'accepted', REJECTED: 'rejected' } as const\nexport type Status = 'pending' | 'accepted' | 'rejected'\n\n/** 记录视图摘要(按文件分组)。 */\nexport interface FileSummary {\n path: string\n recs: RecordView[]\n pending: number\n}\nexport interface Summary {\n files: FileSummary[]\n pendingFiles: FileSummary[]\n totalFiles: number\n}\n\n/** hunk 的 DOM 定位 key(callId:idx)。 */\nexport function callIdAttr(callId: string, idx: number): string {\n return String(callId) + ':' + String(idx)\n}\n\n/** 某 hunk 的当前决策状态(缺省 pending)。 */\nexport function statusAt(rec: RecordView | undefined, idx: number): Status {\n if (!rec) return ST.PENDING\n if (Array.isArray(rec.decisions?.perHunk) && rec.decisions.perHunk[idx] !== undefined) return rec.decisions.perHunk[idx] as Status\n return (rec.decisions?.call as Status) ?? ST.PENDING\n}\n\n/** hunk 是否为空差异(old===new,无实际内容变化,不可操作)。create 记录不视为空差异。 */\nexport function noopHunk(rec: RecordView | undefined, h: Hunk | CallHunk | null | undefined): boolean {\n if (!rec || rec.create === true) return false\n const precise = rec && h && rec.hunks.indexOf(h as Hunk) >= 0\n ? preciseHunk(rec, rec.hunks.indexOf(h as Hunk))\n : h\n const oldText = precise?.oldText ?? null\n const newText = precise?.newText ?? null\n return oldText !== null && oldText === newText\n}\n\n/** 记录是否仍有待处理差异(superseded / 全部已决策 = false)。 */\nexport function isRecPending(rec: RecordView): boolean {\n if (!rec || rec.superseded === true || rec.conflict === true) return false\n const perHunk = Array.isArray(rec.decisions?.perHunk) ? rec.decisions.perHunk : []\n if (perHunk.length) {\n // 只认存在至少一个\"非空差异且未决策\"的 hunk\n for (let i = 0; i < perHunk.length; i++) {\n if (perHunk[i] !== 'accepted' && perHunk[i] !== 'rejected' && !noopHunk(rec, (rec.hunks || [])[i])) return true\n }\n return false\n }\n return rec.decisions.call === 'pending' || rec.decisions.call === undefined\n}\n\n/** 记录待处理差异\"处\"数(按 hunk,跳过空差异)。 */\nexport function pendingCount(recs: RecordView[]): number {\n let n = 0\n for (const rec of recs) {\n if (!isRecPending(rec)) continue\n const perHunk = Array.isArray(rec.decisions?.perHunk) ? rec.decisions.perHunk : []\n if (perHunk.length) {\n for (let i = 0; i < perHunk.length; i++) {\n if (perHunk[i] === 'pending' && !noopHunk(rec, (rec.hunks || [])[i])) n++\n }\n } else {\n const hunks = Array.isArray(rec.hunks) ? rec.hunks : []\n for (const h of hunks) if (!noopHunk(rec, h)) n++\n if (!hunks.length && !noopHunk(rec, rec.callHunk)) n = Math.max(n, 1)\n }\n }\n return n\n}\n\n/** 按文件分组的差异摘要(角标/Launcher 用)。 */\nexport function summarize(records: RecordView[]): Summary {\n const byPath = new Map<string, RecordView[]>()\n for (const r of records) {\n if (!byPath.has(r.path)) byPath.set(r.path, [])\n byPath.get(r.path)!.push(r)\n }\n const files: FileSummary[] = []\n for (const [path, recs] of byPath) files.push({ path, recs, pending: pendingCount(recs) })\n files.sort((a, b) => (a.path < b.path ? -1 : 1))\n const pendingFiles = files.filter((f) => f.pending > 0)\n return { files, pendingFiles, totalFiles: pendingFiles.length }\n}\n","/**\n * dsh-vscode-mode client — 差异区域计算纯函数(可单测)。\n * 迁移自原 src/client/index.ts 的 diffRegions/trimCommonLines/countLinesBefore,语义不改。\n * 作者 ddj 2026-08-20\n */\nimport type { Hunk, RecordView } from '../../shared/types.js'\nimport { locateHunks, lineBefore, preciseHunk, splitLines } from '../../shared/diff.js'\nimport { ST, noopHunk, statusAt } from './records.js'\nimport type { Status } from './records.js'\n\n/** 差异区域(文件内一段待处理/已处理的变更)。 */\nexport interface Region {\n callId: string\n idx: number\n start?: number\n end?: number\n oldLines: string[]\n newLines: string[]\n whole?: boolean\n status: Status\n create: boolean\n rec: RecordView\n superseded: boolean\n stale?: boolean\n}\n\n/** 统计 index 之前(不含)的换行数 → 0 基行号。 */\nexport function countLinesBefore(text: string, index: number): number {\n return lineBefore(text, index)\n}\n\n/**\n * 行级公共前缀/后缀裁剪:old/new 首尾相同的行视为未变化(上下文),只保留真正变更的中间段。\n * @author ddj 2026年08月20号\n * @param oldLines 替换前内容按行拆分\n * @param newLines 替换后内容按行拆分\n * @returns 裁剪后的变更段与公共前缀行数\n */\nexport function trimCommonLines(oldLines: string[], newLines: string[]): { oldLines: string[]; newLines: string[]; shift: number } {\n let prefix = 0\n const maxPrefix = Math.min(oldLines.length, newLines.length)\n while (prefix < maxPrefix && oldLines[prefix] === newLines[prefix]) prefix++\n let suffix = 0\n const maxSuffix = Math.min(oldLines.length - prefix, newLines.length - prefix)\n while (suffix < maxSuffix && oldLines[oldLines.length - 1 - suffix] === newLines[newLines.length - 1 - suffix]) suffix++\n return { oldLines: oldLines.slice(prefix, oldLines.length - suffix), newLines: newLines.slice(prefix, newLines.length - suffix), shift: prefix }\n}\n\n/** 计算文件内各差异区域(行范围 + old/new + 状态),用于行内绿标注与 DiffBox。 */\nexport function diffRegions(records: RecordView[], content: string | null): Region[] {\n const regions: Region[] = []\n if (content === null) return regions\n const lines = splitLines(content)\n for (const rec of records) {\n if (rec.create) {\n for (let i = 0; i < rec.hunks.length; i++) {\n const h = preciseHunk(rec, i)\n if (!h || noopHunk(rec, h)) continue\n regions.push({ callId: rec.callId, idx: i, start: 1, end: lines.length + 1, oldLines: [], newLines: lines.slice(), whole: true, status: statusAt(rec, i), create: true, rec, superseded: rec.superseded === true })\n }\n continue\n }\n const entries: Array<{ idx: number; hunk: Hunk }> = []\n for (let i = 0; i < rec.hunks.length; i++) {\n const hunk = preciseHunk(rec, i)\n if (hunk && !noopHunk(rec, hunk)) entries.push({ idx: i, hunk })\n }\n const locations = locateHunks(content, entries.map((entry) => entry.hunk))\n for (let i = 0; i < entries.length; i++) {\n const entry = entries[i]\n const location = locations[i]\n const status = statusAt(rec, entry.idx)\n if (!location.matched) {\n regions.push({ callId: rec.callId, idx: entry.idx, stale: true, status, create: false, oldLines: entry.hunk.oldText === null ? [] : entry.hunk.oldText.split('\\n'), newLines: entry.hunk.newText ? entry.hunk.newText.split('\\n') : [], rec, superseded: rec.superseded === true })\n continue\n }\n const start = countLinesBefore(content, location.start) + 1\n const oldLines = entry.hunk.oldText === null ? [] : entry.hunk.oldText.split('\\n')\n const newLines = entry.hunk.newText.split('\\n')\n const trimmed = trimCommonLines(oldLines, newLines)\n const regionStart = start + trimmed.shift\n regions.push({ callId: rec.callId, idx: entry.idx, start: regionStart, end: regionStart + trimmed.newLines.length, oldLines: trimmed.oldLines, newLines: trimmed.newLines, status, create: false, rec, superseded: rec.superseded === true })\n }\n }\n regions.sort((a, b) => (a.start ?? Infinity) - (b.start ?? Infinity))\n return regions\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — QuickOpen:顶部搜索框(Ctrl+P 打开文件)。\n * 迁移自原 src/client/index.ts 的 QuickOpen,语义不改。\n * 作者 ddj 2026-08-20\n */\nimport React from 'react'\nimport { rpc } from '../rpc.js'\n\n/**\n * 快速打开搜索框:Ctrl+P 聚焦,输入 ≥2 字符经 edrv.searchFiles 搜索,\n * 结果列表点击/回车打开文件。\n * @param props.sessionId 会话 id\n * @param props.onOpen 打开回调(path)\n */\nexport function QuickOpen(props) {\n const sessionId = props?.sessionId\n const onOpen = props?.onOpen\n const [q, setQ] = React.useState('')\n const [results, setResults] = React.useState(null)\n const [open, setOpen] = React.useState(false)\n const inputRef = React.useRef(null)\n const seq = React.useRef(0)\n const timer = React.useRef(null)\n\n const search = (query) => {\n const s = ++seq.current\n const clean = String(query || '').trim()\n if (clean.length < 2) { setResults(null); return }\n rpc('edrv.searchFiles', { sessionId, query: clean }).then((res) => {\n if (s !== seq.current) return\n setResults((res && res.ok && Array.isArray(res.files)) ? res.files : [])\n }).catch(() => { if (s === seq.current) setResults([]) })\n }\n\n const onChange = (v) => {\n setQ(v); setOpen(true)\n if (timer.current) clearTimeout(timer.current)\n timer.current = setTimeout(() => search(v), 180)\n }\n\n const pick = (p) => {\n onOpen(p)\n setQ(''); setResults(null); setOpen(false)\n inputRef.current?.blur?.()\n }\n\n React.useEffect(() => {\n const onKey = (e) => {\n if ((e.ctrlKey || e.metaKey) && String(e.key).toLowerCase() === 'p') {\n e.preventDefault(); e.stopPropagation()\n inputRef.current?.focus?.()\n setOpen(true)\n } else if (e.key === 'Escape') {\n setOpen(false); inputRef.current?.blur?.()\n }\n }\n window.addEventListener('keydown', onKey, true)\n return () => window.removeEventListener('keydown', onKey, true)\n }, [])\n\n const dirText = (p) => {\n const base = String(p).split(/[\\\\/]/).pop() || String(p)\n return String(p).slice(0, Math.max(0, String(p).length - base.length)).replace(/[\\\\/]+$/, '') || String(p)\n }\n\n let pop = null\n if (open && Array.isArray(results) && q.trim().length >= 2) {\n if (results.length) {\n const items = results.map((p) => React.createElement('div', { key: p, className: 'edrv-search-item', onClick: () => pick(p) },\n React.createElement('span', { className: 'n' }, String(p).split(/[\\\\/]/).pop() || p),\n React.createElement('span', { className: 'd' }, dirText(p))))\n pop = React.createElement('div', { className: 'edrv-search-pop' }, ...items)\n } else {\n pop = React.createElement('div', { className: 'edrv-search-pop' }, React.createElement('div', { className: 'edrv-search-empty' }, '无匹配文件'))\n }\n }\n\n return React.createElement('div', { className: 'edrv-search-wrap' },\n React.createElement('input', {\n ref: inputRef, className: 'edrv-search', placeholder: '搜索文件 (Ctrl+P)',\n value: q,\n onChange: (e) => onChange(e.target.value),\n onFocus: () => { if (q.trim().length >= 2 && !results) setOpen(true) },\n onKeyDown: (e) => {\n if (e.key === 'Enter' && Array.isArray(results) && results.length) pick(results[0])\n if (e.key === 'Escape') setOpen(false)\n },\n }),\n pop)\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — UI 共用小工具(按钮样式/状态文案/等宽字体)。\n * 迁移自原 src/client/index.ts 的 btn/badgeOf/MONO,语义不改。\n * 作者 ddj 2026-08-20\n */\nimport { ST } from '../state/records.js'\n\n/** 次级按钮内联样式(accept=true 绿色 / false 红色)。 */\nexport function btn(accept) {\n return {\n fontSize: 11,\n padding: '1px 8px',\n border: '1px solid var(--dsw-alias-border-l2,#555)',\n borderRadius: 4,\n cursor: 'pointer',\n background: 'var(--dsw-alias-bg-layer-1,transparent)',\n color: accept ? 'var(--dsw-alias-state-success-primary,#2e9e44)' : 'var(--dsw-alias-state-error-primary,#d9534f)',\n }\n}\n\n/** 状态中文文案。 */\nexport function badgeOf(status) {\n return status === ST.ACCEPTED ? '已采纳' : status === ST.REJECTED ? '已拒绝' : '待处理'\n}\n\n/** 等宽字体常量(差异行渲染用)。 */\nexport const MONO = { fontFamily: 'var(--ds-font-family-code, ui-monospace, monospace)', fontSize: 12, lineHeight: 1.55 }\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — DiffLauncher:全局差异总览 + 归档 圆角下拉。\n * 迁移自原 src/client/index.ts 的 DiffLauncher,语义不改。\n * 作者 ddj 2026-08-20\n */\nimport React from 'react'\nimport { rpc } from '../rpc.js'\nimport { MONO, btn } from './shared.js'\n\n/**\n * 全局差异面板:待处理文件列表(点击打开并跳转)+ 归档浏览/批次回滚。\n * 由状态栏差异 chip / header 角标触发。\n */\nexport function DiffLauncher(props) {\n const sessionId = props?.sessionId\n const sum = props?.sum\n const onClose = props?.onClose\n const onOpenFile = props?.onOpenFile\n const [tab, setTab] = React.useState(props?.tab === 'archive' ? 'archive' : 'pending') // 'pending' | 'archive'\n const [archives, setArchives] = React.useState(null)\n const [archiveDetail, setArchiveDetail] = React.useState(null)\n const [archivePath, setArchivePath] = React.useState(null)\n const [archiveErr, setArchiveErr] = React.useState(null)\n const [error, setError] = React.useState(null)\n\n const loadArchives = () => {\n if (!sessionId) { setArchiveErr('会话不存在'); return }\n rpc('edrv.archiveList', { sessionId }).then((res) => {\n if (res && res.ok && Array.isArray(res.entries)) { setArchives(res.entries); setArchiveErr(null) }\n else setArchiveErr(res?.error ? String(res.error) : '归档列表读取失败')\n }).catch((e) => setArchiveErr('归档异常:' + String(e)))\n }\n const loadArchiveDetail = (path) => {\n if (!sessionId) return\n setArchiveDetail(null)\n rpc('edrv.archiveRead', { sessionId, path }).then((res) => {\n if (res && res.ok && Array.isArray(res.batches)) setArchiveDetail(res.batches)\n else setArchiveErr(res?.error ? String(res.error) : '归档详情读取失败')\n }).catch((e) => setArchiveErr('归档异常:' + String(e)))\n }\n React.useEffect(() => {\n if (tab !== 'archive') return\n setArchives(null); setArchiveDetail(null); setArchivePath(null); setArchiveErr(null)\n loadArchives()\n }, [tab, sessionId])\n\n let body\n if (tab === 'pending') {\n body = (sum.pendingFiles.length === 0\n ? React.createElement('div', { className: 'edrv-search-empty' }, '暂无待处理差异(已全部处理)')\n : sum.pendingFiles.map((f) => React.createElement('div', { key: f.path, className: 'edrv-launch-row', title: '打开并跳转到差异 ' + f.path, onClick: () => onOpenFile(f.path) },\n React.createElement('span', { className: 'edrv-launch-path' }, f.path),\n React.createElement('span', { className: 'edrv-launch-cnt' }, '待处理 ' + f.pending + ' 处'),\n React.createElement('button', { className: 'edrv-btn-mini edrv-btn-keep', onClick: (e) => { e.stopPropagation(); onOpenFile(f.path) } }, '打开'))))\n } else {\n if (archiveErr) body = React.createElement('div', { className: 'edrv-search-empty', style: { color: 'var(--dsw-alias-state-error-primary,#d9534f)' } }, '错误:' + String(archiveErr))\n else if (archives === null) body = React.createElement('div', { className: 'edrv-search-empty' }, '加载中…')\n else if (archives.length === 0) body = React.createElement('div', { className: 'edrv-search-empty' }, '暂无归档记录')\n else {\n const inner = archives.map((e) => {\n const open = archivePath === e.path\n let detailEl = null\n if (open) {\n if (archiveDetail === null) detailEl = React.createElement('div', { style: { padding: 8, fontSize: 11, color: 'var(--dsw-alias-label-tertiary,#888)' } }, '加载中…')\n else {\n const batches = archiveDetail.filter((b) => b.path === e.path)\n detailEl = batches.map((b) => (Array.isArray(b.records) ? b.records : []).map((rec) => {\n const lines = []\n const hunks = Array.isArray(rec.hunks) ? rec.hunks : []\n for (const h of hunks) {\n const oldLs = (h.oldText ?? '').split('\\n')\n const newLs = (h.newText ?? '').split('\\n')\n for (const t of oldLs) lines.push({ k: 'old', t })\n if (oldLs.length && newLs.length) lines.push({ k: 'sep', t: '' })\n for (const t of newLs) lines.push({ k: 'new', t })\n }\n const sm = rec.summary || { accepted: 0, rejected: 0, pending: 0, superseded: false }\n return React.createElement('div', { key: rec.callId, style: { padding: '5px 8px', borderTop: '1px solid var(--dsw-alias-border-l1,#333)' } },\n React.createElement('div', { style: { display: 'flex', gap: 8, alignItems: 'center', flexWrap: 'wrap', fontSize: 11, marginBottom: 2 } },\n React.createElement('span', { style: { color: 'var(--dsw-alias-label-primary,#ddd)', fontWeight: 600 } }, rec.toolName === 'write' ? (rec.create ? '新建' : '写入') : '编辑'),\n React.createElement('span', { style: { color: 'var(--dsw-alias-state-success-primary,#2e9e44)' } }, '采纳 ' + sm.accepted),\n React.createElement('span', { style: { color: 'var(--dsw-alias-state-error-primary,#d9534f)' } }, '拒绝 ' + sm.rejected),\n (rec.superseded ? React.createElement('span', { style: { color: 'var(--dsw-alias-state-warn-primary,#b7791f)' } }, '被覆盖') : null),\n React.createElement('span', { style: { color: 'var(--dsw-alias-label-tertiary,#888)' } }, new Date(rec.at).toLocaleTimeString())),\n React.createElement('pre', { style: { margin: 0, whiteSpace: 'pre', fontFamily: MONO.fontFamily, fontSize: 11, lineHeight: 1.5, overflowX: 'auto' } }, lines.map((ln, i) => React.createElement('div', { key: i, style: { background: ln.k === 'old' ? 'rgba(239,68,68,.10)' : ln.k === 'new' ? 'rgba(34,197,94,.10)' : 'transparent', color: ln.k === 'old' ? 'var(--dsw-alias-state-error-primary,#d9534f)' : ln.k === 'new' ? 'var(--dsw-alias-state-success-primary,#2e9e44)' : 'var(--dsw-alias-label-tertiary,#888)' } }, (ln.k === 'old' ? '- ' : ln.k === 'new' ? '+ ' : '') + ln.t)))\n )\n }))\n }\n }\n return React.createElement('div', { key: e.at + e.path, style: { border: '1px solid var(--dsw-alias-border-l1,#333)', borderRadius: 8, overflow: 'hidden' } },\n React.createElement('div', { style: { display: 'flex', gap: 8, alignItems: 'center', padding: '6px 8px', background: 'var(--dsw-alias-bg-layer-1,transparent)', cursor: 'pointer', flexWrap: 'wrap' }, onClick: () => { if (open) { setArchivePath(null); setArchiveDetail(null) } else { setArchivePath(e.path); loadArchiveDetail(e.path) } } },\n React.createElement('span', { style: { flex: 1, fontSize: 12, color: 'var(--dsw-alias-label-primary,#ddd)', wordBreak: 'break-all' } }, e.path),\n (e.batch != null ? React.createElement('span', { style: { fontSize: 11, color: 'var(--dsw-alias-label-tertiary,#888)' } }, '批次 ' + e.batch) : null),\n (e.reason ? React.createElement('span', { style: { fontSize: 11, color: 'var(--dsw-alias-state-warn-primary,#b7791f)' } }, e.reason) : null),\n React.createElement('span', { style: { fontSize: 11, color: 'var(--dsw-alias-label-tertiary,#888)' } }, new Date(e.at).toLocaleString()),\n React.createElement('span', { style: { fontSize: 11, color: 'var(--dsw-alias-label-tertiary,#888)' } }, '采纳 ' + e.summary.accepted + ' · 拒绝 ' + e.summary.rejected + (e.summary.superseded ? ' · 覆盖 ' + e.summary.superseded : '')),\n React.createElement('button', { onClick: (ev) => {\n ev.stopPropagation()\n if (e.batch == null) return\n if (!window.confirm('将文件恢复到批次 ' + e.batch + ' 之前的状态?(当前活跃差异将一并归档)')) return\n rpc('edrv.rollback', { sessionId, path: e.path, batch: e.batch }).then((res) => {\n if (res && res.ok) {\n setError(null); window.dispatchEvent(new CustomEvent('edrv:refresh'))\n setArchivePath(null); setArchiveDetail(null); loadArchives()\n } else setError(res?.error ? String(res.error) : '回滚失败')\n }).catch((err) => setError('回滚异常:' + String(err)))\n }, style: btn(false) }, '回滚')),\n detailEl)\n })\n body = React.createElement('div', { className: 'edrv-launch-arch' }, inner)\n }\n }\n\n return React.createElement('div', { className: 'edrv-launch', 'data-edrv-launch': '1' },\n React.createElement('div', { className: 'edrv-launch-head' },\n React.createElement('span', { style: { fontSize: 12, fontWeight: 600, color: 'var(--dsw-alias-label-primary,#eee)', marginRight: 4 } }, '差异'),\n React.createElement('button', { className: 'edrv-launch-tab' + (tab === 'pending' ? ' on' : ''), onClick: () => setTab('pending') }, '待处理' + (sum.totalFiles ? ' (' + sum.totalFiles + ')' : '')),\n React.createElement('button', { className: 'edrv-launch-tab' + (tab === 'archive' ? ' on' : ''), onClick: () => setTab('archive') }, '归档'),\n React.createElement('span', { style: { flex: 1 } }),\n (error ? React.createElement('span', { style: { fontSize: 11, color: 'var(--dsw-alias-state-error-primary,#d9534f)', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap', maxWidth: '40%' } }, '错误:' + String(error)) : null),\n React.createElement('button', { onClick: onClose, style: btn(false) }, '✕ 关闭')),\n React.createElement('div', { className: 'edrv-launch-body' }, body))\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — 侧边栏容器(活动栏 + 面板区 + 拖拽调宽)。\n * 面板列表来自注册表(活动栏图标/徽标/激活态),渲染当前激活面板的 render(ctx);\n * 右侧手柄拖拽调宽(clamp 180–560),底部按钮收起侧边栏。\n * 作者 ddj 2026-08-26\n */\nimport React from 'react'\nimport type { SidebarCtx } from './types.js'\n\nconst W_MIN = 180\nconst W_MAX = 560\n\n/**\n * 侧边栏容器。\n * @param props.registry 面板注册表(list() 提供面板顺序)\n * @param props.ctx 面板共享上下文\n * @param props.activePanel 当前激活面板 id\n * @param props.onActive 激活面板变化回调\n * @param props.width 面板区宽度\n * @param props.onWidth 宽度变化回调\n * @param props.onHide 收起侧边栏回调\n */\nexport function SidebarView(props) {\n const panels = props.registry?.list?.() ?? []\n const ctx = props.ctx\n const activePanel = props.activePanel\n const onActive = props.onActive\n const width = props.width\n const onWidth = props.onWidth\n const onHide = props.onHide\n\n const active = panels.find((p) => p.id === activePanel) || panels[0]\n\n const onPointerDown = (e) => {\n e.preventDefault()\n const startX = e.clientX\n const startW = width\n const onMove = (ev) => {\n const w = Math.max(W_MIN, Math.min(W_MAX, startW + (ev.clientX - startX)))\n onWidth(w)\n }\n const onUp = () => {\n window.removeEventListener('pointermove', onMove)\n window.removeEventListener('pointerup', onUp)\n }\n window.addEventListener('pointermove', onMove)\n window.addEventListener('pointerup', onUp)\n }\n\n const rail = React.createElement('div', { className: 'edrv-rail' },\n React.createElement('div', { style: { flex: 1, display: 'flex', flexDirection: 'column', gap: 2 } },\n panels.map((p) => {\n const count = typeof p.badge === 'function' ? p.badge(ctx) : null\n return React.createElement('button', {\n key: p.id,\n className: 'edrv-rail-btn' + (active && p.id === active.id ? ' edrv-rail-on' : ''),\n title: p.title,\n onClick: () => onActive(p.id),\n },\n React.createElement('span', { className: 'edrv-rail-icon' }, p.icon),\n count > 0\n ? React.createElement('span', { className: 'edrv-rail-badge' }, String(count))\n : null)\n })),\n React.createElement('button', { className: 'edrv-rail-btn', title: '隐藏侧边栏 (Ctrl+B)', onClick: onHide }, '◀'))\n\n return React.createElement('div', { className: 'edrv-sidebar', style: { width } },\n rail,\n React.createElement('div', { className: 'edrv-side-body' },\n active ? active.render(ctx) : null),\n React.createElement('div', { className: 'edrv-side-resize', onPointerDown: onPointerDown }))\n}\n","/**\n * dsh-vscode-mode client — 会话级差异 dock store。\n * EditorView 发布当前编辑上下文,conversation.input.dock 唯一读取并渲染。\n * 作者 ddj 2026年08月26号\n */\n\n/** 差异 dock 的显示形态。 */\nexport type DiffDockMode = 'chat' | 'editor' | 'editor-empty'\n\n/**\n * 跨 slot 传递的差异 dock 快照。\n * 操作回调随快照一起更新,避免 dock 持有已卸载编辑器的旧闭包。\n */\nexport interface DiffDockSnapshot {\n mode: DiffDockMode\n [key: string]: unknown\n}\n\ntype DiffDockListener = () => void\ntype DiffDockSource = object\n\nconst values = new Map<string, DiffDockSnapshot>()\nconst sources = new Map<string, DiffDockSource>()\nconst listeners = new Map<string, Set<DiffDockListener>>()\n\n/** 通知指定会话的 dock 订阅者。 */\nfunction notifyDiff(sessionId: string): void {\n for (const listener of listeners.get(sessionId) ?? []) listener()\n}\n\n/**\n * 发布指定会话的最新编辑器差异上下文。\n * @author ddj 2026年08月26号\n * @param sessionId 会话 id\n * @param snapshot 完整 DiffBox 操作上下文\n * @param source 发布者令牌,用于卸载时防止误清理新实例\n */\nexport function publishDiffDock(sessionId: string, snapshot: DiffDockSnapshot, source?: DiffDockSource): void {\n values.set(sessionId, snapshot)\n if (source) sources.set(sessionId, source)\n else sources.delete(sessionId)\n notifyDiff(sessionId)\n}\n\n/**\n * 清除指定会话的差异上下文。\n * @author ddj 2026年08月26号\n * @param sessionId 会话 id\n * @param source 可选发布者令牌;不匹配时忽略清理\n */\nexport function clearDiffDock(sessionId: string, source?: DiffDockSource): void {\n if (source && sources.get(sessionId) !== source) return\n values.delete(sessionId)\n sources.delete(sessionId)\n notifyDiff(sessionId)\n}\n\n/**\n * 读取指定会话的最新上下文。\n * @author ddj 2026年08月26号\n * @param sessionId 会话 id\n * @returns 最新上下文或 null\n */\nexport function readDiffDock(sessionId?: string): DiffDockSnapshot | null {\n if (!sessionId) return null\n return values.get(sessionId) ?? null\n}\n\n/**\n * 订阅指定会话的上下文变化。\n * @author ddj 2026年08月26号\n * @param sessionId 会话 id\n * @param listener 变化回调\n * @returns 取消订阅函数\n */\nexport function subscribeDiffDock(sessionId: string, listener: DiffDockListener): () => void {\n let bucket = listeners.get(sessionId)\n if (!bucket) {\n bucket = new Set()\n listeners.set(sessionId, bucket)\n }\n bucket.add(listener)\n return () => {\n bucket!.delete(listener)\n if (!bucket!.size) listeners.delete(sessionId)\n }\n}\n","/**\n * dsh-vscode-mode client — 对话差异 dock 纯函数。\n * 只负责差异文件轮转和文案,状态查询仍由组件复用现有 edrv.list/summarize。\n * 作者 ddj 2026-08-26\n */\n\n/**\n * 从稳定差异文件列表中取下一个路径,并返回下一次索引。\n * @author ddj 2026年08月26号\n * @param paths 待处理差异文件路径\n * @param index 当前轮转索引\n * @returns 下一个路径与归一化后的下一索引\n */\nexport function nextDiffPath(paths: string[], index: number): { path: string | null; index: number } {\n if (!paths.length) return { path: null, index: 0 }\n const current = Number.isFinite(index) ? Math.max(0, Math.floor(index)) : 0\n const at = current % paths.length\n return { path: paths[at] ?? null, index: (at + 1) % paths.length }\n}\n\n/**\n * 生成对话差异 dock 的单按钮文案。\n * @author ddj 2026年08月26号\n * @param count 待处理差异文件数量\n * @returns 展示文案\n */\nexport function diffDockText(count: number): string {\n return '差异 ' + Math.max(0, Math.floor(count)) + ' 个文件 · 查看下一个'\n}\n\n/**\n * 根据活动文件决定编辑页 dock 形态,加载期间保持 editor 结构稳定。\n * @author ddj 2026年08月26号\n * @param activePath 当前活动文件路径\n * @returns 编辑态或无文件空态\n */\nexport function editorDockMode(activePath: string | null | undefined): 'editor' | 'editor-empty' {\n return activePath ? 'editor' : 'editor-empty'\n}\n\n/**\n * 获取切换文件期间稳定展示的文件内差异数量。\n * @author ddj 2026年08月26号\n * @param ready 当前文件内容是否已加载完成\n * @param actualTotal 内容就绪后的精确差异数\n * @param fallbackTotal 内容加载期间的文件摘要差异数\n * @returns 非负整数差异数\n */\nexport function displayDiffTotal(ready: boolean, actualTotal: number, fallbackTotal: number): number {\n const value = ready ? actualTotal : fallbackTotal\n return Number.isFinite(value) ? Math.max(0, Math.floor(value)) : 0\n}\n","/**\n * dsh-vscode-mode client — 编辑区与原生 composer 的几何边界计算。\n * @author ddj 2026年08月26号\n */\n\n/**\n * 计算编辑根节点在当前会话滚动区内、composer 上方可使用的高度。\n * @author ddj 2026年08月26号\n * @param rootTop 编辑根节点顶边\n * @param scrollBottom 会话滚动区可视底边\n * @param composerTop composer 顶边;缺失时回退滚动区底边\n * @returns 非负可用高度\n */\nexport function editorHeight(rootTop: number, scrollBottom: number, composerTop?: number): number {\n const root = Number.isFinite(rootTop) ? rootTop : 0\n const scroll = Number.isFinite(scrollBottom) ? scrollBottom : root\n const composer = Number.isFinite(composerTop) ? composerTop as number : scroll\n return Math.max(0, Math.min(scroll, composer) - root)\n}\n","/**\n * dsh-vscode-mode client — 「在文件浏览器中打开」RPC 包装(树菜单与 Monaco 右键共用)。\n * 归一化为 { ok, error? },不抛异常;无会话/异常降级返回错误文案。\n * 作者 ddj 2026-08-27\n */\nimport { rpc } from './rpc.js'\n\nexport interface RevealOutcome {\n ok: boolean\n error?: string\n}\n\n/**\n * 请求 host 在 OS 文件浏览器中打开/定位路径。\n * @author ddj 2026年08月27号\n * @param sessionId 会话 id(可空)\n * @param path 工作区相对路径('' = 根目录)\n * @returns 成功或失败原因\n */\nexport async function revealInExplorer(sessionId: string | undefined, path: string): Promise<RevealOutcome> {\n if (!sessionId) return { ok: false, error: '无活动会话' }\n try {\n const res = await rpc('edrv.revealInExplorer', { sessionId, path })\n return res.ok ? { ok: true } : { ok: false, error: res.error }\n } catch (error) {\n return { ok: false, error: '打开异常:' + String(error) }\n }\n}\n","/**\n * dsh-vscode-mode client — 编辑器视图状态持久化(纯函数,可单测)。\n * 对齐 VSCode workbench.editor.restoreViewState:恢复每个文件的光标/滚动/折叠位置。\n * 视图状态 = Monaco editor.saveViewState() 返回值(JSON 可序列化),按 path 存储。\n * 作者 ddj 2026-08-28\n */\n\n/** localStorage 键前缀(按会话隔离)。 */\nconst KEY_PREFIX = 'edrv.cache.viewstate.v1.'\n\n/** 视图状态条目容量上限。 */\nexport const VIEWSTATE_CAP = 50\n\n/** 视图状态序列化体积上限(单条目,防止超大选区/折叠数据撑爆配额)。 */\nexport const VIEWSTATE_BYTES_CAP = 64 * 1024\n\n/**\n * 判断对象是否为合法的 Monaco view state(保守形状校验,非深校验)。\n * @author ddj 2026年08月28号\n * @param value 待校验对象\n * @returns 是否可接受\n */\nexport function isViewStateLike(value: unknown): boolean {\n if (!value || typeof value !== 'object') return false\n const v = value as Record<string, unknown>\n // 至少含光标状态与视口滚动信息之一;无内容时拒绝(空对象无恢复价值)\n return Array.isArray(v.cursorState) || typeof v.viewState === 'object'\n || Array.isArray(v.contributionsState)\n}\n\n/**\n * 序列化视图状态映射(path → viewState)。\n * @author ddj 2026年08月28号\n * @param states path → viewState 映射\n * @returns JSON 字符串\n */\nexport function serializeViewStates(states: Record<string, unknown>): string {\n return JSON.stringify({ v: 1, states })\n}\n\n/**\n * 解析视图状态文本;损坏/格式不符 → null。\n * @author ddj 2026年08月28号\n * @param text localStorage 原文\n * @returns path → viewState 映射,非法返回 null\n */\nexport function parseViewStates(text: string | null): Record<string, unknown> | null {\n if (!text) return null\n try {\n const data = JSON.parse(text)\n if (!data || typeof data !== 'object') return null\n const states = (data as Record<string, unknown>).states\n if (!states || typeof states !== 'object' || Array.isArray(states)) return null\n const out: Record<string, unknown> = {}\n for (const [path, state] of Object.entries(states)) {\n if (typeof path !== 'string' || !path) continue\n if (!isViewStateLike(state)) continue\n out[path] = state\n }\n return out\n } catch (error) {\n return null\n }\n}\n\n/**\n * 把新视图状态并入既有映射:同 path 覆盖、按写入顺序裁剪到容量上限。\n * @author ddj 2026年08月28号\n * @param states 既有映射\n * @param path 文件路径\n * @param state 视图状态\n * @returns 新映射(容量裁剪后)\n */\nexport function upsertViewState(\n states: Record<string, unknown>,\n path: string,\n state: unknown,\n): Record<string, unknown> {\n if (!path || !isViewStateLike(state)) return states\n try {\n if (JSON.stringify(state).length > VIEWSTATE_BYTES_CAP) return states\n } catch (error) {\n return states\n }\n const next = Object.assign({}, states)\n delete next[path] // 先删后加,保证该 path 排到最末(近似 LRU:最新写入)\n next[path] = state\n const keys = Object.keys(next)\n if (keys.length > VIEWSTATE_CAP) {\n for (const k of keys.slice(0, keys.length - VIEWSTATE_CAP)) delete next[k]\n }\n return next\n}\n\n/**\n * 读取某会话的视图状态缓存(localStorage 不可用 → 空映射)。\n * @author ddj 2026年08月28号\n * @param sessionId 会话 id\n * @returns path → viewState 映射\n */\nexport function viewStatesLoad(sessionId: string): Record<string, unknown> {\n try {\n return parseViewStates(window.localStorage.getItem(KEY_PREFIX + String(sessionId))) ?? {}\n } catch (error) {\n return {}\n }\n}\n\n/**\n * 写入某会话的视图状态缓存(损坏/配额满 → 忽略)。\n * @author ddj 2026年08月28号\n * @param sessionId 会话 id\n * @param states path → viewState 映射\n */\nexport function viewStatesSave(sessionId: string, states: Record<string, unknown>): void {\n try {\n window.localStorage.setItem(KEY_PREFIX + String(sessionId), serializeViewStates(states))\n } catch (error) { /* 配额满/隐私模式忽略 */ }\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — EditorView:中央 VSCode 式文件编辑器(编排层)。\n * 迁移自原 src/client/index.ts 的 EditorView,语义不改;差异自绘已抽到 monaco/diffRender。\n * 职责:页签/QuickOpen/Monaco 编辑器/差异审查(DiffBox/Launcher/Badge 事件装配)/状态栏/自动保存。\n * 作者 ddj 2026-08-20\n */\nimport React from 'react'\nimport { dbg, rpc } from '../rpc.js'\nimport { emitRefresh } from '../events.js'\nimport { langOf, loadMonaco } from '../monaco/loader.js'\nimport { createDiffRenderer } from '../monaco/diffRender.js'\nimport { ST, callIdAttr, noopHunk, summarize } from '../state/records.js'\nimport { diffRegions } from '../state/regions.js'\nimport { QuickOpen } from './QuickOpen.js'\nimport { DiffLauncher } from './DiffLauncher.js'\nimport { SidebarView } from '../sidebar/SidebarView.js'\nimport { clearDiffDock, publishDiffDock } from '../diffDockStore.js'\nimport { displayDiffTotal, editorDockMode } from '../diffDock.js'\nimport { editorHeight } from '../editorLayout.js'\nimport { revealInExplorer as revealPathInExplorer } from '../fileReveal.js'\nimport { setSidePending, SIDEBAR_INSTALL_CMD } from '../sidebarBridge.js'\nimport { upsertViewState, viewStatesLoad, viewStatesSave } from '../state/viewStateCache.js'\n\n/**\n * 中央编辑区:文件页签(脏点/关闭/打开路径)+ Ctrl+P 搜索 + Monaco 编辑器 +\n * 底部差异条(DiffBox/空态)+ 全局差异下拉(DiffLauncher)+ 状态栏。\n * @param props.sessionId 会话 id\n * @param props.schedule 延时调度(ctx.timeout)\n * @param props.layout 布局形态:'tab'(中央页签,默认)| 'side'(侧边栏面板)\n * @param props.sideHint 旧页签形态下显示侧边栏引导(安装命令)\n */\nexport function EditorView(props) {\n const sessionId = props?.sessionId\n const schedule = props.schedule\n const addToConversation = props.addToConversation\n const layout = props?.layout === 'side' ? 'side' : 'tab'\n const sideHint = props?.sideHint\n const [monaco, setMonaco] = React.useState(null)\n const [monacoErr, setMonacoErr] = React.useState(null)\n const [records, setRecords] = React.useState({})\n const [tabs, setTabs] = React.useState([])\n const [active, setActive] = React.useState(null)\n const [dirtyMap, setDirtyMap] = React.useState({})\n const [content, setContent] = React.useState(null)\n const [contentPath, setContentPath] = React.useState(null)\n const [status, setStatus] = React.useState('')\n const [error, setError] = React.useState(null)\n const [loadError, setLoadError] = React.useState(null)\n const [loadStage, setLoadStage] = React.useState({ progress: 0, message: '准备加载编辑器…' })\n const [openInput, setOpenInput] = React.useState(false)\n const [pathDraft, setPathDraft] = React.useState('')\n const [cursor, setCursor] = React.useState('')\n const [launcherOpen, setLauncherOpen] = React.useState(false)\n const [launcherTab, setLauncherTab] = React.useState('pending')\n const [hoverAct, setHoverAct] = React.useState(null) // { region, top } 编辑区 hover 差异块的 Keep/Undo 浮层\n const [diffIdx, setDiffIdx] = React.useState(0) // 当前文件内差异位置(x/x 显示)\n const [fileIdx, setFileIdx] = React.useState(0) // 全局差异文件位置(x/x 文件 显示)\n const [tabMenu, setTabMenu] = React.useState(null) // Tab 右键菜单 { x,y,path }(编辑区右键走 Monaco 原生菜单,无此浮层)\n const [sidebarOn, setSidebarOn] = React.useState(layout !== 'side') // 侧边栏显隐(侧栏形态默认收起)\n const [sidebarW, setSidebarW] = React.useState(240) // 侧边栏宽度\n const [activePanel, setActivePanel] = React.useState('explorer') // 激活面板 id\n const [focusRequest, setFocusRequest] = React.useState(0) // 外部差异聚焦请求版本\n const [hintDismissed, setHintDismissed] = React.useState(() => {\n try { return localStorage.getItem('edrv.side-hint-dismissed') === '1' } catch { return false }\n }) // 侧边栏引导条是否已关闭\n const editorRef = React.useRef(null)\n const viewRootRef = React.useRef(null)\n const monacoRef = React.useRef(null)\n const modelsRef = React.useRef(new Map())\n // 视图状态缓存(path → Monaco viewState;重启后恢复光标/滚动/折叠位置)\n const viewStatesRef = React.useRef({})\n const saveTimerRef = React.useRef(null)\n const loadSeqRef = React.useRef(0)\n const programmaticRef = React.useRef(false)\n const bootRef = React.useRef(false)\n const pendingFocusRef = React.useRef(null) // { path, region } 内容加载后跳转\n const hoverRegionsRef = React.useRef([]) // 当前 pending 区域镜像(稳定回调读取)\n const lineRegionMapRef = React.useRef(new Map()) // 行 → 区域 映射(hover 命中)\n const hoverKeyRef = React.useRef(null) // 当前 hover 区域 key(区域不变不重渲染)\n const hoverTopRef = React.useRef(null) // 当前 hover 浮窗 top(滚动后位置变化才重定位)\n const hoverRightRef = React.useRef(null) // 浮窗右侧避让 Monaco 缩略栏\n const hideTimerRef = React.useRef(null) // 延迟隐藏计时器(防闪烁)\n const hoverEditorRef = React.useRef(false) // 鼠标是否仍在编辑器命中区\n const hoverPanelRef = React.useRef(false) // 鼠标是否已进入 Keep/Undo 浮层\n const batchBusyRef = React.useRef(false) // 批量 Keep All/Undo All 防重入\n const menuHandlersRef = React.useRef(null) // 右键菜单动作的最新闭包(Monaco addAction 空依赖回调读取)\n const diffRendererRef = React.useRef(null)\n const layoutRef = React.useRef(layout) // ensureEditor 空依赖闭包读取的稳定布局\n layoutRef.current = layout\n if (!diffRendererRef.current) diffRendererRef.current = createDiffRenderer((sid, t) => dbg(sid, t))\n\n const currentRecords = React.useMemo(() => {\n const list = []\n for (const rec of Object.values(records)) if (rec.path === active && rec.archived !== true) list.push(rec)\n return list\n }, [records, active])\n\n const contentReady = content !== null && contentPath === active\n const regions = React.useMemo(() => diffRegions(currentRecords, contentReady ? content : null).filter((r) => !r.superseded), [currentRecords, content, contentPath, active])\n // useMemo 稳定引用:否则 hover 等重渲染会让 view zone effect 反复重建(- 号闪烁)\n const pendingRegions = React.useMemo(() => regions.filter((r) => r.status === ST.PENDING && !r.stale), [regions])\n const staleRegions = React.useMemo(() => regions.filter((r) => r.status === ST.PENDING && r.stale), [regions])\n hoverRegionsRef.current = pendingRegions\n // 行 → 差异区域 映射(hover O(1) 命中;每行归属其区域)\n const lineRegionMap = React.useMemo(() => {\n const map = new Map()\n for (const r of pendingRegions) {\n if (r.start === undefined || r.end === undefined) continue\n const last = Math.max(r.start, r.end - 1)\n for (let ln = r.start; ln <= last; ln++) if (!map.has(ln)) map.set(ln, r)\n }\n return map\n }, [pendingRegions])\n lineRegionMapRef.current = lineRegionMap\n const sum = React.useMemo(() => summarize(Object.values(records)), [records])\n\n const addTab = (path, select) => {\n setTabs((prev) => {\n if (prev.some((t) => t.path === path)) return prev\n return prev.concat([{ path }])\n })\n if (select) setActive(path)\n }\n\n /**\n * 保存当前活动文件的视图状态(光标/滚动/折叠)到会话缓存。\n * @author ddj 2026年08月28号\n * @param path 要保存的文件路径(缺省 = 当前 active)\n */\n const saveViewState = (path) => {\n const ed = editorRef.current\n const target = path ?? active\n if (!ed || !target) return\n try {\n const state = ed.saveViewState()\n if (!state) return\n viewStatesRef.current = upsertViewState(viewStatesRef.current, target, state)\n viewStatesSave(sessionId, viewStatesRef.current)\n } catch (e) { /* 视图状态保存失败忽略 */ }\n }\n\n /**\n * 恢复指定文件的视图状态(内容就绪、setModel 后调用;恢复后即消费删除)。\n * @author ddj 2026年08月28号\n * @param path 文件路径\n */\n const restoreViewState = (path) => {\n const ed = editorRef.current\n if (!ed || !path) return\n const saved = viewStatesRef.current[path]\n if (!saved) return\n const next = Object.assign({}, viewStatesRef.current)\n delete next[path]\n viewStatesRef.current = next\n try { ed.restoreViewState(saved) } catch (e) { /* 恢复失败忽略(行号越界自动兜底) */ }\n }\n\n const closeTab = (path) => {\n flushSave()\n if (path === active) saveViewState(path)\n setTabs((prev) => {\n const idx = prev.findIndex((t) => t.path === path)\n if (idx < 0) return prev\n const next = prev.filter((t) => t.path !== path)\n if (active === path) setActive(next[idx] ? next[idx].path : (next[idx - 1] ? next[idx - 1].path : null))\n return next\n })\n }\n\n /**\n * 轮询去重:前后记录内容一致时返回原引用,React 跳过重渲染,\n * 阻断 5s 轮询 → memo 链 → diff 重渲染/日志 的空转。\n * @author ddj 2026年08月26号\n * @param prev 当前 records\n * @param next 轮询新结果\n * @returns 内容一致返回 true\n */\n const sameRecords = (prev, next) => {\n const pk = Object.keys(prev)\n const nk = Object.keys(next)\n if (pk.length !== nk.length) return false\n for (const k of pk) {\n if (!(k in next)) return false\n if (JSON.stringify(prev[k]) !== JSON.stringify(next[k])) return false\n }\n return true\n }\n\n const refreshRecords = (skipStale) => {\n if (!sessionId) return\n rpc('edrv.list', { sessionId, ...(skipStale ? { skipStale: true } : {}) }).then((res) => {\n if (!res || !res.ok || !Array.isArray(res.records)) return\n const map = {}\n for (const r of res.records) {\n if (r.archived === true) continue\n map[r.callId] = r\n }\n setRecords((prev) => (sameRecords(prev, map) ? prev : map))\n }).catch((e) => setError('list异常:' + String(e)))\n }\n\n /**\n * 加载文件内容(对齐 VSCode model 复用:会话内已打开的 model 直接秒显,\n * 后台静默 RPC 校验防陈旧;首次打开走原读取流程)。\n * @author ddj 2026年08月28号\n * @param path 文件路径\n * @param sid 会话 id\n * @param force 强制走 RPC(reloadFile 用,跳过 model 复用)\n */\n const loadContent = (path, sid, force) => {\n const seq = ++loadSeqRef.current\n const cachedModel = force ? null : modelsRef.current.get(path)\n if (cachedModel) {\n // model 命中:直接显示其内容(切 tab 零等待),后台静默校验\n setContent(cachedModel.getValue())\n setContentPath(path)\n setLoadStage((prev) => ({ progress: Math.max(84, prev.progress), message: '文件已读取,准备创建编辑器…' }))\n setStatus('已加载')\n rpc('edrv.read', { sessionId: sid, path }).then((res) => {\n if (seq !== loadSeqRef.current || path !== active) return\n if (res && res.ok && res.content !== cachedModel.getValue()) {\n saveViewState(path) // 内容更新前保留当前视图位置\n setContent(res.content)\n setStatus('已加载')\n }\n }).catch(() => { /* 校验失败保留缓存内容 */ })\n return\n }\n setLoadError(null)\n setLoadStage({ progress: monaco ? 72 : 12, message: '读取文件内容…' })\n rpc('edrv.read', { sessionId: sid, path }).then((res) => {\n if (seq !== loadSeqRef.current || path !== active) return\n if (res && res.ok) {\n setContent(res.content)\n setContentPath(path)\n setLoadStage((prev) => ({ progress: Math.max(84, prev.progress), message: '文件已读取,准备创建编辑器…' }))\n setStatus('已加载')\n } else {\n const message = res?.error ? String(res.error) : '读取失败'\n setLoadError(message)\n setError(message)\n setStatus('读取失败')\n }\n }).catch((e) => {\n if (seq !== loadSeqRef.current) return\n const message = 'read异常:' + String(e)\n setLoadError(message)\n setError(message)\n setStatus('读取失败')\n })\n }\n\n // 挂载轮询 + 事件订阅\n React.useEffect(() => {\n if (!sessionId) return\n refreshRecords()\n const t = setInterval(refreshRecords, 5000)\n const onRefresh = () => refreshRecords()\n window.addEventListener('edrv:refresh', onRefresh)\n return () => { clearInterval(t); window.removeEventListener('edrv:refresh', onRefresh) }\n }, [sessionId])\n\n React.useEffect(() => {\n const onOpen = (e) => {\n const p = e?.detail?.path\n if (!p) return\n if (e?.detail?.focusDiff === true) {\n pendingFocusRef.current = { path: p, region: null }\n setFocusRequest((value) => value + 1)\n }\n addTab(p, true)\n }\n const onShowLauncher = (event) => {\n const tab = event?.detail?.tab\n if (tab === 'pending' || tab === 'archive') setLauncherTab(tab)\n setLauncherOpen(true)\n }\n window.addEventListener('edrv:open-editor', onOpen)\n window.addEventListener('edrv:show-launcher', onShowLauncher)\n return () => {\n window.removeEventListener('edrv:open-editor', onOpen)\n window.removeEventListener('edrv:show-launcher', onShowLauncher)\n }\n }, [sessionId])\n\n // 对话输入区的唯一差异 dock 读取此会话快照;编辑器卸载时只清理自己的发布者令牌。\n const dockSourceRef = React.useRef({})\n React.useEffect(() => () => {\n clearDiffDock(sessionId, dockSourceRef.current)\n if (layout === 'side') setSidePending(sessionId, 0)\n }, [sessionId])\n\n // DSH composer 保持原生布局;编辑区只读取几何边界并同步自己的高度。\n // 侧栏形态:面板容器自带高度,跳过 composer 几何同步(面板内无会话滚动区)。\n React.useLayoutEffect(() => {\n if (layout === 'side') return\n const root = viewRootRef.current\n const scroll = root?.closest?.('[data-conversation-scroll]')\n if (!root || !scroll) return\n let seat = null\n let frame = null\n let resizeObserver = null\n const update = () => {\n frame = null\n const rootRect = root.getBoundingClientRect()\n const scrollRect = scroll.getBoundingClientRect()\n const seatRect = seat?.getBoundingClientRect?.()\n const height = editorHeight(rootRect.top, scrollRect.bottom, seatRect?.top)\n root.style.setProperty('--edrv-editor-height', height + 'px')\n }\n const scheduleUpdate = () => {\n if (frame !== null) return\n frame = requestAnimationFrame(update)\n }\n const attachSeat = () => {\n const next = scroll.querySelector?.('[data-composer-seat]')\n if (next === seat) {\n scheduleUpdate()\n return\n }\n resizeObserver?.disconnect()\n seat = next\n resizeObserver = null\n if (seat && typeof ResizeObserver === 'function') {\n resizeObserver = new ResizeObserver(scheduleUpdate)\n resizeObserver.observe(seat)\n }\n scheduleUpdate()\n }\n attachSeat()\n const mutationObserver = typeof MutationObserver === 'function'\n ? new MutationObserver(attachSeat)\n : null\n mutationObserver?.observe(scroll, { childList: true })\n const scrollObserver = typeof ResizeObserver === 'function' ? new ResizeObserver(scheduleUpdate) : null\n scrollObserver?.observe(scroll)\n window.addEventListener('resize', scheduleUpdate)\n scheduleUpdate()\n return () => {\n if (frame !== null) cancelAnimationFrame(frame)\n resizeObserver?.disconnect()\n scrollObserver?.disconnect()\n mutationObserver?.disconnect()\n window.removeEventListener('resize', scheduleUpdate)\n root.style.removeProperty('--edrv-editor-height')\n }\n }, [sessionId, layout])\n\n // localStorage v2 恢复页签\n React.useEffect(() => {\n if (bootRef.current || !sessionId) return\n bootRef.current = true\n viewStatesRef.current = viewStatesLoad(sessionId)\n try {\n const raw = localStorage.getItem('edrv.editor.v2.' + String(sessionId))\n if (raw) {\n const saved = JSON.parse(raw)\n if (Array.isArray(saved.tabs) && saved.tabs.length) {\n setTabs(saved.tabs.map((p) => ({ path: p })))\n if (typeof saved.active === 'string') setActive(saved.active)\n }\n }\n } catch (e) { /* 损坏忽略 */ }\n }, [sessionId])\n\n React.useEffect(() => {\n if (!sessionId) return\n try { localStorage.setItem('edrv.editor.v2.' + String(sessionId), JSON.stringify({ tabs: tabs.map((t) => t.path), active })) }\n catch (e) { /* 忽略 */ }\n }, [tabs, active, sessionId])\n\n // 侧边栏状态:恢复(显隐/宽度/激活面板);侧栏形态独立键(默认收起,不共享页签形态偏好)\n const sidebarKey = 'edrv.sidebar.' + (layout === 'side' ? 'side.' : '') + String(sessionId)\n React.useEffect(() => {\n if (!sessionId) return\n try {\n const raw = localStorage.getItem(sidebarKey)\n if (raw) {\n const saved = JSON.parse(raw)\n if (typeof saved.on === 'boolean') setSidebarOn(saved.on)\n if (typeof saved.width === 'number') setSidebarW(Math.max(180, Math.min(560, saved.width)))\n if (typeof saved.panel === 'string') setActivePanel(saved.panel)\n }\n } catch (e) { /* 损坏忽略 */ }\n }, [sessionId, sidebarKey])\n\n // 侧边栏状态持久化\n React.useEffect(() => {\n if (!sessionId) return\n try { localStorage.setItem(sidebarKey, JSON.stringify({ on: sidebarOn, width: sidebarW, panel: activePanel })) }\n catch (e) { /* 忽略 */ }\n }, [sidebarOn, sidebarW, activePanel, sessionId, sidebarKey])\n\n // Ctrl+B 切换侧边栏(capture 抢占,避免与 DSH 全局冲突)\n React.useEffect(() => {\n const onKey = (e) => {\n if ((e.ctrlKey || e.metaKey) && String(e.key).toLowerCase() === 'b') {\n e.preventDefault(); e.stopPropagation()\n setSidebarOn((v) => !v)\n }\n }\n window.addEventListener('keydown', onKey, true)\n return () => window.removeEventListener('keydown', onKey, true)\n }, [])\n\n // 文件 → 待处理差异数 映射(侧边栏角标)\n const pendingByPath = React.useMemo(() => {\n const out = {}\n for (const f of sum.files) if (f.pending > 0) out[f.path] = f.pending\n return out\n }, [sum])\n\n React.useEffect(() => {\n if (!active) return\n setContent(null)\n setContentPath(null)\n setLoadError(null)\n setLoadStage({ progress: 10, message: '准备读取文件…' })\n setStatus('加载中…')\n loadContent(active, sessionId)\n }, [active, sessionId])\n\n // Tab 右键菜单打开时 Esc 关闭\n React.useEffect(() => {\n if (!tabMenu) return\n const onKey = (e) => { if (e.key === 'Escape') dismissMenus() }\n window.addEventListener('keydown', onKey, true)\n return () => window.removeEventListener('keydown', onKey, true)\n }, [tabMenu])\n\n React.useEffect(() => {\n if (monaco || monacoErr) return\n let alive = true\n const onProgress = (stage) => {\n if (!alive) return\n const progress = stage.phase === 'ready' ? 70 : Math.round(10 + stage.progress * 0.6)\n setLoadStage((prev) => ({ progress: Math.max(prev.progress, progress), message: stage.message }))\n }\n loadMonaco(onProgress).then((m) => { if (alive) setMonaco(m) }).catch((e) => {\n if (alive) {\n setMonacoErr(String(e?.message ?? e))\n setStatus('Monaco 不可用')\n }\n })\n return () => { alive = false }\n }, [monaco, monacoErr])\n\n monacoRef.current = monaco\n\n const getModel = (path, text) => {\n const cache = modelsRef.current\n let model = cache.get(path)\n if (!model) {\n model = window.monaco.editor.createModel(text ?? '', langOf(path), window.monaco.Uri.parse('edrv:///' + encodeURI(path)))\n cache.set(path, model)\n } else if (text !== undefined && model.getValue() !== text) {\n programmaticRef.current = true\n model.setValue(text)\n programmaticRef.current = false\n }\n return model\n }\n\n const flushSave = () => {\n if (saveTimerRef.current) { saveTimerRef.current(); saveTimerRef.current = null }\n }\n\n const doSave = (silent) => {\n const ed = editorRef.current\n if (!active || !ed) return\n const text = ed.getValue()\n if (!silent) setStatus('保存中…')\n rpc('edrv.save', { sessionId, path: active, content: text }).then((res) => {\n if (res && res.ok) {\n setStatus('已保存 ' + new Date().toTimeString().slice(0, 8))\n setContent(text)\n setContentPath(active)\n setDirtyMap((d) => Object.assign({}, d, { [active]: false }))\n refreshRecords()\n emitRefresh()\n } else { setStatus('保存失败'); setError(res?.error ? String(res.error) : '保存失败') }\n }).catch((e) => { setStatus('保存失败'); setError('保存异常:' + String(e)) })\n }\n\n const onEdit = () => {\n const ed = editorRef.current\n if (!ed || !active) return\n setDirtyMap((d) => Object.assign({}, d, { [active]: true }))\n setStatus('编辑中…')\n if (saveTimerRef.current) saveTimerRef.current()\n saveTimerRef.current = schedule(() => doSave(true), 700)\n }\n\n // model 同步(当前内容)\n React.useEffect(() => {\n if (!monaco || !editorRef.current || !active || content === null) return\n const ed = editorRef.current\n const model = getModel(active, content)\n if (ed.getModel() !== model) ed.setModel(model)\n restoreViewState(active)\n setLoadStage((prev) => ({ progress: Math.max(96, prev.progress), message: '创建编辑器视图…' }))\n }, [monaco, active, content])\n\n // 行内差异自绘(decorations / view zones / minus overlay)→ diffRenderer\n React.useEffect(() => {\n if (!monaco || !editorRef.current || !active || content === null) return\n diffRendererRef.current.render(monaco, editorRef.current, pendingRegions, sessionId)\n setLoadStage({ progress: 100, message: '编辑器已就绪' })\n }, [monaco, active, content, pendingRegions])\n\n React.useEffect(() => () => {\n flushSave()\n saveViewState(active)\n diffRendererRef.current?.dispose?.()\n if (editorRef.current) { editorRef.current.dispose(); editorRef.current = null }\n for (const m of modelsRef.current.values()) m.dispose()\n modelsRef.current.clear()\n const root = editorRef.current && editorRef.current.getDomNode ? editorRef.current.getDomNode() : null\n if (root) {\n const ov = root.querySelector('.edrv-minus-overlay')\n if (ov) ov.remove()\n }\n }, [])\n\n // 普通 Monaco 编辑器(可编辑、单列行号)+ 自绘行内差异(decoration 绿底+ / view zone 删除块)\n const ensureEditor = React.useCallback((node) => {\n if (!node) {\n if (editorRef.current) { editorRef.current.dispose(); editorRef.current = null }\n return\n }\n if (editorRef.current || !monacoRef.current) return\n const m = monacoRef.current\n const side = layoutRef.current === 'side'\n const ed = m.editor.create(node, {\n value: '',\n language: 'plaintext',\n theme: 'vs',\n fontFamily: 'var(--ds-font-family-code, ui-monospace, monospace)',\n fontSize: 13,\n lineHeight: 20,\n minimap: { enabled: !side, scale: 1 },\n glyphMargin: true,\n lineDecorationsWidth: 16,\n automaticLayout: true,\n scrollBeyondLastLine: false,\n wordWrap: 'off',\n tabSize: 2,\n renderWhitespace: 'selection',\n smoothScrolling: true,\n cursorBlinking: 'smooth',\n padding: { top: side ? 6 : 8 },\n })\n ed.addCommand(m.KeyMod.CtrlCmd | m.KeyCode.KeyS, () => { flushSave(); doSave(false) })\n ed.onDidChangeModelContent(() => {\n if (!ed.getModel() || programmaticRef.current) return\n onEdit()\n })\n ed.onDidChangeCursorPosition((e) => {\n setCursor('Ln ' + e.position.lineNumber + ', Col ' + e.position.column)\n })\n // 编辑区右键 → 注入 Monaco 原生 context menu(与 Go to Definition 等同菜单,避免分离浮层)。\n // 有选区时额外显示「选中内容」项:context key edrvSelection 由光标选区变化驱动。\n // 路径/选区在点击时从 model/editor 实时读取(不依赖闭包里的过期 active)。\n const menuHandlers = () => menuHandlersRef.current\n const pathOf = (edx) => {\n const model = edx?.getModel?.()\n const uriPath = model?.uri?.path\n return uriPath ? decodeURIComponent(String(uriPath).replace(/^\\//, '')) : null\n }\n const selectionOf = (edx) => {\n const s = edx?.getSelection?.()\n if (!s) return null\n if (s.startLineNumber === s.endLineNumber && s.startColumn === s.endColumn) return null\n return { startLine: s.startLineNumber, endLine: s.endLineNumber }\n }\n const selKey = ed.createContextKey('edrvSelection', false)\n ed.onDidChangeCursorSelection((e) => {\n const s = e?.selection\n selKey.set(!!(s && (s.startLineNumber !== s.endLineNumber || s.startColumn !== s.endColumn)))\n })\n ed.addAction({\n id: 'edrv.addFileRef', label: '添加文件到对话', contextMenuGroupId: '1_edrv',\n precondition: 'editorTextFocus',\n run: (edx) => menuHandlers()?.addRefToChat(pathOf(edx)),\n })\n ed.addAction({\n id: 'edrv.addSelectionRef', label: '添加选中内容为引用', contextMenuGroupId: '1_edrv',\n precondition: 'edrvSelection',\n run: (edx) => {\n const s = selectionOf(edx)\n const p = pathOf(edx)\n if (s && p) menuHandlers()?.addRefToChat(p, { startLine: s.startLine, endLine: s.endLine })\n },\n })\n // 在 OS 文件浏览器中打开/定位当前活动文件(与文件管理栏右键菜单同源能力)。\n ed.addAction({\n id: 'edrv.revealInExplorer', label: '在文件浏览器中打开', contextMenuGroupId: '1_edrv',\n precondition: 'editorTextFocus',\n run: (edx) => menuHandlers()?.openInExplorer(pathOf(edx)),\n })\n // hover 差异块 → 浮出 Keep/Undo(req:鼠标移到编辑区差异块时显示)\n // 防闪烁:① 区域不变不 setState(浮窗锚定差异块起始行,不跟随鼠标);② 延迟隐藏;\n // ③ 浮窗自身 onMouseEnter 取消隐藏计时(鼠标在浮窗与编辑器间移动不闪)。\n const hideSoon = () => {\n if (hoverEditorRef.current || hoverPanelRef.current || hideTimerRef.current) return\n hideTimerRef.current = setTimeout(() => {\n hideTimerRef.current = null\n if (hoverEditorRef.current || hoverPanelRef.current) return\n hoverKeyRef.current = null\n hoverTopRef.current = null\n setHoverAct(null)\n }, 180)\n }\n ed.onMouseMove((e) => {\n hoverEditorRef.current = true\n const line = e?.target?.position?.lineNumber\n const map = lineRegionMapRef.current\n if (!line || !map.size) { hoverEditorRef.current = false; hideSoon(); return }\n const hit = map.get(line)\n if (!hit) { hoverEditorRef.current = false; hideSoon(); return }\n const key = callIdAttr(hit.callId, hit.idx)\n const top = Math.max(0, ed.getTopForLineNumber(Math.max(1, hit.start)) - ed.getScrollTop())\n const layout = ed.getLayoutInfo()\n const minimapLeft = layout.minimap?.minimapLeft || 0\n const right = minimapLeft > 0 ? Math.max(12, layout.width - minimapLeft + 8) : Math.max(12, layout.verticalScrollbarWidth + 8)\n if (hoverKeyRef.current === key && hoverTopRef.current === top && hoverRightRef.current === right) return // 同区域同位置不重复更新\n hoverKeyRef.current = key\n hoverTopRef.current = top\n hoverRightRef.current = right\n if (hideTimerRef.current) { clearTimeout(hideTimerRef.current); hideTimerRef.current = null }\n setHoverAct({ region: hit, top, right })\n })\n editorRef.current = ed\n }, [])\n\n // 打开文件后的差异聚焦跳转(内容/差异就绪后执行一次)\n React.useEffect(() => {\n const pf = pendingFocusRef.current\n if (!pf || pf.path !== active || content === null) return\n const target = pf.region || pendingRegions[0]\n const ed = editorRef.current\n if (!target || !ed) return\n pendingFocusRef.current = null\n ed.revealLineInCenter(Math.max(1, target.start ?? 1))\n ed.setPosition({ lineNumber: Math.max(1, target.start ?? 1), column: 1 })\n ed.focus()\n }, [active, content, pendingRegions, focusRequest])\n\n const jumpTo = (region) => {\n if (editorRef.current) {\n editorRef.current.revealLineInCenter(Math.max(1, region?.start ?? 1))\n editorRef.current.setPosition({ lineNumber: Math.max(1, region?.start ?? 1), column: 1 })\n editorRef.current.focus()\n } else {\n pendingFocusRef.current = { path: active, region }\n }\n }\n\n // 索引校正:差异/文件被处理后 pending 列表变化,clamp 到有效范围\n React.useEffect(() => {\n if (diffIdx >= pendingRegions.length && pendingRegions.length > 0) setDiffIdx(pendingRegions.length - 1)\n else if (pendingRegions.length === 0) setDiffIdx(0)\n }, [pendingRegions.length])\n React.useEffect(() => {\n const i = sum.pendingFiles.findIndex((f) => f.path === active)\n if (i >= 0) { if (i !== fileIdx) setFileIdx(i) }\n }, [sum.pendingFiles, active])\n\n // 上下箭头:当前文件内差异切换(x/x)\n const gotoDiff = (delta) => {\n if (!pendingRegions.length) return\n const next = (diffIdx + delta + pendingRegions.length) % pendingRegions.length\n setDiffIdx(next)\n jumpTo(pendingRegions[next])\n }\n // 左右箭头:全局差异文件切换(x/x 文件),打开并跳转\n const gotoFile = (delta) => {\n if (!sum.pendingFiles.length) return\n const next = (fileIdx + delta + sum.pendingFiles.length) % sum.pendingFiles.length\n setFileIdx(next)\n openFile(sum.pendingFiles[next].path, true)\n }\n\n const openNextFile = () => {\n if (!sum.pendingFiles.length) return\n if (sum.pendingFiles.some((file) => file.path === active)) gotoFile(1)\n else openFile(sum.pendingFiles[0].path, true)\n }\n\n const reloadFile = (skipStale) => {\n if (!active) return\n loadContent(active, sessionId, true)\n refreshRecords(skipStale === true)\n }\n\n /**\n * 关闭当前差异浮窗并清理 hover 锚点。\n * @author ddj 2026年08月21号\n */\n const dismissHover = () => {\n hoverKeyRef.current = null\n hoverTopRef.current = null\n hoverRightRef.current = null\n hoverEditorRef.current = false\n hoverPanelRef.current = false\n if (hideTimerRef.current) { clearTimeout(hideTimerRef.current); hideTimerRef.current = null }\n setHoverAct(null)\n }\n\n /**\n * 对单个差异区域执行采纳/不采纳。\n * @author ddj 2026年08月20号\n * @param region 差异区域(callId/idx/create)\n * @param reject true=不采纳(回滚),false=采纳\n * @param silent 批量时抑制中间 reload/报错,由批量方统一收尾\n * @returns Promise<boolean> 是否成功\n */\n const actHunk = (region, reject, silent) => {\n const method = reject ? 'edrv.reject' : 'edrv.accept'\n return rpc(method, { sessionId, callId: region.callId, scope: region.create ? 'call' : 'hunk', hunkIndex: region.idx }).then((res) => {\n if (res && res.ok) {\n setRecords((prev) => Object.assign({}, prev, { [region.callId]: res.record }))\n if (!silent) { reloadFile(); emitRefresh() }\n return true\n }\n if (!silent) setError(res?.error ? String(res.error) : '操作失败')\n return false\n }).catch((e) => {\n if (!silent) setError('操作异常:' + String(e))\n return false\n })\n }\n\n /**\n * 批量采纳/不采纳:一次 RPC 处理多个差异(Keep 整文件 / Keep All / Undo All)。\n * 单次 setRecords 合并全部结果,避免逐条往返读写整个 sidecar。\n * @author ddj 2026年08月25号\n * @param items 决策项数组(callId/scope/hunkIndex/decision)\n * @returns Promise<{ok:number; fail:number}> 成功/失败计数\n */\n const actMany = (items) => {\n if (!items.length) return Promise.resolve({ ok: 0, fail: 0 })\n return rpc('edrv.decideBatch', { sessionId, items }).then((res) => {\n if (!res || !res.ok || !Array.isArray(res.results)) {\n setError(res?.error ? String(res.error) : '批量处理失败')\n return { ok: 0, fail: items.length }\n }\n let ok = 0\n let fail = 0\n const next = {}\n for (const item of res.results) {\n if (item && item.ok) {\n ok++\n if (item.record) next[item.callId] = item.record\n } else {\n fail++\n }\n }\n setRecords((prev) => Object.assign({}, prev, next))\n return { ok, fail }\n }).catch((e) => {\n setError('批量处理异常:' + String(e))\n return { ok: 0, fail: items.length }\n })\n }\n\n /**\n * 决策项构造(与单条 actHunk 的 scope 语义一致:create 记录走 call 作用域)。\n * @author ddj 2026年08月25号\n * @param r 差异区域/待处理项(callId/idx/create)\n * @param reject true=不采纳\n * @returns decideBatch items 元素\n */\n const itemOf = (r, reject) => ({ callId: r.callId, scope: r.create ? 'call' : 'hunk', hunkIndex: r.idx, decision: reject ? 'rejected' : 'accepted' })\n\n const acceptFile = () => {\n actMany(pendingRegions.map((r) => itemOf(r, false))).then(({ ok, fail }) => {\n reloadFile(true)\n emitRefresh()\n setStatus('已采纳 ' + ok + ' 处差异' + (fail ? ',' + fail + ' 处失败' : ''))\n if (fail) setError(fail + ' 处差异处理失败(可能已被后续修改影响),可刷新后重试')\n })\n }\n const undoFile = () => {\n actMany([...pendingRegions].reverse().map((r) => itemOf(r, true))).then(({ ok, fail }) => {\n reloadFile(true)\n emitRefresh()\n setStatus('已不采纳 ' + ok + ' 处差异' + (fail ? ',' + fail + ' 处失败' : ''))\n if (fail) setError(fail + ' 处差异处理失败(可能已被后续修改影响),可刷新后重试')\n })\n }\n\n // 所有差异文件的待处理 hunk 列表(二级菜单 Keep All / Undo All 用)\n const allPending = React.useMemo(() => {\n const out = []\n for (const rec of Object.values(records)) {\n if (rec.superseded === true) continue\n const perHunk = Array.isArray(rec.decisions?.perHunk) ? rec.decisions.perHunk : []\n const hunks = Array.isArray(rec.hunks) ? rec.hunks : []\n for (let i = 0; i < hunks.length; i++) {\n const st = perHunk.length ? perHunk[i] : rec.decisions.call\n if (st === 'pending' && !noopHunk(rec, hunks[i])) out.push({ callId: rec.callId, idx: i, create: rec.create === true, at: rec.at })\n }\n }\n return out\n }, [records])\n\n /**\n * 批量处理所有差异文件:采纳全部 / 不采纳全部。不采纳按 at 降序(新改先回滚)排序后一次 RPC。\n * @author ddj 2026年08月20号\n * @param reject true=全部不采纳(回滚),false=全部采纳\n */\n const actAllPending = (reject) => {\n if (batchBusyRef.current || !allPending.length) return\n batchBusyRef.current = true\n const list = reject ? [...allPending].sort((a, b) => (a.at < b.at ? 1 : a.at > b.at ? -1 : b.idx - a.idx)) : allPending\n actMany(list.map((r) => itemOf(r, reject))).then(({ ok, fail }) => {\n batchBusyRef.current = false\n reloadFile(true)\n emitRefresh()\n setStatus((reject ? '已不采纳 ' : '已采纳 ') + ok + ' 处差异' + (fail ? ',' + fail + ' 处失败' : ''))\n if (fail) setError(fail + ' 处差异处理失败(可能已被后续修改影响),可刷新后重试')\n }).catch(() => { batchBusyRef.current = false })\n }\n const acceptAllFiles = () => actAllPending(false)\n const undoAllFiles = () => actAllPending(true)\n const rollbackFile = () => {\n if (!active) return\n if (!window.confirm('回滚当前文件到修改前状态?(相关差异将归档)')) return\n rpc('edrv.rollback', { sessionId, path: active }).then((res) => {\n if (res && res.ok) {\n setStatus('已回滚'); reloadFile()\n emitRefresh()\n } else setError(res?.error ? String(res.error) : '回滚失败')\n }).catch((e) => setError('回滚异常:' + String(e)))\n }\n\n /**\n * 关闭 Tab 右键菜单。\n * @author ddj 2026年08月25号\n */\n const dismissMenus = () => {\n setTabMenu(null)\n }\n\n /** 把「添加到对话」返回状态映射为状态栏文案。\n * @author ddj 2026年08月25号 */\n const statusOfAdd = (outcome, okText) => {\n if (outcome === 'ok') return okText\n if (outcome === 'busy') return okText + '(输入框忙,已降级纯文本)'\n return '无法添加到对话(无会话或输入框不可用)'\n }\n\n /** 添加文件/选中区引用到对话(异步,状态栏反馈)。 */\n const addRefToChat = (path, range) => {\n if (!path) { setStatus('无活动文件'); return }\n if (!addToConversation) { setStatus('添加到对话不可用'); return }\n addToConversation.appendReference(sessionId, path, range).then((o) => setStatus(statusOfAdd(o, '已添加文件引用')))\n }\n\n /**\n * 在 OS 文件浏览器中打开/定位路径(Monaco 右键菜单用,状态栏反馈)。\n * @author ddj 2026年08月27号\n * @param path 工作区相对路径(可能为 null)\n */\n const openInExplorer = (path) => {\n if (!path) { setStatus('无活动文件'); return }\n if (!sessionId) { setStatus('无活动会话'); return }\n setStatus('正在打开文件浏览器…')\n revealPathInExplorer(sessionId, path).then((outcome) => {\n setStatus(outcome.ok ? '已在文件浏览器中打开' : '打开失败')\n if (!outcome.ok && outcome.error) setError(outcome.error)\n })\n }\n\n // 供 Monaco 原生右键菜单 addAction 读取的最新动作闭包(空依赖回调不随渲染重建)\n menuHandlersRef.current = { addRefToChat, openInExplorer }\n\n const openFile = (path, focusDiff) => {\n if (!path) return\n addTab(path, true)\n if (focusDiff) pendingFocusRef.current = { path, region: null }\n }\n\n const openPath = () => {\n const p = (pathDraft || '').trim()\n if (!p) return\n setStatus('打开中…')\n rpc('edrv.read', { sessionId, path: p }).then((res) => {\n if (res && res.ok) {\n openFile(p, false)\n setOpenInput(false); setPathDraft(''); setStatus('已打开'); setError(null)\n } else { setStatus('打开失败'); setError(res?.error ? String(res.error) : '打开失败') }\n }).catch((e) => { setStatus('打开失败'); setError('打开异常:' + String(e)) })\n }\n\n const tabsEl = React.createElement('div', { className: 'edrv-tabs', style: { flex: '1 1 auto', minWidth: 0 } },\n tabs.map((t) => React.createElement('div', {\n key: t.path,\n className: 'edrv-tab' + (t.path === active ? ' edrv-tab-active' : ''),\n title: t.path,\n onClick: () => { if (t.path !== active) { flushSave(); saveViewState(active); setActive(t.path) } },\n onContextMenu: (e) => {\n e.preventDefault()\n e.stopPropagation()\n setTabMenu({ x: e.clientX, y: e.clientY, path: t.path })\n },\n },\n React.createElement('span', { style: { overflow: 'hidden', textOverflow: 'ellipsis', maxWidth: 180 } }, t.path.split(/[\\\\/]/).pop() || t.path),\n (dirtyMap[t.path] ? React.createElement('span', { className: 'edrv-tab-dot' }) : null),\n React.createElement('span', { className: 'edrv-tab-x', onClick: (e) => { e.stopPropagation(); closeTab(t.path) } }, '×'))),\n (openInput\n ? React.createElement('input', { className: 'edrv-path-input', autoFocus: true, placeholder: '输入工作区相对/绝对路径,回车打开', value: pathDraft, onChange: (e) => setPathDraft(e.target.value), onKeyDown: (e) => { if (e.key === 'Enter') openPath(); if (e.key === 'Escape') setOpenInput(false) } })\n : React.createElement('button', { className: 'edrv-tab-add', title: '打开文件(输入路径)', onClick: () => setOpenInput(true) }, '+')))\n\n const pathBar = React.createElement('div', { className: 'edrv-pathbar', title: active || '' },\n React.createElement('span', { className: 'edrv-pb-name' }, active ? String(active).split(/[\\\\/]/).pop() : '未打开文件'),\n React.createElement('span', { className: 'edrv-pb-full' }, active || '使用右上搜索框 (Ctrl+P) 打开文件'),\n (active && langOf(active) ? React.createElement('span', { className: 'edrv-pb-meta' }, langOf(active)) : null),\n (cursor ? React.createElement('span', { className: 'edrv-pb-meta' }, cursor) : null),\n (status ? React.createElement('span', { className: 'edrv-pb-meta edrv-pb-status' }, status) : null))\n\n const tabRow = React.createElement('div', { style: { display: 'flex', alignItems: 'center', background: 'var(--dsw-alias-bg-layer-1,transparent)', flexShrink: 0 } },\n tabsEl,\n (sum.totalFiles > 0\n ? React.createElement('button', { className: 'edrv-diffchip', title: '打开差异总览/归档', onClick: () => setLauncherOpen((o) => !o) }, '⚠ 差异 ' + sum.totalFiles + ' 文件')\n : null),\n React.createElement('button', { className: 'edrv-chip-btn' + (sidebarOn ? ' edrv-chip-on' : ''), title: '切换侧边栏 (Ctrl+B)', onClick: () => setSidebarOn((v) => !v) }, '☰'),\n React.createElement('button', { className: 'edrv-chip-btn', title: '刷新', onClick: reloadFile }, '⟳'),\n React.createElement(QuickOpen, { sessionId, onOpen: (p) => openFile(p, false) }))\n\n const otherFiles = sum.pendingFiles.filter((f) => f.path !== active)\n\n /**\n * 渲染编辑器/文件加载进度面板。\n * @author ddj 2026年08月22号\n * @param message 当前加载阶段\n * @param progress 阶段进度\n * @param retry 可选重试回调\n * @returns 加载面板 React 元素\n */\n const loadingBody = (message, progress, retry) => React.createElement('div', { className: 'edrv-empty edrv-loading', 'aria-live': 'polite' },\n React.createElement('div', { className: 'edrv-loading-title' }, message),\n React.createElement('div', {\n className: 'edrv-progress',\n role: 'progressbar',\n 'aria-label': '编辑器加载进度',\n 'aria-valuemin': 0,\n 'aria-valuemax': 100,\n 'aria-valuenow': progress,\n }, React.createElement('div', { className: 'edrv-progress-value', style: { width: Math.max(0, Math.min(100, progress)) + '%' } })),\n React.createElement('div', { className: 'edrv-loading-percent' }, Math.round(progress) + '%'),\n retry ? React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', onClick: retry }, '重试') : null)\n\n let body\n if (!monaco && !monacoErr) {\n body = loadingBody(loadStage.message, loadStage.progress)\n } else if (monacoErr) {\n body = React.createElement('div', { className: 'edrv-empty' },\n React.createElement('div', null, 'Monaco 编辑器加载失败:' + String(monacoErr)),\n React.createElement('div', { style: { fontSize: 11 } }, '请确认插件包 assets/vendor/monaco 完整(/edrv/vendor 路由可达)'),\n React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', onClick: () => { setMonacoErr(null); setLoadStage({ progress: 0, message: '准备重试 Monaco…' }) } }, '重试'))\n } else if (!active) {\n body = React.createElement('div', { className: 'edrv-empty' },\n React.createElement('div', null, '暂无打开的文件'),\n React.createElement('div', { style: { fontSize: 12 } }, '使用右上搜索框 (Ctrl+P) 打开工作区文件;agent 修改文件后顶部会出现差异角标'))\n } else if (content === null && loadError) {\n body = loadingBody('文件加载失败:' + loadError, 0, () => {\n setLoadError(null)\n setContent(null)\n setContentPath(null)\n setLoadStage({ progress: 10, message: '重新读取文件…' })\n loadContent(active, sessionId)\n })\n } else if (content === null) {\n body = loadingBody(loadStage.message || '读取文件内容…', loadStage.progress)\n } else {\n body = React.createElement('div', { className: 'edrv-monaco-host' },\n React.createElement('div', { ref: ensureEditor }))\n }\n\n const hoverEl = (hoverAct && !launcherOpen)\n ? React.createElement('div', {\n className: 'edrv-hoveract',\n style: { top: hoverAct.top, right: hoverAct.right ?? 12 },\n onMouseEnter: () => { hoverPanelRef.current = true; if (hideTimerRef.current) { clearTimeout(hideTimerRef.current); hideTimerRef.current = null } },\n onMouseMove: () => { hoverPanelRef.current = true; if (hideTimerRef.current) { clearTimeout(hideTimerRef.current); hideTimerRef.current = null } },\n onMouseLeave: () => {\n hoverPanelRef.current = false\n if (hoverEditorRef.current || hideTimerRef.current) return\n hideTimerRef.current = setTimeout(() => {\n hideTimerRef.current = null\n if (hoverEditorRef.current || hoverPanelRef.current) return\n hoverKeyRef.current = null\n hoverTopRef.current = null\n setHoverAct(null)\n }, 420)\n },\n },\n React.createElement('button', { className: 'edrv-pill edrv-pill-keep', onClick: () => { dismissHover(); actHunk(hoverAct.region, false) } }, '✓ Keep'),\n React.createElement('button', { className: 'edrv-pill edrv-pill-undo', onClick: () => { dismissHover(); actHunk(hoverAct.region, true) } }, '↩ Undo'))\n : null\n\n /** 组装差异 dock 快照(发布给 conversation.input.dock 的唯一 DiffBox 实例)。 */\n const buildDockSnapshot = () => ({\n mode: editorDockMode(active),\n pendingRegions,\n staleRegions,\n onAct: actHunk,\n onAcceptFile: acceptFile,\n onUndoFile: undoFile,\n onAcceptAllFiles: acceptAllFiles,\n onUndoAllFiles: undoAllFiles,\n allPendingCount: allPending.length,\n onRollback: rollbackFile,\n onJump: jumpTo,\n otherFiles,\n onOpenOther: (path) => openFile(path, true),\n onOpenLauncher: (tab) => { setLauncherTab(tab || 'pending'); setLauncherOpen(true) },\n onRefresh: reloadFile,\n activePath: active,\n diffIdx: contentReady ? diffIdx : 0,\n diffTotal: displayDiffTotal(contentReady, pendingRegions.length, sum.files.find((file) => file.path === active)?.pending ?? 0),\n fileIdx,\n fileTotal: sum.pendingFiles.length,\n onPrevDiff: () => gotoDiff(-1),\n onNextDiff: () => gotoDiff(1),\n onPrevFile: () => gotoFile(-1),\n onNextFile: () => gotoFile(1),\n onOpenNextFile: openNextFile,\n })\n\n React.useEffect(() => {\n if (!sessionId) return\n publishDiffDock(sessionId, buildDockSnapshot(), dockSourceRef.current)\n // 侧栏形态同步 Tab 角标计数(仅本形态写入;页签形态清零避免残留)\n if (layout === 'side') setSidePending(sessionId, sum.totalFiles)\n else setSidePending(sessionId, 0)\n })\n\n const overlay = launcherOpen\n ? React.createElement(React.Fragment, null,\n React.createElement('div', { style: { position: 'fixed', inset: 0, zIndex: 30 }, onClick: () => setLauncherOpen(false) }),\n React.createElement(DiffLauncher, { sessionId, sum, tab: launcherTab, onClose: () => setLauncherOpen(false), onOpenFile: (p) => { openFile(p, true); setLauncherOpen(false) } }))\n : null\n\n // Tab 右键菜单浮层:全屏遮罩(点击/右键关闭)+ 菜单(固定定位,clamp 防越界)。\n // 编辑区右键走 Monaco 原生 context menu(editor.addAction),不在此渲染浮层。\n /**\n * 计算右键菜单固定定位(clamp 防越出视口)。\n * @author ddj 2026年08月25号\n */\n const menuPos = (x, y) => ({\n left: Math.max(4, Math.min(x, (window.innerWidth || 800) - 224)),\n top: Math.max(4, Math.min(y, (window.innerHeight || 600) - 176)),\n })\n const menuBackdrop = tabMenu\n ? React.createElement('div', {\n style: { position: 'fixed', inset: 0, zIndex: 70 },\n onClick: dismissMenus,\n onContextMenu: (e) => { e.preventDefault(); dismissMenus() },\n })\n : null\n const tabMenuEl = tabMenu\n ? React.createElement('div', { className: 'edrv-ctxmenu', style: menuPos(tabMenu.x, tabMenu.y) },\n React.createElement('button', { className: 'edrv-ctxmenu-item', onClick: () => { addRefToChat(tabMenu.path); dismissMenus() } }, '添加文件到对话'),\n React.createElement('div', { className: 'edrv-ctxmenu-sep' }),\n React.createElement('button', { className: 'edrv-ctxmenu-item edrv-ctxmenu-danger', onClick: () => { closeTab(tabMenu.path); dismissMenus() } }, '关闭标签页'))\n : null\n\n const sidebarPanels = props.sidebarPanels\n const sidebarCtx = {\n sessionId,\n openFile: (p) => openFile(p, false),\n activePath: active,\n pendingByPath,\n sum: { totalFiles: sum.totalFiles, files: sum.files },\n refreshRecords: () => refreshRecords(),\n editor: () => editorRef.current,\n outlineSources: props.outlineSources,\n fileMenuItems: props.fileMenuItems,\n notify: (message) => setStatus(message),\n }\n\n // 主编辑列(侧边栏右侧):pathBar + tabRow + 编辑/差异区(底部整条留给 DSH 对话输入栏)\n const editorArea = React.createElement('div', { className: 'edrv-editor-area' },\n body,\n hoverEl,\n overlay)\n // 侧边栏引导条(仅旧页签形态且未装 betterSidebar 时显示;可复制安装命令、可关闭)\n const dismissHint = () => {\n setHintDismissed(true)\n try { localStorage.setItem('edrv.side-hint-dismissed', '1') } catch (e) { /* 忽略 */ }\n }\n const copyInstallCmd = () => {\n if (navigator.clipboard?.writeText) navigator.clipboard.writeText(SIDEBAR_INSTALL_CMD).catch(() => {})\n }\n const sideHintEl = (layout === 'tab' && sideHint && !hintDismissed)\n ? React.createElement('div', { className: 'edrv-side-hint' },\n React.createElement('span', { className: 'edrv-side-hint-text' }, '安装 dsh-better-sidebar 后可启用侧边栏编辑(对话+编辑同屏):'),\n React.createElement('code', { className: 'edrv-side-hint-cmd' }, SIDEBAR_INSTALL_CMD),\n React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', title: '复制安装命令', onClick: copyInstallCmd }, '复制命令'),\n React.createElement('button', { className: 'edrv-side-hint-close', title: '关闭提示', 'aria-label': '关闭提示', onClick: dismissHint }, '×'))\n : null\n const mainCol = React.createElement('div', { className: 'edrv-main-col', style: { flex: 1, minWidth: 0, minHeight: 0, display: 'flex', flexDirection: 'column', overflow: 'hidden' } },\n pathBar,\n tabRow,\n sideHintEl,\n editorArea)\n // 编辑器根节点按 composer 顶部边界动态限高,底部对话区域继续由 DSH 原生渲染。\n // 侧栏形态由面板容器给高(100%),不做 composer 几何同步。\n const editorRow = React.createElement('div', { className: 'edrv-editor-row' },\n (sidebarOn && sidebarPanels\n ? React.createElement(SidebarView, {\n registry: sidebarPanels,\n ctx: sidebarCtx,\n activePanel,\n onActive: setActivePanel,\n width: sidebarW,\n onWidth: setSidebarW,\n onHide: () => setSidebarOn(false),\n })\n : null),\n mainCol)\n\n const baseStyle = { minHeight: 0, display: 'flex', flexDirection: 'column', background: 'var(--dsw-alias-bg-base,transparent)', overflow: 'hidden' }\n const rootEl = layout === 'side'\n ? React.createElement('div', { ref: viewRootRef, 'data-edrv-view': '1', 'data-edrv-layout': 'side', className: 'edrv-view-side', style: Object.assign({}, baseStyle, { height: '100%' }) },\n editorRow,\n menuBackdrop,\n tabMenuEl)\n : React.createElement('div', { ref: viewRootRef, 'data-edrv-view': '1', style: Object.assign({}, baseStyle, { height: 'var(--edrv-editor-height, 100%)', maxHeight: 'var(--edrv-editor-height, 100%)' }) },\n editorRow,\n menuBackdrop,\n tabMenuEl)\n return rootEl\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — DiffBadge:header 差异角标(仅工作区有差异时显示)。\n * 迁移自原 src/client/index.ts 的 DiffBadge,语义不改。\n * 作者 ddj 2026-08-20\n */\nimport React from 'react'\nimport { rpc } from '../rpc.js'\nimport { openEditorView, emitShowLauncher } from '../events.js'\nimport { summarize } from '../state/records.js'\n\n/**\n * 会话 header 差异角标:5s 轮询 edrv.list,有差异时显示数字徽章,点击打开编辑区并拉起 DiffLauncher。\n */\nexport function DiffBadge(props) {\n const sessionId = props?.sessionId\n const [summary, setSummary] = React.useState(null)\n const seq = React.useRef(0)\n\n const load = React.useCallback(() => {\n if (!sessionId) return\n const s = ++seq.current\n rpc('edrv.list', { sessionId }).then((res) => {\n if (s !== seq.current || !res || !res.ok || !Array.isArray(res.records)) return\n setSummary(summarize(res.records))\n }).catch(() => {})\n }, [sessionId])\n\n React.useEffect(() => {\n load()\n const t = setInterval(load, 5000)\n const onRefresh = () => load()\n window.addEventListener('edrv:refresh', onRefresh)\n return () => { clearInterval(t); window.removeEventListener('edrv:refresh', onRefresh) }\n }, [load])\n\n const n = summary?.totalFiles ?? 0\n if (!n) return null\n\n const click = () => {\n // 侧栏形态:带首个待处理文件路径(内容打开自动展开面板);旧形态行为不变\n openEditorView(summary?.pendingFiles?.[0]?.path ?? null)\n setTimeout(() => { emitShowLauncher() }, 120)\n }\n\n return React.createElement('button', {\n onClick: click,\n title: n + ' 个文件有差异,点击在编辑区查看',\n style: { position: 'relative', display: 'inline-flex', alignItems: 'center', justifyContent: 'center', width: 30, height: 30, padding: 0, background: 'transparent', border: 'none', borderRadius: 6, cursor: 'pointer' },\n },\n React.createElement('img', { src: '/edrv/assets/compare-select.png', alt: '差异', style: { width: 22, height: 22, display: 'block' } }),\n React.createElement('span', { style: { position: 'absolute', top: 1, right: 0, minWidth: 15, height: 15, padding: '0 3px', borderRadius: 8, background: 'var(--dsw-alias-state-warn-primary,#d97706)', color: '#fff', fontSize: 10, lineHeight: '15px', textAlign: 'center', fontWeight: 700, boxSizing: 'border-box' } }, String(n)))\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — DiffBox:每个文件底部紧凑差异条(per-file hunk + ⋮ 二级菜单)。\n * 迁移自原 src/client/index.ts 的 DiffBox,语义不改。\n * 作者 ddj 2026-08-20\n */\nimport React from 'react'\nimport { callIdAttr } from '../state/records.js'\nimport { diffDockText } from '../diffDock.js'\nimport { badgeOf } from './shared.js'\n\n/**\n * 折叠控制使用任务栏同尺寸的 chevron 轮廓,避免依赖未声明的运行时图标包。\n * @author ddj 2026年08月25号\n * @param open 是否已展开\n * @returns 14×14 的装饰性 chevron SVG\n */\nfunction chevronOf(open) {\n const path = open ? 'M3.25 5.25 7 9l3.75-3.75' : 'M3.25 8.75 7 5l3.75 3.75'\n return React.createElement('svg', {\n width: 14,\n height: 14,\n viewBox: '0 0 14 14',\n fill: 'none',\n 'aria-hidden': true,\n focusable: false,\n }, React.createElement('path', {\n d: path,\n stroke: 'currentColor',\n strokeWidth: 1.2,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n }))\n}\n\n/**\n * 差异条:当前文件内 diff 导航(↑↓←→)、Keep/Undo、展开 hunk 列表、⋮ 二级菜单\n * (Keep All / Undo All / 差异总览 / 归档 / 回滚 / 刷新)+ 其他差异文件小节。\n */\nexport function DiffBox(props) {\n const {\n pendingRegions = [], staleRegions = [], onAct, onAcceptFile, onUndoFile, onAcceptAllFiles, onUndoAllFiles,\n allPendingCount = 0, onRollback, onJump, otherFiles = [], onOpenOther, onOpenLauncher, onRefresh, activePath,\n diffIdx = 0, diffTotal = 0, fileIdx = 0, fileTotal = 0, onPrevDiff, onNextDiff, onPrevFile, onNextFile,\n mode = 'editor', onOpenNextFile, dock = false,\n } = props\n const [expanded, setExpanded] = React.useState(false)\n const [detailsOpen, setDetailsOpen] = React.useState(false)\n const detailsId = React.useId()\n const canAct = pendingRegions.length > 0\n\n const base = String(activePath || '').split(/[\\\\/]/).pop() || ''\n\n if (mode === 'chat' || mode === 'editor-empty') {\n return React.createElement('div', { className: 'edrv-diffbar edrv-diffbar-dock', 'data-edrv-diffbox': '1', 'data-edrv-diff-mode': mode },\n React.createElement('div', { className: 'edrv-diffbar-row edrv-diffbar-dock-row' },\n React.createElement('button', {\n type: 'button',\n className: 'edrv-diffbar-dock-button',\n title: '切换到下一个差异文件',\n 'aria-label': diffDockText(fileTotal),\n onClick: onOpenNextFile,\n }, diffDockText(fileTotal))))\n }\n\n let bodyEl = null\n if (expanded) {\n const rows = pendingRegions.map((r) => {\n const key = callIdAttr(r.callId, r.idx)\n return React.createElement('div', { key, className: 'edrv-diffrow', 'data-edrv-hunk': key, title: '跳转到 L' + (r.start ?? '?'), onClick: () => onJump(r) },\n React.createElement('span', { className: 'edrv-diffrow-l' }, 'L' + (r.start ?? '?') + '-' + (r.end ?? '?')),\n (r.oldLines.length ? React.createElement('span', { className: 'edrv-diffrow-o' }, '-' + r.oldLines.length) : null),\n (r.newLines.length ? React.createElement('span', { className: 'edrv-diffrow-n' }, '+' + r.newLines.length) : null),\n (r.create ? React.createElement('span', { className: 'edrv-diffrow-tag' }, '新建') : null),\n React.createElement('span', { style: { flex: 1 } }))\n })\n const stale = staleRegions.map((r) => React.createElement('div', { key: 'stale' + callIdAttr(r.callId, r.idx), className: 'edrv-diffrow edrv-diffrow-stale', title: '差异无法定位(文件可能已被手动修改)' },\n React.createElement('span', { className: 'edrv-diffrow-l' }, 'L' + (r.start ?? '?') + ' 无法定位'),\n React.createElement('span', { className: 'edrv-diffrow-tag' }, '冲突/需刷新'),\n React.createElement('span', { className: 'edrv-diffrow-tag' }, badgeOf(r.status))))\n let othersEl = null\n if (otherFiles.length) {\n othersEl = React.createElement('div', { className: 'edrv-diffbox-others' },\n React.createElement('span', { className: 'edrv-diffrow-tag' }, '其他差异文件 (' + otherFiles.length + '):'),\n otherFiles.map((f) => React.createElement('button', { key: f.path, className: 'edrv-diffrow-file', title: f.path, onClick: () => onOpenOther(f.path) },\n String(f.path).split(/[\\\\/]/).pop() + ' (' + f.pending + ')')))\n }\n bodyEl = React.createElement('div', { className: 'edrv-diffbar-body' }, ...rows, ...stale, othersEl)\n }\n\n const details = detailsOpen\n ? React.createElement('div', { className: 'edrv-diff-details', id: detailsId },\n React.createElement('button', { className: 'edrv-diffmenu-item', disabled: !allPendingCount, onClick: onAcceptAllFiles }, '✓ Keep All(全部文件采纳)'),\n React.createElement('button', { className: 'edrv-diffmenu-item danger', disabled: !allPendingCount, onClick: onUndoAllFiles }, '↩ Undo All(全部文件不采纳)'),\n React.createElement('div', { className: 'edrv-diffmenu-sep' }),\n React.createElement('button', { className: 'edrv-diffmenu-item', onClick: () => onOpenLauncher('pending') }, '🗂 差异总览'),\n React.createElement('button', { className: 'edrv-diffmenu-item', onClick: () => onOpenLauncher('archive') }, '📁 归档'),\n React.createElement('div', { className: 'edrv-diffmenu-sep' }),\n React.createElement('button', { className: 'edrv-diffmenu-item', disabled: !canAct, onClick: onRollback }, '⟲ 回滚文件'),\n React.createElement('button', { className: 'edrv-diffmenu-item', onClick: onRefresh }, '⟳ 刷新'))\n : null\n\n return React.createElement('div', { className: 'edrv-diffbar edrv-diffbar-dock', 'data-edrv-diffbox': '1', 'data-edrv-diff-mode': 'editor' },\n React.createElement('div', { className: 'edrv-diffbar-row edrv-diffbar-editor-row' },\n React.createElement('div', { className: 'edrv-diffbar-editor-content' },\n React.createElement('div', { className: 'edrv-diffbar-nav' },\n React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', title: '上一个差异', disabled: !canAct, onClick: onPrevDiff }, '↑'),\n React.createElement('span', { className: 'edrv-diffbar-count edrv-diffbar-progress', title: '当前文件内差异位置(点击展开/收起差异列表)', onClick: () => setExpanded((v) => !v) }, diffTotal ? (diffIdx + 1) + '/' + diffTotal : '0/0'),\n React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', title: '下一个差异', disabled: !canAct, onClick: onNextDiff }, '↓')),\n React.createElement('div', { className: 'edrv-diffbar-files' },\n React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', title: '上一个差异文件', disabled: !fileTotal, onClick: onPrevFile }, '←'),\n React.createElement('span', { className: 'edrv-diffbar-count edrv-count-file edrv-diffbar-progress', title: '差异文件位置' }, fileTotal ? (fileIdx + 1) + '/' + fileTotal + ' 文件' : '0/0 文件'),\n React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', title: '下一个差异文件', disabled: !fileTotal, onClick: onNextFile }, '→'),\n React.createElement('span', { className: 'edrv-diffbar-file edrv-diffbar-summary', title: activePath || '' }, base)),\n\n React.createElement('div', { className: 'edrv-diffbar-actions' },\n React.createElement('button', { className: 'edrv-pill edrv-pill-keep', title: '采纳当前文件的全部差异', disabled: !canAct, onClick: onAcceptFile }, '✓ Keep'),\n React.createElement('button', { className: 'edrv-pill edrv-pill-undo', title: '不采纳当前文件的全部差异(回滚)', disabled: !canAct, onClick: onUndoFile }, '↩ Undo'),\n React.createElement('button', {\n className: 'edrv-pill edrv-pill-ghost edrv-diff-details-toggle',\n title: detailsOpen ? '收起差异操作' : '展开差异操作',\n 'aria-label': detailsOpen ? '收起差异操作' : '展开差异操作',\n 'aria-expanded': detailsOpen,\n 'aria-controls': detailsId,\n onClick: () => setDetailsOpen((value) => !value),\n }, chevronOf(detailsOpen))))),\n bodyEl,\n details)\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — 会话级差异 dock。\n * conversation.input.dock 是唯一实例:普通对话显示摘要,文件编辑页显示完整操作条。\n * 作者 ddj 2026-08-26\n */\nimport React from 'react'\nimport { rpc } from '../rpc.js'\nimport { openDiffView } from '../events.js'\nimport { summarize } from '../state/records.js'\nimport { nextDiffPath } from '../diffDock.js'\nimport { readDiffDock, subscribeDiffDock } from '../diffDockStore.js'\nimport { DiffBox } from './DiffBox.js'\n\nconst nextIndexBySession = new Map()\n\n/**\n * 对话输入框上方的唯一差异 dock。\n * @author ddj 2026年08月26号\n * @param props DSH 注入的会话属性\n * @returns 差异 dock React 元素或 null\n */\nexport function ConversationDiffDock(props) {\n const sessionId = props?.sessionId\n const [summary, setSummary] = React.useState(null)\n const [, setStoreRevision] = React.useState(0)\n const seq = React.useRef(0)\n\n const load = React.useCallback(() => {\n if (!sessionId) return\n const current = ++seq.current\n rpc('edrv.list', { sessionId }).then((res) => {\n if (current !== seq.current || !res || !res.ok || !Array.isArray(res.records)) return\n setSummary(summarize(res.records))\n }).catch(() => {})\n }, [sessionId])\n\n React.useEffect(() => {\n load()\n const timer = setInterval(load, 5000)\n const onRefresh = () => load()\n window.addEventListener('edrv:refresh', onRefresh)\n return () => {\n clearInterval(timer)\n window.removeEventListener('edrv:refresh', onRefresh)\n }\n }, [load])\n\n React.useEffect(() => {\n if (!sessionId) return undefined\n const sync = () => setStoreRevision((value) => value + 1)\n sync()\n return subscribeDiffDock(sessionId, sync)\n }, [sessionId])\n\n const renderDock = (content, key) => React.createElement('div', {\n key,\n className: 'edrv-diff-dock-shell',\n 'data-edrv-diff-dock-shell': '1',\n }, content)\n\n const editorSnapshot = readDiffDock(sessionId)\n if (editorSnapshot) {\n if (editorSnapshot.mode === 'editor-empty' && !editorSnapshot.fileTotal) return null\n return renderDock(React.createElement(DiffBox, Object.assign({}, editorSnapshot, { dock: true })), sessionId)\n }\n\n if (!sessionId || !summary?.pendingFiles?.length) return null\n\n const paths = summary.pendingFiles.map((file) => file.path)\n const click = () => {\n const current = nextIndexBySession.get(sessionId) ?? 0\n const next = nextDiffPath(paths, current)\n nextIndexBySession.set(sessionId, next.index)\n if (next.path) openDiffView(next.path)\n }\n\n return renderDock(React.createElement(DiffBox, {\n mode: 'chat',\n dock: true,\n fileTotal: paths.length,\n onOpenNextFile: click,\n }), sessionId || 'chat')\n}\n","/**\n * dsh-vscode-mode client — 兼容层:设置桥选择 / slot 安全注册 / openPath 链式补丁 / 外部插件常量。\n * 纯逻辑与薄 ctx 胶水,node 环境可单测(不依赖 DOM)。\n * 作者 ddj 2026年08月24号\n */\n\n/** 本插件包名(与 host compat.PLUGIN_NAME 对应)。 */\nexport const PLUGIN_NAME = 'dsh-vscode-mode'\n/** 外部侧栏插件名(dsh-web-ui-all 家族的文件打开能力提供方)。 */\nexport const SIDEBAR_PLUGIN = 'dsh-better-sidebar'\n\n/** 设置 scope 的跨组件上下文形状(与官方 settingsScope 绑定的最小面)。 */\nexport interface SettingsScopeLike {\n getSnapshot: () => { status?: string; value?: { fileOpenTool?: unknown }; writable?: boolean }\n subscribe: (listener: () => void) => () => void\n set: (field: string, value: unknown) => Promise<void>\n}\n\n/**\n * 设置桥三级优先:webUiSettings(linxin666 兼容桥)→ settingsScope(官方)→ 无。\n * 桥绑定抛错时降级到下一级,不让单个桥异常拖垮设置装配。\n * @author ddj 2026年08月24号\n * @param ctx 客户端服务上下文\n * @returns 激活的桥名称与绑定 scope\n */\nexport function pickSettingsBinder(ctx: { get: (name: string) => unknown }): { service: string; scope: SettingsScopeLike | undefined } {\n for (const service of ['webUiSettings', 'settingsScope']) {\n try {\n const binder = ctx.get(service) as { bind?: (spec: { namespace: string }) => SettingsScopeLike } | undefined\n const scope = binder?.bind?.({ namespace: PLUGIN_NAME })\n if (scope) return { service, scope }\n } catch {\n /* 桥异常时降级到下一级 */\n }\n }\n return { service: 'none', scope: undefined }\n}\n\n/** slot 注册描述(对齐 ctx.slots.register 的形状)。 */\nexport interface SlotSpec {\n name: string\n id: string\n order?: number\n label?: string\n inject?: (sessionId: string) => object\n}\n\n/**\n * 跨版本 slot 安全注册:封装 ctx.slots.inject 等待声明模式(新老 DSH 通用),\n * 服务缺失或注册抛错时降级为警告,不让单条 slot 拖垮装配。\n * 注意:方法必须挂在服务对象上调用(slots.register 是依赖 this.records 的类方法,\n * 解构后 this 丢失会静默失败),故禁止解构。\n * @author ddj 2026年08月24号\n * @param ctx 客户端上下文(slots 服务)\n * @param spec slot 描述\n * @param render 渲染函数\n * @returns 注销函数(未注册返回 null;形态切换时用于卸载旧 slot)\n */\nexport function registerSlotSafely(ctx: { slots?: { inject?: (name: string, register: () => unknown) => unknown; register?: (...args: unknown[]) => unknown } }, spec: SlotSpec, render: (props: unknown) => unknown): (() => void) | null {\n const slots = ctx?.slots as { inject: (name: string, register: () => unknown) => unknown; register: (...args: unknown[]) => unknown } | undefined\n if (!slots || typeof slots.inject !== 'function' || typeof slots.register !== 'function') {\n console.warn('[' + PLUGIN_NAME + '] slots 服务不可用,跳过 slot ' + spec.name)\n return null\n }\n try {\n const disposer = slots.inject(spec.name, () => slots.register(spec, render))\n return typeof disposer === 'function' ? disposer as () => void : null\n } catch (error) {\n console.warn('[' + PLUGIN_NAME + '] slot ' + spec.name + ' 注册失败(' + String(error) + '),已跳过')\n return null\n }\n}\n\n/**\n * 链式补丁对象方法:保存原实现、装入包装实现,dispose 恢复。\n * 恢复带归属校验(仅当当前实现仍是本包装时还原),多插件补丁按栈序互不踩踏。\n * @author ddj 2026年08月24号\n * @param owner 目标对象\n * @param key 方法名\n * @param wrapper 包装实现(original 为补丁前的实现)\n * @returns 恢复函数(幂等)\n */\nexport function patchMethod<T extends object, K extends keyof T>(\n owner: T,\n key: K,\n wrapper: (original: T[K], ...args: never[]) => unknown,\n): () => void {\n const original = owner[key]\n const patched = ((...args: never[]) => wrapper(original, ...args)) as T[K]\n owner[key] = patched\n return () => {\n if (owner[key] === patched) owner[key] = original\n }\n}\n","/**\n * dsh-vscode-mode client — 文件打开器注册表与自动选择。\n * @author ddj 2026年08月24号\n */\nimport { SIDEBAR_PLUGIN } from './compat.js'\n\nexport const AUTO_OPEN_TOOL = 'auto'\nexport const SYSTEM_OPEN_TOOL = 'system'\nexport const VSCODE_OPEN_TOOL = 'dsh-vscode-mode'\nexport const SIDEBAR_OPEN_TOOL = SIDEBAR_PLUGIN\n\nexport interface FileOpenContext {\n sessionId?: string\n cwd?: string\n}\n\nexport interface FileOpener {\n id: string\n label: string\n description?: string\n priority?: number\n isAvailable?: () => boolean\n open: (path: string, context: FileOpenContext) => void | Promise<void>\n}\n\nexport interface FileOpenerRegistry {\n register(opener: FileOpener): () => void\n registerFileOpener(opener: FileOpener): () => void\n list(): readonly FileOpener[]\n subscribe(listener: () => void): () => void\n get(id: string): FileOpener | undefined\n}\n\n/**\n * 写入外部打开器并触发注册表通知。\n * @author ddj 2026年08月24号\n * @param entries 打开器存储\n * @param notify 变更通知\n * @param opener 打开器\n */\nfunction registryRegister(entries: Map<string, FileOpener>, notify: () => void, opener: FileOpener): void {\n if (!opener.id || typeof opener.open !== 'function') throw new TypeError('文件打开器必须提供 id 和 open')\n entries.set(opener.id, opener)\n notify()\n}\n\n/**\n * 创建生命周期独立的文件打开器注册表。\n * @author ddj 2026年08月24号\n * @returns 文件打开器注册表\n */\nexport function createFileOpenerRegistry(): FileOpenerRegistry {\n const entries = new Map<string, FileOpener>()\n const listeners = new Set<() => void>()\n const notify = (): void => {\n for (const listener of listeners) listener()\n }\n const list = (): readonly FileOpener[] => [...entries.values()].sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0))\n return {\n register(opener: FileOpener): () => void {\n registryRegister(entries, notify, opener)\n return () => {\n if (entries.get(opener.id) !== opener) return\n entries.delete(opener.id)\n notify()\n }\n },\n registerFileOpener(opener: FileOpener): () => void {\n registryRegister(entries, notify, opener)\n return () => {\n if (entries.get(opener.id) !== opener) return\n entries.delete(opener.id)\n notify()\n }\n },\n list,\n subscribe(listener: () => void): () => void {\n listeners.add(listener)\n return () => listeners.delete(listener)\n },\n get: (id: string) => entries.get(id),\n }\n}\n\n/**\n * 检查打开器当前是否可用。\n * @author ddj 2026年08月24号\n * @param opener 待检查打开器\n * @returns 是否可用\n */\nexport function isAvailable(opener: FileOpener): boolean {\n try {\n return opener.isAvailable ? opener.isAvailable() : true\n } catch {\n return false\n }\n}\n\n/**\n * 返回当前可展示的文件打开器。\n * @author ddj 2026年08月24号\n * @param registry 文件打开器注册表\n * @returns 可用打开器列表\n */\nexport function availableOpeners(registry: FileOpenerRegistry): FileOpener[] {\n return registry.list().filter(isAvailable)\n}\n\n/**\n * 按设置选择打开器,不可用时回退自动优先级。\n * @author ddj 2026年08月24号\n * @param registry 文件打开器注册表\n * @param selected 用户选择的打开器 id\n * @returns 选中的打开器\n */\nexport function selectOpener(\n registry: FileOpenerRegistry,\n selected: string,\n): FileOpener | undefined {\n if (selected !== AUTO_OPEN_TOOL) {\n const requested = registry.get(selected)\n if (requested && isAvailable(requested)) return requested\n }\n return availableOpeners(registry)[0]\n}\n\n/**\n * 结构化探测 dsh-better-sidebar 的文件打开能力。\n * @author ddj 2026年08月24号\n * @param ctx 客户端服务上下文\n * @returns 侧边栏打开器或 undefined\n */\nexport function scanSidebar(ctx: { get: (name: string) => unknown }): FileOpener | undefined {\n try {\n const service = ctx.get('betterSidebar') as {\n openFile?: (scope: { sessionId: string; cwd?: string }, path: string, title?: string) => void\n isTabEnabled?: (id: string) => boolean\n features?: readonly string[]\n getSnapshot?: () => { state?: unknown }\n } | undefined\n if (!service || typeof service.openFile !== 'function') return undefined\n const advertised = service.features?.includes('openFile') ?? true\n if (!advertised) return undefined\n const canOpen = typeof service.isTabEnabled !== 'function' || service.isTabEnabled('editor')\n if (!canOpen) return undefined\n return {\n id: SIDEBAR_OPEN_TOOL,\n label: 'dsh-better-sidebar',\n description: '在 dsh-web-ui-all 侧边栏编辑器中打开',\n priority: 80,\n isAvailable: () => typeof service.openFile === 'function'\n && (service.features?.includes('openFile') ?? true)\n && (typeof service.isTabEnabled !== 'function' || service.isTabEnabled('editor')),\n open: (path, context) => {\n if (!context.sessionId) throw new Error('当前没有活动会话')\n service.openFile!({ sessionId: context.sessionId, cwd: context.cwd }, path, baseName(path))\n },\n }\n } catch {\n return undefined\n }\n}\n\n/**\n * 从路径提取文件名。\n * @author ddj 2026年08月24号\n * @param path 文件路径\n * @returns 文件名\n */\nexport function baseName(path: string): string {\n const normalized = path.replace(/\\\\/g, '/')\n return normalized.slice(normalized.lastIndexOf('/') + 1) || path\n}\n","/**\n * dsh-vscode-mode client — 设置 scope 的跨组件上下文。\n * 绑定逻辑(webUiSettings 兼容桥 → 官方 settingsScope 降级)统一由 compat 层提供。\n * 作者 ddj 2026年08月24号\n */\nimport React from 'react'\nimport { pickSettingsBinder, type SettingsScopeLike } from './compat.js'\n\nexport type { SettingsScopeLike }\n\nexport const SettingsContext = React.createContext<SettingsScopeLike | undefined>(undefined)\n\n/**\n * 从 Cordis 服务绑定 VSCodeMode 设置 scope(兼容桥优先,官方次之)。\n * @author ddj 2026年08月24号\n * @param ctx 客户端服务上下文\n * @returns 设置 scope 或 undefined\n */\nexport function getSettingsScope(ctx: { get: (name: string) => unknown }): SettingsScopeLike | undefined {\n return pickSettingsBinder(ctx).scope\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — VSCodeMode 设置区内的 MCP 管理。\n * 子 Tab:我的 MCP(profile 全局)/ 项目 MCP(各项目 .mcp.json)/ MCP 市场(占位)。\n * 作者 ddj 2026年08月22号\n */\nimport React from 'react'\nimport { rpc } from '../rpc.js'\nimport type { MpcProject, MpcServer } from '../../shared/mcp.js'\nimport '../styles/mcp.css'\nimport { availableOpeners, AUTO_OPEN_TOOL } from '../fileOpeners.js'\nimport { SettingsContext } from '../settingsContext.js'\n\nconst EMPTY = { serverName: '', transport: 'stdio', command: '', args: '', cwd: '', url: '', headers: '' }\n\n/** 将表单草稿转换为 Host MCP 配置。 */\nfunction configOf(draft) {\n const config = { serverName: draft.serverName.trim(), transport: draft.transport }\n if (draft.transport === 'stdio') {\n config.command = draft.command.trim()\n config.args = draft.args.split(/\\r?\\n|\\s+/).filter(Boolean)\n if (draft.cwd.trim()) config.cwd = draft.cwd.trim()\n } else {\n config.url = draft.url.trim()\n config.headers = parsePairs(draft.headers)\n }\n return config\n}\n\n/** 解析每行 key=value 的表单字段。 */\nfunction parsePairs(text) {\n return Object.fromEntries(text.split(/\\r?\\n/).map((line) => line.trim()).filter(Boolean).map((line) => {\n const idx = line.indexOf('=')\n return idx > 0 ? [line.slice(0, idx).trim(), line.slice(idx + 1).trim()] : [line, '']\n }))\n}\n\n/** 服务状态文案。 */\nfunction statusOf(server) {\n return server.status === 'connected' ? '在线' : server.status === 'connecting' ? '连接中' : server.status === 'disabled' ? '已禁用' : '错误'\n}\n\n/** MCP 服务卡片(全局与项目共用)。 */\nfunction ServerCard({ server, onRefresh, onToggle, onRemove }) {\n return React.createElement('article', { className: 'vsm-mcp-card' },\n React.createElement('div', { className: 'vsm-mcp-card-head' },\n React.createElement('div', { className: 'vsm-mcp-title' }, React.createElement('span', { className: 'vsm-mcp-dot ' + (server.enabled ? server.status : 'disabled') }), server.serverName),\n React.createElement('div', { className: 'vsm-mcp-actions' },\n React.createElement('button', { onClick: () => onRefresh(server.id), title: '刷新连接' }, '↻'),\n React.createElement('button', { className: 'vsm-danger', onClick: () => onRemove(server.id), title: '删除 MCP' }, '⌫'),\n React.createElement('button', { className: 'vsm-switch ' + (server.enabled ? 'on' : ''), onClick: () => onToggle(server), 'aria-label': server.enabled ? '禁用' : '启用' }, server.enabled ? '●' : '○'),\n ),\n ),\n React.createElement('div', { className: 'vsm-mcp-meta' }, statusOf(server), ' · ', server.toolCount, ' 个工具 · ', server.transport),\n server.error && React.createElement('div', { className: 'vsm-mcp-error' }, server.error),\n React.createElement('div', { className: 'vsm-mcp-tools' }, server.tools.map((tool) => React.createElement('span', { key: tool.name, className: 'vsm-mcp-chip', title: tool.description || tool.name }, tool.name))),\n )\n}\n\n/** 按项目标题或路径过滤,大小写不敏感。 */\nexport function filterProjects(projects, query) {\n const needle = String(query ?? '').trim().toLowerCase()\n if (!needle) return projects\n return projects.filter((project) => `${project.title} ${project.workspacePath}`.toLowerCase().includes(needle))\n}\n\n/** 带搜索的项目组合框。 */\nfunction ProjectPicker({ projects, value, onChange }) {\n const [open, setOpen] = React.useState(false)\n const [query, setQuery] = React.useState('')\n const [highlight, setHighlight] = React.useState(0)\n const rootRef = React.useRef(null)\n const selected = projects.find((project) => project.workspacePath === value)\n const filtered = React.useMemo(() => filterProjects(projects, query), [projects, query])\n\n React.useEffect(() => {\n const close = (event) => {\n if (!rootRef.current?.contains(event.target)) setOpen(false)\n }\n document.addEventListener('mousedown', close)\n return () => document.removeEventListener('mousedown', close)\n }, [])\n\n const choose = (project) => {\n onChange(project.workspacePath)\n setQuery('')\n setOpen(false)\n }\n const move = (delta) => setHighlight((old) => Math.max(0, Math.min(Math.max(0, filtered.length - 1), old + delta)))\n const keyDown = (event) => {\n if (event.key === 'ArrowDown') { event.preventDefault(); move(1) }\n else if (event.key === 'ArrowUp') { event.preventDefault(); move(-1) }\n else if (event.key === 'Enter' && filtered[highlight]) { event.preventDefault(); choose(filtered[highlight]) }\n else if (event.key === 'Escape') { event.preventDefault(); setOpen(false) }\n }\n return React.createElement('div', { className: 'vsm-project-picker', ref: rootRef },\n React.createElement('button', { className: 'vsm-project-picker-trigger', role: 'combobox', 'aria-expanded': open, onClick: () => setOpen((old) => !old) },\n React.createElement('span', { className: 'vsm-project-picker-label' }, selected?.title || '选择项目', selected && React.createElement('small', null, selected.workspacePath)),\n React.createElement('span', { className: 'vsm-project-picker-arrow' }, open ? '⌃' : '⌄'),\n ),\n open && React.createElement('div', { className: 'vsm-project-picker-menu' },\n React.createElement('input', { autoFocus: true, className: 'vsm-project-picker-search', value: query, placeholder: '搜索项目名称或路径…', onChange: (event) => { setQuery(event.target.value); setHighlight(0) }, onKeyDown: keyDown }),\n React.createElement('div', { className: 'vsm-project-picker-options', role: 'listbox' }, filtered.length ? filtered.map((project, index) => React.createElement('button', { key: project.workspacePath, role: 'option', 'aria-selected': project.workspacePath === value, className: 'vsm-project-option ' + (index === highlight ? 'highlight' : '') + (project.workspacePath === value ? ' selected' : ''), onMouseEnter: () => setHighlight(index), onClick: () => choose(project) }, React.createElement('span', null, project.title), React.createElement('small', null, project.workspacePath, ' · ', project.servers.length, ' 个 MCP'))) : React.createElement('div', { className: 'vsm-project-picker-empty' }, '没有匹配的项目')),\n ),\n )\n}\n\n/** 单个项目的 MCP 分组。 */\nfunction ProjectGroup({ project, busy, onAdd, onRefresh, onToggle, onRemove }) {\n const head = React.createElement('div', { className: 'vsm-project-head' },\n React.createElement('div', { className: 'vsm-project-title' }, React.createElement('span', { className: 'vsm-project-icon' }, '▣'), React.createElement('div', null, React.createElement('span', { className: 'vsm-project-name' }, project.title), React.createElement('span', { className: 'vsm-project-path' }, project.workspacePath))),\n React.createElement('button', { className: 'vsm-primary vsm-small', onClick: () => onAdd(project) }, '+ 添加 MCP'),\n )\n let body\n if (project.missingDir) body = React.createElement('div', { className: 'vsm-project-empty' }, '项目目录已不存在,无法管理 MCP')\n else if (project.fileError) body = React.createElement('div', { className: 'vsm-mcp-error vsm-mcp-banner' }, project.fileError)\n else if (!project.servers.length) body = React.createElement('div', { className: 'vsm-project-empty' }, '此项目未配置 MCP')\n else body = project.servers.map((server) => React.createElement(ServerCard, { key: server.serverName, server, onRefresh: (id) => onRefresh(project, server, id), onToggle: () => onToggle(project, server), onRemove: (id) => onRemove(project, server, id) }))\n return React.createElement('section', { className: 'vsm-project' }, head, body)\n}\n\n/** 通用设置:选择当前对话文件链接的打开器 + 开发形态开关。 */\nfunction GeneralSettings({ registry }) {\n const [tool, setTool] = React.useState(AUTO_OPEN_TOOL)\n const [busy, setBusy] = React.useState(false)\n const [error, setError] = React.useState('')\n const [devForm, setDevForm] = React.useState(null)\n const [devBusy, setDevBusy] = React.useState(false)\n const [devMessage, setDevMessage] = React.useState('')\n const settings = React.useContext(SettingsContext)\n const snapshot = settings?.getSnapshot?.()\n const loading = !snapshot || snapshot.status === 'loading'\n const unavailable = snapshot?.status === 'unavailable' || !settings\n const notReady = snapshot?.status !== 'ready'\n React.useEffect(() => {\n const onChange = () => {\n const next = settings?.getSnapshot?.().value?.fileOpenTool\n if (typeof next === 'string') setTool(next)\n }\n onChange()\n return settings?.subscribe?.(onChange)\n }, [settings])\n React.useEffect(() => {\n rpc('vscode.devFormGet', {}).then((result) => {\n if (result.ok) setDevForm(result.devForm)\n }).catch(() => { /* 开发形态查询失败静默 */ })\n }, [])\n const save = (value) => {\n setTool(value); setBusy(true); setError('')\n if (!settings?.set) { setError('设置服务不可用'); setBusy(false); return }\n settings.set('fileOpenTool', value).catch((e) => setError(String(e))).finally(() => setBusy(false))\n }\n const closeDevForm = () => {\n if (!window.confirm('关闭开发形态:插件将切换为正式版安装(版本依赖 + 删除工作区链接),pnpm 装配后需重启 DSH 生效。确认关闭?')) return\n setDevBusy(true)\n setDevMessage('')\n rpc('vscode.devFormSet', { enabled: false }).then((result) => {\n if (!result.ok) { setDevMessage('关闭失败:' + String(result.error)); return }\n setDevForm(result.devForm)\n setDevMessage(result.restart ? '已切换为正式版,重启 DSH 后生效。' : '已关闭开发形态。')\n }).catch((e) => setDevMessage('关闭失败:' + String(e))).finally(() => setDevBusy(false))\n }\n const options = [{ id: AUTO_OPEN_TOOL, label: '自动选择', description: '按当前已注册工具自动选择' }, ...availableOpeners(registry).map((item) => ({ id: item.id, label: item.label, description: item.description }))]\n const currentOption = options.some((item) => item.id === tool) ? tool : AUTO_OPEN_TOOL\n const devFormRow = devForm?.enabled ? React.createElement('div', { className: 'vsm-general-row' },\n React.createElement('span', null, '开发形态', React.createElement('small', { className: 'vsm-devform-note' }, '工作区链接安装:' + devForm.path)),\n React.createElement('div', { className: 'vsm-devform-actions' },\n devMessage && React.createElement('small', { className: 'vsm-devform-msg' }, devMessage),\n React.createElement('button', { className: 'vsm-devform-close', disabled: devBusy, onClick: closeDevForm }, devBusy ? '切换中…' : '关闭开发形态'),\n ),\n ) : null\n return React.createElement('section', { className: 'vsm-general-page' },\n React.createElement('h2', null, '通用'),\n React.createElement('p', null, '配置 DSH 对话中文件链接的打开工具。工具由当前运行时自动扫描。'),\n unavailable && React.createElement('div', { className: 'vsm-mcp-error vsm-mcp-banner' }, '设置服务暂不可用,当前使用自动选择。'),\n error && React.createElement('div', { className: 'vsm-mcp-error vsm-mcp-banner' }, error),\n React.createElement('label', { className: 'vsm-general-row' }, React.createElement('span', null, '文件链接使用工具'), React.createElement('select', { value: currentOption, disabled: loading || unavailable || notReady || busy || snapshot?.writable === false, onChange: (event) => save(event.target.value) }, options.map((item) => React.createElement('option', { key: item.id, value: item.id }, item.label))), loading && React.createElement('small', null, '读取中…')),\n devFormRow,\n )\n}\n\n/** 兼容性小节:host 报告(RPC compat)+ 客户端本地适配项。 */\nfunction CompatSection({ getSummary }) {\n const [report, setReport] = React.useState(null)\n const [error, setError] = React.useState('')\n React.useEffect(() => {\n let alive = true\n rpc('compat', {}).then((result) => {\n if (!alive) return\n if (!result.ok) setError(String(result.error))\n else setReport(result.report)\n }).catch((e) => { if (alive) setError(String(e)) })\n return () => { alive = false }\n }, [])\n const renderItems = (list) => (list ?? []).map((item) => React.createElement('div', { key: item.name, className: 'vsm-compat-item ' + (item.active ? 'ok' : 'warn') },\n React.createElement('span', { className: 'vsm-compat-name' }, item.name),\n React.createElement('span', { className: 'vsm-compat-note' }, item.note ?? (item.active ? '正常' : '未生效')),\n ))\n const warnings = report?.warnings ?? []\n const devForm = report?.devForm\n return React.createElement('section', { className: 'vsm-general-page' },\n React.createElement('h2', null, '兼容性'),\n React.createElement('p', null, '检测与其他插件 / DSH 版本的适配状态与已知问题。' + (report?.pluginVersion ? '(插件版本 ' + report.pluginVersion + ')' : '')),\n error && React.createElement('div', { className: 'vsm-mcp-error vsm-mcp-banner' }, error),\n devForm?.enabled && React.createElement(React.Fragment, null,\n React.createElement('h3', { className: 'vsm-compat-h3' }, '开发形态'),\n React.createElement('div', { className: 'vsm-compat-item ok' }, React.createElement('span', { className: 'vsm-compat-name' }, '开发形态开启(工作区链接安装)'), React.createElement('span', { className: 'vsm-compat-note' }, devForm.path)),\n ),\n React.createElement('h3', { className: 'vsm-compat-h3' }, '外部插件与服务'),\n renderItems(report?.external),\n React.createElement('h3', { className: 'vsm-compat-h3' }, '客户端适配'),\n renderItems(getSummary?.() ?? []),\n React.createElement('h3', { className: 'vsm-compat-h3' }, '护栏'),\n renderItems(report?.guards),\n React.createElement('h3', { className: 'vsm-compat-h3' }, '警告'),\n warnings.length ? warnings.map((w, index) => React.createElement('div', { key: index, className: 'vsm-mcp-error vsm-mcp-banner' }, w)) : React.createElement('div', { className: 'vsm-compat-item ok' }, React.createElement('span', { className: 'vsm-compat-name' }, '未检测到兼容性问题'), React.createElement('span', { className: 'vsm-compat-note' }, '')),\n )\n}\n\n/** MCP 管理主面板。 */\nexport function McpSettings(props) {\n const openerRegistry = props?.openerRegistry ?? { list: () => [] }\n const compatSummary = props?.compatSummary ?? (() => [])\n const [servers, setServers] = React.useState<MpcServer[]>([])\n const [projects, setProjects] = React.useState<MpcProject[]>([])\n const [loading, setLoading] = React.useState(true)\n const [busy, setBusy] = React.useState('')\n const [error, setError] = React.useState('')\n const [tab, setTab] = React.useState('general')\n const [draft, setDraft] = React.useState(EMPTY)\n const [showForm, setShowForm] = React.useState(false)\n const [projectForm, setProjectForm] = React.useState(null)\n const [selectedPath, setSelectedPath] = React.useState('')\n\n React.useEffect(() => {\n if (!projects.length) {\n setSelectedPath('')\n return\n }\n if (!projects.some((project) => project.workspacePath === selectedPath)) setSelectedPath(projects[0].workspacePath)\n }, [projects, selectedPath])\n\n const loadAll = React.useCallback(() => {\n setLoading(true)\n setError('')\n Promise.all([rpc('mcp.list', {}), rpc('mcp.projects', {})]).then(([list, prj]) => {\n if (!list.ok) throw new Error(list.error)\n if (!prj.ok) throw new Error(prj.error)\n setServers(list.servers)\n setProjects(prj.projects)\n }).catch((e) => setError(String(e))).finally(() => setLoading(false))\n }, [])\n\n React.useEffect(loadAll, [loadAll])\n\n const finish = (result) => {\n if (!result.ok) throw new Error(result.error)\n return result\n }\n\n const action = (label, id, method, args, patch) => {\n setBusy(id)\n setError('')\n return rpc(method, args).then(finish).then((result) => {\n if (patch) patch(result)\n }).catch((e) => setError(String(e))).finally(() => setBusy('')).then(() => label)\n }\n\n const refreshGlobal = (id) => action('refresh', id, 'mcp.refresh', { id }, (r) => setServers((old) => old.map((s) => s.id === id ? r.server : s)))\n const toggleGlobal = (s) => action('toggle', s.id, 'mcp.toggle', { id: s.id, enabled: !s.enabled }, (r) => setServers((old) => old.map((x) => x.id === s.id ? r.server : x)))\n const removeGlobal = (s) => window.confirm('确认删除此 MCP 服务?') && action('remove', s.id, 'mcp.remove', { id: s.id }, (r) => setServers((old) => old.filter((x) => x.id !== s.id)))\n\n const replaceProject = (workspacePath) => (result) => setProjects((old) => old.map((p) => p.workspacePath === workspacePath ? result.project : p))\n const projectAction = (workspacePath, serverName, method, args, patch) => {\n setBusy(workspacePath + ':' + serverName)\n setError('')\n return rpc(method, args).then(finish).then((result) => {\n if (patch) patch(result)\n }).catch((e) => setError(String(e))).finally(() => setBusy(''))\n }\n\n const refreshProject = (p, s) => projectAction(p.workspacePath, s.serverName, 'mcp.projectRefresh', { workspacePath: p.workspacePath, serverName: s.serverName }, replaceProject(p.workspacePath))\n const toggleProject = (p, s) => projectAction(p.workspacePath, s.serverName, 'mcp.projectToggle', { workspacePath: p.workspacePath, serverName: s.serverName, enabled: !s.enabled }, replaceProject(p.workspacePath))\n const removeProject = (p, s) => window.confirm('确认删除此项目的 MCP「' + s.serverName + '」?') && projectAction(p.workspacePath, s.serverName, 'mcp.projectRemove', { workspacePath: p.workspacePath, serverName: s.serverName }, replaceProject(p.workspacePath))\n\n const saveGlobal = () => {\n setBusy('save')\n setError('')\n rpc('mcp.save', { config: configOf(draft) }).then(finish).then((result) => {\n setServers((old) => old.some((s) => s.id === result.server.id) ? old.map((s) => s.id === result.server.id ? result.server : s) : old.concat(result.server))\n setDraft(EMPTY)\n setShowForm(false)\n }).catch((e) => setError(String(e))).finally(() => setBusy(''))\n }\n\n const saveProject = () => {\n if (!projectForm) return\n setBusy('project-save')\n setError('')\n const config = configOf(draft)\n rpc('mcp.projectSave', { workspacePath: projectForm.workspacePath, serverName: config.serverName, config }).then(finish).then((result) => {\n setProjects((old) => old.map((p) => p.workspacePath === projectForm.workspacePath ? result.project : p))\n setDraft(EMPTY)\n setProjectForm(null)\n }).catch((e) => setError(String(e))).finally(() => setBusy(''))\n }\n\n const edit = (key, value) => setDraft((old) => ({ ...old, [key]: value }))\n const marketBody = React.createElement('div', { className: 'vsm-mcp-empty' }, 'MCP 市场暂未接入')\n const selectedProject = projects.find((project) => project.workspacePath === selectedPath)\n const projectBody = projects.length ? React.createElement(React.Fragment, null,\n React.createElement(ProjectPicker, { projects, value: selectedPath, onChange: setSelectedPath }),\n selectedProject ? React.createElement(ProjectGroup, { project: selectedProject, busy, onAdd: (project) => { setDraft(EMPTY); setProjectForm({ workspacePath: project.workspacePath, title: project.title }) }, onRefresh: refreshProject, onToggle: toggleProject, onRemove: removeProject }) : React.createElement('div', { className: 'vsm-mcp-empty' }, '请选择项目'),\n ) : React.createElement('div', { className: 'vsm-mcp-empty' }, '还没有项目')\n let body\n if (loading) body = React.createElement('div', { className: 'vsm-mcp-empty' }, '正在读取 MCP 服务…')\n else if (tab === 'general') body = React.createElement(GeneralSettings, { registry: openerRegistry })\n else if (tab === 'mine') body = React.createElement('div', null, servers.length ? servers.map((s) => React.createElement(ServerCard, { key: s.id, server: s, onRefresh: refreshGlobal, onToggle: toggleGlobal, onRemove: removeGlobal })) : React.createElement('div', { className: 'vsm-mcp-empty' }, '还没有配置全局 MCP'))\n else if (tab === 'projects') body = projectBody\n else if (tab === 'compat') body = React.createElement(CompatSection, { getSummary: compatSummary })\n else body = marketBody\n const form = showForm ? React.createElement(McpForm, { title: '添加全局 MCP', draft, busy, edit, save: saveGlobal, close: () => setShowForm(false) }) : projectForm ? React.createElement(McpForm, { title: '添加项目 MCP · ' + projectForm.title, draft, busy, edit, save: saveProject, close: () => setProjectForm(null) }) : null\n return React.createElement('section', { className: 'vsm-mcp-page' },\n React.createElement('header', { className: 'vsm-mcp-header' }, React.createElement('div', null, React.createElement('h2', null, 'VSCodeMode'), React.createElement('p', null, '管理当前 profile 与各项目的 Model Context Protocol 服务。')), React.createElement('button', { className: 'vsm-primary', onClick: () => { setDraft(EMPTY); setShowForm(true) } }, '+ 添加全局 MCP')),\n React.createElement('nav', { className: 'vsm-mcp-tabs' }, React.createElement('button', { className: tab === 'general' ? 'active' : '', onClick: () => setTab('general') }, '通用'), React.createElement('button', { className: tab === 'mine' ? 'active' : '', onClick: () => setTab('mine') }, '我的 MCP'), React.createElement('button', { className: tab === 'projects' ? 'active' : '', onClick: () => setTab('projects') }, '项目 MCP'), React.createElement('button', { className: tab === 'market' ? 'active' : '', onClick: () => setTab('market') }, 'MCP 市场'), React.createElement('button', { className: tab === 'compat' ? 'active' : '', onClick: () => setTab('compat') }, '兼容性')),\n error && React.createElement('div', { className: 'vsm-mcp-error vsm-mcp-banner' }, error),\n body,\n form,\n )\n}\n\n/** MCP 新增表单(全局/项目共用)。 */\nfunction McpForm({ title, draft, busy, edit, save, close }) {\n const input = (key, placeholder) => React.createElement('input', { value: draft[key], onChange: (e) => edit(key, e.target.value), placeholder })\n const fields = draft.transport === 'stdio' ? React.createElement(React.Fragment, null, React.createElement('label', null, '命令', input('command', 'npx')), React.createElement('label', null, '参数(空格或换行分隔)', React.createElement('textarea', { value: draft.args, onChange: (e) => edit('args', e.target.value) })), React.createElement('label', null, '工作目录(可选)', input('cwd', ''))) : React.createElement(React.Fragment, null, React.createElement('label', null, 'URL', input('url', 'http://localhost:3000/mcp')), React.createElement('label', null, '请求头(每行 key=value)', React.createElement('textarea', { value: draft.headers, onChange: (e) => edit('headers', e.target.value) })))\n return React.createElement('div', { className: 'vsm-mcp-modal' }, React.createElement('div', { className: 'vsm-mcp-dialog' }, React.createElement('h3', null, title), React.createElement('label', null, '名称', input('serverName', '例如 codegraph')), React.createElement('label', null, '传输方式', React.createElement('select', { value: draft.transport, onChange: (e) => edit('transport', e.target.value) }, React.createElement('option', { value: 'stdio' }, 'stdio'), React.createElement('option', { value: 'streamable-http' }, 'streamable-http'))), fields, React.createElement('div', { className: 'vsm-mcp-dialog-actions' }, React.createElement('button', { onClick: close }, '取消'), React.createElement('button', { className: 'vsm-primary', disabled: busy === 'save' || busy === 'project-save', onClick: save }, '保存并连接'))))\n}\n","/**\n * dsh-vscode-mode client — DSH 对话文件链接的统一打开路由。\n * openPath 补丁经 compat.patchMethod 安装(链式恢复,多插件补丁互不踩踏)。\n * 作者 ddj 2026年08月24号\n */\nimport { patchMethod } from './compat.js'\nimport { openEditorView } from './events.js'\nimport { AUTO_OPEN_TOOL, VSCODE_OPEN_TOOL, type FileOpenContext, type FileOpenerRegistry, isAvailable, selectOpener } from './fileOpeners.js'\n\nexport interface OpenPathRouterOptions {\n workspaces: { openPath: (path: string) => Promise<void> }\n registry: FileOpenerRegistry\n selected: () => string\n context: () => FileOpenContext\n logger?: (message: string) => void\n}\n\n/**\n * 安装可卸载的 workspaces.openPath 路由。\n * @author ddj 2026年08月24号\n * @param options 路由依赖\n * @returns 恢复原方法的 disposer\n */\nexport function installOpenPathRouter(options: OpenPathRouterOptions): () => void {\n const open = async (original: (path: string) => Promise<void>, path: string): Promise<void> => {\n const context = options.context()\n const opener = selectOpener(options.registry, options.selected())\n if (!opener || !isAvailable(opener)) return original.call(options.workspaces, path)\n try {\n await opener.open(path, context)\n } catch (error) {\n options.logger?.('文件打开器 ' + opener.id + ' 失败,回退系统打开: ' + String(error))\n if (opener.id !== 'system') await original.call(options.workspaces, path)\n else throw error\n }\n }\n return patchMethod(options.workspaces, 'openPath', open as never)\n}\n\n/**\n * 创建 VSCodeMode 内置文件打开器。\n * @author ddj 2026年08月24号\n * @returns VSCodeMode 打开器\n */\nexport function vscodeOpener(): { id: string; label: string; priority: number; open: (path: string) => void } {\n return { id: VSCODE_OPEN_TOOL, label: 'VSCodeMode', priority: 100, open: (path) => openEditorView(path) }\n}\n\n/**\n * 规范化设置中的打开器 id。\n * @author ddj 2026年08月24号\n * @param value 原始设置值\n * @returns 可路由的打开器 id\n */\nexport function autoValue(value: unknown): string {\n return typeof value === 'string' && value.trim() ? value.trim() : AUTO_OPEN_TOOL\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — SideEditorTab:betterSidebar「文件编辑」Tab 的组件包装。\n * 把 TabComponentProps(scope/tab/visible)映射为 EditorView 侧栏形态 props,\n * 并按会话 key 保证切会话状态干净重建;创建种子的初始打开在挂载后投递一次。\n * 作者 ddj 2026年08月25号\n */\nimport React from 'react'\nimport { EditorView } from './EditorView.js'\nimport { resolveInitialOpen, setSideEditorMounted, takePendingSideOpen } from '../sidebarBridge.js'\n\n/**\n * 侧边栏 Tab 组件(TabDescriptor.component 装配)。\n * @param props TabComponentProps(scope.sessionId、tab.path/meta 等)\n * @returns EditorView 侧栏形态\n */\nexport function SideEditorTab(props) {\n const sessionId = props?.scope?.sessionId\n const initial = React.useMemo(() => resolveInitialOpen(props?.tab), [props?.tab])\n const dispatchedRef = React.useRef(false)\n\n React.useEffect(() => {\n setSideEditorMounted(true)\n return () => setSideEditorMounted(false)\n }, [])\n\n React.useEffect(() => {\n if (dispatchedRef.current) return\n dispatchedRef.current = true\n // 待消费打开(挂载前暂存的聚焦请求)优先于创建种子;两者都走同事件,EditorView 幂等处理\n const pending = takePendingSideOpen(sessionId)\n const request = pending ?? initial\n window.dispatchEvent(new CustomEvent('edrv:open-editor', {\n detail: { path: request?.path ?? null, focusDiff: request?.focusDiff === true },\n }))\n }, [initial.path, initial.focusDiff, sessionId])\n\n return React.createElement(EditorView, {\n key: sessionId,\n sessionId,\n layout: 'side',\n schedule: props?.schedule,\n addToConversation: props?.addToConversation,\n sidebarPanels: props?.sidebarPanels,\n outlineSources: props?.outlineSources,\n fileMenuItems: props?.fileMenuItems,\n })\n}\n","/**\n * dsh-vscode-mode client — 把文件/选中内容注入会话对话输入框(composer draft)。\n * 复用 DSH 官方输入门面:ctx.conversation.input.for(sessions.scope(sessionId)) → SessionInput。\n * 引用 chip:insertReference(reference source,发送时序列化为 @path 文本);忙态降级为纯文本 setDraft。\n * 纯函数部分 node 可单测。\n * 作者 ddj 2026-08-25\n */\n\n/** 文件引用可选的行区间(选中内容用)。 */\nexport interface RefRange {\n startLine: number\n endLine: number\n}\n\n/** 引用动作的返回状态。 */\nexport type AddOutcome = 'ok' | 'busy' | 'unavailable'\n\n/** DSH reference source 名(dsh-client-ui-reference 注册的 @file/@session 统一源)。 */\nconst REF_SOURCE = 'reference'\n\n/**\n * 生成 DSH @file 语法引用串:cwd 相对化、\\ → /、含空白时按 @\"path\" 语法加引号。\n * cwd 外/无法相对化的路径回退原路径。\n * @author ddj 2026年08月25号\n * @param path 打开的文件路径(相对 cwd 或绝对)\n * @param cwd 会话工作区目录(可选)\n * @returns 引用串(如 @src/index.ts 或 @\"a b.ts\")\n */\nexport function mentionOf(path: string, cwd: string | undefined): string {\n const raw = String(path)\n let rel = raw\n if (cwd) {\n const base = String(cwd).replace(/[\\\\/]+$/, '')\n const up = raw.replace(/\\\\/g, '/')\n const baseUp = base.replace(/\\\\/g, '/')\n if (up.startsWith(baseUp + '/')) rel = up.slice(baseUp.length + 1)\n else if (up === baseUp) rel = ''\n }\n rel = rel.replace(/\\\\/g, '/').replace(/^\\.\\//, '')\n if (!rel) rel = raw.replace(/\\\\/g, '/')\n if (/[\\u0000-\\u001f\\u007f-\\u009f\"]/u.test(rel)) return '@' + raw\n return /\\s/u.test(rel) ? `@\"${rel}\"` : `@${rel}`\n}\n\n/** 引用标签:文件名 + 可选行区间(chip 内展示,不带 @ 前缀)。\n * @author ddj 2026年08月25号 */\nexport function labelOf(path: string, range: RefRange | undefined): string {\n const base = String(path).split(/[\\\\/]/).pop() || String(path)\n if (!range || range.endLine < range.startLine) return base\n return range.startLine === range.endLine\n ? `${base} L${range.startLine}`\n : `${base} L${range.startLine}-${range.endLine}`\n}\n\n/** 引用 ref:引用串 + 可选行区间(序列化直出,agent 据此读取对应片段)。\n * @author ddj 2026年08月25号 */\nexport function refOf(mention: string, range: RefRange | undefined): string {\n if (!range || range.endLine < range.startLine) return mention\n return range.startLine === range.endLine\n ? `${mention} L${range.startLine}`\n : `${mention} L${range.startLine}-${range.endLine}`\n}\n\n/** 构造 DSH 文件引用插入载荷(source=reference,发送序列化为 mention(+range) 文本)。 */\nexport function buildFileRef(\n path: string,\n cwd: string | undefined,\n range?: RefRange,\n): { reference: ReferenceInsertLike; mention: string } {\n const mention = mentionOf(path, cwd)\n return {\n mention,\n reference: {\n source: REF_SOURCE,\n ref: refOf(mention, range),\n label: labelOf(path, range),\n appearance: 'file',\n clipboardText: mention,\n },\n }\n}\n\n/** 输入门面最小形状(运行时来自 ctx.conversation.input,避免引入新类型依赖)。 */\nexport interface InputLike {\n state: { getSnapshot: () => { draft: string; draftRev: number } }\n insertReference: (ref: ReferenceInsertLike, span: TokenSpanLike) => boolean\n setDraft: (text: string) => void\n notify: (level: 'info' | 'error', text: string) => void\n}\n\n/** ReferenceInsert 结构形状(与 dsh-client-ui-input-trigger 类型一致)。 */\nexport interface ReferenceInsertLike {\n source: string\n ref: string\n label: string\n appearance?: 'session' | 'file' | 'folder'\n clipboardText: string\n}\n\n/** TokenSpan 结构形状(start/end 为草稿字符偏移,draftRev 为 CAS 版本)。 */\nexport interface TokenSpanLike {\n start: number\n end: number\n draftRev: number\n}\n\n/** ctx 依赖的最小面(sessions.scope + conversation.input)。 */\nexport interface CtxLike {\n get: (name: string) => unknown\n}\n\n/** 注入器产物:给 EditorView 用的动作集合。 */\nexport interface AddToConversation {\n /** 追加文件引用 chip(@path [Lstart-end]);忙态自动降级纯文本。 */\n appendReference(sessionId: string | undefined, path: string, range?: RefRange): Promise<AddOutcome>\n}\n\n/**\n * 解析会话输入门面;缺失时返回 undefined(动作侧守卫降级)。\n * @author ddj 2026年08月25号\n * @param ctx 客户端服务上下文\n * @param sessionId 会话 id\n * @returns SessionInput 或 undefined\n */\nexport function inputFor(ctx: CtxLike, sessionId: string | undefined): InputLike | undefined {\n if (!sessionId) return undefined\n try {\n const sessions = ctx.get('sessions') as { scope?: (id: string) => unknown } | undefined\n const conversation = ctx.get('conversation') as { input?: { for: (actx: unknown) => unknown } } | undefined\n const actx = sessions?.scope?.(sessionId)\n const shell = actx && conversation?.input?.for?.(actx)\n return (shell && typeof (shell as InputLike).setDraft === 'function') ? shell as InputLike : undefined\n } catch {\n return undefined\n }\n}\n\n/** 取当前草稿长度与版本;无输入门面时返回 null。\n * @author ddj 2026年08月25号 */\nfunction draftCursor(input: InputLike | undefined): { draft: string; draftRev: number } | null {\n try {\n const s = input?.state?.getSnapshot?.()\n if (!s) return null\n return { draft: String(s.draft ?? ''), draftRev: Number(s.draftRev ?? 0) }\n } catch {\n return null\n }\n}\n\n/** 从 sessions 列表快照读会话工作区目录(与 index.ts 既有读取方式一致)。\n * @author ddj 2026年08月25号 */\nfunction cwdOf(ctx: CtxLike, sessionId: string | undefined): string | undefined {\n if (!sessionId) return undefined\n try {\n const sessions = ctx.get('sessions') as\n | { list?: { getSnapshot?: () => { byId?: Record<string, { cwd?: string }> } } }\n | undefined\n return sessions?.list?.getSnapshot?.()?.byId?.[sessionId]?.cwd\n } catch {\n return undefined\n }\n}\n\n/** 写入成功后的 composer 内联提示(门面可用时;失败静默)。\n * @author ddj 2026年08月25号 */\nfunction notify(input: InputLike, text: string): void {\n try {\n input.notify?.('info', text)\n } catch {\n /* 提示失败忽略 */\n }\n}\n\n/** 输入门面插入引用(拦截异常视作未应用,走降级)。\n * @author ddj 2026年08月25号 */\nfunction safeInsert(input: InputLike, reference: ReferenceInsertLike, span: TokenSpanLike): boolean {\n try {\n return input.insertReference(reference, span) === true\n } catch {\n return false\n }\n}\n\n/**\n * 创建「添加到对话」动作集(apply 阶段构建一次,随 props 传给 EditorView)。\n * @author ddj 2026年08月25号\n * @param ctx 客户端服务上下文(sessions + conversation)\n * @returns 动作集\n */\nexport function createAddToConversation(ctx: CtxLike): AddToConversation {\n const appendReference: AddToConversation['appendReference'] = async (sessionId, path, range) => {\n const input = inputFor(ctx, sessionId)\n if (!input) return 'unavailable'\n const cur = draftCursor(input)\n if (!cur) return 'unavailable'\n const { reference, mention } = buildFileRef(path, cwdOf(ctx, sessionId), range)\n const span: TokenSpanLike = { start: cur.draft.length, end: cur.draft.length, draftRev: cur.draftRev }\n const ok = safeInsert(input, reference, span)\n if (!ok) {\n // 忙态(adjudicating/submitting)或 CAS 失败:降级纯文本追加,保证动作有落点。\n const gap = cur.draft.length > 0 && !/\\s$/.test(cur.draft) ? ' ' : ''\n input.setDraft(cur.draft + gap + mention + ' ')\n notify(input, '已添加文件引用 ' + mention)\n return 'busy'\n }\n notify(input, '已添加文件引用 ' + mention)\n return 'ok'\n }\n\n return { appendReference }\n}\n","/**\n * dsh-vscode-mode client — 侧边栏面板注册表。\n * 镜像 fileOpeners.ts 的注册表模式:create + register(返回注销) + list + subscribe,\n * 由 client/index.ts `ctx.provide('edrvSidebarPanels', registry)` 对外暴露(第三方可注册)。\n * 作者 ddj 2026-08-26\n */\nimport type { SidebarPanelDef } from './types.js'\n\nexport interface SidebarPanelRegistry {\n register(panel: SidebarPanelDef): () => void\n list(): readonly SidebarPanelDef[]\n subscribe(listener: () => void): () => void\n get(id: string): SidebarPanelDef | undefined\n}\n\n/** 校验面板定义并写入注册表(缺 id/render 抛 TypeError)。 */\nfunction panelRegister(entries: Map<string, SidebarPanelDef>, notify: () => void, panel: SidebarPanelDef): void {\n if (!panel.id || typeof panel.render !== 'function') throw new TypeError('侧边栏面板必须提供 id 和 render')\n entries.set(panel.id, panel)\n notify()\n}\n\n/**\n * 创建生命周期独立的面板注册表。\n * @author ddj 2026年08月26号\n * @returns 面板注册表\n */\nexport function createSidebarPanelRegistry(): SidebarPanelRegistry {\n const entries = new Map<string, SidebarPanelDef>()\n const listeners = new Set<() => void>()\n const notify = (): void => {\n for (const listener of listeners) listener()\n }\n const list = (): readonly SidebarPanelDef[] =>\n [...entries.values()].sort((a, b) => (a.order ?? 100) - (b.order ?? 100))\n return {\n register(panel: SidebarPanelDef): () => void {\n panelRegister(entries, notify, panel)\n return () => {\n if (entries.get(panel.id) !== panel) return\n entries.delete(panel.id)\n notify()\n }\n },\n list,\n subscribe(listener: () => void): () => void {\n listeners.add(listener)\n return () => listeners.delete(listener)\n },\n get: (id: string) => entries.get(id),\n }\n}\n","/**\n * dsh-vscode-mode client — 右键菜单 viewport 定位纯函数。\n * 将目标行锚点与视口边界计算从 React 渲染层拆出,便于复用和单测。\n * 作者 ddj 2026-08-28\n */\n\nexport interface MenuPosition {\n left: number\n top: number\n}\n\nexport interface MenuAnchorRect {\n top: number\n right: number\n width: number\n height: number\n}\n\n/**\n * 将菜单坐标限制在 viewport 内。\n * @author ddj 2026年08月28号\n * @param x 期望的 viewport x 坐标\n * @param y 期望的 viewport y 坐标\n * @param viewportWidth viewport 宽度\n * @param viewportHeight viewport 高度\n * @param menuWidth 菜单估算宽度\n * @param menuHeight 菜单估算高度\n * @returns 限制后的菜单位置\n */\nexport function clampMenuPosition(\n x: number,\n y: number,\n viewportWidth: number,\n viewportHeight: number,\n menuWidth: number,\n menuHeight: number,\n): MenuPosition {\n const maxLeft = Math.max(4, viewportWidth - menuWidth)\n const maxTop = Math.max(4, viewportHeight - menuHeight)\n return {\n left: Math.max(4, Math.min(x, maxLeft)),\n top: Math.max(4, Math.min(y, maxTop)),\n }\n}\n\n/**\n * 将文件树行右键菜单锚定到目标行右侧;无法测量时回退到鼠标坐标。\n * @author ddj 2026年08月28号\n * @param rect 目标行的布局矩形\n * @param fallbackX 鼠标 viewport x 坐标\n * @param fallbackY 鼠标 viewport y 坐标\n * @returns 菜单初始位置\n */\nexport function rowMenuPosition(\n rect: MenuAnchorRect | null | undefined,\n fallbackX: number,\n fallbackY: number,\n): MenuPosition {\n if (!rect || rect.width <= 0 || rect.height <= 0) {\n return { left: fallbackX, top: fallbackY }\n }\n return { left: rect.right + 4, top: rect.top }\n}\n","/**\n * dsh-vscode-mode client — 通用浮动右键菜单(createElement 风格、类型化)。\n * 非阻塞式关闭:window capture 监听(点击菜单外/右键菜单外/Esc 关闭),\n * 不拦截菜单外事件,允许同一事件内由发起方切换/重开菜单。\n * 条目支持 danger/disabled/separator,复用既有 edrv-ctxmenu* 样式类。\n * 作者 ddj 2026-08-27\n */\nimport React from 'react'\nimport { createPortal } from 'react-dom'\nimport { clampMenuPosition } from './menuPosition.js'\n\n/** 单条菜单项(展示层形状;业务侧由 buildTreeMenu 映射而来)。 */\nexport interface ContextMenuEntry {\n id: string\n label: string\n danger?: boolean\n disabled?: boolean\n /** 前置分隔线。 */\n separator?: boolean\n onClick?: () => void\n}\n\nexport interface ContextMenuProps {\n x: number\n y: number\n entries: ContextMenuEntry[]\n onClose: () => void\n}\n\n/** 菜单估算宽高(clamp 防越出视口,与 EditorView menuPos 常量对齐)。 */\nconst MENU_W = 224\nconst MENU_H = 176\n\n/**\n * 浮动右键菜单。\n * @param props.x 视口 x 坐标\n * @param props.y 视口 y 坐标\n * @param props.entries 菜单项列表\n * @param props.onClose 关闭回调(backdrop 点击/右键/Esc/点击项后触发)\n */\nexport function ContextMenu(props: ContextMenuProps): React.ReactElement {\n const { x, y, entries, onClose } = props\n const menuRef = React.useRef<HTMLDivElement | null>(null)\n\n React.useEffect(() => {\n const onKey = (e: KeyboardEvent): void => {\n if (e.key === 'Escape') onClose()\n }\n const onPointerDown = (e: PointerEvent): void => {\n if (e.button !== 0) return\n if (menuRef.current && menuRef.current.contains(e.target as Node)) return\n onClose()\n }\n const onContextMenu = (e: MouseEvent): void => {\n if (menuRef.current && menuRef.current.contains(e.target as Node)) {\n e.preventDefault()\n }\n onClose()\n }\n window.addEventListener('keydown', onKey, true)\n window.addEventListener('pointerdown', onPointerDown, true)\n window.addEventListener('contextmenu', onContextMenu, true)\n return () => {\n window.removeEventListener('keydown', onKey, true)\n window.removeEventListener('pointerdown', onPointerDown, true)\n window.removeEventListener('contextmenu', onContextMenu, true)\n }\n }, [onClose])\n\n const safeX = Number.isFinite(x) ? x : 4\n const safeY = Number.isFinite(y) ? y : 4\n const position = clampMenuPosition(\n safeX,\n safeY,\n window.innerWidth || 800,\n window.innerHeight || 600,\n MENU_W,\n MENU_H,\n )\n\n const children: React.ReactNode[] = []\n for (const entry of entries) {\n if (entry.separator) {\n children.push(React.createElement('div', { key: 'sep-' + entry.id, className: 'edrv-ctxmenu-sep' }))\n continue\n }\n const cls = 'edrv-ctxmenu-item'\n + (entry.danger ? ' edrv-ctxmenu-danger' : '')\n + (entry.disabled ? ' edrv-ctxmenu-disabled' : '')\n children.push(React.createElement('button', {\n key: entry.id,\n className: cls,\n disabled: entry.disabled,\n onClick: () => {\n if (!entry.disabled) {\n entry.onClick?.()\n onClose()\n }\n },\n }, entry.label))\n }\n\n const overlay = React.createElement('div', { 'data-edrv-view': '1' },\n React.createElement('div', { className: 'edrv-ctxmenu', ref: menuRef, style: position }, ...children))\n\n return typeof document === 'undefined' ? overlay : createPortal(overlay, document.body)\n}\n","/**\n * dsh-vscode-mode client — 文件管理右键菜单框架(类型 + 注册表 + 纯构建函数)。\n * 镜像 sidebar/registry.ts 的注册表模式:create + register(返回注销) + list + subscribe,\n * 由 client/index.ts `ctx.provide('edrvFileContextMenuItems', registry)` 对外暴露(第三方可注册)。\n * 新增菜单项只需 register 一条 TreeMenuItem,面板在右键打开时经 buildTreeMenu 过滤/排序。\n * 本模块不触 React/浏览器,可单测。\n * 作者 ddj 2026-08-27\n */\nimport type { TreeEntry } from '../../shared/rpc.js'\nimport type { SidebarCtx } from './types.js'\n\n/** 右键目标(树行/面板空白区,path 相对工作区根,'' 表示根目录)。 */\nexport interface TreeMenuTarget {\n path: string\n type: TreeEntry['type']\n}\n\n/** 一条右键菜单项定义。 */\nexport interface TreeMenuItem {\n id: string\n label: string\n /** 排序:数值越小越靠前(缺省 100)。 */\n order?: number\n /** 红色警示样式(如删除类操作)。 */\n danger?: boolean\n /** 置灰不可点(如无权限/目标不支持时)。 */\n disabled?: boolean\n /** 前置分隔线。 */\n separator?: boolean\n /** 显隐守卫:返回 false 则不显示。 */\n visible?: (target: TreeMenuTarget, ctx: SidebarCtx) => boolean\n run: (target: TreeMenuTarget, ctx: SidebarCtx) => void\n}\n\n/** 右键菜单项注册表(生命周期独立,可注册/注销/订阅)。 */\nexport interface TreeMenuRegistry {\n register(item: TreeMenuItem): () => void\n list(): readonly TreeMenuItem[]\n subscribe(listener: () => void): () => void\n get(id: string): TreeMenuItem | undefined\n}\n\n/** 校验菜单项并写入注册表(缺 id/run/label 抛 TypeError)。 */\nfunction itemRegister(entries: Map<string, TreeMenuItem>, notify: () => void, item: TreeMenuItem): void {\n if (!item.id || typeof item.run !== 'function' || !item.label) {\n throw new TypeError('文件右键菜单项必须提供 id、label 和 run')\n }\n entries.set(item.id, item)\n notify()\n}\n\n/**\n * 创建生命周期独立的右键菜单项注册表。\n * @author ddj 2026年08月27号\n * @returns 菜单项注册表\n */\nexport function createTreeMenuRegistry(): TreeMenuRegistry {\n const entries = new Map<string, TreeMenuItem>()\n const listeners = new Set<() => void>()\n const notify = (): void => {\n for (const listener of listeners) listener()\n }\n const list = (): readonly TreeMenuItem[] =>\n [...entries.values()].sort((a, b) => (a.order ?? 100) - (b.order ?? 100))\n return {\n register(item: TreeMenuItem): () => void {\n itemRegister(entries, notify, item)\n return () => {\n if (entries.get(item.id) !== item) return\n entries.delete(item.id)\n notify()\n }\n },\n list,\n subscribe(listener: () => void): () => void {\n listeners.add(listener)\n return () => listeners.delete(listener)\n },\n get: (id: string) => entries.get(id),\n }\n}\n\n/**\n * 按目标构建当前可见菜单项(visible 过滤 + order 排序)。\n * @author ddj 2026年08月27号\n * @param registry 菜单项注册表\n * @param target 右键目标\n * @param ctx 面板共享上下文\n * @returns 可见菜单项(已排序)\n */\nexport function buildTreeMenu(registry: TreeMenuRegistry | undefined, target: TreeMenuTarget, ctx: SidebarCtx): TreeMenuItem[] {\n if (!registry) return []\n const out: TreeMenuItem[] = []\n for (const item of registry.list()) {\n if (typeof item.visible === 'function' && !item.visible(target, ctx)) continue\n out.push(item)\n }\n return out\n}\n","/**\n * dsh-vscode-mode client — 资源管理栏展开状态持久化(纯函数,可单测)。\n * 对齐 VSCode:只持久化展开路径集合,不缓存目录条目数据(条目实时 listDir)。\n * 作者 ddj 2026-08-28\n */\n\n/** localStorage 键前缀(按会话隔离)。 */\nconst KEY_PREFIX = 'edrv.cache.explorer.v1.'\n\n/** 展开路径容量上限:超出丢弃最旧(按写入顺序近似 LRU)。 */\nexport const EXPANDED_CAP = 500\n\n/** 展开状态缓存内容。 */\nexport interface ExplorerCacheData {\n root: string | null\n expanded: string[]\n}\n\n/**\n * 归一化展开路径:去空白、反斜杠→斜杠、去首尾斜杠,`..` 段拒绝。\n * @author ddj 2026年08月28号\n * @param rel 目录相对路径('' = 根)\n * @returns 归一化路径,非法返回 null\n */\nexport function normalizeExpanded(rel: string | undefined | null): string | null {\n const s = String(rel ?? '').trim().replace(/\\\\/g, '/').replace(/^\\/+|\\/+$/g, '')\n if (!s) return ''\n const segs = s.split('/').filter((seg) => seg !== '.')\n if (!segs.length) return ''\n for (const seg of segs) {\n if (seg === '..') return null\n }\n return segs.join('/')\n}\n\n/**\n * 裁剪展开路径集:去重、丢弃非法路径、超容量丢弃尾部(保持传入顺序)。\n * @author ddj 2026年08月28号\n * @param expanded 原始展开路径集合\n * @returns 规范化后的路径数组\n */\nexport function sanitizeExpanded(expanded: unknown): string[] {\n if (!Array.isArray(expanded)) return []\n const seen = new Set<string>()\n const out: string[] = []\n for (const item of expanded) {\n const rel = normalizeExpanded(typeof item === 'string' ? item : null)\n if (rel === null || seen.has(rel)) continue\n seen.add(rel)\n out.push(rel)\n if (out.length >= EXPANDED_CAP) break\n }\n return out\n}\n\n/**\n * 序列化缓存数据(JSON;root 为 null 时省略,减小体积)。\n * @author ddj 2026年08月28号\n * @param data 缓存数据\n * @returns JSON 字符串\n */\nexport function serializeExplorer(data: ExplorerCacheData): string {\n const payload = data.root === null || data.root === undefined\n ? { v: 1, expanded: data.expanded }\n : { v: 1, root: data.root, expanded: data.expanded }\n return JSON.stringify(payload)\n}\n\n/**\n * 解析缓存文本;损坏/格式不符 → null。\n * @author ddj 2026年08月28号\n * @param text localStorage 原文\n * @returns 解析后的缓存数据,非法返回 null\n */\nexport function parseExplorer(text: string | null): ExplorerCacheData | null {\n if (!text) return null\n try {\n const data = JSON.parse(text)\n if (!data || typeof data !== 'object') return null\n const root = typeof data.root === 'string' && data.root ? data.root : null\n const expanded = sanitizeExpanded(data.expanded)\n return { root, expanded }\n } catch (error) {\n return null\n }\n}\n\n/**\n * 读取某会话的展开状态缓存(localStorage 不可用 → null)。\n * @author ddj 2026年08月28号\n * @param sessionId 会话 id\n * @returns 缓存数据或 null\n */\nexport function explorerLoad(sessionId: string): ExplorerCacheData | null {\n try {\n return parseExplorer(window.localStorage.getItem(KEY_PREFIX + String(sessionId)))\n } catch (error) {\n return null\n }\n}\n\n/**\n * 写入某会话的展开状态缓存(损坏/配额满 → 忽略)。\n * @author ddj 2026年08月28号\n * @param sessionId 会话 id\n * @param data 缓存数据\n */\nexport function explorerSave(sessionId: string, data: ExplorerCacheData): void {\n try {\n window.localStorage.setItem(KEY_PREFIX + String(sessionId), serializeExplorer(data))\n } catch (error) { /* 配额满/隐私模式忽略 */ }\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — 侧边栏「文件管理」面板(懒加载目录树)。\n * 点目录展开/收起(首次经 edrv.listDir 拉取并缓存),点文件经 ctx.openFile 打开;\n * 差异角标取 pendingByPath,活动文件高亮;edrv:refresh 事件与手动刷新重载树。\n * 右键行/空白弹出菜单:项来自 ctx.fileMenuItems 注册表(可拓展),\n * 内置「在文件浏览器中打开」经 edrv.revealInExplorer 定位/打开。\n * 作者 ddj 2026-08-26 / 2026-08-27\n */\nimport React from 'react'\nimport { rpc } from '../../rpc.js'\nimport { ContextMenu } from '../../ui/ContextMenu.js'\nimport { rowMenuPosition } from '../../ui/menuPosition.js'\nimport { buildTreeMenu } from '../contextMenu.js'\nimport { explorerLoad, explorerSave } from '../../state/explorerCache.js'\nimport type { SidebarCtx } from '../types.js'\n\nconst DIR_CAP = 4000\nconst SAVE_DEBOUNCE_MS = 300\n\n/**\n * 目录树面板主体。\n * @param props.ctx 面板共享上下文(sessionId/openFile/activePath/pendingByPath/fileMenuItems/notify)\n */\nexport function FileExplorer(props) {\n const ctx = props?.ctx\n const sessionId = ctx?.sessionId\n const openFile = ctx?.openFile\n const activePath = ctx?.activePath ?? null\n const pendingByPath = ctx?.pendingByPath ?? {}\n const [root, setRoot] = React.useState(null)\n const [dirs, setDirs] = React.useState({})\n const [expanded, setExpanded] = React.useState({})\n const [loading, setLoading] = React.useState({})\n const [error, setError] = React.useState(null)\n const [menu, setMenu] = React.useState(null) // 右键菜单 { x, y, target }\n const tokensRef = React.useRef({})\n // expanded 的 ref 镜像:edrv:refresh 监听用首次渲染闭包,但需读到最新展开态\n const expandedRef = React.useRef({})\n expandedRef.current = expanded\n // 展开状态防抖写回计时器\n const saveTimerRef = React.useRef(null)\n\n const loadDir = (rel) => {\n const token = (tokensRef.current[rel] || 0) + 1\n tokensRef.current[rel] = token\n setLoading((prev) => Object.assign({}, prev, { [rel]: true }))\n setError(null)\n rpc('edrv.listDir', { sessionId, path: rel }).then((res) => {\n if (tokensRef.current[rel] !== token) return\n if (res && res.ok && Array.isArray(res.entries)) {\n setDirs((prev) => Object.assign({}, prev, { [rel]: res.entries }))\n if (res.root && !root) setRoot(res.root)\n } else {\n setError(res?.error ? String(res.error) : '读取目录失败')\n }\n }).catch((e) => {\n if (tokensRef.current[rel] !== token) return\n setError('读取目录异常:' + String(e))\n }).finally(() => {\n if (tokensRef.current[rel] !== token) return\n setLoading((prev) => {\n const next = Object.assign({}, prev)\n delete next[rel]\n return next\n })\n })\n }\n\n const toggle = (rel) => {\n if (expanded[rel] === true) {\n setExpanded((prev) => Object.assign({}, prev, { [rel]: false }))\n return\n }\n if (!dirs[rel]) void loadDir(rel)\n setExpanded((prev) => Object.assign({}, prev, { [rel]: true }))\n }\n\n const refresh = () => {\n const keep = Object.keys(expandedRef.current).filter((k) => expandedRef.current[k] === true)\n tokensRef.current = {}\n setMenu(null)\n setDirs({})\n setLoading({})\n setError(null)\n if (keep.length) {\n const next = {}\n for (const rel of keep) next[rel] = true\n setExpanded(next)\n for (const rel of keep) void loadDir(rel)\n } else {\n setExpanded({})\n }\n void loadDir('')\n }\n\n React.useEffect(() => {\n tokensRef.current = {}\n setDirs({})\n setExpanded({})\n setLoading({})\n setError(null)\n setMenu(null)\n setRoot(null)\n // 恢复上次展开状态(对齐 VSCode:持久化展开路径,目录条目实时拉取)\n const cached = sessionId ? explorerLoad(sessionId) : null\n const restored = cached?.expanded ?? []\n if (cached?.root) setRoot(cached.root)\n if (restored.length) {\n const next = {}\n for (const rel of restored) next[rel] = true\n setExpanded(next)\n }\n void loadDir('')\n for (const rel of restored) {\n if (rel) void loadDir(rel)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [sessionId])\n\n // 展开状态防抖写回 localStorage(重启后恢复展开结构)\n React.useEffect(() => {\n if (saveTimerRef.current) { clearTimeout(saveTimerRef.current); saveTimerRef.current = null }\n if (!sessionId) return\n saveTimerRef.current = setTimeout(() => {\n saveTimerRef.current = null\n const expandedList = Object.keys(expanded).filter((k) => expanded[k] === true)\n explorerSave(sessionId, { root, expanded: expandedList })\n }, SAVE_DEBOUNCE_MS)\n return () => {\n if (saveTimerRef.current) { clearTimeout(saveTimerRef.current); saveTimerRef.current = null }\n }\n }, [expanded, root, sessionId])\n\n React.useEffect(() => {\n const onRefresh = () => refresh()\n window.addEventListener('edrv:refresh', onRefresh)\n return () => window.removeEventListener('edrv:refresh', onRefresh)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n const rootName = root ? String(root).split(/[\\\\/]/).pop() || root : ''\n\n const rowEl = (e, depth, isDir, isOpen) => {\n const pending = isDir ? 0 : (pendingByPath[e.path] ?? 0)\n const active = !isDir && e.path === activePath\n const contextTarget = Boolean(menu && menuEntries.length && menu.target.path === e.path)\n const dim = e.type === 'other'\n return React.createElement('div', {\n key: e.path,\n className: 'edrv-tree-row'\n + (active ? ' edrv-tree-active' : '')\n + (contextTarget ? ' edrv-tree-context' : ''),\n title: e.path,\n style: { paddingLeft: 6 + depth * 14 },\n onClick: () => { if (isDir) toggle(e.path); else openFile(e.path) },\n onContextMenu: (ev) => {\n ev.preventDefault()\n ev.stopPropagation()\n const rect = ev.currentTarget?.getBoundingClientRect?.()\n const position = rowMenuPosition(rect, ev.clientX, ev.clientY)\n setMenu({ x: position.left, y: position.top, target: { path: e.path, type: e.type } })\n },\n },\n React.createElement('span', { className: 'edrv-tree-chev' },\n isDir ? (isOpen ? '▾' : '▸') : ''),\n React.createElement('span', { className: 'edrv-tree-name' + (dim ? ' edrv-tree-dim' : '') },\n isDir ? (isOpen ? '📂' : '📁') : '📄', ' ', e.name),\n (pending > 0\n ? React.createElement('span', { className: 'edrv-tree-badge' }, String(pending))\n : null))\n }\n\n const rowsOf = (rel, depth) => {\n const entries = dirs[rel]\n if (!entries) {\n return [React.createElement('div', { key: rel + ':loading', className: 'edrv-tree-loading', style: { paddingLeft: 6 + depth * 14 } },\n loading[rel] ? '加载中…' : '无法加载')]\n }\n const rows = []\n const cap = entries.length\n for (let i = 0; i < cap; i++) {\n const e = entries[i]\n const isDir = e.type === 'directory'\n const isOpen = expanded[e.path] === true\n rows.push(rowEl(e, depth, isDir, isOpen))\n if (isDir && isOpen) rows.push(...rowsOf(e.path, depth + 1))\n }\n if (cap >= DIR_CAP) {\n rows.push(React.createElement('div', { key: rel + ':cap', className: 'edrv-tree-loading', style: { paddingLeft: 6 + depth * 14 } },\n '目录条目过多,仅显示前 ' + DIR_CAP + ' 项'))\n }\n return rows\n }\n\n // 面板区右键(空白处)→ 工作区根目录菜单;行内右键已在 rowEl 阻止冒泡。\n const onPanelContext = (ev) => {\n ev.preventDefault()\n ev.stopPropagation()\n if (!ev.currentTarget.contains(ev.target)) return\n setMenu({ x: ev.clientX, y: ev.clientY, target: { path: '', type: 'directory' } })\n }\n // 当前右键目标的可视菜单项(构建时过滤/排序,registry 变化下次打开生效)。\n const menuEntries = menu\n ? buildTreeMenu(ctx?.fileMenuItems, menu.target, ctx).map((item) => ({\n id: item.id,\n label: item.label,\n danger: item.danger,\n disabled: item.disabled,\n separator: item.separator,\n onClick: () => item.run(menu.target, ctx),\n }))\n : []\n\n return React.createElement('div', { className: 'edrv-side-panel', onContextMenu: onPanelContext },\n React.createElement('div', { className: 'edrv-side-head' },\n React.createElement('span', { className: 'edrv-side-title' }, '资源管理器'),\n React.createElement('span', { className: 'edrv-side-root', title: root || '' }, rootName),\n React.createElement('span', { style: { flex: 1 } }),\n React.createElement('button', { className: 'edrv-side-btn', title: '刷新目录树', onClick: refresh }, '⟳')),\n React.createElement('div', { className: 'edrv-tree' },\n (error\n ? React.createElement('div', { className: 'edrv-tree-error' },\n React.createElement('span', null, String(error)),\n React.createElement('button', { className: 'edrv-side-btn', onClick: () => refresh() }, '重试'))\n : null),\n rowsOf('', 0)),\n (menu && menuEntries.length\n ? React.createElement(ContextMenu, { x: menu.x, y: menu.y, entries: menuEntries, onClose: () => setMenu(null) })\n : null))\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — 「文件管理」面板定义(注册表一项)。\n * 作者 ddj 2026-08-26\n */\nimport React from 'react'\nimport { FileExplorer } from './FileExplorer.js'\nimport type { SidebarPanelDef, SidebarCtx } from '../types.js'\n\n/**\n * 构造文件管理面板定义。\n * @author ddj 2026年08月26号\n * @returns 面板定义(含活动栏徽标 = 差异文件总数)\n */\nexport function createFilePanel(): SidebarPanelDef {\n return {\n id: 'explorer',\n title: '文件管理',\n icon: '📁',\n order: 10,\n badge: (ctx: SidebarCtx) => (ctx.sum && ctx.sum.totalFiles > 0 ? ctx.sum.totalFiles : null),\n render: (ctx: SidebarCtx) => React.createElement(FileExplorer, { ctx }),\n }\n}\n","/**\n * dsh-vscode-mode client — 文件管理右键菜单内置项。\n * 首个内置项:「在文件浏览器中打开」(文件→OS Explorer 定位选中、目录→打开目录)。\n * 反馈统一走 ctx.notify(由 EditorView 提供,落到编辑区路径栏状态)。\n * 作者 ddj 2026-08-27\n */\nimport { revealInExplorer } from '../fileReveal.js'\nimport type { TreeMenuItem } from './contextMenu.js'\n\n/**\n * 构造内置右键菜单项列表(后续内置项直接追加)。\n * @author ddj 2026年08月27号\n * @returns 内置菜单项数组\n */\nexport function createDefaultFileMenuItems(): TreeMenuItem[] {\n return [\n {\n id: 'reveal-in-explorer',\n label: '在文件浏览器中打开',\n order: 0,\n run: (target, ctx) => {\n void revealInExplorer(ctx.sessionId, target.path).then((outcome) => {\n ctx.notify?.(outcome.ok ? '已在文件浏览器中打开' : '打开失败:' + (outcome.error ?? '未知错误'))\n })\n },\n },\n ]\n}\n","/**\n * dsh-vscode-mode client — 大纲兜底解析器(纯函数,无 DOM/Monaco 依赖,node 可测)。\n * 覆盖无内置 document symbol provider 的语言:markdown/mdx、python、shell、powershell、\n * lua、go、rust、yaml、ini(toml)、花括号语言(c/cpp/csharp/java/php/ruby/kotlin/swift/dart)。\n * TS/JS/JSON/CSS/HTML 有 Monaco 原生 provider,不走这里。\n * 作者 ddj 2026-08-27\n */\nimport type { OutlineSymbol } from './types.js'\n\n/** monaco SymbolKind 数值常量(与 LSP SymbolKind 一致,面板渲染按此分组)。 */\nexport const SK = {\n File: 0, Module: 1, Namespace: 2, Package: 3, Class: 4, Method: 5,\n Property: 6, Field: 7, Constructor: 8, Enum: 9, Interface: 10,\n Function: 11, Variable: 12, Constant: 13, String: 14, Number: 15,\n Boolean: 16, Array: 17, Object: 18, Key: 19, Null: 20, EnumMember: 21,\n Struct: 22, Event: 23, Operator: 24, TypeParameter: 25,\n} as const\n\n/** 花括号语言的泛型函数名排除集(避免误把控制流/关键字当符号)。 */\nconst BRACE_KW = new Set([\n 'if', 'for', 'while', 'switch', 'catch', 'foreach', 'using', 'with', 'when',\n 'match', 'return', 'new', 'in', 'of', 'do', 'else', 'elif', 'then', 'yield',\n 'await', 'typeof', 'instanceof', 'case', 'default', 'try', 'finally', 'throw',\n])\n\n/** 花括号语言的类型关键字 → SymbolKind。 */\nconst BRACE_TYPE_KIND: Record<string, number> = {\n class: SK.Class, struct: SK.Struct, interface: SK.Interface, enum: SK.Enum,\n namespace: SK.Namespace, module: SK.Module, trait: SK.Interface, record: SK.Class,\n}\n\n/** 按文档序(先序)补齐每个符号的 endLine:叶子取“下一个符号起行 - 1”,容器取末子 endLine。 */\nfunction computeEnds(symbols: OutlineSymbol[], lastLine: number): void {\n const order: OutlineSymbol[] = []\n const collect = (list: OutlineSymbol[]): void => {\n for (const s of list) {\n order.push(s)\n if (s.children && s.children.length) collect(s.children)\n }\n }\n collect(symbols)\n for (let i = order.length - 1; i >= 0; i--) {\n const s = order[i]\n const kids = s.children ?? []\n if (kids.length) {\n s.endLine = Math.max(s.startLine, kids[kids.length - 1].endLine)\n } else {\n const next = order[i + 1]\n const end = next ? Math.max(s.startLine, next.startLine - 1) : lastLine\n s.endLine = Math.max(s.startLine, Math.min(end, lastLine))\n }\n }\n}\n\n/** 构造单行符号(起始行=跳转行=所在行;detail 为截断后的声明文本)。 */\nfunction mk(lineIndex: number, name: string, kind: number, raw: string): OutlineSymbol {\n const detail = raw.trim().replace(/\\s+/g, ' ').slice(0, 80)\n const line = lineIndex + 1\n const out: OutlineSymbol = { name, kind, startLine: line, endLine: line, selectLine: line }\n if (detail && detail !== name) out.detail = detail\n return out\n}\n\n/** Markdown/mdx:`#` 级标题,层级嵌套。 */\nfunction parseMarkdown(text: string): OutlineSymbol[] {\n const roots: OutlineSymbol[] = []\n const stack: Array<{ level: number; item: OutlineSymbol }> = []\n const lines = text.split('\\n')\n for (let i = 0; i < lines.length; i++) {\n const m = /^(\\#{1,6})\\s+(.+?)\\s*#*\\s*$/.exec(lines[i])\n if (!m) continue\n const item: OutlineSymbol = {\n name: m[2].trim(), kind: SK.Namespace,\n startLine: i + 1, endLine: i + 1, selectLine: i + 1, children: [],\n }\n while (stack.length && stack[stack.length - 1].level >= m[1].length) stack.pop()\n const parent = stack.length ? stack[stack.length - 1].item : null\n ;(parent ? parent.children : roots)!.push(item)\n stack.push({ level: m[1].length, item })\n }\n computeEnds(roots, lines.length)\n return roots\n}\n\n/** Python:def/class 按缩进栈嵌套。 */\nfunction parsePython(text: string): OutlineSymbol[] {\n const roots: OutlineSymbol[] = []\n const stack: Array<{ indent: number; item: OutlineSymbol }> = []\n const lines = text.split('\\n')\n for (let i = 0; i < lines.length; i++) {\n const m = /^([ \\t]*)(?:class|def)\\s+([A-Za-z_]\\w*)\\s*[(:]/.exec(lines[i])\n if (!m) continue\n const indent = m[1].replace(/\\t/g, ' ').length\n const isClass = /class\\s/.test(lines[i])\n const item: OutlineSymbol = {\n name: m[2], kind: isClass ? SK.Class : SK.Function,\n startLine: i + 1, endLine: i + 1, selectLine: i + 1, children: [],\n }\n while (stack.length && stack[stack.length - 1].indent >= indent) stack.pop()\n const parent = stack.length ? stack[stack.length - 1].item : null\n ;(parent ? parent.children : roots)!.push(item)\n stack.push({ indent, item })\n }\n computeEnds(roots, lines.length)\n return roots\n}\n\n/** Shell:`name() {` 函数。 */\nfunction parseShell(text: string): OutlineSymbol[] {\n const out: OutlineSymbol[] = []\n const lines = text.split('\\n')\n for (let i = 0; i < lines.length; i++) {\n const m = /^[ \\t]*([A-Za-z_][A-Za-z0-9_]*)[ \\t]*\\(\\)[ \\t]*\\{/.exec(lines[i])\n if (m) out.push(mk(i, m[1], SK.Function, lines[i]))\n }\n computeEnds(out, lines.length)\n return out\n}\n\n/** PowerShell:`function Name {` / `filter Name {`。 */\nfunction parsePwsh(text: string): OutlineSymbol[] {\n const out: OutlineSymbol[] = []\n const lines = text.split('\\n')\n for (let i = 0; i < lines.length; i++) {\n const m = /^[ \\t]*(?:function|filter)[ \\t]+([\\w.-]+)/.exec(lines[i])\n if (m) out.push(mk(i, m[1], SK.Function, lines[i]))\n }\n computeEnds(out, lines.length)\n return out\n}\n\n/** Lua:`function Foo:bar` / `M.bar = class|function`。 */\nfunction parseLua(text: string): OutlineSymbol[] {\n const out: OutlineSymbol[] = []\n const lines = text.split('\\n')\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]\n if (/^\\s*--/.test(line)) continue\n const fm = /^[ \\t]*(?:local[ \\t]+)?function[ \\t]+([A-Za-z_][\\w.:]*)/.exec(line)\n if (fm) { out.push(mk(i, fm[1], SK.Function, line)); continue }\n const cm = /^[ \\t]*([A-Za-z_][\\w.]*)[ \\t]*=[ \\t]*(?:class|function)\\b/.exec(line)\n if (cm) out.push(mk(i, cm[1], /class\\b/.test(line) ? SK.Class : SK.Function, line))\n }\n computeEnds(out, lines.length)\n return out\n}\n\n/** Go:func(含 receiver)/ type。 */\nfunction parseGo(text: string): OutlineSymbol[] {\n const out: OutlineSymbol[] = []\n const lines = text.split('\\n')\n for (let i = 0; i < lines.length; i++) {\n const fm = /^[ \\t]*func[ \\t]+(?:\\([^)]*\\)[ \\t]*)?([A-Za-z_]\\w*)/.exec(lines[i])\n if (fm) { out.push(mk(i, fm[1], SK.Function, lines[i])); continue }\n const tm = /^[ \\t]*type[ \\t]+([A-Za-z_]\\w*)/.exec(lines[i])\n if (tm) out.push(mk(i, tm[1], SK.Struct, lines[i]))\n }\n computeEnds(out, lines.length)\n return out\n}\n\n/** Rust:fn/struct/enum/trait/impl/mod/type。 */\nfunction parseRust(text: string): OutlineSymbol[] {\n const out: OutlineSymbol[] = []\n const lines = text.split('\\n')\n const kindOf: Record<string, number> = {\n fn: SK.Function, struct: SK.Struct, enum: SK.Enum, trait: SK.Interface,\n impl: SK.Module, mod: SK.Module, type: SK.TypeParameter,\n }\n for (let i = 0; i < lines.length; i++) {\n const m = /^[ \\t]*(?:pub(?:\\([^)]*\\))?[ \\t]+)?(fn|struct|enum|trait|impl|mod|type)[ \\t]+([A-Za-z_]\\w*)/.exec(lines[i])\n if (m && kindOf[m[1]]) out.push(mk(i, m[2], kindOf[m[1]], lines[i]))\n }\n computeEnds(out, lines.length)\n return out\n}\n\n/** YAML:仅顶层键。 */\nfunction parseYaml(text: string): OutlineSymbol[] {\n const out: OutlineSymbol[] = []\n const lines = text.split('\\n')\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]\n if (!line.trim() || /^\\s/.test(line) || /^\\s*[#-]/.test(line)) continue\n const m = /^([A-Za-z0-9_.\\-]+)\\s*:/.exec(line)\n if (m) out.push(mk(i, m[1], SK.Key, line))\n }\n computeEnds(out, lines.length)\n return out\n}\n\n/** INI/TOML:`[section]` + `key=value`。 */\nfunction parseIni(text: string): OutlineSymbol[] {\n const out: OutlineSymbol[] = []\n const lines = text.split('\\n')\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]\n if (!line.trim() || /^\\s*[;#]/.test(line)) continue\n const sm = /^\\[([^\\]]+)\\]/.exec(line)\n if (sm) { out.push(mk(i, sm[1], SK.Namespace, line)); continue }\n const km = /^([A-Za-z0-9_.\\-]+)\\s*[=:]/.exec(line.trim())\n if (km) out.push(mk(i, km[1], SK.Key, line))\n }\n computeEnds(out, lines.length)\n return out\n}\n\n/** 花括号语言(C 族/JVM/.NET):类型声明 + 泛型函数扫描(扁平,best-effort)。 */\nfunction parseBrace(text: string): OutlineSymbol[] {\n const out: OutlineSymbol[] = []\n const lines = text.split('\\n')\n const typeRe = /^[ \\t]*(?:(?:public|private|protected|internal|static|final|abstract|sealed|readonly|export|declare|async|open|extern|virtual|override|const|global|pub|local)\\s+)*(class|struct|interface|enum|namespace|module|trait|record)\\s+([A-Za-z_]\\w*)/\n // 泛型函数:允许任意“字词型”返回类型/修饰符前缀(含 :: 限定名),名字后跟 ( 且不以 ; 结尾\n const funcRe = /^[ \\t]*(?:[\\w<>,*&\\[\\].:]+\\s+)*([A-Za-z_]\\w*)\\s*(?:<[^>]*>)?\\s*\\(/\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]\n const t = line.trim()\n if (!t || /^\\s*\\*/.test(line)) continue\n const tm = typeRe.exec(line)\n if (tm) { out.push(mk(i, tm[2], BRACE_TYPE_KIND[tm[1]] ?? SK.Class, line)); continue }\n const fm = funcRe.exec(line)\n if (!fm) continue\n if (BRACE_KW.has(fm[1]) || /;\\s*$/.test(t)) continue\n out.push(mk(i, fm[1], SK.Function, line))\n }\n computeEnds(out, lines.length)\n return out\n}\n\n/**\n * 按 Monaco languageId 解析大纲符号(纯函数)。\n * @author ddj 2026年08月27号\n * @param languageId Monaco 语言 id\n * @param text 文件全文\n * @returns 归一化大纲符号树\n */\nexport function parseOutline(languageId: string, text: string): OutlineSymbol[] {\n switch (languageId) {\n case 'markdown':\n case 'mdx':\n return parseMarkdown(text)\n case 'python':\n return parsePython(text)\n case 'shell':\n return parseShell(text)\n case 'powershell':\n return parsePwsh(text)\n case 'lua':\n return parseLua(text)\n case 'go':\n return parseGo(text)\n case 'rust':\n return parseRust(text)\n case 'yaml':\n return parseYaml(text)\n case 'ini':\n return parseIni(text)\n case 'c':\n case 'cpp':\n case 'csharp':\n case 'java':\n case 'php':\n case 'ruby':\n case 'kotlin':\n case 'swift':\n case 'dart':\n return parseBrace(text)\n default:\n return []\n }\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — 大纲源注册表 + 内置数据源(monaco / fallback)。\n * 解析规则:按优先级降序遍历源,首个非空结果生效;全空 → 空态。\n * monaco 源吃 Monaco 原生 document symbol provider(ts/json/css/html 与未来\n * 第三方注册的 provider);fallback 源兜底无内置提供方的语言(parse.ts)。\n * 注册表对外 provide 为 edrvOutlineSources,第三方语言插件可注册更高优先级源。\n * 作者 ddj 2026-08-27\n */\nimport type { OutlineSourceRegistry, OutlineSource, OutlineSourceInput, OutlineSymbol } from './types.js'\nimport { parseOutline } from './parse.js'\n\n/** Monaco 原生有 document symbol provider 的语言(无需 fallback)。 */\nexport const OUTLINE_MONACO_LANGS = new Set([\n 'typescript', 'javascript', 'json', 'jsonc', 'css', 'scss', 'less', 'html',\n])\n\n/** 无内置 provider、由 parse.ts 兜底的语言。 */\nexport const OUTLINE_FALLBACK_LANGS = new Set([\n 'markdown', 'mdx', 'python', 'shell', 'powershell', 'lua', 'go', 'rust',\n 'yaml', 'ini', 'c', 'cpp', 'csharp', 'java', 'php', 'ruby', 'kotlin',\n 'swift', 'dart',\n])\n\n/**\n * 创建生命周期独立的大纲源注册表。\n * @author ddj 2026年08月27号\n * @returns 大纲源注册表\n */\nexport function createOutlineSourceRegistry(): OutlineSourceRegistry {\n const entries = new Map<string, OutlineSource>()\n const listeners = new Set<() => void>()\n const notify = (): void => {\n for (const listener of listeners) listener()\n }\n const list = (): readonly OutlineSource[] =>\n [...entries.values()].sort((a, b) => (b.priority - a.priority) || (a.id < b.id ? -1 : a.id > b.id ? 1 : 0))\n return {\n register(source: OutlineSource): () => void {\n if (!source || !source.id || typeof source.get !== 'function') throw new TypeError('大纲源必须提供 id 与 get')\n entries.set(source.id, source)\n notify()\n return () => {\n if (entries.get(source.id) !== source) return\n entries.delete(source.id)\n notify()\n }\n },\n list,\n subscribe(listener: () => void): () => void {\n listeners.add(listener)\n return () => listeners.delete(listener)\n },\n get: (id: string) => entries.get(id),\n }\n}\n\n/** 归一化 Monaco OutlineElement(getTopLevelSymbols 产物)→ OutlineSymbol。 */\nfunction normalizeMonaco(el): OutlineSymbol | null {\n if (!el || typeof el.name !== 'string') return null\n const range = el.range || {}\n const sel = el.selectionRange || range\n const startLine = Math.max(1, Number(sel.startLineNumber ?? range.startLineNumber ?? 1))\n const endLine = Math.max(1, Number(range.endLineNumber ?? startLine))\n const out: OutlineSymbol = {\n name: el.name,\n kind: typeof el.kind === 'number' ? el.kind : 0,\n startLine: Math.max(1, Number(range.startLineNumber ?? startLine)),\n endLine,\n selectLine: startLine,\n }\n if (typeof el.detail === 'string' && el.detail) out.detail = el.detail\n if (Array.isArray(el.children) && el.children.length) {\n const kids = el.children.map(normalizeMonaco).filter(Boolean)\n if (kids.length) out.children = kids\n }\n return out\n}\n\n/**\n * 按优先级解析大纲符号:首个非空结果生效(出错源跳过,落入下一优先级)。\n * @author ddj 2026年08月27号\n * @param sources 大纲源注册表\n * @param input 当前快照(languageId/model/editor/monaco)\n * @returns 归一化符号树(无符号时为空数组)\n */\nexport async function resolveOutline(sources: OutlineSourceRegistry, input: OutlineSourceInput): Promise<OutlineSymbol[]> {\n for (const source of sources.list()) {\n let supports = false\n try { supports = source.provides(input.languageId) } catch { supports = false }\n if (!supports) continue\n let items: OutlineSymbol[] | null = null\n try { items = await source.get(input) } catch { items = null }\n if (items && items.length) return items\n }\n return []\n}\n\n/**\n * 注册内置大纲源(monaco=50 / fallback=30)。\n * @author ddj 2026年08月27号\n * @param registry 目标注册表\n * @returns 注销函数(同时注销全部内置源)\n */\nexport function registerBuiltinOutlineSources(registry: OutlineSourceRegistry): () => void {\n const disposers = [\n registry.register({\n id: 'monaco',\n priority: 50,\n provides: () => true,\n async get(input: OutlineSourceInput): Promise<OutlineSymbol[]> {\n const ed = input.editor\n const model = input.model\n const cmd = ed?._commandService\n if (!cmd || typeof cmd.executeCommand !== 'function') return []\n const uri = model?.uri\n if (!uri) return []\n const list = await cmd.executeCommand('_executeDocumentSymbolProvider', uri)\n return Array.isArray(list) ? list.map(normalizeMonaco).filter(Boolean) : []\n },\n }),\n registry.register({\n id: 'fallback',\n priority: 30,\n provides: (languageId: string) => OUTLINE_FALLBACK_LANGS.has(languageId),\n async get(input: OutlineSourceInput): Promise<OutlineSymbol[]> {\n const model = input.model\n if (!model || typeof model.getValue !== 'function') return []\n return parseOutline(input.languageId, model.getValue())\n },\n }),\n ]\n return () => { for (const dispose of disposers) dispose() }\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — 侧边栏「大纲」面板。\n * 数据源经 resolveOutline(源注册表,优先级降序、首个非空生效)解析当前活动文件符号:\n * monaco 源吃原生 document symbol provider,fallback 源兜底无内置提供方的语言。\n * 交互:点击符号跳转编辑器、▸/▾ 折叠、光标所在符号高亮、空/加载/错误态。\n * 作者 ddj 2026-08-27\n */\nimport React from 'react'\nimport { resolveOutline } from './sources.js'\nimport type { SidebarCtx } from '../sidebar/types.js'\n\n/** 渲染符号数上限(防超大文件卡顿,超出显示截断提示)。 */\nconst RENDER_CAP = 800\n\n/** kind 分组元信息(字形 + 样式类)。 */\nconst KIND_GROUPS = {\n func: { glyph: 'ƒ', cls: 'edrv-ol-func' },\n type: { glyph: 'C', cls: 'edrv-ol-type' },\n data: { glyph: '•', cls: 'edrv-ol-data' },\n ns: { glyph: '▤', cls: 'edrv-ol-ns' },\n key: { glyph: '·', cls: 'edrv-ol-key' },\n}\n\n/** SymbolKind 数值 → 分组(File0..Package3=ns;Class4/Enum9/Interface10/Struct22/TypeParameter25=type;Method5/Constructor8/Function11=func;Key19/EnumMember21=key)。 */\nfunction kindMeta(kind) {\n const k = kind | 0\n if (k <= 3) return KIND_GROUPS.ns\n if (k === 4 || k === 9 || k === 10 || k === 22 || k === 25) return KIND_GROUPS.type\n if (k === 5 || k === 8 || k === 11) return KIND_GROUPS.func\n if (k === 19 || k === 21) return KIND_GROUPS.key\n return KIND_GROUPS.data\n}\n\n/**\n * 大纲面板主体。\n * @param props.ctx 面板共享上下文(editor/outlineSources/activePath)\n */\nexport function OutlinePanel(props) {\n const ctx = props?.ctx\n const activePath = ctx?.activePath ?? null\n const [symbols, setSymbols] = React.useState(null)\n const [error, setError] = React.useState(null)\n const [collapsed, setCollapsed] = React.useState({})\n const [cursorLine, setCursorLine] = React.useState(null)\n const seqRef = React.useRef(0)\n // ref 镜像:refresh 稳定([]),监听器只挂一次,避免 EditorView 每渲染重建 ctx 造成抖动\n const ctxRef = React.useRef(ctx)\n ctxRef.current = ctx\n const activeRef = React.useRef(activePath)\n activeRef.current = activePath\n const sourcesRef = React.useRef(ctx?.outlineSources)\n sourcesRef.current = ctx?.outlineSources\n\n const refresh = React.useCallback(() => {\n const c = ctxRef.current\n const ed = c?.editor?.()\n const model = ed?.getModel?.()\n const seq = ++seqRef.current\n if (!ed || !model) { setSymbols(null); setError(null); return }\n const uriPath = model?.uri?.path\n const modelPath = uriPath ? decodeURIComponent(String(uriPath).replace(/^\\//, '')) : null\n const active = activeRef.current\n if (active && modelPath !== active) { setSymbols(null); setError(null); return }\n const sources = sourcesRef.current\n if (!sources) { setSymbols([]); setError(null); return }\n setError(null)\n resolveOutline(sources, { languageId: model.getLanguageId(), model, editor: ed, monaco: window.monaco })\n .then((list) => { if (seq === seqRef.current) setSymbols(list || []) })\n .catch((e) => { if (seq === seqRef.current) { setError(String(e?.message ?? e)); setSymbols(null) } })\n }, [])\n\n // 编辑器监听:模型切换/内容编辑(防抖)/光标移动 + edrv:refresh;\n // 编辑器未就绪时轮询等待(避免面板先于 Monaco 挂载后永久停在加载态)\n React.useEffect(() => {\n const disposers = []\n let debounceTimer = null\n let waitTimer = null\n const attach = () => {\n const ed = ctxRef.current?.editor?.()\n if (!ed) return false\n let contentDisposable = null\n const subContent = (model) => {\n if (contentDisposable) { contentDisposable.dispose(); contentDisposable = null }\n contentDisposable = model?.onDidChangeContent?.(() => {\n if (debounceTimer) clearTimeout(debounceTimer)\n debounceTimer = setTimeout(() => { debounceTimer = null; refresh() }, 300)\n }) ?? null\n }\n const onModel = () => { subContent(ed.getModel?.()); refresh() }\n const onCursor = (e) => setCursorLine(e?.position?.lineNumber ?? null)\n subContent(ed.getModel?.())\n const subs = [\n ed.onDidChangeModel?.(onModel),\n ed.onDidChangeCursorPosition?.(onCursor),\n { dispose: () => { if (contentDisposable) contentDisposable.dispose() } },\n ]\n for (const s of subs) if (s) disposers.push(s)\n refresh()\n return true\n }\n const onRefresh = () => refresh()\n window.addEventListener('edrv:refresh', onRefresh)\n if (!attach()) {\n waitTimer = setInterval(() => { if (attach()) { clearInterval(waitTimer); waitTimer = null } }, 400)\n }\n return () => {\n if (debounceTimer) clearTimeout(debounceTimer)\n if (waitTimer) clearInterval(waitTimer)\n for (const d of disposers) if (d?.dispose) d.dispose()\n window.removeEventListener('edrv:refresh', onRefresh)\n }\n }, [refresh])\n\n // 活动文件变化 → 重拉\n React.useEffect(() => { refresh() }, [refresh, activePath])\n\n const jump = (sym) => {\n const ed = ctxRef.current?.editor?.()\n if (!ed) return\n const line = Math.max(1, sym?.selectLine ?? sym?.startLine ?? 1)\n ed.revealLineInCenter(line)\n ed.setPosition({ lineNumber: line, column: 1 })\n ed.focus()\n }\n\n const toggleCollapse = (key) => {\n setCollapsed((prev) => Object.assign({}, prev, { [key]: prev[key] === true ? false : true }))\n }\n\n const allKeys = React.useMemo(() => {\n const keys = []\n const walk = (list, prefix) => {\n for (let i = 0; i < list.length; i++) {\n const key = prefix ? prefix + '/' + i : String(i)\n const sym = list[i]\n if (sym.children && sym.children.length) { keys.push(key); walk(sym.children, key) }\n }\n }\n walk(symbols || [], '')\n return keys\n }, [symbols])\n\n const setAll = (value) => {\n const next = {}\n for (const key of allKeys) next[key] = value\n setCollapsed(next)\n }\n\n const renderTree = (list, depth, prefix) => {\n const rows = []\n const cap = Math.min(list.length, RENDER_CAP)\n for (let i = 0; i < cap; i++) {\n const sym = list[i]\n const key = prefix ? prefix + '/' + i : String(i)\n const kids = sym.children && sym.children.length ? sym.children : null\n const isCollapsed = collapsed[key] === true\n const meta = kindMeta(sym.kind)\n const active = cursorLine != null && sym.startLine <= cursorLine && cursorLine <= sym.endLine\n rows.push(React.createElement('div', {\n key,\n className: 'edrv-tree-row' + (active ? ' edrv-tree-active' : ''),\n title: sym.detail || sym.name,\n style: { paddingLeft: 6 + depth * 14 },\n onClick: () => jump(sym),\n },\n React.createElement('span', {\n className: 'edrv-tree-chev',\n onClick: (e) => { e.stopPropagation(); toggleCollapse(key) },\n }, kids ? (isCollapsed ? '▸' : '▾') : ''),\n React.createElement('span', { className: 'edrv-outline-kind ' + meta.cls }, meta.glyph),\n React.createElement('span', { className: 'edrv-tree-name' }, sym.name),\n (sym.detail ? React.createElement('span', { className: 'edrv-outline-detail' }, sym.detail) : null),\n React.createElement('span', { className: 'edrv-outline-ln' }, String(sym.selectLine ?? sym.startLine ?? ''))))\n if (kids && !isCollapsed) rows.push(...renderTree(kids, depth + 1, key))\n }\n if (list.length > RENDER_CAP) {\n rows.push(React.createElement('div', { key: 'cap', className: 'edrv-tree-loading' }, '符号过多,仅显示前 ' + RENDER_CAP + ' 个'))\n }\n return rows\n }\n\n const basename = activePath ? String(activePath).split(/[\\\\/]/).pop() || activePath : ''\n\n let body\n if (error) {\n body = React.createElement('div', { className: 'edrv-tree' },\n React.createElement('div', { className: 'edrv-tree-error' },\n React.createElement('span', null, String(error)),\n React.createElement('button', { className: 'edrv-side-btn', onClick: refresh }, '重试')))\n } else if (!activePath) {\n body = React.createElement('div', { className: 'edrv-tree' },\n React.createElement('div', { className: 'edrv-tree-loading' }, '未打开文件'))\n } else if (symbols === null) {\n body = React.createElement('div', { className: 'edrv-tree' },\n React.createElement('div', { className: 'edrv-tree-loading' }, '加载中…'))\n } else if (symbols.length === 0) {\n body = React.createElement('div', { className: 'edrv-tree' },\n React.createElement('div', { className: 'edrv-tree-loading' }, '该语言暂不支持大纲或文件无符号'))\n } else {\n body = React.createElement('div', { className: 'edrv-tree' }, ...renderTree(symbols, 0, ''))\n }\n\n return React.createElement('div', { className: 'edrv-side-panel' },\n React.createElement('div', { className: 'edrv-side-head' },\n React.createElement('span', { className: 'edrv-side-title' }, '大纲'),\n React.createElement('span', { className: 'edrv-side-root', title: activePath || '' }, basename),\n React.createElement('span', { style: { flex: 1 } }),\n React.createElement('button', { className: 'edrv-side-btn', title: '折叠全部', disabled: !(symbols && symbols.length), onClick: () => setAll(true) }, '−'),\n React.createElement('button', { className: 'edrv-side-btn', title: '展开全部', disabled: !(symbols && symbols.length), onClick: () => setAll(false) }, '+'),\n React.createElement('button', { className: 'edrv-side-btn', title: '刷新大纲', onClick: refresh }, '⟳')),\n body)\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — 「大纲」面板定义(注册表一项)。\n * 数据源解析复用 outline/sources 的源注册表(ctx.outlineSources 注入)。\n * 作者 ddj 2026-08-27\n */\nimport React from 'react'\nimport { OutlinePanel } from './OutlinePanel.js'\nimport type { SidebarPanelDef, SidebarCtx } from '../sidebar/types.js'\n\n/**\n * 构造大纲面板定义。\n * @author ddj 2026年08月27号\n * @returns 面板定义(无徽标;活动栏图标 📜)\n */\nexport function createOutlinePanel(): SidebarPanelDef {\n return {\n id: 'outline',\n title: '大纲',\n icon: '📜',\n order: 20,\n render: (ctx: SidebarCtx) => React.createElement(OutlinePanel, { ctx }),\n }\n}\n","/**\n * dsh-vscode-mode client — 浏览器半入口:slot 注册 + 装配。\n * 挂点:betterSidebar「文件编辑」Tab(侧边栏形态,对话+编辑同屏;未装 dsh-better-sidebar 时\n * 回退 conversation.view 中央页签)+ conversation.input.dock 差异条 + header 差异角标。\n * 与 Host 通信:同源 fetch('/edrv/rpc')(shared/rpc 契约)。\n *\n * ⚠️ 跨版本 slot 装配(2026-08-21):新版 DSH 的 slots 系统要求 slot 必须由父 entry\n * 的 children table 先声明,直接 `ctx.slots.register({name:'conversation.view'})` 在\n * 声明未就绪时抛 `slot ... is not declared (a parent entry's children table must declare it)`。\n * 正确写法 = `ctx.slots.inject(name, () => ctx.slots.register(...))`:声明存在时同步\n * 执行,否则等待声明(官方 ui-conversation 自身即此模式);旧版(rc.8 及更早)同样支持,\n * 故跨版本兼容。slot 名:conversation.view / conversation.session.header.utilities /\n * conversation.input.dock。\n * 作者 ddj 2026-08-20\n */\nimport React from 'react'\nimport './styles/editor.css'\nimport { EditorView } from './ui/EditorView.js'\nimport { DiffBadge } from './ui/DiffBadge.js'\nimport { ConversationDiffDock } from './ui/ConversationDiffDock.js'\nimport { McpSettings } from './ui/McpSettings.js'\nimport { rpc } from './rpc.js'\nimport { loadMonaco } from './monaco/loader.js'\nimport { createFileOpenerRegistry, scanSidebar, type FileOpenContext } from './fileOpeners.js'\nimport type { FileOpenerRegistry } from './fileOpeners.js'\nimport { installOpenPathRouter, vscodeOpener, autoValue } from './openPathRouter.js'\nimport { SettingsContext } from './settingsContext.js'\nimport { SIDEBAR_PLUGIN, pickSettingsBinder, registerSlotSafely } from './compat.js'\nimport { detectSidebarService, installSideEditor, setEnsureSideEditor, SIDEBAR_INSTALL_CMD } from './sidebarBridge.js'\nimport { SideEditorTab } from './ui/SideEditorTab.js'\nimport { createAddToConversation } from './addToConversation.js'\nimport { createSidebarPanelRegistry } from './sidebar/registry.js'\nimport { createFilePanel } from './sidebar/panels/index.js'\nimport { createTreeMenuRegistry } from './sidebar/contextMenu.js'\nimport { createDefaultFileMenuItems } from './sidebar/menuItems.js'\nimport { createOutlinePanel } from './outline/index.js'\nimport { createOutlineSourceRegistry, registerBuiltinOutlineSources } from './outline/sources.js'\nimport type { CompatAdapter } from '../shared/compat.js'\n\n// ⚠️ inject 只列必需服务:webUiSettings 是 @linxin666/dsh-client-ui-web-ui-settings 提供的\n// 可选兼容桥(非官方服务),列入 inject 会让未装该桥的部署启动时 entry 永久 pending,\n// web boot 直接失败('1 entry did not activate')。兼容层用 ctx.get 运行时探测 + 降级,不靠 inject。\nexport const inject = ['slots', 'timer', 'locale', 'connection', 'remote', 'workspaces', 'sessions', 'conversation', 'settingsScope']\n\n/**\n * 装配客户端:注册中央编辑区视图与 header 差异角标。\n * @author ddj 2026年08月20号\n * @param ctx 客户端根上下文(slots + timer 服务)\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function apply(ctx: any): void {\n const schedule = (fn: () => void, ms: number) => ctx.timeout(fn, ms)\n\n const registry: FileOpenerRegistry = createFileOpenerRegistry()\n const workspaces = ctx.get('workspaces')\n const sessions = ctx.get('sessions')\n\n // Monaco 加载时机:不再 DSH 启动即预热,改为进入会话界面(sessions.list.current 出现)后再后台加载,\n // 用户点开「文件编辑」页签即用;空闲时仍由 EditorView 挂载兜底加载。\n // 模块级 promise 去重,重复触发只首次真正加载;requestIdleCallback 让出会话首屏带宽,缺省回退延时调度;\n // 预热失败静默吞掉(loader 失败会重置 promise,页签打开时仍走原有加载/重试路径)。\n const monacoList = sessions?.list\n if (typeof window !== 'undefined' && monacoList && typeof monacoList.subscribe === 'function') {\n const list = monacoList as { getSnapshot: () => { current?: unknown }; subscribe: (listener: () => void) => () => void }\n const schedulePreload = () => {\n const preload = () => loadMonaco(() => {}).catch(() => {})\n if (typeof window.requestIdleCallback === 'function') window.requestIdleCallback(preload, { timeout: 2000 })\n else schedule(preload, 300)\n }\n const onSessionEnter = () => {\n if (!list.getSnapshot()?.current) return\n schedulePreload()\n }\n ctx.effect(() => list.subscribe(onSessionEnter), 'vscode-mode: monaco session trigger')\n onSessionEnter()\n }\n const originalOpenPath = workspaces?.openPath\n const binder = pickSettingsBinder(ctx)\n const settings = binder.scope\n let selected = autoValue('auto')\n /** 可选探测 betterSidebar 服务(不进 inject:缺失会让插件停靠等待,杀死回退路径)。 */\n let sideService = detectSidebarService(ctx)\n /** 「添加到对话」动作集:编辑区/Tab 右键菜单注入文件引用与代码块(conversation 服务缺失时各动作安全降级)。 */\n const addToConversation = createAddToConversation(ctx)\n\n /** 客户端侧兼容摘要(与 host 报告合并展示;惰性求值保证 HMR 后仍新鲜)。 */\n const compatSummary = (): CompatAdapter[] => [\n { name: '设置桥', active: settings !== undefined, note: settings !== undefined ? '使用 ' + binder.service + ' 桥' : '未绑定设置服务(fileOpenTool 持久化不可用)' },\n { name: '文件打开路由(workspaces.openPath)', active: Boolean(workspaces?.openPath), note: 'vscode 打开器优先,失败回退系统打开' },\n { name: '侧边栏打开器(' + SIDEBAR_PLUGIN + ')', active: registry.get(SIDEBAR_PLUGIN) !== undefined, note: registry.get(SIDEBAR_PLUGIN) !== undefined ? '已注册(优先级 80)' : '未检测到侧边栏打开能力' },\n { name: '侧边栏编辑区(' + SIDEBAR_PLUGIN + ')', active: sideService !== undefined, note: sideService !== undefined ? '编辑区=侧边栏 Tab(对话+编辑同屏)' : '未检测到;安装 dsh-better-sidebar 后刷新启用侧边栏形态(' + SIDEBAR_INSTALL_CMD + ')' },\n ]\n\n ctx.provide('fileOpeners', registry)\n ctx.effect(() => registry.register(vscodeOpener()), 'vscode-mode: file opener')\n\n // 侧边栏面板注册表(对外 provide,供本插件/第三方注册面板;文件管理为面板 #1)\n const sidebarPanels = createSidebarPanelRegistry()\n ctx.provide('edrvSidebarPanels', sidebarPanels)\n ctx.effect(() => sidebarPanels.register(createFilePanel()), 'vscode-mode: sidebar panel')\n // 文件右键菜单项注册表(对外 provide,供本插件/第三方注册;内置「在文件浏览器中打开」)\n const fileMenuItems = createTreeMenuRegistry()\n ctx.provide('edrvFileContextMenuItems', fileMenuItems)\n for (const item of createDefaultFileMenuItems()) {\n ctx.effect(() => fileMenuItems.register(item), 'vscode-mode: file context menu item ' + item.id)\n }\n // 大纲源注册表(公开预留口):第三方语言插件(LSP/VSIX 等)注册更高优先级源即可覆盖兜底\n const outlineSources = createOutlineSourceRegistry()\n ctx.provide('edrvOutlineSources', outlineSources)\n ctx.effect(() => registerBuiltinOutlineSources(outlineSources), 'vscode-mode: outline sources')\n ctx.effect(() => sidebarPanels.register(createOutlinePanel()), 'vscode-mode: sidebar panel outline')\n ctx.effect(() => registry.register({\n id: 'system', label: '系统默认应用', priority: 0,\n open: (path: string) => originalOpenPath.call(workspaces, path),\n }), 'vscode-mode: system file opener')\n ctx.effect(() => {\n const sidebar = scanSidebar(ctx)\n return sidebar ? registry.register(sidebar) : undefined\n }, 'vscode-mode: sidebar file opener')\n ctx.effect(() => {\n if (!settings) return undefined\n const sync = (): void => {\n const snapshot = settings.getSnapshot()\n if (snapshot.status === 'loading') return\n selected = autoValue(snapshot.value?.fileOpenTool)\n window.dispatchEvent(new CustomEvent('edrv:file-open-tool-change', { detail: { value: selected } }))\n }\n sync()\n return settings.subscribe(sync)\n }, 'vscode-mode: file opener setting sync')\n if (workspaces?.openPath) {\n ctx.effect(() => installOpenPathRouter({\n workspaces,\n registry,\n selected: () => selected,\n context: () => {\n const current = sessions?.list?.getSnapshot?.()\n const sessionId = current?.current\n const summary = sessionId ? current?.byId?.[sessionId] : undefined\n return { sessionId, cwd: summary?.cwd } as FileOpenContext\n },\n logger: (message: string) => console.warn('[dsh-vscode-mode] ' + message),\n }), 'vscode-mode: file link routing')\n }\n\n // 中央「文件编辑」页签(旧形态回退):类 VSCode 编辑器;侧边栏形态可用时编辑器住 betterSidebar Tab,\n // 本页签不注册(避免双实例:Monaco×2 + diff dock 每会话单源抢占)。\n const registerLegacyTab = (): (() => void) | null => {\n return registerSlotSafely(ctx, {\n name: 'conversation.view',\n id: 'edrv-editor',\n order: 5,\n label: '文件编辑',\n inject: (sessionId: string) => ({ sessionId }),\n }, (props: unknown) => React.createElement(EditorView, Object.assign({}, props, { layout: 'tab', sideHint: SIDEBAR_INSTALL_CMD, schedule, addToConversation, sidebarPanels, outlineSources, fileMenuItems })))\n }\n\n // 侧边栏/中央页签两形态互斥切换:sideDisposer(侧边栏 Tab)与 legacyDisposer(中央页签)只保留其一。\n // ⚠️ betterSidebar 服务由 dsh-better-sidebar 的 client bundle(1MB+)在页面加载时提供,本插件\n // bundle 较小往往先执行完启动检测——一次性探测会误报「未检测到」并永久停在中央页签形态(实测\n // 竞态:better-sidebar 已装,但「文件编辑」Tab 未注册)。故启动后按 2s 间隔重试(窗口 ~30s),\n // 命中即自动切换侧边栏形态;始终未命中则保持中央页签回退。\n let sideDisposer: (() => void) | null = null\n let legacyDisposer: (() => void) | null = null\n const applySideForm = (): void => {\n if (sideService) {\n if (sideDisposer !== null) return\n if (legacyDisposer !== null) { legacyDisposer(); legacyDisposer = null }\n sideDisposer = ctx.effect(() => installSideEditor({\n service: sideService as NonNullable<typeof sideService>,\n renderTab: (props: Record<string, unknown>) => React.createElement(SideEditorTab, Object.assign({}, props, { schedule, addToConversation, sidebarPanels, outlineSources, fileMenuItems })),\n activeSession: () => {\n const snapshot = sessions?.list?.getSnapshot?.() as { current?: string; byId?: Record<string, { cwd?: string }> } | undefined\n const sessionId = snapshot?.current\n if (!sessionId) return undefined\n return { sessionId, cwd: snapshot?.byId?.[sessionId]?.cwd }\n },\n registerLegacyFallback: registerLegacyTab,\n }), 'vscode-mode: sidebar editor tab')\n } else {\n if (legacyDisposer !== null) return\n if (sideDisposer !== null) { sideDisposer(); sideDisposer = null }\n setEnsureSideEditor(null)\n legacyDisposer = registerLegacyTab()\n }\n }\n applySideForm()\n let sideRetries = 0\n const retrySideService = (): void => {\n if (sideService !== undefined || sideRetries >= 15) return\n sideRetries += 1\n schedule(() => {\n if (sideService !== undefined) return\n sideService = detectSidebarService(ctx)\n if (sideService !== undefined) {\n console.info('[dsh-vscode-mode] 检测到 ' + SIDEBAR_PLUGIN + ',切换侧边栏编辑形态')\n applySideForm()\n } else {\n retrySideService()\n }\n }, 2000)\n }\n retrySideService()\n\n // 对话输入框上方差异 dock:普通对话显示单文案按钮,文件编辑页由 EditorView 隐藏\n registerSlotSafely(ctx, {\n name: 'conversation.input.dock',\n id: 'edrv-diff-dock',\n order: 30,\n label: '差异',\n inject: (sessionId: string) => ({ sessionId }),\n }, (props: unknown) => React.createElement(ConversationDiffDock, Object.assign({}, props)))\n\n // header 差异角标:仅当前工作区存在差异时渲染\n registerSlotSafely(ctx, { name: 'conversation.session.header.utilities', id: 'edrv-diff-badge', order: 90, label: '差异' },\n (props: unknown) => React.createElement(DiffBadge, Object.assign({}, props)))\n\n // 设置页中的 VSCodeMode 专属页签,MCP 管理作为该页签的内部子 Tab。\n registerSlotSafely(ctx, {\n name: 'settings.section',\n id: 'vscode-mode',\n order: 30,\n label: 'VSCodeMode',\n }, () => React.createElement(SettingsContext.Provider, { value: settings }, React.createElement(McpSettings, { openerRegistry: registry, compatSummary })))\n}"],"mappings":"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"}
1
+ {"version":3,"file":"client.js","names":["React","listeners","React","React","React","React","KEY_PREFIX","React","React","React","React","React","React","React","React","React","createPortal","React","React","React","React","React","React"],"sources":["../src/shared/rpc.ts","../src/client/rpc.ts","../src/client/sidebarBridge.ts","../src/client/events.ts","../src/client/monaco/loader.ts","../src/client/monaco/diffRender.ts","../src/shared/diff.ts","../src/client/state/records.ts","../src/client/state/regions.ts","../src/shared/keybindings.ts","../src/client/keybindings.ts","../src/client/ui/QuickOpen.ts","../src/client/ui/shared.ts","../src/client/ui/DiffLauncher.ts","../src/client/sidebar/SidebarView.ts","../src/client/diffDockStore.ts","../src/client/diffDock.ts","../src/client/editorLayout.ts","../src/client/fileReveal.ts","../src/client/state/viewStateCache.ts","../src/client/ui/EditorView.ts","../src/client/ui/DiffBadge.ts","../src/client/ui/DiffBox.ts","../src/client/ui/ConversationDiffDock.ts","../src/client/compat.ts","../src/client/fileOpeners.ts","../src/client/settingsContext.ts","../src/client/ui/KeybindingsPanel.ts","../src/client/ui/McpSettings.ts","../src/client/openPathRouter.ts","../src/client/ui/SideEditorTab.ts","../src/client/addToConversation.ts","../src/client/sidebar/registry.ts","../src/client/ui/menuPosition.ts","../src/client/ui/ContextMenu.ts","../src/client/sidebar/contextMenu.ts","../src/client/state/explorerCache.ts","../src/client/sidebar/panels/FileExplorer.ts","../src/client/sidebar/panels/SearchPanel.ts","../src/client/sidebar/panels/index.ts","../src/client/sidebar/menuItems.ts","../src/client/outline/parse.ts","../src/client/outline/sources.ts","../src/client/outline/OutlinePanel.tsx","../src/client/outline/index.ts","../src/client/index.ts"],"sourcesContent":["/**\n * dsh-vscode-mode RPC contract — method names, per-method request/ok payloads,\n * and the typed handler map shared by the host dispatcher and the client\n * fetch wrapper. 载荷形状与历史实现一字不差,仅把隐式约定类型化。\n *\n * Purity rule: no node/react imports (same as types.ts).\n * 作者 ddj 2026-08-20\n */\nimport type {\n ArchiveBatch,\n ArchiveEntry,\n RecordView,\n StaleHunk,\n} from './types.js'\nimport type { MpcConfig, MpcProject, MpcProjectSaveInput, MpcServer } from './mcp.js'\nimport type { CompatReport, DevFormInfo } from './compat.js'\n\n/** webServer 精确路由。 */\nexport const RPC_PATH = '/edrv/rpc'\n\n/** 决策作用域:call=整条记录,hunk=单个差异块。 */\nexport type RpcScope = 'call' | 'hunk'\n\n/** 目录树单项(edrv.listDir 返回;path 相对工作区根,'/' 分隔)。 */\nexport interface TreeEntry {\n name: string\n path: string\n type: 'file' | 'directory' | 'other'\n size?: number\n}\n\n/** 内容搜索单条命中(edrv.searchContent 返回;path 相对工作区根,列为 1-based UTF-16)。 */\nexport interface SearchContentMatch {\n path: string\n line: number\n startColumn: number\n endColumn: number\n text: string\n}\n\n/** 一条批量决策项(decideBatch 的 items 元素,与 accept/reject 单条参数同构)。 */\nexport interface DecideItem {\n callId: string\n scope?: RpcScope\n hunkIndex?: number\n decision: 'accepted' | 'rejected'\n}\n\n/** 批量决策逐项结果。 */\nexport interface DecideResult {\n callId: string\n ok: boolean\n error?: string\n record?: RecordView\n}\n\n/** 每个方法的请求参数(sessionId 为公共可选字段)。 */\nexport interface RpcRequestMap {\n 'edrv.list': { sessionId?: string; callIds?: string[]; skipStale?: boolean }\n 'edrv.accept': { sessionId?: string; callId: string; scope?: RpcScope; hunkIndex?: number }\n 'edrv.reject': { sessionId?: string; callId: string; scope?: RpcScope; hunkIndex?: number }\n 'edrv.decideBatch': { sessionId?: string; items: DecideItem[] }\n 'edrv.read': { sessionId?: string; path: string }\n 'edrv.original': { sessionId?: string; path: string }\n 'edrv.save': { sessionId?: string; path: string; content: string }\n 'edrv.archiveList': { sessionId?: string }\n 'edrv.archiveRead': { sessionId?: string; path?: string }\n 'edrv.rollback': { sessionId?: string; path: string; batch?: number }\n 'edrv.debug': { sessionId?: string; text: string }\n 'edrv.searchFiles': { sessionId?: string; query: string }\n 'edrv.searchContent': { sessionId?: string; query: string; matchCase?: boolean; wholeWord?: boolean; regex?: boolean; maxResults?: number; include?: string[]; exclude?: string[] }\n 'edrv.listDir': { sessionId?: string; path: string }\n 'edrv.revealInExplorer': { sessionId?: string; path: string }\n 'mcp.list': {}\n 'mcp.save': { config: MpcConfig }\n 'mcp.remove': { id: string }\n 'mcp.toggle': { id: string; enabled: boolean }\n 'mcp.refresh': { id: string }\n 'mcp.projects': {}\n 'mcp.projectSave': MpcProjectSaveInput\n 'mcp.projectRemove': { workspacePath: string; serverName: string }\n 'mcp.projectToggle': { workspacePath: string; serverName: string; enabled: boolean }\n 'mcp.projectRefresh': { workspacePath: string; serverName: string }\n 'vscode.fileOpenSettingsGet': {}\n 'vscode.fileOpenSettingsUpdate': { fileOpenTool: string; expectedRevision?: number }\n 'vscode.devFormGet': {}\n 'vscode.devFormSet': { enabled: boolean; path?: string }\n 'compat': {}\n}\n\nexport type RpcMethod = keyof RpcRequestMap\n\n/** 每个方法成功(ok:true)时的附加载荷。 */\nexport interface RpcOkMap {\n 'edrv.list': { records: RecordView[] }\n 'edrv.accept': { record: RecordView }\n 'edrv.reject': { record: RecordView }\n 'edrv.decideBatch': { results: DecideResult[] }\n 'edrv.read': { content: string; size: number }\n 'edrv.original': { content: string; size: number; stale: StaleHunk[]; fallback: boolean }\n 'edrv.save': object\n 'edrv.archiveList': { entries: ArchiveEntry[] }\n 'edrv.archiveRead': { batches: ArchiveBatch[] }\n 'edrv.rollback': { path: string; batch: number | null }\n 'edrv.debug': object\n 'edrv.searchFiles': { files: string[]; truncated: boolean }\n 'edrv.searchContent': { matches: SearchContentMatch[]; truncated: boolean }\n 'edrv.listDir': { root: string; path: string; entries: TreeEntry[] }\n 'edrv.revealInExplorer': { revealed: string }\n 'mcp.list': { servers: MpcServer[] }\n 'mcp.save': { server: MpcServer }\n 'mcp.remove': object\n 'mcp.toggle': { server: MpcServer }\n 'mcp.refresh': { server: MpcServer }\n 'mcp.projects': { projects: MpcProject[] }\n 'mcp.projectSave': { project: MpcProject }\n 'mcp.projectRemove': { project: MpcProject }\n 'mcp.projectToggle': { project: MpcProject }\n 'mcp.projectRefresh': { project: MpcProject }\n 'vscode.fileOpenSettingsGet': { fileOpenTool: string; revision?: number }\n 'vscode.fileOpenSettingsUpdate': { fileOpenTool: string; revision?: number }\n 'vscode.devFormGet': { devForm: DevFormInfo }\n 'vscode.devFormSet': { devForm: DevFormInfo; restart: boolean }\n 'compat': { report: CompatReport }\n}\n\n/** 统一响应:{ok:true, ...payload} 或 {ok:false, error}。 */\nexport type RpcResult<M extends RpcMethod> =\n | ({ ok: true } & RpcOkMap[M])\n | { ok: false; error: string }\n\n/** 每个方法的 handler 签名(host 分发表与 client 类型检查共用)。 */\nexport type RpcHandler<M extends RpcMethod> = (\n args: RpcRequestMap[M],\n) => Promise<RpcResult<M>>\n\n/** host RPC 分发表:method → handler。 */\nexport type RpcHandlerMap = {\n [M in RpcMethod]: RpcHandler<M>\n}\n","/**\n * dsh-vscode-mode client — 类型化 RPC 包装 + 诊断日志。\n * 迁移自原 src/client/index.ts 的 rpc/dbg,语义不改。\n * 作者 ddj 2026-08-20\n */\nimport { RPC_PATH } from '../shared/rpc.js'\nimport type { RpcMethod, RpcRequestMap, RpcResult } from '../shared/rpc.js'\n\n/**\n * 诊断日志开关(默认关):diff 渲染热路径每条日志 = 1 次 RPC 往返 +\n * host 端 debug 文件全量读改写(上限 512KB),高频渲染下开销可观。\n * 排查问题时在浏览器控制台执行 localStorage.setItem('edrv.debug','1') 后刷新开启。\n * @author ddj 2026年08月26号\n */\nconst DEBUG = (() => {\n try { return localStorage.getItem('edrv.debug') === '1' } catch (e) { return false }\n})()\n\n/** 同源 RPC 调用(host /edrv/rpc 精确路由)。 */\nexport function rpc<M extends RpcMethod>(method: M, args: RpcRequestMap[M]): Promise<RpcResult<M>> {\n return fetch(RPC_PATH, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ method, args }),\n }).then((res) => res.json()) as Promise<RpcResult<M>>\n}\n\n/**\n * 诊断日志:开关关闭时直接返回(零 RPC 零落盘);开启时走 host edrv.debug 落盘。\n * @author ddj 2026年08月26号\n * @param sessionId 会话 id\n * @param text 日志文本\n */\nexport function dbg(sessionId: string | undefined, text: string): void {\n if (!DEBUG) return\n try {\n rpc('edrv.debug', { sessionId, text }).catch(() => {})\n } catch (e) { /* 日志失败忽略 */ }\n}\n","/**\n * dsh-vscode-mode client — 侧边栏编辑区桥:可选探测 dsh-better-sidebar 的\n * ctx.betterSidebar 服务,并注册「文件编辑」Tab(单实例)。\n * 可选依赖模式:服务缺失时调用方回退到中央页签形态;本模块不注册任何东西。\n * 纯逻辑(探测/初始打开解析/角标计数)可单测,DOM/事件仅存在于 install 路径。\n * 作者 ddj 2026年08月25号\n */\n\nimport React from 'react'\n\n/** betterSidebar 服务名(ctx.get 用;不要加进 inject——缺失会让插件停靠等待)。 */\nexport const BETTER_SIDEBAR_SERVICE = 'betterSidebar'\n/** 本插件在侧边栏注册的 Tab 类型 id(亦是 SidebarTab.type)。 */\nexport const SIDE_TAB_ID = 'edrv-editor'\n/** 侧边栏 Tab 标题。 */\nexport const SIDE_TAB_TITLE = '文件编辑'\n/** 推荐安装命令(提示条/兼容性报告共用)。 */\nexport const SIDEBAR_INSTALL_CMD = 'dsh plugin --profile web add dsh-better-sidebar'\n\n/** Tab 元数据(openTab 种子随 Tab 持久化,创建路径用它恢复初始打开)。 */\nexport interface SideEditorMeta {\n /** 待打开的工作区相对/绝对路径。 */\n openPath?: string\n /** 打开后聚焦首个差异。 */\n focusDiff?: boolean\n}\n\n/**\n * betterSidebar 服务的最小结构面(结构性探测,不 import 第三方类型)。\n */\nexport interface SidebarServiceLike {\n registerTab: (descriptor: unknown) => () => void\n openTab: (seed: { type: string; title?: string; path?: string; meta?: unknown }, scope?: { sessionId: string; cwd?: string }) => void\n isTabEnabled?: (id: string) => boolean\n features?: readonly string[]\n}\n\n/**\n * 解析 Tab 挂载时的初始打开请求(创建路径读 tab.path/meta,聚焦路径走窗口事件)。\n * @author ddj 2026年08月25号\n * @param tab 侧边栏 Tab(path/meta 为可选字段)\n * @returns 待打开路径与是否聚焦差异\n */\nexport function resolveInitialOpen(tab: { path?: string; meta?: unknown } | null | undefined): { path: string | null; focusDiff: boolean } {\n const meta = (tab?.meta ?? {}) as SideEditorMeta\n const path = typeof tab?.path === 'string' && tab.path ? tab.path : (typeof meta?.openPath === 'string' ? meta.openPath : null)\n return { path: path || null, focusDiff: meta?.focusDiff === true }\n}\n\n/** 会话级待处理差异文件数缓存(Tab 角标同步读取;EditorView 侧栏形态写入)。 */\nconst sidePending = new Map<string, number>()\n\n/**\n * 写入会话的待处理差异文件数(0 视为清除,不显示角标)。\n * @author ddj 2026年08月25号\n * @param sessionId 会话 id\n * @param count 待处理差异文件数\n */\nexport function setSidePending(sessionId: string, count: number): void {\n if (!sessionId) return\n const value = Number.isFinite(count) ? Math.max(0, Math.floor(count)) : 0\n if (value > 0) sidePending.set(sessionId, value)\n else sidePending.delete(sessionId)\n}\n\n/**\n * 读取会话的待处理差异文件数(角标用)。\n * @author ddj 2026年08月25号\n * @param sessionId 会话 id\n * @returns 非负计数\n */\nexport function getSidePending(sessionId?: string): number {\n if (!sessionId) return 0\n return sidePending.get(sessionId) ?? 0\n}\n\n/** 模块级侧栏打开路由(events.ts 优先走它;未注册 = 旧页签形态)。 */\nlet ensureSideEditor: ((path: string | null, focusDiff: boolean) => boolean) | null = null\n\n/** 待消费的初始打开(Tab 组件尚未挂载时暂存;按会话匹配,挂载时取走)。 */\nlet pendingOpen: { sessionId: string; path: string | null; focusDiff: boolean } | null = null\n/** Tab 组件当前是否有挂载实例(有则直接投递窗口事件,无则暂存待消费)。 */\nlet sideEditorMounted = false\n\n/**\n * 注册/撤销侧栏打开路由。\n * @author ddj 2026年08月25号\n * @param fn 路由函数或 null\n */\nexport function setEnsureSideEditor(fn: ((path: string | null, focusDiff: boolean) => boolean) | null): void {\n ensureSideEditor = fn\n}\n\n/**\n * 标记侧栏编辑器组件挂载状态(SideEditorTab 挂载/卸载时调用)。\n * @author ddj 2026年08月25号\n * @param mounted 是否已挂载\n */\nexport function setSideEditorMounted(mounted: boolean): void {\n sideEditorMounted = mounted\n}\n\n/**\n * 暂存指定会话的待消费初始打开(Tab 组件未挂载时由 install 路径调用)。\n * @author ddj 2026年08月25号\n * @param sessionId 会话 id\n * @param path 待打开路径(可空)\n * @param focusDiff 是否聚焦首个差异\n */\nexport function stagePendingSideOpen(sessionId: string, path: string | null, focusDiff: boolean): void {\n if (!sessionId) return\n pendingOpen = { sessionId, path: path || null, focusDiff: focusDiff === true }\n}\n\n/**\n * 取走指定会话的待消费初始打开(SideEditorTab 挂载时读取;不存在返回 null)。\n * @author ddj 2026年08月25号\n * @param sessionId 会话 id\n * @returns 待打开请求或 null\n */\nexport function takePendingSideOpen(sessionId?: string): { path: string | null; focusDiff: boolean } | null {\n if (!pendingOpen || !sessionId || pendingOpen.sessionId !== sessionId) return null\n const value = { path: pendingOpen.path, focusDiff: pendingOpen.focusDiff }\n pendingOpen = null\n return value\n}\n\n/**\n * 打开/聚焦侧栏编辑器(打开路径可选;返回是否已被侧栏形态接管)。\n * @author ddj 2026年08月25号\n * @param path 待打开路径(可空)\n * @param focusDiff 是否聚焦首个差异\n * @returns 是否路由成功\n */\nexport function routeSideEditor(path: string | null, focusDiff: boolean): boolean {\n if (typeof ensureSideEditor !== 'function') return false\n try {\n return ensureSideEditor(path, focusDiff) === true\n } catch (error) {\n console.warn('[dsh-vscode-mode] 侧栏编辑器打开失败(' + String(error) + '),已回退')\n return false\n }\n}\n\n/**\n * 结构化探测 betterSidebar 服务(可选依赖:缺失/降级返回 undefined)。\n * @author ddj 2026年08月25号\n * @param ctx 客户端服务上下文\n * @returns 服务结构面或 undefined\n */\nexport function detectSidebarService(ctx: { get: (name: string) => unknown }): SidebarServiceLike | undefined {\n try {\n const service = ctx.get(BETTER_SIDEBAR_SERVICE) as SidebarServiceLike | undefined\n if (!service || typeof service.registerTab !== 'function' || typeof service.openTab !== 'function') return undefined\n return service\n } catch {\n return undefined\n }\n}\n\n/**\n * 注册侧边栏「文件编辑」Tab 并接管打开路由。\n * Tab 被用户在 better-sidebar 设置里禁用时,打开路由降级为回退回调(中央页签)。\n * @author ddj 2026年08月25号\n * @param options 装配参数(组件依赖 + 活动会话解析 + 回退注册)\n * @returns 卸载器(反注册 Tab + 撤销路由)\n */\nexport function installSideEditor(options: {\n service: SidebarServiceLike\n renderTab: (props: Record<string, unknown>) => unknown\n activeSession: () => { sessionId?: string; cwd?: string } | undefined\n registerLegacyFallback: () => void\n}): () => void {\n const { service, renderTab, activeSession, registerLegacyFallback } = options\n let fallbackInstalled = false\n const open = (path: string | null, focusDiff: boolean): boolean => {\n if (typeof service.isTabEnabled === 'function' && !service.isTabEnabled(SIDE_TAB_ID)) {\n if (!fallbackInstalled) {\n fallbackInstalled = true\n try { registerLegacyFallback() } catch (error) { console.warn('[dsh-vscode-mode] 回退注册失败(' + String(error) + ')') }\n }\n return false\n }\n const scope = activeSession()\n const sessionId = scope?.sessionId\n if (!sessionId) return false\n try {\n service.openTab({\n type: SIDE_TAB_ID,\n title: SIDE_TAB_TITLE,\n ...(path ? { path } : {}),\n meta: { openPath: path || undefined, focusDiff },\n }, { sessionId, cwd: scope?.cwd })\n } catch (error) {\n console.warn('[dsh-vscode-mode] openTab 失败(' + String(error) + ')')\n return false\n }\n if (sideEditorMounted) {\n // 已挂载:窗口事件直达 EditorView 监听器\n window.dispatchEvent(new CustomEvent('edrv:open-editor', { detail: { path, focusDiff } }))\n } else {\n // 未挂载(面板折叠卸载/首次创建):暂存待消费,挂载时由 SideEditorTab 取走\n stagePendingSideOpen(sessionId, path, focusDiff)\n }\n return true\n }\n let tabDisposer: (() => void) | null = null\n try {\n tabDisposer = service.registerTab({\n id: SIDE_TAB_ID,\n title: SIDE_TAB_TITLE,\n icon: codeIcon,\n single: true,\n badge: (_ctx: unknown, scope: { sessionId?: string }) => getSidePending(scope?.sessionId) || null,\n component: renderTab,\n })\n } catch (error) {\n console.warn('[dsh-vscode-mode] 侧边栏 Tab 注册失败(' + String(error) + ')')\n // 注册失败 = 侧栏形态不可用:立即回退中央页签,不接管打开路由\n if (!fallbackInstalled) {\n fallbackInstalled = true\n try { registerLegacyFallback() } catch (inner) { console.warn('[dsh-vscode-mode] 回退注册失败(' + String(inner) + ')') }\n }\n return () => {}\n }\n setEnsureSideEditor(open)\n return () => {\n if (typeof tabDisposer === 'function') tabDisposer()\n setEnsureSideEditor(null)\n }\n}\n\n/**\n * 侧边栏 Tab 图标(内联 SVG 代码括号,不依赖图标包)。\n * @author ddj 2026年08月25号\n * @param size 边长(px)\n * @returns 图标元素\n */\nfunction codeIcon(size: number): unknown {\n return React.createElement('svg', {\n width: size, height: size, viewBox: '0 0 16 16', fill: 'none', 'aria-hidden': true, focusable: false,\n },\n React.createElement('path', {\n d: 'M5.5 4.5 2.5 8l3 3.5M10.5 4.5 13.5 8l-3 3.5',\n stroke: 'currentColor', strokeWidth: 1.4, strokeLinecap: 'round', strokeLinejoin: 'round',\n }))\n}\n","/**\n * dsh-vscode-mode client — 跨组件/跨 slot 的窗口事件助手。\n * 迁移自原 src/client/index.ts 的 openEditorView 与事件派发,语义不改;\n * 侧边栏形态(sidebarBridge 已注册路由)优先,否则回退 DOM 页签点击。\n * 作者 ddj 2026-08-20\n */\nimport { routeSideEditor } from './sidebarBridge.js'\n\n/**\n * 选择中央「文件编辑」页签(DOM 级,无需 store actions)。仅旧页签形态使用。\n * @author ddj 2026年08月26号\n */\nfunction selectEditorTab(): void {\n const tabs = Array.from(document.querySelectorAll('div[role=\"tablist\"] button[role=\"tab\"]'))\n for (const tab of tabs) {\n if (tab.textContent && tab.textContent.includes('文件编辑')) {\n (tab as HTMLButtonElement).click()\n break\n }\n }\n}\n\n/**\n * 打开「文件编辑」:侧边栏形态路由优先,旧形态回退中央页签。\n * @author ddj 2026年08月26号\n * @param path 要打开的路径(可空)\n */\nexport function openEditorView(path: string | null): void {\n if (routeSideEditor(path ?? null, false)) return\n selectEditorTab()\n const target = path ?? null\n setTimeout(() => {\n window.dispatchEvent(new CustomEvent('edrv:open-editor', { detail: { path: target } }))\n }, 80)\n}\n\n/**\n * 打开文件编辑页并聚焦指定文件的首个差异(侧边栏形态自动展开面板)。\n * @author ddj 2026年08月26号\n * @param path 待聚焦的差异文件路径\n */\nexport function openDiffView(path: string): void {\n if (routeSideEditor(path, true)) return\n selectEditorTab()\n setTimeout(() => {\n window.dispatchEvent(new CustomEvent('edrv:open-editor', {\n detail: { path, focusDiff: true },\n }))\n }, 80)\n}\n\n/** 差异状态变化:触发角标/DiffBox 重拉。 */\nexport function emitRefresh(): void {\n window.dispatchEvent(new CustomEvent('edrv:refresh'))\n}\n\n/** 打开指定路径到编辑区页签。 */\nexport function emitOpenEditor(path: string): void {\n window.dispatchEvent(new CustomEvent('edrv:open-editor', { detail: { path } }))\n}\n\n/**\n * 拉起 DiffLauncher。\n * @author ddj 2026年08月26号\n * @param tab 可选的目标页签\n */\nexport function emitShowLauncher(tab?: 'pending' | 'archive'): void {\n window.dispatchEvent(new CustomEvent('edrv:show-launcher', { detail: { tab } }))\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — Monaco 加载与语言映射(AMD 构建,离线随包分发)。\n * 迁移自原 src/client/index.ts 的 MONACO_BASE/LANG_BY_EXT/langOf/loadMonaco,语义不改。\n * 作者 ddj 2026-08-20\n */\n\nexport const MONACO_BASE = '/edrv/vendor/monaco/vs'\nlet monacoPromise = null\nlet monacoStage = { phase: 'idle', progress: 0, message: '准备加载 Monaco…' }\nconst stageListeners = new Set()\n\n/**\n * Monaco 加载阶段:这是阶段进度而非网络字节进度,避免误导用户。\n * @author ddj 2026年08月22号\n */\nexport const MONACO_STAGES = {\n loader: { progress: 18, message: '加载 Monaco 引导模块…' },\n core: { progress: 72, message: '加载编辑器核心模块…' },\n ready: { progress: 100, message: 'Monaco 编辑器已就绪' },\n error: { progress: 0, message: 'Monaco 编辑器加载失败' },\n}\n\n/**\n * 发布 Monaco 加载阶段,监听器异常不得影响编辑器加载。\n * @author ddj 2026年08月22号\n * @param phase 阶段名\n * @param progress 阶段百分比\n * @param message 用户可读状态\n */\nfunction publishStage(phase, progress, message) {\n monacoStage = { phase, progress, message }\n for (const listener of stageListeners) {\n try { listener(monacoStage) } catch (error) { /* UI 回调异常忽略 */ }\n }\n}\n\n/**\n * 订阅 Monaco 加载阶段。\n * @author ddj 2026年08月22号\n * @param listener 阶段回调\n * @returns 取消订阅函数\n */\nfunction subscribeStage(listener) {\n if (typeof listener !== 'function') return () => {}\n stageListeners.add(listener)\n listener(monacoStage)\n return () => stageListeners.delete(listener)\n}\n\n/** 扩展名 → Monaco language id(常见语言;未知回退 plaintext)。 */\nexport const LANG_BY_EXT = {\n js: 'javascript', jsx: 'javascript', mjs: 'javascript', cjs: 'javascript',\n ts: 'typescript', tsx: 'typescript', mts: 'typescript', cts: 'typescript',\n json: 'json', jsonc: 'json', md: 'markdown', markdown: 'markdown', mdx: 'mdx',\n css: 'css', scss: 'scss', less: 'less', html: 'html', htm: 'html', vue: 'html', xml: 'xml',\n yaml: 'yaml', yml: 'yaml', toml: 'ini', ini: 'ini', cfg: 'ini',\n py: 'python', sh: 'shell', bash: 'shell', zsh: 'shell', ps1: 'powershell',\n lua: 'lua', java: 'java', c: 'c', h: 'c', cpp: 'cpp', cc: 'cpp', cxx: 'cpp', hpp: 'cpp',\n cs: 'csharp', go: 'go', rs: 'rust', rb: 'ruby', php: 'php', sql: 'sql',\n swift: 'swift', kt: 'kotlin', kts: 'kotlin', dart: 'dart', dockerfile: 'dockerfile'\n}\n\n/**\n * 路径 → Monaco language id:取 basename 扩展名(dockerfile/Dockerfile 特判)。\n * @author ddj 2026年08月20号\n * @param path 文件路径\n * @returns language id\n */\nexport function langOf(path) {\n const base = String(path || '').split(/[\\\\/]/).pop() || ''\n if (/^dockerfile$/i.test(base)) return 'dockerfile'\n const dot = base.lastIndexOf('.')\n if (dot <= 0) return 'plaintext'\n return LANG_BY_EXT[base.slice(dot + 1).toLowerCase()] ?? 'plaintext'\n}\n\n/**\n * 加载 Monaco Editor(AMD 构建,随插件包离线分发):注入 loader.js → require.config → editor.main。\n * @author ddj 2026年08月20号\n * @returns Promise<object> window.monaco\n */\nexport function loadMonaco(onProgress) {\n const unsubscribe = subscribeStage(onProgress)\n if (!monacoPromise) {\n publishStage('loader', MONACO_STAGES.loader.progress, MONACO_STAGES.loader.message)\n monacoPromise = new Promise((resolve, reject) => {\n const fail = (error) => {\n monacoPromise = null\n publishStage('error', MONACO_STAGES.error.progress, MONACO_STAGES.error.message)\n reject(error)\n }\n const boot = () => {\n try {\n window.require.config({ paths: { vs: MONACO_BASE } })\n publishStage('core', MONACO_STAGES.core.progress, MONACO_STAGES.core.message)\n window.require(['vs/editor/editor.main'], () => {\n publishStage('ready', MONACO_STAGES.ready.progress, MONACO_STAGES.ready.message)\n resolve(window.monaco)\n }, (err) => fail(new Error('Monaco 模块加载失败:' + String(err))))\n } catch (error) {\n fail(error)\n }\n }\n const existing = document.querySelector('script[data-edrv-monaco-loader]')\n if (existing) boot()\n else {\n const s = document.createElement('script')\n s.src = MONACO_BASE + '/loader.js'\n s.dataset.edrvMonacoLoader = '1'\n s.onload = boot\n s.onerror = () => fail(new Error('Monaco loader 加载失败'))\n document.head.appendChild(s)\n }\n })\n }\n return monacoPromise.finally(unsubscribe)\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — 行内差异自绘(新增行绿底 + glyph margin '+';删除块 view zone 红底)。\n * 迁移自原 src/client/index.ts 的 diff-render effect,语义不改。\n * 作者 ddj 2026-08-20\n */\n\n/**\n * 差异渲染器(每 EditorView 挂载一个,内部持有 zone/decoration 状态)。\n * @param log 诊断日志函数((sessionId, text) => void)\n */\nexport function createDiffRenderer(log) {\n let viewZoneIds = []\n let decorations = []\n /** 上次已渲染的差异指纹(callId:idx@start-end:oldLen/newLen 串):内容未变时跳过重建。 */\n let lastKey = null\n\n /**\n * 渲染当前 pending 差异:绿底 decoration + 删除块 view zones + '-' 号 overlay(滚动同步)。\n * @param monaco window.monaco\n * @param editor Monaco 编辑器实例\n * @param pendingRegions 待处理差异区域\n * @param sessionId 会话 id\n */\n const render = (monaco, editor, pendingRegions, sessionId) => {\n // 空渲染且无残留(5s 轮询 setRecords 常触发):无需清理时直接跳过,\n // 不打 begin 日志、不做无谓 DOM 操作;有 zone/decoration 残留时仍需走清理。\n if (!pendingRegions.length && viewZoneIds.length === 0 && decorations.length === 0) return\n const renderT0 = Date.now()\n const callIdAttr = (callId, idx) => String(callId) + ':' + String(idx)\n // 指纹相同 = 内容未变(轮询/引用空转/重复点击触发的重渲染):残留 DOM 已在位,\n // 直接跳过整轮重建(view zones 拆建 / overlay DOM / 50ms 校正),消除同区域重复渲染成本。\n const key = pendingRegions.map((r) => callIdAttr(r.callId, r.idx) + '@' + (r.start ?? '?') + '-' + (r.end ?? '?') + ':' + (r.oldLines ? r.oldLines.length : 0) + '/' + (r.newLines ? r.newLines.length : 0)).join('|')\n if (key === lastKey) return\n lastKey = key\n log(sessionId, '[diff-render] begin regs=' + pendingRegions.length + ' ' + pendingRegions.map((r) => callIdAttr(r.callId, r.idx) + '@' + (r.start ?? '?') + '-' + (r.end ?? '?') + '(-' + (r.oldLines ? r.oldLines.length : 0) + '/+' + (r.newLines ? r.newLines.length : 0) + ')').join('|'))\n\n const decos = []\n for (const r of pendingRegions) {\n if (r.start === undefined || r.end === undefined) continue\n if (r.newLines && r.newLines.length) {\n decos.push({\n range: new monaco.Range(r.start, 1, Math.max(r.start, r.end - 1), 1),\n options: { isWholeLine: true, className: 'edrv-mn-add-line', linesDecorationsClassName: 'edrv-mn-gutter-add' },\n })\n }\n }\n decorations = editor.deltaDecorations(decorations, decos)\n\n // 删除块 view zones(红底 + 正文;- 号由独立 overlay 层渲染,定位在 decoration 列与 + 同列,\n // 不受 view zone 容器定位/裁剪影响;滚动用 translateY 同步)\n let createdZones = []\n editor.changeViewZones((accessor) => {\n for (const id of viewZoneIds) { try { accessor.removeZone(id) } catch (e) { /* 已移除 */ } }\n viewZoneIds = []\n const zones = []\n for (const r of pendingRegions) {\n if (r.create) continue\n const oldLines = r.oldLines && r.oldLines.length ? r.oldLines : null\n if (!oldLines) continue\n const after = Math.max(0, (r.start ?? 1) - 1)\n const domNode = document.createElement('div')\n domNode.className = 'edrv-del-zone'\n domNode.dataset.edrvHunk = callIdAttr(r.callId, r.idx)\n for (const t of oldLines) {\n const row = document.createElement('div')\n row.className = 'edrv-del-row'\n const text = document.createElement('span')\n text.className = 'edrv-del-text'\n text.textContent = t\n row.appendChild(text)\n domNode.appendChild(row)\n }\n const id = accessor.addZone({\n afterLineNumber: after,\n heightInLines: oldLines.length,\n domNode,\n suppressMouseDown: false,\n })\n viewZoneIds.push(id)\n zones.push({ domNode, after, n: oldLines.length })\n }\n createdZones = zones\n })\n\n if (createdZones.length) {\n const root = editor.getDomNode()\n if (root) {\n let overlay = root.querySelector('.edrv-minus-overlay')\n if (!overlay) {\n overlay = document.createElement('div')\n overlay.className = 'edrv-minus-overlay'\n root.appendChild(overlay)\n }\n overlay.innerHTML = ''\n const lineH = editor.getOption(monaco.editor.EditorOption.lineHeight) || 20\n let li = null\n try { li = editor.getLayoutInfo() } catch (e) { /* ignore */ }\n const rawLeft = li ? li.decorationsLeft : 0\n const width = li && li.decorationsWidth > 0 ? li.decorationsWidth : 16\n // decorationsLeft 是 Monaco 内部坐标,需限制在宿主根节点内,避免窄窗口/边框\n // 或布局尚未完成时把减号绘制到编辑器左、右边界之外。\n const maxLeft = Math.max(0, root.clientWidth - width)\n // 字符本身有少量字体侧向留白;给标记列留出 4px 内缩,避免减号半个\n // 字符落到 Monaco 根节点左边框外,同时仍限制右侧不越界。\n const markerInset = 12\n const left = Math.max(0, Math.min(maxLeft, rawLeft + markerInset))\n const lineCount = editor.getModel().getLineCount()\n let itemIdx = 0\n let zi = 0\n for (const z of createdZones) {\n // 用 Monaco 坐标 API 计算 view zone 顶部,避免离屏 zone DOM 未布局导致 getBoundingClientRect 为 0\n const anchor = Math.min(z.after + 1, lineCount)\n let zoneBottom = editor.getTopForLineNumber(anchor)\n if (z.after >= lineCount) zoneBottom += lineH\n const zoneTop = zoneBottom - z.n * lineH\n for (let i = 0; i < z.n; i++) {\n const item = document.createElement('div')\n item.className = 'edrv-minus-item'\n // 使用 CSS 线段代替文本字符,避免不同字体的侧向留白把 “-” 绘制到边界外。\n item.textContent = ''\n item.style.width = width + 'px'\n item.style.height = lineH + 'px'\n item.dataset.zone = String(zi)\n item.dataset.row = String(i)\n item.style.top = (zoneTop + i * lineH) + 'px'\n item.style.left = left + 'px'\n overlay.appendChild(item)\n itemIdx++\n }\n zi++\n }\n log(sessionId, '[diff-render] placed zones=' + createdZones.length + ' items=' + itemIdx + ' left=' + left + ' w=' + width + ' t+' + (Date.now() - renderT0) + 'ms')\n // 滚动同步:overlay 随内容滚动(内容坐标 - scrollTop)\n const syncScroll = () => {\n const s2 = editor.getScrollTop() || 0\n if (overlay) overlay.style.transform = 'translateY(' + (-s2) + 'px)'\n }\n syncScroll()\n overlay.__edrvSync = syncScroll\n if (!overlay.__edrvBound) {\n overlay.__edrvBound = true\n editor.onDidScrollChange(syncScroll)\n }\n // 已可见的 zone 用真实 DOM 坐标做一次微调(离屏 zone 仍保留坐标 API 位置)\n setTimeout(() => {\n try {\n const edRect = root.getBoundingClientRect()\n const st = editor.getScrollTop() || 0\n const items = overlay.querySelectorAll('.edrv-minus-item')\n let correctedLeft = left\n try {\n const layout = editor.getLayoutInfo()\n const markerWidth = layout.decorationsWidth > 0 ? layout.decorationsWidth : width\n correctedLeft = Math.max(0, Math.min(Math.max(0, root.clientWidth - markerWidth), (layout.decorationsLeft || 0) + 12))\n } catch (e) { /* 保留首次布局计算结果 */ }\n for (const item of items) {\n item.style.left = correctedLeft + 'px'\n const zIndex = Number(item.dataset.zone)\n const rIndex = Number(item.dataset.row)\n const z = createdZones[zIndex]\n if (!z || !z.domNode.isConnected) continue\n const rowEl = z.domNode.querySelectorAll('.edrv-del-row')[rIndex]\n if (!rowEl) continue\n const rowRect = rowEl.getBoundingClientRect()\n if (rowRect.height > 0) {\n item.style.top = (rowRect.top - edRect.top + st) + 'px'\n }\n }\n } catch (e) { log(sessionId, '[diff-render] correct fail ' + String(e)) }\n }, 50)\n }\n } else {\n const root = editor.getDomNode()\n const overlay = root && root.querySelector('.edrv-minus-overlay')\n if (overlay) overlay.innerHTML = ''\n }\n }\n\n /** 卸载清理(EditorView unmount 时调用)。 */\n const dispose = () => {\n viewZoneIds = []\n decorations = []\n }\n\n return { render, dispose }\n}\n","/**\n * dsh-vscode-mode shared diff primitives — 快照指纹、hunk 规范化与安全定位。\n * 不依赖 Node/React,host 与 browser 共用,避免各层用不同 indexOf 语义。\n * 作者 ddj 2026-08-24\n */\nimport type { Hunk, RecordBase } from './types.js'\n\n/** 文件读取状态,区分真实空文件与无法读取/过大的文件。 */\nexport type ReadState =\n | { kind: 'content'; content: string }\n | { kind: 'missing' }\n | { kind: 'unavailable' }\n\n/** 文本中的一个半开区间 [start,end)。 */\nexport interface TextRange {\n start: number\n end: number\n}\n\n/** 一条 hunk 在当前内容中的定位结果。 */\nexport interface HunkLocation extends TextRange {\n idx: number\n hunk: Hunk\n matched: boolean\n}\n\n/** 统一取对应 hunk;callHunk 只用于旧记录缺失 hunks 时兼容。 */\nexport function preciseHunk(record: Pick<RecordBase, 'hunks' | 'callHunk'>, idx: number): Hunk | null {\n return hunkOf(record, idx)\n}\n\n/** 轻量、确定性的字符串指纹;不引入 Node crypto。 */\nexport function fingerprint(text: string | null | undefined): string | null {\n if (typeof text !== 'string') return null\n let hash = 2166136261\n for (let i = 0; i < text.length; i++) {\n hash ^= text.charCodeAt(i)\n hash = Math.imul(hash, 16777619)\n }\n return 'fnv1a:' + (hash >>> 0).toString(16) + ':' + text.length\n}\n\n/** 取记录第 idx 个有效 hunk;只有记录缺 hunk 时才回退 callHunk。 */\nexport function hunkOf(record: Pick<RecordBase, 'hunks' | 'callHunk'>, idx: number): Hunk | null {\n const hunk = Array.isArray(record.hunks) ? record.hunks[idx] : undefined\n if (hunk && typeof hunk.newText === 'string') return hunk\n if (idx === 0 && record.callHunk && typeof record.callHunk.newText === 'string') return record.callHunk\n return null\n}\n\n/** hunk 是否表示没有实际内容变化。 */\nexport function isNoopHunk(hunk: Hunk | null | undefined): boolean {\n return !!hunk && hunk.oldText !== null && hunk.oldText === hunk.newText\n}\n\n/** splitLines 的空文本语义:真实空文件没有一行变更内容。 */\nexport function splitLines(text: string): string[] {\n return text.length ? text.split('\\n') : []\n}\n\n/** 为执行后 hunk 写入快照坐标;空 newText 通过 before/after 公共边界定位删除点。 */\nexport function annotateHunk(hunk: Hunk, before: string | null, after: string | null): Hunk {\n return annotateHunks([hunk], before, after)[0]\n}\n\n/** 按文件顺序为多 hunk 写入不重复的 after 坐标。 */\nexport function annotateHunks(hunks: Hunk[], before: string | null, after: string | null): Hunk[] {\n if (typeof after !== 'string') return hunks\n let cursor = 0\n return hunks.map((hunk) => {\n if (hunk.newText.length > 0) {\n const start = after.indexOf(hunk.newText, cursor)\n if (start >= 0) {\n cursor = start + hunk.newText.length\n return { ...hunk, afterStart: start, afterEnd: cursor }\n }\n return hunk\n }\n if (hunks.length !== 1 || typeof before !== 'string' || before === after || hunk.oldText === null) return hunk\n const prefix = commonPrefix(before, after)\n const suffix = commonSuffix(before, after, prefix)\n const removedStart = prefix\n const removedEnd = Math.max(removedStart, before.length - suffix)\n return { ...hunk, afterStart: removedStart, afterEnd: removedStart, beforeStart: removedStart, beforeEnd: removedEnd }\n })\n}\n\n/** 计算两个文本的最长公共前缀长度。 */\nfunction commonPrefix(left: string, right: string): number {\n const limit = Math.min(left.length, right.length)\n let i = 0\n while (i < limit && left.charCodeAt(i) === right.charCodeAt(i)) i++\n return i\n}\n\n/** 计算不与 prefix 重叠的最长公共后缀长度。 */\nfunction commonSuffix(left: string, right: string, prefix: number): number {\n const limit = Math.min(left.length, right.length) - prefix\n let i = 0\n while (i < limit && left.charCodeAt(left.length - 1 - i) === right.charCodeAt(right.length - 1 - i)) i++\n return i\n}\n\n/** 计算 index 前的 0 基行数。 */\nexport function lineBefore(text: string, index: number): number {\n let n = 0\n const end = Math.max(0, Math.min(index, text.length))\n for (let i = 0; i < end; i++) if (text.charCodeAt(i) === 10) n++\n return n\n}\n\n/** 找出文本的全部非重叠出现位置。 */\nfunction allMatches(content: string, needle: string): TextRange[] {\n if (!needle.length) return []\n const out: TextRange[] = []\n let from = 0\n while (from <= content.length - needle.length) {\n const at = content.indexOf(needle, from)\n if (at < 0) break\n out.push({ start: at, end: at + needle.length })\n from = at + Math.max(1, needle.length)\n }\n return out\n}\n\n/**\n * 从 after 快照定位所有 hunk,按 hunk 顺序优先选未占用且靠近前一块的候选。\n * 若 hunk 带 afterStart/afterEnd,则优先验证快照坐标,避免重复文本错配。\n * @author ddj 2026年08月24号\n * @param content 当前文件内容\n * @param hunks 待定位 hunk\n * @returns 每个 hunk 一个结果,matched=false 表示冲突/stale\n */\nexport function locateHunks(content: string, hunks: Hunk[]): HunkLocation[] {\n const locations: HunkLocation[] = []\n let cursor = 0\n const occupied: TextRange[] = []\n for (let idx = 0; idx < hunks.length; idx++) {\n const hunk = hunks[idx]\n const newText = hunk.newText\n const snapshot = Number.isInteger(hunk.afterStart) && Number.isInteger(hunk.afterEnd)\n ? { start: hunk.afterStart as number, end: hunk.afterEnd as number }\n : null\n const snapshotMatches = snapshot && snapshot.start >= 0 && snapshot.end >= snapshot.start\n && (newText.length === 0 || content.slice(snapshot.start, snapshot.end) === newText)\n ? snapshot\n : null\n const candidates = snapshotMatches ? [snapshotMatches] : allMatches(content, newText)\n const candidate = candidates.find((range) => range.start >= cursor && !occupied.some((used) => overlaps(range, used)))\n ?? candidates.find((range) => !occupied.some((used) => overlaps(range, used)))\n if (candidate) {\n locations.push({ idx, hunk, ...candidate, matched: true })\n occupied.push(candidate)\n cursor = Math.max(cursor, candidate.end)\n continue\n }\n if (newText.length === 0 && hunk.afterStart === undefined && hunk.afterEnd === undefined && content.length === 0) {\n const point = { start: 0, end: 0 }\n locations.push({ idx, hunk, ...point, matched: true })\n continue\n }\n if (newText.length === 0 && hunk.afterStart !== undefined && hunk.afterEnd !== undefined\n && hunk.afterStart === hunk.afterEnd && hunk.afterStart >= 0 && hunk.afterStart <= content.length) {\n const point = { start: hunk.afterStart, end: hunk.afterEnd }\n if (!occupied.some((used) => overlaps(point, used))) {\n locations.push({ idx, hunk, ...point, matched: true })\n occupied.push(point)\n cursor = Math.max(cursor, point.end)\n continue\n }\n }\n locations.push({ idx, hunk, start: -1, end: -1, matched: false })\n }\n return locations\n}\n\n/** 判断两个半开区间是否重叠。零长度区间只与同一位置的零长度区间重叠。 */\nfunction overlaps(left: TextRange, right: TextRange): boolean {\n if (left.start === left.end || right.start === right.end) return left.start === right.start && left.end === right.end\n return left.start < right.end && right.start < left.end\n}\n\n/** 在可定位区间上执行一次 hunk 反向替换。 */\nexport function replaceRange(content: string, location: HunkLocation, reverse = false): string | null {\n if (!location.matched || location.start < 0) return null\n const replacement = reverse ? (location.hunk.oldText ?? '') : location.hunk.newText\n return content.slice(0, location.start) + replacement + content.slice(location.end)\n}\n\n/** 按当前内容中出现的位置从后向前应用 hunk,避免前块长度变化影响后块。 */\nexport function applyLocations(content: string, locations: HunkLocation[], reverse = false): { content: string; stale: number[] } {\n const stale = locations.filter((location) => !location.matched).map((location) => location.idx)\n let out = content\n const matched = locations.filter((location) => location.matched).sort((a, b) => b.start - a.start)\n for (const location of matched) {\n const next = replaceRange(out, location, reverse)\n if (next === null) stale.push(location.idx)\n else out = next\n }\n return { content: out, stale: stale.sort((a, b) => a - b) }\n}\n","/**\n * dsh-vscode-mode client — 记录/差异状态纯函数(可单测)。\n * 迁移自原 src/client/index.ts 前段,语义一字不改。\n * 作者 ddj 2026-08-20\n */\nimport type { CallHunk, Hunk, RecordView } from '../../shared/types.js'\nimport { preciseHunk } from '../../shared/diff.js'\n\n/** 差异决策状态。 */\nexport const ST = { PENDING: 'pending', ACCEPTED: 'accepted', REJECTED: 'rejected' } as const\nexport type Status = 'pending' | 'accepted' | 'rejected'\n\n/** 记录视图摘要(按文件分组)。 */\nexport interface FileSummary {\n path: string\n recs: RecordView[]\n pending: number\n}\nexport interface Summary {\n files: FileSummary[]\n pendingFiles: FileSummary[]\n totalFiles: number\n}\n\n/** hunk 的 DOM 定位 key(callId:idx)。 */\nexport function callIdAttr(callId: string, idx: number): string {\n return String(callId) + ':' + String(idx)\n}\n\n/** 某 hunk 的当前决策状态(缺省 pending)。 */\nexport function statusAt(rec: RecordView | undefined, idx: number): Status {\n if (!rec) return ST.PENDING\n if (Array.isArray(rec.decisions?.perHunk) && rec.decisions.perHunk[idx] !== undefined) return rec.decisions.perHunk[idx] as Status\n return (rec.decisions?.call as Status) ?? ST.PENDING\n}\n\n/** hunk 是否为空差异(old===new,无实际内容变化,不可操作)。create 记录不视为空差异。 */\nexport function noopHunk(rec: RecordView | undefined, h: Hunk | CallHunk | null | undefined): boolean {\n if (!rec || rec.create === true) return false\n const precise = rec && h && rec.hunks.indexOf(h as Hunk) >= 0\n ? preciseHunk(rec, rec.hunks.indexOf(h as Hunk))\n : h\n const oldText = precise?.oldText ?? null\n const newText = precise?.newText ?? null\n return oldText !== null && oldText === newText\n}\n\n/** 记录是否仍有待处理差异(superseded / 全部已决策 = false)。 */\nexport function isRecPending(rec: RecordView): boolean {\n if (!rec || rec.superseded === true || rec.conflict === true) return false\n const perHunk = Array.isArray(rec.decisions?.perHunk) ? rec.decisions.perHunk : []\n if (perHunk.length) {\n // 只认存在至少一个\"非空差异且未决策\"的 hunk\n for (let i = 0; i < perHunk.length; i++) {\n if (perHunk[i] !== 'accepted' && perHunk[i] !== 'rejected' && !noopHunk(rec, (rec.hunks || [])[i])) return true\n }\n return false\n }\n return rec.decisions.call === 'pending' || rec.decisions.call === undefined\n}\n\n/** 记录待处理差异\"处\"数(按 hunk,跳过空差异)。 */\nexport function pendingCount(recs: RecordView[]): number {\n let n = 0\n for (const rec of recs) {\n if (!isRecPending(rec)) continue\n const perHunk = Array.isArray(rec.decisions?.perHunk) ? rec.decisions.perHunk : []\n if (perHunk.length) {\n for (let i = 0; i < perHunk.length; i++) {\n if (perHunk[i] === 'pending' && !noopHunk(rec, (rec.hunks || [])[i])) n++\n }\n } else {\n const hunks = Array.isArray(rec.hunks) ? rec.hunks : []\n for (const h of hunks) if (!noopHunk(rec, h)) n++\n if (!hunks.length && !noopHunk(rec, rec.callHunk)) n = Math.max(n, 1)\n }\n }\n return n\n}\n\n/** 按文件分组的差异摘要(角标/Launcher 用)。 */\nexport function summarize(records: RecordView[]): Summary {\n const byPath = new Map<string, RecordView[]>()\n for (const r of records) {\n if (!byPath.has(r.path)) byPath.set(r.path, [])\n byPath.get(r.path)!.push(r)\n }\n const files: FileSummary[] = []\n for (const [path, recs] of byPath) files.push({ path, recs, pending: pendingCount(recs) })\n files.sort((a, b) => (a.path < b.path ? -1 : 1))\n const pendingFiles = files.filter((f) => f.pending > 0)\n return { files, pendingFiles, totalFiles: pendingFiles.length }\n}\n","/**\n * dsh-vscode-mode client — 差异区域计算纯函数(可单测)。\n * 迁移自原 src/client/index.ts 的 diffRegions/trimCommonLines/countLinesBefore,语义不改。\n * 作者 ddj 2026-08-20\n */\nimport type { Hunk, RecordView } from '../../shared/types.js'\nimport { locateHunks, lineBefore, preciseHunk, splitLines } from '../../shared/diff.js'\nimport { ST, noopHunk, statusAt } from './records.js'\nimport type { Status } from './records.js'\n\n/** 差异区域(文件内一段待处理/已处理的变更)。 */\nexport interface Region {\n callId: string\n idx: number\n start?: number\n end?: number\n oldLines: string[]\n newLines: string[]\n whole?: boolean\n status: Status\n create: boolean\n rec: RecordView\n superseded: boolean\n stale?: boolean\n}\n\n/** 统计 index 之前(不含)的换行数 → 0 基行号。 */\nexport function countLinesBefore(text: string, index: number): number {\n return lineBefore(text, index)\n}\n\n/**\n * 行级公共前缀/后缀裁剪:old/new 首尾相同的行视为未变化(上下文),只保留真正变更的中间段。\n * @author ddj 2026年08月20号\n * @param oldLines 替换前内容按行拆分\n * @param newLines 替换后内容按行拆分\n * @returns 裁剪后的变更段与公共前缀行数\n */\nexport function trimCommonLines(oldLines: string[], newLines: string[]): { oldLines: string[]; newLines: string[]; shift: number } {\n let prefix = 0\n const maxPrefix = Math.min(oldLines.length, newLines.length)\n while (prefix < maxPrefix && oldLines[prefix] === newLines[prefix]) prefix++\n let suffix = 0\n const maxSuffix = Math.min(oldLines.length - prefix, newLines.length - prefix)\n while (suffix < maxSuffix && oldLines[oldLines.length - 1 - suffix] === newLines[newLines.length - 1 - suffix]) suffix++\n return { oldLines: oldLines.slice(prefix, oldLines.length - suffix), newLines: newLines.slice(prefix, newLines.length - suffix), shift: prefix }\n}\n\n/** 计算文件内各差异区域(行范围 + old/new + 状态),用于行内绿标注与 DiffBox。 */\nexport function diffRegions(records: RecordView[], content: string | null): Region[] {\n const regions: Region[] = []\n if (content === null) return regions\n const lines = splitLines(content)\n for (const rec of records) {\n if (rec.create) {\n for (let i = 0; i < rec.hunks.length; i++) {\n const h = preciseHunk(rec, i)\n if (!h || noopHunk(rec, h)) continue\n regions.push({ callId: rec.callId, idx: i, start: 1, end: lines.length + 1, oldLines: [], newLines: lines.slice(), whole: true, status: statusAt(rec, i), create: true, rec, superseded: rec.superseded === true })\n }\n continue\n }\n const entries: Array<{ idx: number; hunk: Hunk }> = []\n for (let i = 0; i < rec.hunks.length; i++) {\n const hunk = preciseHunk(rec, i)\n if (hunk && !noopHunk(rec, hunk)) entries.push({ idx: i, hunk })\n }\n const locations = locateHunks(content, entries.map((entry) => entry.hunk))\n for (let i = 0; i < entries.length; i++) {\n const entry = entries[i]\n const location = locations[i]\n const status = statusAt(rec, entry.idx)\n if (!location.matched) {\n regions.push({ callId: rec.callId, idx: entry.idx, stale: true, status, create: false, oldLines: entry.hunk.oldText === null ? [] : entry.hunk.oldText.split('\\n'), newLines: entry.hunk.newText ? entry.hunk.newText.split('\\n') : [], rec, superseded: rec.superseded === true })\n continue\n }\n const start = countLinesBefore(content, location.start) + 1\n const oldLines = entry.hunk.oldText === null ? [] : entry.hunk.oldText.split('\\n')\n const newLines = entry.hunk.newText.split('\\n')\n const trimmed = trimCommonLines(oldLines, newLines)\n const regionStart = start + trimmed.shift\n regions.push({ callId: rec.callId, idx: entry.idx, start: regionStart, end: regionStart + trimmed.newLines.length, oldLines: trimmed.oldLines, newLines: trimmed.newLines, status, create: false, rec, superseded: rec.superseded === true })\n }\n }\n regions.sort((a, b) => (a.start ?? Infinity) - (b.start ?? Infinity))\n return regions\n}\n","/**\n * dsh-vscode-mode shared — 快捷键命令目录与默认键位(双面契约)。\n * 纯数据模块:host(settings schema 默认值)与 client(执行匹配/设置页)共用。\n * 键位格式:修饰符 + 主键,`+` 连接,如 `Ctrl+Shift+F`;空串 = 未绑定。\n * 作者 ddj 2026年08月26号\n */\n\n/** 命令 id → 默认键位。命令目录以此为准,新增命令只需加一项。 */\nexport const KEYBINDING_DEFAULTS: Record<string, string> = {\n 'edrv.save': 'Ctrl+S',\n 'edrv.quickOpen': 'Ctrl+P',\n 'edrv.toggleSidebar': 'Ctrl+B',\n 'edrv.searchInFiles': 'Ctrl+Shift+F',\n}\n\n/**\n * 返回默认键位的独立副本(调用方修改不污染目录)。\n * @author ddj 2026年08月26号\n * @returns 默认键位映射\n */\nexport function defaultKeybindings(): Record<string, string> {\n return { ...KEYBINDING_DEFAULTS }\n}\n\n/**\n * 规整外部键位数据:只保留已知命令 id 且为字符串的值,未知 id 丢弃。\n * 防止用户文档/旧版本写入的未知命令污染执行匹配。\n * @author ddj 2026年08月26号\n * @param raw 原始设置值\n * @returns 规整后的键位映射(缺省项不补默认值,由调用方按需合并)\n */\nexport function normalizeKeybindings(raw: unknown): Record<string, string> {\n const out: Record<string, string> = {}\n if (!raw || typeof raw !== 'object') return out\n for (const [id, chord] of Object.entries(raw as Record<string, unknown>)) {\n if (id in KEYBINDING_DEFAULTS && typeof chord === 'string') out[id] = chord\n }\n return out\n}\n","/**\n * dsh-vscode-mode client — 快捷键配置模块(解析/匹配/状态同步)。\n * 纯逻辑(parseChord/formatChord/matchEvent/chordFromEvent/normalizeKey)不依赖 DOM,可单测;\n * 模块状态由 settings 订阅驱动(client/index.ts 调 keybindingsApply)。\n * 键位语义:Ctrl 与 Cmd 互认(延续现有 Ctrl+P/Ctrl+B 捕获行为)。\n * 作者 ddj 2026年08月26号\n */\nimport React from 'react'\nimport { KEYBINDING_DEFAULTS, normalizeKeybindings } from '../shared/keybindings.js'\n\n/** 解析后的键位(修饰符 + 规范化主键)。 */\nexport interface Binding {\n ctrl: boolean\n shift: boolean\n alt: boolean\n meta: boolean\n key: string\n}\n\n/** 命令目录(设置页展示标签;执行按目录序先匹配先执行,冲突键位确定性)。 */\nexport const COMMANDS: Array<{ id: string; label: string }> = [\n { id: 'edrv.save', label: '保存文件' },\n { id: 'edrv.quickOpen', label: '快速打开文件' },\n { id: 'edrv.toggleSidebar', label: '切换侧边栏' },\n { id: 'edrv.searchInFiles', label: '在工作区中搜索' },\n]\n\nconst MODIFIERS: Record<string, 'ctrl' | 'shift' | 'alt' | 'meta'> = {\n ctrl: 'ctrl', cmd: 'meta', meta: 'meta', shift: 'shift', alt: 'alt',\n}\n\nlet current: Record<string, string> = { ...KEYBINDING_DEFAULTS }\nlet parsed: Record<string, Binding | null> = {}\nconst listeners = new Set<() => void>()\n\n/**\n * 应用设置快照(与默认值合并;未知 id 丢弃;空对象 = 全部默认)。\n * @author ddj 2026年08月26号\n * @param raw 设置 scope 的 keybindings 字段\n */\nexport function keybindingsApply(raw: unknown): void {\n current = { ...KEYBINDING_DEFAULTS, ...normalizeKeybindings(raw) }\n parsed = {}\n for (const id of Object.keys(current)) parsed[id] = parseChord(current[id])\n for (const listener of listeners) {\n try { listener() } catch { /* 监听器异常不影响其他订阅 */ }\n }\n}\n\n/**\n * 订阅键位配置变化。\n * @author ddj 2026年08月26号\n * @param listener 变化回调\n * @returns 取消订阅函数\n */\nexport function subscribeKeybindings(listener: () => void): () => void {\n listeners.add(listener)\n return () => listeners.delete(listener)\n}\n\n/**\n * 当前键位弦(未绑定/空 → null)。\n * @author ddj 2026年08月26号\n * @param id 命令 id\n * @returns 键位弦或 null\n */\nexport function chordOf(id: string): string | null {\n const chord = current[id]\n return typeof chord === 'string' && chord.trim() !== '' ? chord : null\n}\n\n/**\n * 当前命令的解析键位(未绑定/非法 → null)。\n * @author ddj 2026年08月26号\n * @param id 命令 id\n * @returns 解析键位或 null\n */\nexport function bindingOf(id: string): Binding | null {\n return parsed[id] ?? null\n}\n\n/**\n * 主键规范化:小写字母大写、空格归一为 Space,其余原样(与事件 e.key 对照)。\n * @author ddj 2026年08月26号\n * @param key 事件主键\n * @returns 规范化主键\n */\nexport function normalizeKey(key: string): string {\n const value = String(key ?? '')\n if (value === ' ') return 'Space'\n if (value.length === 1 && value >= 'a' && value <= 'z') return value.toUpperCase()\n return value\n}\n\n/**\n * 解析键位弦(如 `Ctrl+Shift+F`;纯修饰键/重复主键/空 → null)。\n * @author ddj 2026年08月26号\n * @param chord 键位弦\n * @returns 解析键位或 null\n */\nexport function parseChord(chord: string): Binding | null {\n const parts = String(chord ?? '').split('+').map((part) => part.trim()).filter(Boolean)\n if (!parts.length) return null\n const binding: Binding = { ctrl: false, shift: false, alt: false, meta: false, key: '' }\n for (const part of parts) {\n const modifier = MODIFIERS[part.toLocaleLowerCase('en-US')]\n if (modifier) {\n binding[modifier] = true\n continue\n }\n if (binding.key) return null\n binding.key = normalizeKey(part)\n }\n return binding.key ? binding : null\n}\n\n/**\n * 格式化键位(Ctrl/Cmd/Shift/Alt + 主键;meta 显示 Cmd)。\n * @author ddj 2026年08月26号\n * @param binding 解析键位\n * @returns 键位弦\n */\nexport function formatChord(binding: Binding): string {\n const parts: string[] = []\n if (binding.ctrl) parts.push('Ctrl')\n if (binding.meta) parts.push('Cmd')\n if (binding.shift) parts.push('Shift')\n if (binding.alt) parts.push('Alt')\n parts.push(binding.key)\n return parts.join('+')\n}\n\n/**\n * 事件是否命中键位(Ctrl 与 Cmd 互认)。\n * @author ddj 2026年08月26号\n * @param e 键盘事件(鸭子类型,便于单测)\n * @param binding 解析键位(null = 未绑定,永不命中)\n * @returns 是否命中\n */\nexport function matchEvent(e: { ctrlKey?: boolean; metaKey?: boolean; shiftKey?: boolean; altKey?: boolean; key?: string }, binding: Binding | null): boolean {\n if (!binding) return false\n if ((e.ctrlKey || e.metaKey) !== (binding.ctrl || binding.meta)) return false\n if (Boolean(e.shiftKey) !== binding.shift) return false\n if (Boolean(e.altKey) !== binding.alt) return false\n return normalizeKey(e.key ?? '') === binding.key\n}\n\n/**\n * 从键盘事件构造键位弦(纯修饰键 → null,供设置页录制)。\n * @author ddj 2026年08月26号\n * @param e 键盘事件\n * @returns 键位弦或 null\n */\nexport function chordFromEvent(e: { ctrlKey?: boolean; metaKey?: boolean; shiftKey?: boolean; altKey?: boolean; key?: string }): string | null {\n const key = normalizeKey(e.key ?? '')\n if (!key || key === 'Control' || key === 'Shift' || key === 'Alt' || key === 'Meta') return null\n return formatChord({ ctrl: Boolean(e.ctrlKey), shift: Boolean(e.shiftKey), alt: Boolean(e.altKey), meta: Boolean(e.metaKey), key })\n}\n\n/**\n * 键位版本 hook:配置变化时返回新版本(tooltip/占位文案随键位刷新)。\n * @author ddj 2026年08月26号\n * @returns 当前版本号\n */\nexport function useKeybindingsVersion(): number {\n const [version, setVersion] = React.useState(0)\n React.useEffect(() => subscribeKeybindings(() => setVersion((v) => v + 1)), [])\n return version\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — QuickOpen:顶部搜索框(Ctrl+P 打开文件)。\n * 快捷键随配置(edrv.quickOpen),占位文案同步当前键位。\n * 迁移自原 src/client/index.ts 的 QuickOpen,语义不改。\n * 作者 ddj 2026-08-20 / 2026-08-26\n */\nimport React from 'react'\nimport { rpc } from '../rpc.js'\nimport { bindingOf, chordOf, matchEvent, useKeybindingsVersion } from '../keybindings.js'\n\n/**\n * 快速打开搜索框:Ctrl+P 聚焦,输入 ≥2 字符经 edrv.searchFiles 搜索,\n * 结果列表点击/回车打开文件。\n * @param props.sessionId 会话 id\n * @param props.onOpen 打开回调(path)\n */\nexport function QuickOpen(props) {\n const sessionId = props?.sessionId\n const onOpen = props?.onOpen\n const [q, setQ] = React.useState('')\n const [results, setResults] = React.useState(null)\n const [open, setOpen] = React.useState(false)\n const inputRef = React.useRef(null)\n const seq = React.useRef(0)\n const timer = React.useRef(null)\n useKeybindingsVersion() // 键位变化时刷新占位文案\n\n const search = (query) => {\n const s = ++seq.current\n const clean = String(query || '').trim()\n if (clean.length < 2) { setResults(null); return }\n rpc('edrv.searchFiles', { sessionId, query: clean }).then((res) => {\n if (s !== seq.current) return\n setResults((res && res.ok && Array.isArray(res.files)) ? res.files : [])\n }).catch(() => { if (s === seq.current) setResults([]) })\n }\n\n const onChange = (v) => {\n setQ(v); setOpen(true)\n if (timer.current) clearTimeout(timer.current)\n timer.current = setTimeout(() => search(v), 180)\n }\n\n const pick = (p) => {\n onOpen(p)\n setQ(''); setResults(null); setOpen(false)\n inputRef.current?.blur?.()\n }\n\n React.useEffect(() => {\n const onKey = (e) => {\n if (matchEvent(e, bindingOf('edrv.quickOpen'))) {\n e.preventDefault(); e.stopPropagation()\n inputRef.current?.focus?.()\n setOpen(true)\n } else if (e.key === 'Escape') {\n setOpen(false); inputRef.current?.blur?.()\n }\n }\n window.addEventListener('keydown', onKey, true)\n return () => window.removeEventListener('keydown', onKey, true)\n }, [])\n\n const dirText = (p) => {\n const base = String(p).split(/[\\\\/]/).pop() || String(p)\n return String(p).slice(0, Math.max(0, String(p).length - base.length)).replace(/[\\\\/]+$/, '') || String(p)\n }\n\n let pop = null\n if (open && Array.isArray(results) && q.trim().length >= 2) {\n if (results.length) {\n const items = results.map((p) => React.createElement('div', { key: p, className: 'edrv-search-item', onClick: () => pick(p) },\n React.createElement('span', { className: 'n' }, String(p).split(/[\\\\/]/).pop() || p),\n React.createElement('span', { className: 'd' }, dirText(p))))\n pop = React.createElement('div', { className: 'edrv-search-pop' }, ...items)\n } else {\n pop = React.createElement('div', { className: 'edrv-search-pop' }, React.createElement('div', { className: 'edrv-search-empty' }, '无匹配文件'))\n }\n }\n\n return React.createElement('div', { className: 'edrv-search-wrap' },\n React.createElement('input', {\n ref: inputRef, className: 'edrv-search', placeholder: '搜索文件 (' + (chordOf('edrv.quickOpen') ?? 'Ctrl+P') + ')',\n value: q,\n onChange: (e) => onChange(e.target.value),\n onFocus: () => { if (q.trim().length >= 2 && !results) setOpen(true) },\n onKeyDown: (e) => {\n if (e.key === 'Enter' && Array.isArray(results) && results.length) pick(results[0])\n if (e.key === 'Escape') setOpen(false)\n },\n }),\n pop)\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — UI 共用小工具(按钮样式/状态文案/等宽字体)。\n * 迁移自原 src/client/index.ts 的 btn/badgeOf/MONO,语义不改。\n * 作者 ddj 2026-08-20\n */\nimport { ST } from '../state/records.js'\n\n/** 次级按钮内联样式(accept=true 绿色 / false 红色)。 */\nexport function btn(accept) {\n return {\n fontSize: 11,\n padding: '1px 8px',\n border: '1px solid var(--dsw-alias-border-l2,#555)',\n borderRadius: 4,\n cursor: 'pointer',\n background: 'var(--dsw-alias-bg-layer-1,transparent)',\n color: accept ? 'var(--dsw-alias-state-success-primary,#2e9e44)' : 'var(--dsw-alias-state-error-primary,#d9534f)',\n }\n}\n\n/** 状态中文文案。 */\nexport function badgeOf(status) {\n return status === ST.ACCEPTED ? '已采纳' : status === ST.REJECTED ? '已拒绝' : '待处理'\n}\n\n/** 等宽字体常量(差异行渲染用)。 */\nexport const MONO = { fontFamily: 'var(--ds-font-family-code, ui-monospace, monospace)', fontSize: 12, lineHeight: 1.55 }\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — DiffLauncher:全局差异总览 + 归档 圆角下拉。\n * 迁移自原 src/client/index.ts 的 DiffLauncher,语义不改。\n * 作者 ddj 2026-08-20\n */\nimport React from 'react'\nimport { rpc } from '../rpc.js'\nimport { MONO, btn } from './shared.js'\n\n/**\n * 全局差异面板:待处理文件列表(点击打开并跳转)+ 归档浏览/批次回滚。\n * 由状态栏差异 chip / header 角标触发。\n */\nexport function DiffLauncher(props) {\n const sessionId = props?.sessionId\n const sum = props?.sum\n const onClose = props?.onClose\n const onOpenFile = props?.onOpenFile\n const [tab, setTab] = React.useState(props?.tab === 'archive' ? 'archive' : 'pending') // 'pending' | 'archive'\n const [archives, setArchives] = React.useState(null)\n const [archiveDetail, setArchiveDetail] = React.useState(null)\n const [archivePath, setArchivePath] = React.useState(null)\n const [archiveErr, setArchiveErr] = React.useState(null)\n const [error, setError] = React.useState(null)\n\n const loadArchives = () => {\n if (!sessionId) { setArchiveErr('会话不存在'); return }\n rpc('edrv.archiveList', { sessionId }).then((res) => {\n if (res && res.ok && Array.isArray(res.entries)) { setArchives(res.entries); setArchiveErr(null) }\n else setArchiveErr(res?.error ? String(res.error) : '归档列表读取失败')\n }).catch((e) => setArchiveErr('归档异常:' + String(e)))\n }\n const loadArchiveDetail = (path) => {\n if (!sessionId) return\n setArchiveDetail(null)\n rpc('edrv.archiveRead', { sessionId, path }).then((res) => {\n if (res && res.ok && Array.isArray(res.batches)) setArchiveDetail(res.batches)\n else setArchiveErr(res?.error ? String(res.error) : '归档详情读取失败')\n }).catch((e) => setArchiveErr('归档异常:' + String(e)))\n }\n React.useEffect(() => {\n if (tab !== 'archive') return\n setArchives(null); setArchiveDetail(null); setArchivePath(null); setArchiveErr(null)\n loadArchives()\n }, [tab, sessionId])\n\n let body\n if (tab === 'pending') {\n body = (sum.pendingFiles.length === 0\n ? React.createElement('div', { className: 'edrv-search-empty' }, '暂无待处理差异(已全部处理)')\n : sum.pendingFiles.map((f) => React.createElement('div', { key: f.path, className: 'edrv-launch-row', title: '打开并跳转到差异 ' + f.path, onClick: () => onOpenFile(f.path) },\n React.createElement('span', { className: 'edrv-launch-path' }, f.path),\n React.createElement('span', { className: 'edrv-launch-cnt' }, '待处理 ' + f.pending + ' 处'),\n React.createElement('button', { className: 'edrv-btn-mini edrv-btn-keep', onClick: (e) => { e.stopPropagation(); onOpenFile(f.path) } }, '打开'))))\n } else {\n if (archiveErr) body = React.createElement('div', { className: 'edrv-search-empty', style: { color: 'var(--dsw-alias-state-error-primary,#d9534f)' } }, '错误:' + String(archiveErr))\n else if (archives === null) body = React.createElement('div', { className: 'edrv-search-empty' }, '加载中…')\n else if (archives.length === 0) body = React.createElement('div', { className: 'edrv-search-empty' }, '暂无归档记录')\n else {\n const inner = archives.map((e) => {\n const open = archivePath === e.path\n let detailEl = null\n if (open) {\n if (archiveDetail === null) detailEl = React.createElement('div', { style: { padding: 8, fontSize: 11, color: 'var(--dsw-alias-label-tertiary,#888)' } }, '加载中…')\n else {\n const batches = archiveDetail.filter((b) => b.path === e.path)\n detailEl = batches.map((b) => (Array.isArray(b.records) ? b.records : []).map((rec) => {\n const lines = []\n const hunks = Array.isArray(rec.hunks) ? rec.hunks : []\n for (const h of hunks) {\n const oldLs = (h.oldText ?? '').split('\\n')\n const newLs = (h.newText ?? '').split('\\n')\n for (const t of oldLs) lines.push({ k: 'old', t })\n if (oldLs.length && newLs.length) lines.push({ k: 'sep', t: '' })\n for (const t of newLs) lines.push({ k: 'new', t })\n }\n const sm = rec.summary || { accepted: 0, rejected: 0, pending: 0, superseded: false }\n return React.createElement('div', { key: rec.callId, style: { padding: '5px 8px', borderTop: '1px solid var(--dsw-alias-border-l1,#333)' } },\n React.createElement('div', { style: { display: 'flex', gap: 8, alignItems: 'center', flexWrap: 'wrap', fontSize: 11, marginBottom: 2 } },\n React.createElement('span', { style: { color: 'var(--dsw-alias-label-primary,#ddd)', fontWeight: 600 } }, rec.toolName === 'write' ? (rec.create ? '新建' : '写入') : '编辑'),\n React.createElement('span', { style: { color: 'var(--dsw-alias-state-success-primary,#2e9e44)' } }, '采纳 ' + sm.accepted),\n React.createElement('span', { style: { color: 'var(--dsw-alias-state-error-primary,#d9534f)' } }, '拒绝 ' + sm.rejected),\n (rec.superseded ? React.createElement('span', { style: { color: 'var(--dsw-alias-state-warn-primary,#b7791f)' } }, '被覆盖') : null),\n React.createElement('span', { style: { color: 'var(--dsw-alias-label-tertiary,#888)' } }, new Date(rec.at).toLocaleTimeString())),\n React.createElement('pre', { style: { margin: 0, whiteSpace: 'pre', fontFamily: MONO.fontFamily, fontSize: 11, lineHeight: 1.5, overflowX: 'auto' } }, lines.map((ln, i) => React.createElement('div', { key: i, style: { background: ln.k === 'old' ? 'rgba(239,68,68,.10)' : ln.k === 'new' ? 'rgba(34,197,94,.10)' : 'transparent', color: ln.k === 'old' ? 'var(--dsw-alias-state-error-primary,#d9534f)' : ln.k === 'new' ? 'var(--dsw-alias-state-success-primary,#2e9e44)' : 'var(--dsw-alias-label-tertiary,#888)' } }, (ln.k === 'old' ? '- ' : ln.k === 'new' ? '+ ' : '') + ln.t)))\n )\n }))\n }\n }\n return React.createElement('div', { key: e.at + e.path, style: { border: '1px solid var(--dsw-alias-border-l1,#333)', borderRadius: 8, overflow: 'hidden' } },\n React.createElement('div', { style: { display: 'flex', gap: 8, alignItems: 'center', padding: '6px 8px', background: 'var(--dsw-alias-bg-layer-1,transparent)', cursor: 'pointer', flexWrap: 'wrap' }, onClick: () => { if (open) { setArchivePath(null); setArchiveDetail(null) } else { setArchivePath(e.path); loadArchiveDetail(e.path) } } },\n React.createElement('span', { style: { flex: 1, fontSize: 12, color: 'var(--dsw-alias-label-primary,#ddd)', wordBreak: 'break-all' } }, e.path),\n (e.batch != null ? React.createElement('span', { style: { fontSize: 11, color: 'var(--dsw-alias-label-tertiary,#888)' } }, '批次 ' + e.batch) : null),\n (e.reason ? React.createElement('span', { style: { fontSize: 11, color: 'var(--dsw-alias-state-warn-primary,#b7791f)' } }, e.reason) : null),\n React.createElement('span', { style: { fontSize: 11, color: 'var(--dsw-alias-label-tertiary,#888)' } }, new Date(e.at).toLocaleString()),\n React.createElement('span', { style: { fontSize: 11, color: 'var(--dsw-alias-label-tertiary,#888)' } }, '采纳 ' + e.summary.accepted + ' · 拒绝 ' + e.summary.rejected + (e.summary.superseded ? ' · 覆盖 ' + e.summary.superseded : '')),\n React.createElement('button', { onClick: (ev) => {\n ev.stopPropagation()\n if (e.batch == null) return\n if (!window.confirm('将文件恢复到批次 ' + e.batch + ' 之前的状态?(当前活跃差异将一并归档)')) return\n rpc('edrv.rollback', { sessionId, path: e.path, batch: e.batch }).then((res) => {\n if (res && res.ok) {\n setError(null); window.dispatchEvent(new CustomEvent('edrv:refresh'))\n setArchivePath(null); setArchiveDetail(null); loadArchives()\n } else setError(res?.error ? String(res.error) : '回滚失败')\n }).catch((err) => setError('回滚异常:' + String(err)))\n }, style: btn(false) }, '回滚')),\n detailEl)\n })\n body = React.createElement('div', { className: 'edrv-launch-arch' }, inner)\n }\n }\n\n return React.createElement('div', { className: 'edrv-launch', 'data-edrv-launch': '1' },\n React.createElement('div', { className: 'edrv-launch-head' },\n React.createElement('span', { style: { fontSize: 12, fontWeight: 600, color: 'var(--dsw-alias-label-primary,#eee)', marginRight: 4 } }, '差异'),\n React.createElement('button', { className: 'edrv-launch-tab' + (tab === 'pending' ? ' on' : ''), onClick: () => setTab('pending') }, '待处理' + (sum.totalFiles ? ' (' + sum.totalFiles + ')' : '')),\n React.createElement('button', { className: 'edrv-launch-tab' + (tab === 'archive' ? ' on' : ''), onClick: () => setTab('archive') }, '归档'),\n React.createElement('span', { style: { flex: 1 } }),\n (error ? React.createElement('span', { style: { fontSize: 11, color: 'var(--dsw-alias-state-error-primary,#d9534f)', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap', maxWidth: '40%' } }, '错误:' + String(error)) : null),\n React.createElement('button', { onClick: onClose, style: btn(false) }, '✕ 关闭')),\n React.createElement('div', { className: 'edrv-launch-body' }, body))\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — 侧边栏容器(活动栏 + 面板区 + 拖拽调宽)。\n * 面板列表来自注册表(活动栏图标/徽标/激活态),渲染当前激活面板的 render(ctx);\n * 右侧手柄拖拽调宽(clamp 180–560),底部按钮收起侧边栏。\n * 作者 ddj 2026-08-26\n */\nimport React from 'react'\nimport type { SidebarCtx } from './types.js'\n\nconst W_MIN = 180\nconst W_MAX = 560\n\n/**\n * 侧边栏容器。\n * @param props.registry 面板注册表(list() 提供面板顺序)\n * @param props.ctx 面板共享上下文\n * @param props.activePanel 当前激活面板 id\n * @param props.onActive 激活面板变化回调\n * @param props.width 面板区宽度\n * @param props.onWidth 宽度变化回调\n * @param props.onHide 收起侧边栏回调\n */\nexport function SidebarView(props) {\n const panels = props.registry?.list?.() ?? []\n const ctx = props.ctx\n const activePanel = props.activePanel\n const onActive = props.onActive\n const width = props.width\n const onWidth = props.onWidth\n const onHide = props.onHide\n\n const active = panels.find((p) => p.id === activePanel) || panels[0]\n\n const onPointerDown = (e) => {\n e.preventDefault()\n const startX = e.clientX\n const startW = width\n const onMove = (ev) => {\n const w = Math.max(W_MIN, Math.min(W_MAX, startW + (ev.clientX - startX)))\n onWidth(w)\n }\n const onUp = () => {\n window.removeEventListener('pointermove', onMove)\n window.removeEventListener('pointerup', onUp)\n }\n window.addEventListener('pointermove', onMove)\n window.addEventListener('pointerup', onUp)\n }\n\n const rail = React.createElement('div', { className: 'edrv-rail' },\n React.createElement('div', { style: { flex: 1, display: 'flex', flexDirection: 'column', gap: 2 } },\n panels.map((p) => {\n const count = typeof p.badge === 'function' ? p.badge(ctx) : null\n return React.createElement('button', {\n key: p.id,\n className: 'edrv-rail-btn' + (active && p.id === active.id ? ' edrv-rail-on' : ''),\n title: p.title,\n onClick: () => onActive(p.id),\n },\n React.createElement('span', { className: 'edrv-rail-icon' }, p.icon),\n count > 0\n ? React.createElement('span', { className: 'edrv-rail-badge' }, String(count))\n : null)\n })),\n React.createElement('button', { className: 'edrv-rail-btn', title: '隐藏侧边栏 (Ctrl+B)', onClick: onHide }, '◀'))\n\n return React.createElement('div', { className: 'edrv-sidebar', style: { width } },\n rail,\n React.createElement('div', { className: 'edrv-side-body' },\n active ? active.render(ctx) : null),\n React.createElement('div', { className: 'edrv-side-resize', onPointerDown: onPointerDown }))\n}\n","/**\n * dsh-vscode-mode client — 会话级差异 dock store。\n * EditorView 发布当前编辑上下文,conversation.input.dock 唯一读取并渲染。\n * 作者 ddj 2026年08月26号\n */\n\n/** 差异 dock 的显示形态。 */\nexport type DiffDockMode = 'chat' | 'editor' | 'editor-empty'\n\n/**\n * 跨 slot 传递的差异 dock 快照。\n * 操作回调随快照一起更新,避免 dock 持有已卸载编辑器的旧闭包。\n */\nexport interface DiffDockSnapshot {\n mode: DiffDockMode\n [key: string]: unknown\n}\n\ntype DiffDockListener = () => void\ntype DiffDockSource = object\n\nconst values = new Map<string, DiffDockSnapshot>()\nconst sources = new Map<string, DiffDockSource>()\nconst listeners = new Map<string, Set<DiffDockListener>>()\n\n/** 通知指定会话的 dock 订阅者。 */\nfunction notifyDiff(sessionId: string): void {\n for (const listener of listeners.get(sessionId) ?? []) listener()\n}\n\n/**\n * 发布指定会话的最新编辑器差异上下文。\n * @author ddj 2026年08月26号\n * @param sessionId 会话 id\n * @param snapshot 完整 DiffBox 操作上下文\n * @param source 发布者令牌,用于卸载时防止误清理新实例\n */\nexport function publishDiffDock(sessionId: string, snapshot: DiffDockSnapshot, source?: DiffDockSource): void {\n values.set(sessionId, snapshot)\n if (source) sources.set(sessionId, source)\n else sources.delete(sessionId)\n notifyDiff(sessionId)\n}\n\n/**\n * 清除指定会话的差异上下文。\n * @author ddj 2026年08月26号\n * @param sessionId 会话 id\n * @param source 可选发布者令牌;不匹配时忽略清理\n */\nexport function clearDiffDock(sessionId: string, source?: DiffDockSource): void {\n if (source && sources.get(sessionId) !== source) return\n values.delete(sessionId)\n sources.delete(sessionId)\n notifyDiff(sessionId)\n}\n\n/**\n * 读取指定会话的最新上下文。\n * @author ddj 2026年08月26号\n * @param sessionId 会话 id\n * @returns 最新上下文或 null\n */\nexport function readDiffDock(sessionId?: string): DiffDockSnapshot | null {\n if (!sessionId) return null\n return values.get(sessionId) ?? null\n}\n\n/**\n * 订阅指定会话的上下文变化。\n * @author ddj 2026年08月26号\n * @param sessionId 会话 id\n * @param listener 变化回调\n * @returns 取消订阅函数\n */\nexport function subscribeDiffDock(sessionId: string, listener: DiffDockListener): () => void {\n let bucket = listeners.get(sessionId)\n if (!bucket) {\n bucket = new Set()\n listeners.set(sessionId, bucket)\n }\n bucket.add(listener)\n return () => {\n bucket!.delete(listener)\n if (!bucket!.size) listeners.delete(sessionId)\n }\n}\n","/**\n * dsh-vscode-mode client — 对话差异 dock 纯函数。\n * 只负责差异文件轮转和文案,状态查询仍由组件复用现有 edrv.list/summarize。\n * 作者 ddj 2026-08-26\n */\n\n/**\n * 从稳定差异文件列表中取下一个路径,并返回下一次索引。\n * @author ddj 2026年08月26号\n * @param paths 待处理差异文件路径\n * @param index 当前轮转索引\n * @returns 下一个路径与归一化后的下一索引\n */\nexport function nextDiffPath(paths: string[], index: number): { path: string | null; index: number } {\n if (!paths.length) return { path: null, index: 0 }\n const current = Number.isFinite(index) ? Math.max(0, Math.floor(index)) : 0\n const at = current % paths.length\n return { path: paths[at] ?? null, index: (at + 1) % paths.length }\n}\n\n/**\n * 生成对话差异 dock 的单按钮文案。\n * @author ddj 2026年08月26号\n * @param count 待处理差异文件数量\n * @returns 展示文案\n */\nexport function diffDockText(count: number): string {\n return '差异 ' + Math.max(0, Math.floor(count)) + ' 个文件 · 查看下一个'\n}\n\n/**\n * 根据活动文件决定编辑页 dock 形态,加载期间保持 editor 结构稳定。\n * @author ddj 2026年08月26号\n * @param activePath 当前活动文件路径\n * @returns 编辑态或无文件空态\n */\nexport function editorDockMode(activePath: string | null | undefined): 'editor' | 'editor-empty' {\n return activePath ? 'editor' : 'editor-empty'\n}\n\n/**\n * 获取切换文件期间稳定展示的文件内差异数量。\n * @author ddj 2026年08月26号\n * @param ready 当前文件内容是否已加载完成\n * @param actualTotal 内容就绪后的精确差异数\n * @param fallbackTotal 内容加载期间的文件摘要差异数\n * @returns 非负整数差异数\n */\nexport function displayDiffTotal(ready: boolean, actualTotal: number, fallbackTotal: number): number {\n const value = ready ? actualTotal : fallbackTotal\n return Number.isFinite(value) ? Math.max(0, Math.floor(value)) : 0\n}\n","/**\n * dsh-vscode-mode client — 编辑区与原生 composer 的几何边界计算。\n * @author ddj 2026年08月26号\n */\n\n/**\n * 计算编辑根节点在当前会话滚动区内、composer 上方可使用的高度。\n * @author ddj 2026年08月26号\n * @param rootTop 编辑根节点顶边\n * @param scrollBottom 会话滚动区可视底边\n * @param composerTop composer 顶边;缺失时回退滚动区底边\n * @returns 非负可用高度\n */\nexport function editorHeight(rootTop: number, scrollBottom: number, composerTop?: number): number {\n const root = Number.isFinite(rootTop) ? rootTop : 0\n const scroll = Number.isFinite(scrollBottom) ? scrollBottom : root\n const composer = Number.isFinite(composerTop) ? composerTop as number : scroll\n return Math.max(0, Math.min(scroll, composer) - root)\n}\n","/**\n * dsh-vscode-mode client — 「在文件浏览器中打开」RPC 包装(树菜单与 Monaco 右键共用)。\n * 归一化为 { ok, error? },不抛异常;无会话/异常降级返回错误文案。\n * 作者 ddj 2026-08-27\n */\nimport { rpc } from './rpc.js'\n\nexport interface RevealOutcome {\n ok: boolean\n error?: string\n}\n\n/**\n * 请求 host 在 OS 文件浏览器中打开/定位路径。\n * @author ddj 2026年08月27号\n * @param sessionId 会话 id(可空)\n * @param path 工作区相对路径('' = 根目录)\n * @returns 成功或失败原因\n */\nexport async function revealInExplorer(sessionId: string | undefined, path: string): Promise<RevealOutcome> {\n if (!sessionId) return { ok: false, error: '无活动会话' }\n try {\n const res = await rpc('edrv.revealInExplorer', { sessionId, path })\n return res.ok ? { ok: true } : { ok: false, error: res.error }\n } catch (error) {\n return { ok: false, error: '打开异常:' + String(error) }\n }\n}\n","/**\n * dsh-vscode-mode client — 编辑器视图状态持久化(纯函数,可单测)。\n * 对齐 VSCode workbench.editor.restoreViewState:恢复每个文件的光标/滚动/折叠位置。\n * 视图状态 = Monaco editor.saveViewState() 返回值(JSON 可序列化),按 path 存储。\n * 作者 ddj 2026-08-28\n */\n\n/** localStorage 键前缀(按会话隔离)。 */\nconst KEY_PREFIX = 'edrv.cache.viewstate.v1.'\n\n/** 视图状态条目容量上限。 */\nexport const VIEWSTATE_CAP = 50\n\n/** 视图状态序列化体积上限(单条目,防止超大选区/折叠数据撑爆配额)。 */\nexport const VIEWSTATE_BYTES_CAP = 64 * 1024\n\n/**\n * 判断对象是否为合法的 Monaco view state(保守形状校验,非深校验)。\n * @author ddj 2026年08月28号\n * @param value 待校验对象\n * @returns 是否可接受\n */\nexport function isViewStateLike(value: unknown): boolean {\n if (!value || typeof value !== 'object') return false\n const v = value as Record<string, unknown>\n // 至少含光标状态与视口滚动信息之一;无内容时拒绝(空对象无恢复价值)\n return Array.isArray(v.cursorState) || typeof v.viewState === 'object'\n || Array.isArray(v.contributionsState)\n}\n\n/**\n * 序列化视图状态映射(path → viewState)。\n * @author ddj 2026年08月28号\n * @param states path → viewState 映射\n * @returns JSON 字符串\n */\nexport function serializeViewStates(states: Record<string, unknown>): string {\n return JSON.stringify({ v: 1, states })\n}\n\n/**\n * 解析视图状态文本;损坏/格式不符 → null。\n * @author ddj 2026年08月28号\n * @param text localStorage 原文\n * @returns path → viewState 映射,非法返回 null\n */\nexport function parseViewStates(text: string | null): Record<string, unknown> | null {\n if (!text) return null\n try {\n const data = JSON.parse(text)\n if (!data || typeof data !== 'object') return null\n const states = (data as Record<string, unknown>).states\n if (!states || typeof states !== 'object' || Array.isArray(states)) return null\n const out: Record<string, unknown> = {}\n for (const [path, state] of Object.entries(states)) {\n if (typeof path !== 'string' || !path) continue\n if (!isViewStateLike(state)) continue\n out[path] = state\n }\n return out\n } catch (error) {\n return null\n }\n}\n\n/**\n * 把新视图状态并入既有映射:同 path 覆盖、按写入顺序裁剪到容量上限。\n * @author ddj 2026年08月28号\n * @param states 既有映射\n * @param path 文件路径\n * @param state 视图状态\n * @returns 新映射(容量裁剪后)\n */\nexport function upsertViewState(\n states: Record<string, unknown>,\n path: string,\n state: unknown,\n): Record<string, unknown> {\n if (!path || !isViewStateLike(state)) return states\n try {\n if (JSON.stringify(state).length > VIEWSTATE_BYTES_CAP) return states\n } catch (error) {\n return states\n }\n const next = Object.assign({}, states)\n delete next[path] // 先删后加,保证该 path 排到最末(近似 LRU:最新写入)\n next[path] = state\n const keys = Object.keys(next)\n if (keys.length > VIEWSTATE_CAP) {\n for (const k of keys.slice(0, keys.length - VIEWSTATE_CAP)) delete next[k]\n }\n return next\n}\n\n/**\n * 读取某会话的视图状态缓存(localStorage 不可用 → 空映射)。\n * @author ddj 2026年08月28号\n * @param sessionId 会话 id\n * @returns path → viewState 映射\n */\nexport function viewStatesLoad(sessionId: string): Record<string, unknown> {\n try {\n return parseViewStates(window.localStorage.getItem(KEY_PREFIX + String(sessionId))) ?? {}\n } catch (error) {\n return {}\n }\n}\n\n/**\n * 写入某会话的视图状态缓存(损坏/配额满 → 忽略)。\n * @author ddj 2026年08月28号\n * @param sessionId 会话 id\n * @param states path → viewState 映射\n */\nexport function viewStatesSave(sessionId: string, states: Record<string, unknown>): void {\n try {\n window.localStorage.setItem(KEY_PREFIX + String(sessionId), serializeViewStates(states))\n } catch (error) { /* 配额满/隐私模式忽略 */ }\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — EditorView:中央 VSCode 式文件编辑器(编排层)。\n * 迁移自原 src/client/index.ts 的 EditorView,语义不改;差异自绘已抽到 monaco/diffRender。\n * 职责:页签/QuickOpen/Monaco 编辑器/差异审查(DiffBox/Launcher/Badge 事件装配)/状态栏/自动保存。\n * 作者 ddj 2026-08-20\n */\nimport React from 'react'\nimport { dbg, rpc } from '../rpc.js'\nimport { emitRefresh } from '../events.js'\nimport { langOf, loadMonaco } from '../monaco/loader.js'\nimport { createDiffRenderer } from '../monaco/diffRender.js'\nimport { ST, callIdAttr, noopHunk, summarize } from '../state/records.js'\nimport { diffRegions } from '../state/regions.js'\nimport { QuickOpen } from './QuickOpen.js'\nimport { DiffLauncher } from './DiffLauncher.js'\nimport { SidebarView } from '../sidebar/SidebarView.js'\nimport { clearDiffDock, publishDiffDock } from '../diffDockStore.js'\nimport { displayDiffTotal, editorDockMode } from '../diffDock.js'\nimport { editorHeight } from '../editorLayout.js'\nimport { revealInExplorer as revealPathInExplorer } from '../fileReveal.js'\nimport { setSidePending, SIDEBAR_INSTALL_CMD } from '../sidebarBridge.js'\nimport { upsertViewState, viewStatesLoad, viewStatesSave } from '../state/viewStateCache.js'\nimport { bindingOf, chordOf, matchEvent, useKeybindingsVersion } from '../keybindings.js'\n\n/**\n * 中央编辑区:文件页签(脏点/关闭/打开路径)+ Ctrl+P 搜索 + Monaco 编辑器 +\n * 底部差异条(DiffBox/空态)+ 全局差异下拉(DiffLauncher)+ 状态栏。\n * @param props.sessionId 会话 id\n * @param props.schedule 延时调度(ctx.timeout)\n * @param props.layout 布局形态:'tab'(中央页签,默认)| 'side'(侧边栏面板)\n * @param props.sideHint 旧页签形态下显示侧边栏引导(安装命令)\n */\nexport function EditorView(props) {\n const sessionId = props?.sessionId\n const schedule = props.schedule\n const addToConversation = props.addToConversation\n const layout = props?.layout === 'side' ? 'side' : 'tab'\n const sideHint = props?.sideHint\n const [monaco, setMonaco] = React.useState(null)\n const [monacoErr, setMonacoErr] = React.useState(null)\n const [records, setRecords] = React.useState({})\n const [tabs, setTabs] = React.useState([])\n const [active, setActive] = React.useState(null)\n const [dirtyMap, setDirtyMap] = React.useState({})\n const [content, setContent] = React.useState(null)\n const [contentPath, setContentPath] = React.useState(null)\n const [status, setStatus] = React.useState('')\n const [error, setError] = React.useState(null)\n const [loadError, setLoadError] = React.useState(null)\n const [loadStage, setLoadStage] = React.useState({ progress: 0, message: '准备加载编辑器…' })\n const [openInput, setOpenInput] = React.useState(false)\n const [pathDraft, setPathDraft] = React.useState('')\n const [cursor, setCursor] = React.useState('')\n const [launcherOpen, setLauncherOpen] = React.useState(false)\n const [launcherTab, setLauncherTab] = React.useState('pending')\n const [hoverAct, setHoverAct] = React.useState(null) // { region, top } 编辑区 hover 差异块的 Keep/Undo 浮层\n const [diffIdx, setDiffIdx] = React.useState(0) // 当前文件内差异位置(x/x 显示)\n const [fileIdx, setFileIdx] = React.useState(0) // 全局差异文件位置(x/x 文件 显示)\n const [tabMenu, setTabMenu] = React.useState(null) // Tab 右键菜单 { x,y,path }(编辑区右键走 Monaco 原生菜单,无此浮层)\n const [sidebarOn, setSidebarOn] = React.useState(layout !== 'side') // 侧边栏显隐(侧栏形态默认收起)\n const [sidebarW, setSidebarW] = React.useState(240) // 侧边栏宽度\n const [activePanel, setActivePanel] = React.useState('explorer') // 激活面板 id\n const [focusRequest, setFocusRequest] = React.useState(0) // 外部差异聚焦请求版本\n const kbVersion = useKeybindingsVersion() // 快捷键配置版本(tooltip 文案随键位刷新)\n const [hintDismissed, setHintDismissed] = React.useState(() => {\n try { return localStorage.getItem('edrv.side-hint-dismissed') === '1' } catch { return false }\n }) // 侧边栏引导条是否已关闭\n const editorRef = React.useRef(null)\n const viewRootRef = React.useRef(null)\n const monacoRef = React.useRef(null)\n const modelsRef = React.useRef(new Map())\n // 视图状态缓存(path → Monaco viewState;重启后恢复光标/滚动/折叠位置)\n const viewStatesRef = React.useRef({})\n const saveTimerRef = React.useRef(null)\n const loadSeqRef = React.useRef(0)\n const programmaticRef = React.useRef(false)\n const bootRef = React.useRef(false)\n const pendingFocusRef = React.useRef(null) // { path, region } 内容加载后跳转\n const hoverRegionsRef = React.useRef([]) // 当前 pending 区域镜像(稳定回调读取)\n const lineRegionMapRef = React.useRef(new Map()) // 行 → 区域 映射(hover 命中)\n const hoverKeyRef = React.useRef(null) // 当前 hover 区域 key(区域不变不重渲染)\n const hoverTopRef = React.useRef(null) // 当前 hover 浮窗 top(滚动后位置变化才重定位)\n const hoverRightRef = React.useRef(null) // 浮窗右侧避让 Monaco 缩略栏\n const hideTimerRef = React.useRef(null) // 延迟隐藏计时器(防闪烁)\n const hoverEditorRef = React.useRef(false) // 鼠标是否仍在编辑器命中区\n const hoverPanelRef = React.useRef(false) // 鼠标是否已进入 Keep/Undo 浮层\n const batchBusyRef = React.useRef(false) // 批量 Keep All/Undo All 防重入\n const menuHandlersRef = React.useRef(null) // 右键菜单动作的最新闭包(Monaco addAction 空依赖回调读取)\n const doSaveRef = React.useRef(null) // 保存动作的最新闭包(窗口级保存监听读取)\n const diffRendererRef = React.useRef(null)\n const layoutRef = React.useRef(layout) // ensureEditor 空依赖闭包读取的稳定布局\n layoutRef.current = layout\n if (!diffRendererRef.current) diffRendererRef.current = createDiffRenderer((sid, t) => dbg(sid, t))\n\n const currentRecords = React.useMemo(() => {\n const list = []\n for (const rec of Object.values(records)) if (rec.path === active && rec.archived !== true) list.push(rec)\n return list\n }, [records, active])\n\n const contentReady = content !== null && contentPath === active\n const regions = React.useMemo(() => diffRegions(currentRecords, contentReady ? content : null).filter((r) => !r.superseded), [currentRecords, content, contentPath, active])\n // useMemo 稳定引用:否则 hover 等重渲染会让 view zone effect 反复重建(- 号闪烁)\n const pendingRegions = React.useMemo(() => regions.filter((r) => r.status === ST.PENDING && !r.stale), [regions])\n const staleRegions = React.useMemo(() => regions.filter((r) => r.status === ST.PENDING && r.stale), [regions])\n hoverRegionsRef.current = pendingRegions\n // 行 → 差异区域 映射(hover O(1) 命中;每行归属其区域)\n const lineRegionMap = React.useMemo(() => {\n const map = new Map()\n for (const r of pendingRegions) {\n if (r.start === undefined || r.end === undefined) continue\n const last = Math.max(r.start, r.end - 1)\n for (let ln = r.start; ln <= last; ln++) if (!map.has(ln)) map.set(ln, r)\n }\n return map\n }, [pendingRegions])\n lineRegionMapRef.current = lineRegionMap\n const sum = React.useMemo(() => summarize(Object.values(records)), [records])\n\n const addTab = (path, select) => {\n setTabs((prev) => {\n if (prev.some((t) => t.path === path)) return prev\n return prev.concat([{ path }])\n })\n if (select) setActive(path)\n }\n\n /**\n * 保存当前活动文件的视图状态(光标/滚动/折叠)到会话缓存。\n * @author ddj 2026年08月28号\n * @param path 要保存的文件路径(缺省 = 当前 active)\n */\n const saveViewState = (path) => {\n const ed = editorRef.current\n const target = path ?? active\n if (!ed || !target) return\n try {\n const state = ed.saveViewState()\n if (!state) return\n viewStatesRef.current = upsertViewState(viewStatesRef.current, target, state)\n viewStatesSave(sessionId, viewStatesRef.current)\n } catch (e) { /* 视图状态保存失败忽略 */ }\n }\n\n /**\n * 恢复指定文件的视图状态(内容就绪、setModel 后调用;恢复后即消费删除)。\n * @author ddj 2026年08月28号\n * @param path 文件路径\n */\n const restoreViewState = (path) => {\n const ed = editorRef.current\n if (!ed || !path) return\n const saved = viewStatesRef.current[path]\n if (!saved) return\n const next = Object.assign({}, viewStatesRef.current)\n delete next[path]\n viewStatesRef.current = next\n try { ed.restoreViewState(saved) } catch (e) { /* 恢复失败忽略(行号越界自动兜底) */ }\n }\n\n const closeTab = (path) => {\n flushSave()\n if (path === active) saveViewState(path)\n setTabs((prev) => {\n const idx = prev.findIndex((t) => t.path === path)\n if (idx < 0) return prev\n const next = prev.filter((t) => t.path !== path)\n if (active === path) setActive(next[idx] ? next[idx].path : (next[idx - 1] ? next[idx - 1].path : null))\n return next\n })\n }\n\n /**\n * 轮询去重:前后记录内容一致时返回原引用,React 跳过重渲染,\n * 阻断 5s 轮询 → memo 链 → diff 重渲染/日志 的空转。\n * @author ddj 2026年08月26号\n * @param prev 当前 records\n * @param next 轮询新结果\n * @returns 内容一致返回 true\n */\n const sameRecords = (prev, next) => {\n const pk = Object.keys(prev)\n const nk = Object.keys(next)\n if (pk.length !== nk.length) return false\n for (const k of pk) {\n if (!(k in next)) return false\n if (JSON.stringify(prev[k]) !== JSON.stringify(next[k])) return false\n }\n return true\n }\n\n const refreshRecords = (skipStale) => {\n if (!sessionId) return\n rpc('edrv.list', { sessionId, ...(skipStale ? { skipStale: true } : {}) }).then((res) => {\n if (!res || !res.ok || !Array.isArray(res.records)) return\n const map = {}\n for (const r of res.records) {\n if (r.archived === true) continue\n map[r.callId] = r\n }\n setRecords((prev) => (sameRecords(prev, map) ? prev : map))\n }).catch((e) => setError('list异常:' + String(e)))\n }\n\n /**\n * 加载文件内容(对齐 VSCode model 复用:会话内已打开的 model 直接秒显,\n * 后台静默 RPC 校验防陈旧;首次打开走原读取流程)。\n * @author ddj 2026年08月28号\n * @param path 文件路径\n * @param sid 会话 id\n * @param force 强制走 RPC(reloadFile 用,跳过 model 复用)\n */\n const loadContent = (path, sid, force) => {\n const seq = ++loadSeqRef.current\n const cachedModel = force ? null : modelsRef.current.get(path)\n if (cachedModel) {\n // model 命中:直接显示其内容(切 tab 零等待),后台静默校验\n setContent(cachedModel.getValue())\n setContentPath(path)\n setLoadStage((prev) => ({ progress: Math.max(84, prev.progress), message: '文件已读取,准备创建编辑器…' }))\n setStatus('已加载')\n rpc('edrv.read', { sessionId: sid, path }).then((res) => {\n if (seq !== loadSeqRef.current || path !== active) return\n if (res && res.ok && res.content !== cachedModel.getValue()) {\n saveViewState(path) // 内容更新前保留当前视图位置\n setContent(res.content)\n setStatus('已加载')\n }\n }).catch(() => { /* 校验失败保留缓存内容 */ })\n return\n }\n setLoadError(null)\n setLoadStage({ progress: monaco ? 72 : 12, message: '读取文件内容…' })\n rpc('edrv.read', { sessionId: sid, path }).then((res) => {\n if (seq !== loadSeqRef.current || path !== active) return\n if (res && res.ok) {\n setContent(res.content)\n setContentPath(path)\n setLoadStage((prev) => ({ progress: Math.max(84, prev.progress), message: '文件已读取,准备创建编辑器…' }))\n setStatus('已加载')\n } else {\n const message = res?.error ? String(res.error) : '读取失败'\n setLoadError(message)\n setError(message)\n setStatus('读取失败')\n }\n }).catch((e) => {\n if (seq !== loadSeqRef.current) return\n const message = 'read异常:' + String(e)\n setLoadError(message)\n setError(message)\n setStatus('读取失败')\n })\n }\n\n // 挂载轮询 + 事件订阅\n React.useEffect(() => {\n if (!sessionId) return\n refreshRecords()\n const t = setInterval(refreshRecords, 5000)\n const onRefresh = () => refreshRecords()\n window.addEventListener('edrv:refresh', onRefresh)\n return () => { clearInterval(t); window.removeEventListener('edrv:refresh', onRefresh) }\n }, [sessionId])\n\n React.useEffect(() => {\n const onOpen = (e) => {\n const p = e?.detail?.path\n if (!p) return\n if (e?.detail?.focusDiff === true) {\n pendingFocusRef.current = { path: p, region: null }\n setFocusRequest((value) => value + 1)\n }\n addTab(p, true)\n }\n const onShowLauncher = (event) => {\n const tab = event?.detail?.tab\n if (tab === 'pending' || tab === 'archive') setLauncherTab(tab)\n setLauncherOpen(true)\n }\n window.addEventListener('edrv:open-editor', onOpen)\n window.addEventListener('edrv:show-launcher', onShowLauncher)\n return () => {\n window.removeEventListener('edrv:open-editor', onOpen)\n window.removeEventListener('edrv:show-launcher', onShowLauncher)\n }\n }, [sessionId])\n\n // 对话输入区的唯一差异 dock 读取此会话快照;编辑器卸载时只清理自己的发布者令牌。\n const dockSourceRef = React.useRef({})\n React.useEffect(() => () => {\n clearDiffDock(sessionId, dockSourceRef.current)\n if (layout === 'side') setSidePending(sessionId, 0)\n }, [sessionId])\n\n // DSH composer 保持原生布局;编辑区只读取几何边界并同步自己的高度。\n // 侧栏形态:面板容器自带高度,跳过 composer 几何同步(面板内无会话滚动区)。\n React.useLayoutEffect(() => {\n if (layout === 'side') return\n const root = viewRootRef.current\n const scroll = root?.closest?.('[data-conversation-scroll]')\n if (!root || !scroll) return\n let seat = null\n let frame = null\n let resizeObserver = null\n const update = () => {\n frame = null\n const rootRect = root.getBoundingClientRect()\n const scrollRect = scroll.getBoundingClientRect()\n const seatRect = seat?.getBoundingClientRect?.()\n const height = editorHeight(rootRect.top, scrollRect.bottom, seatRect?.top)\n root.style.setProperty('--edrv-editor-height', height + 'px')\n }\n const scheduleUpdate = () => {\n if (frame !== null) return\n frame = requestAnimationFrame(update)\n }\n const attachSeat = () => {\n const next = scroll.querySelector?.('[data-composer-seat]')\n if (next === seat) {\n scheduleUpdate()\n return\n }\n resizeObserver?.disconnect()\n seat = next\n resizeObserver = null\n if (seat && typeof ResizeObserver === 'function') {\n resizeObserver = new ResizeObserver(scheduleUpdate)\n resizeObserver.observe(seat)\n }\n scheduleUpdate()\n }\n attachSeat()\n const mutationObserver = typeof MutationObserver === 'function'\n ? new MutationObserver(attachSeat)\n : null\n mutationObserver?.observe(scroll, { childList: true })\n const scrollObserver = typeof ResizeObserver === 'function' ? new ResizeObserver(scheduleUpdate) : null\n scrollObserver?.observe(scroll)\n window.addEventListener('resize', scheduleUpdate)\n scheduleUpdate()\n return () => {\n if (frame !== null) cancelAnimationFrame(frame)\n resizeObserver?.disconnect()\n scrollObserver?.disconnect()\n mutationObserver?.disconnect()\n window.removeEventListener('resize', scheduleUpdate)\n root.style.removeProperty('--edrv-editor-height')\n }\n }, [sessionId, layout])\n\n // localStorage v2 恢复页签\n React.useEffect(() => {\n if (bootRef.current || !sessionId) return\n bootRef.current = true\n viewStatesRef.current = viewStatesLoad(sessionId)\n try {\n const raw = localStorage.getItem('edrv.editor.v2.' + String(sessionId))\n if (raw) {\n const saved = JSON.parse(raw)\n if (Array.isArray(saved.tabs) && saved.tabs.length) {\n setTabs(saved.tabs.map((p) => ({ path: p })))\n if (typeof saved.active === 'string') setActive(saved.active)\n }\n }\n } catch (e) { /* 损坏忽略 */ }\n }, [sessionId])\n\n React.useEffect(() => {\n if (!sessionId) return\n try { localStorage.setItem('edrv.editor.v2.' + String(sessionId), JSON.stringify({ tabs: tabs.map((t) => t.path), active })) }\n catch (e) { /* 忽略 */ }\n }, [tabs, active, sessionId])\n\n // 侧边栏状态:恢复(显隐/宽度/激活面板);侧栏形态独立键(默认收起,不共享页签形态偏好)\n const sidebarKey = 'edrv.sidebar.' + (layout === 'side' ? 'side.' : '') + String(sessionId)\n React.useEffect(() => {\n if (!sessionId) return\n try {\n const raw = localStorage.getItem(sidebarKey)\n if (raw) {\n const saved = JSON.parse(raw)\n if (typeof saved.on === 'boolean') setSidebarOn(saved.on)\n if (typeof saved.width === 'number') setSidebarW(Math.max(180, Math.min(560, saved.width)))\n if (typeof saved.panel === 'string') setActivePanel(saved.panel)\n }\n } catch (e) { /* 损坏忽略 */ }\n }, [sessionId, sidebarKey])\n\n // 侧边栏状态持久化\n React.useEffect(() => {\n if (!sessionId) return\n try { localStorage.setItem(sidebarKey, JSON.stringify({ on: sidebarOn, width: sidebarW, panel: activePanel })) }\n catch (e) { /* 忽略 */ }\n }, [sidebarOn, sidebarW, activePanel, sessionId, sidebarKey])\n\n // 切换侧边栏(capture 抢占,避免与 DSH 全局冲突;键位随快捷键配置)\n React.useEffect(() => {\n const onKey = (e) => {\n if (!matchEvent(e, bindingOf('edrv.toggleSidebar'))) return\n e.preventDefault(); e.stopPropagation()\n setSidebarOn((v) => !v)\n }\n window.addEventListener('keydown', onKey, true)\n return () => window.removeEventListener('keydown', onKey, true)\n }, [])\n\n // 保存文件(窗口级):编辑器有活动模型才拦截执行,无文件时放行(浏览器默认行为)\n React.useEffect(() => {\n const onKey = (e) => {\n if (!matchEvent(e, bindingOf('edrv.save'))) return\n if (!editorRef.current?.getModel?.()) return\n e.preventDefault(); e.stopPropagation()\n flushSave()\n doSaveRef.current(false)\n }\n window.addEventListener('keydown', onKey, true)\n return () => window.removeEventListener('keydown', onKey, true)\n }, [])\n\n // Ctrl+Shift+F 全局搜索:展开侧边栏 + 激活搜索页签,随后聚焦搜索输入框\n React.useEffect(() => {\n const onKey = (e) => {\n if (!matchEvent(e, bindingOf('edrv.searchInFiles'))) return\n e.preventDefault(); e.stopPropagation()\n setSidebarOn(true)\n setActivePanel('search')\n setTimeout(() => window.dispatchEvent(new CustomEvent('edrv:search-focus')), 0)\n }\n window.addEventListener('keydown', onKey, true)\n return () => window.removeEventListener('keydown', onKey, true)\n }, [])\n\n // 文件 → 待处理差异数 映射(侧边栏角标)\n const pendingByPath = React.useMemo(() => {\n const out = {}\n for (const f of sum.files) if (f.pending > 0) out[f.path] = f.pending\n return out\n }, [sum])\n\n React.useEffect(() => {\n if (!active) return\n setContent(null)\n setContentPath(null)\n setLoadError(null)\n setLoadStage({ progress: 10, message: '准备读取文件…' })\n setStatus('加载中…')\n loadContent(active, sessionId)\n }, [active, sessionId])\n\n // Tab 右键菜单打开时 Esc 关闭\n React.useEffect(() => {\n if (!tabMenu) return\n const onKey = (e) => { if (e.key === 'Escape') dismissMenus() }\n window.addEventListener('keydown', onKey, true)\n return () => window.removeEventListener('keydown', onKey, true)\n }, [tabMenu])\n\n React.useEffect(() => {\n if (monaco || monacoErr) return\n let alive = true\n const onProgress = (stage) => {\n if (!alive) return\n const progress = stage.phase === 'ready' ? 70 : Math.round(10 + stage.progress * 0.6)\n setLoadStage((prev) => ({ progress: Math.max(prev.progress, progress), message: stage.message }))\n }\n loadMonaco(onProgress).then((m) => { if (alive) setMonaco(m) }).catch((e) => {\n if (alive) {\n setMonacoErr(String(e?.message ?? e))\n setStatus('Monaco 不可用')\n }\n })\n return () => { alive = false }\n }, [monaco, monacoErr])\n\n monacoRef.current = monaco\n\n const getModel = (path, text) => {\n const cache = modelsRef.current\n let model = cache.get(path)\n if (!model) {\n model = window.monaco.editor.createModel(text ?? '', langOf(path), window.monaco.Uri.parse('edrv:///' + encodeURI(path)))\n cache.set(path, model)\n } else if (text !== undefined && model.getValue() !== text) {\n programmaticRef.current = true\n model.setValue(text)\n programmaticRef.current = false\n }\n return model\n }\n\n const flushSave = () => {\n if (saveTimerRef.current) { saveTimerRef.current(); saveTimerRef.current = null }\n }\n\n const doSave = (silent) => {\n const ed = editorRef.current\n if (!active || !ed) return\n const text = ed.getValue()\n if (!silent) setStatus('保存中…')\n rpc('edrv.save', { sessionId, path: active, content: text }).then((res) => {\n if (res && res.ok) {\n setStatus('已保存 ' + new Date().toTimeString().slice(0, 8))\n setContent(text)\n setContentPath(active)\n setDirtyMap((d) => Object.assign({}, d, { [active]: false }))\n refreshRecords()\n emitRefresh()\n } else { setStatus('保存失败'); setError(res?.error ? String(res.error) : '保存失败') }\n }).catch((e) => { setStatus('保存失败'); setError('保存异常:' + String(e)) })\n }\n doSaveRef.current = doSave\n\n const onEdit = () => {\n const ed = editorRef.current\n if (!ed || !active) return\n setDirtyMap((d) => Object.assign({}, d, { [active]: true }))\n setStatus('编辑中…')\n if (saveTimerRef.current) saveTimerRef.current()\n saveTimerRef.current = schedule(() => doSave(true), 700)\n }\n\n // model 同步(当前内容)\n React.useEffect(() => {\n if (!monaco || !editorRef.current || !active || content === null) return\n const ed = editorRef.current\n const model = getModel(active, content)\n if (ed.getModel() !== model) ed.setModel(model)\n restoreViewState(active)\n setLoadStage((prev) => ({ progress: Math.max(96, prev.progress), message: '创建编辑器视图…' }))\n }, [monaco, active, content])\n\n // 行内差异自绘(decorations / view zones / minus overlay)→ diffRenderer\n React.useEffect(() => {\n if (!monaco || !editorRef.current || !active || content === null) return\n diffRendererRef.current.render(monaco, editorRef.current, pendingRegions, sessionId)\n setLoadStage({ progress: 100, message: '编辑器已就绪' })\n }, [monaco, active, content, pendingRegions])\n\n React.useEffect(() => () => {\n flushSave()\n saveViewState(active)\n diffRendererRef.current?.dispose?.()\n if (editorRef.current) { editorRef.current.dispose(); editorRef.current = null }\n for (const m of modelsRef.current.values()) m.dispose()\n modelsRef.current.clear()\n const root = editorRef.current && editorRef.current.getDomNode ? editorRef.current.getDomNode() : null\n if (root) {\n const ov = root.querySelector('.edrv-minus-overlay')\n if (ov) ov.remove()\n }\n }, [])\n\n // 普通 Monaco 编辑器(可编辑、单列行号)+ 自绘行内差异(decoration 绿底+ / view zone 删除块)\n const ensureEditor = React.useCallback((node) => {\n if (!node) {\n if (editorRef.current) { editorRef.current.dispose(); editorRef.current = null }\n return\n }\n if (editorRef.current || !monacoRef.current) return\n const m = monacoRef.current\n const side = layoutRef.current === 'side'\n const ed = m.editor.create(node, {\n value: '',\n language: 'plaintext',\n theme: 'vs',\n fontFamily: 'var(--ds-font-family-code, ui-monospace, monospace)',\n fontSize: 13,\n lineHeight: 20,\n minimap: { enabled: !side, scale: 1 },\n glyphMargin: true,\n lineDecorationsWidth: 16,\n automaticLayout: true,\n scrollBeyondLastLine: false,\n wordWrap: 'off',\n tabSize: 2,\n renderWhitespace: 'selection',\n smoothScrolling: true,\n cursorBlinking: 'smooth',\n padding: { top: side ? 6 : 8 },\n })\n // 保存改由窗口级快捷键监听执行(键位可配置;见上方 edrv.save 监听)\n ed.onDidChangeModelContent(() => {\n if (!ed.getModel() || programmaticRef.current) return\n onEdit()\n })\n ed.onDidChangeCursorPosition((e) => {\n setCursor('Ln ' + e.position.lineNumber + ', Col ' + e.position.column)\n })\n // 编辑区右键 → 注入 Monaco 原生 context menu(与 Go to Definition 等同菜单,避免分离浮层)。\n // 有选区时额外显示「选中内容」项:context key edrvSelection 由光标选区变化驱动。\n // 路径/选区在点击时从 model/editor 实时读取(不依赖闭包里的过期 active)。\n const menuHandlers = () => menuHandlersRef.current\n const pathOf = (edx) => {\n const model = edx?.getModel?.()\n const uriPath = model?.uri?.path\n return uriPath ? decodeURIComponent(String(uriPath).replace(/^\\//, '')) : null\n }\n const selectionOf = (edx) => {\n const s = edx?.getSelection?.()\n if (!s) return null\n if (s.startLineNumber === s.endLineNumber && s.startColumn === s.endColumn) return null\n return { startLine: s.startLineNumber, endLine: s.endLineNumber }\n }\n const selKey = ed.createContextKey('edrvSelection', false)\n ed.onDidChangeCursorSelection((e) => {\n const s = e?.selection\n selKey.set(!!(s && (s.startLineNumber !== s.endLineNumber || s.startColumn !== s.endColumn)))\n })\n ed.addAction({\n id: 'edrv.addFileRef', label: '添加文件到对话', contextMenuGroupId: '1_edrv',\n precondition: 'editorTextFocus',\n run: (edx) => menuHandlers()?.addRefToChat(pathOf(edx)),\n })\n ed.addAction({\n id: 'edrv.addSelectionRef', label: '添加选中内容为引用', contextMenuGroupId: '1_edrv',\n precondition: 'edrvSelection',\n run: (edx) => {\n const s = selectionOf(edx)\n const p = pathOf(edx)\n if (s && p) menuHandlers()?.addRefToChat(p, { startLine: s.startLine, endLine: s.endLine })\n },\n })\n // 在 OS 文件浏览器中打开/定位当前活动文件(与文件管理栏右键菜单同源能力)。\n ed.addAction({\n id: 'edrv.revealInExplorer', label: '在文件浏览器中打开', contextMenuGroupId: '1_edrv',\n precondition: 'editorTextFocus',\n run: (edx) => menuHandlers()?.openInExplorer(pathOf(edx)),\n })\n // hover 差异块 → 浮出 Keep/Undo(req:鼠标移到编辑区差异块时显示)\n // 防闪烁:① 区域不变不 setState(浮窗锚定差异块起始行,不跟随鼠标);② 延迟隐藏;\n // ③ 浮窗自身 onMouseEnter 取消隐藏计时(鼠标在浮窗与编辑器间移动不闪)。\n const hideSoon = () => {\n if (hoverEditorRef.current || hoverPanelRef.current || hideTimerRef.current) return\n hideTimerRef.current = setTimeout(() => {\n hideTimerRef.current = null\n if (hoverEditorRef.current || hoverPanelRef.current) return\n hoverKeyRef.current = null\n hoverTopRef.current = null\n setHoverAct(null)\n }, 180)\n }\n ed.onMouseMove((e) => {\n hoverEditorRef.current = true\n const line = e?.target?.position?.lineNumber\n const map = lineRegionMapRef.current\n if (!line || !map.size) { hoverEditorRef.current = false; hideSoon(); return }\n const hit = map.get(line)\n if (!hit) { hoverEditorRef.current = false; hideSoon(); return }\n const key = callIdAttr(hit.callId, hit.idx)\n const top = Math.max(0, ed.getTopForLineNumber(Math.max(1, hit.start)) - ed.getScrollTop())\n const layout = ed.getLayoutInfo()\n const minimapLeft = layout.minimap?.minimapLeft || 0\n const right = minimapLeft > 0 ? Math.max(12, layout.width - minimapLeft + 8) : Math.max(12, layout.verticalScrollbarWidth + 8)\n if (hoverKeyRef.current === key && hoverTopRef.current === top && hoverRightRef.current === right) return // 同区域同位置不重复更新\n hoverKeyRef.current = key\n hoverTopRef.current = top\n hoverRightRef.current = right\n if (hideTimerRef.current) { clearTimeout(hideTimerRef.current); hideTimerRef.current = null }\n setHoverAct({ region: hit, top, right })\n })\n editorRef.current = ed\n }, [])\n\n // 打开文件后的跳转(差异聚焦/搜索行列跳转,内容就绪后执行一次)\n React.useEffect(() => {\n const pf = pendingFocusRef.current\n if (!pf || pf.path !== active || content === null) return\n const ed = editorRef.current\n if (!ed) return\n if (pf.line != null) {\n // 搜索命中跳转:直接定位到行/列(不依赖差异区域)\n pendingFocusRef.current = null\n ed.revealLineInCenter(Math.max(1, pf.line))\n ed.setPosition({ lineNumber: Math.max(1, pf.line), column: Math.max(1, pf.column ?? 1) })\n ed.focus()\n return\n }\n const target = pf.region || pendingRegions[0]\n if (!target) return\n pendingFocusRef.current = null\n ed.revealLineInCenter(Math.max(1, target.start ?? 1))\n ed.setPosition({ lineNumber: Math.max(1, target.start ?? 1), column: 1 })\n ed.focus()\n }, [active, content, pendingRegions, focusRequest])\n\n const jumpTo = (region) => {\n if (editorRef.current) {\n editorRef.current.revealLineInCenter(Math.max(1, region?.start ?? 1))\n editorRef.current.setPosition({ lineNumber: Math.max(1, region?.start ?? 1), column: 1 })\n editorRef.current.focus()\n } else {\n pendingFocusRef.current = { path: active, region }\n }\n }\n\n // 索引校正:差异/文件被处理后 pending 列表变化,clamp 到有效范围\n React.useEffect(() => {\n if (diffIdx >= pendingRegions.length && pendingRegions.length > 0) setDiffIdx(pendingRegions.length - 1)\n else if (pendingRegions.length === 0) setDiffIdx(0)\n }, [pendingRegions.length])\n React.useEffect(() => {\n const i = sum.pendingFiles.findIndex((f) => f.path === active)\n if (i >= 0) { if (i !== fileIdx) setFileIdx(i) }\n }, [sum.pendingFiles, active])\n\n // 上下箭头:当前文件内差异切换(x/x)\n const gotoDiff = (delta) => {\n if (!pendingRegions.length) return\n const next = (diffIdx + delta + pendingRegions.length) % pendingRegions.length\n setDiffIdx(next)\n jumpTo(pendingRegions[next])\n }\n // 左右箭头:全局差异文件切换(x/x 文件),打开并跳转\n const gotoFile = (delta) => {\n if (!sum.pendingFiles.length) return\n const next = (fileIdx + delta + sum.pendingFiles.length) % sum.pendingFiles.length\n setFileIdx(next)\n openFile(sum.pendingFiles[next].path, true)\n }\n\n const openNextFile = () => {\n if (!sum.pendingFiles.length) return\n if (sum.pendingFiles.some((file) => file.path === active)) gotoFile(1)\n else openFile(sum.pendingFiles[0].path, true)\n }\n\n const reloadFile = (skipStale) => {\n if (!active) return\n loadContent(active, sessionId, true)\n refreshRecords(skipStale === true)\n }\n\n /**\n * 关闭当前差异浮窗并清理 hover 锚点。\n * @author ddj 2026年08月21号\n */\n const dismissHover = () => {\n hoverKeyRef.current = null\n hoverTopRef.current = null\n hoverRightRef.current = null\n hoverEditorRef.current = false\n hoverPanelRef.current = false\n if (hideTimerRef.current) { clearTimeout(hideTimerRef.current); hideTimerRef.current = null }\n setHoverAct(null)\n }\n\n /**\n * 对单个差异区域执行采纳/不采纳。\n * @author ddj 2026年08月20号\n * @param region 差异区域(callId/idx/create)\n * @param reject true=不采纳(回滚),false=采纳\n * @param silent 批量时抑制中间 reload/报错,由批量方统一收尾\n * @returns Promise<boolean> 是否成功\n */\n const actHunk = (region, reject, silent) => {\n const method = reject ? 'edrv.reject' : 'edrv.accept'\n return rpc(method, { sessionId, callId: region.callId, scope: region.create ? 'call' : 'hunk', hunkIndex: region.idx }).then((res) => {\n if (res && res.ok) {\n setRecords((prev) => Object.assign({}, prev, { [region.callId]: res.record }))\n if (!silent) { reloadFile(); emitRefresh() }\n return true\n }\n if (!silent) setError(res?.error ? String(res.error) : '操作失败')\n return false\n }).catch((e) => {\n if (!silent) setError('操作异常:' + String(e))\n return false\n })\n }\n\n /**\n * 批量采纳/不采纳:一次 RPC 处理多个差异(Keep 整文件 / Keep All / Undo All)。\n * 单次 setRecords 合并全部结果,避免逐条往返读写整个 sidecar。\n * @author ddj 2026年08月25号\n * @param items 决策项数组(callId/scope/hunkIndex/decision)\n * @returns Promise<{ok:number; fail:number}> 成功/失败计数\n */\n const actMany = (items) => {\n if (!items.length) return Promise.resolve({ ok: 0, fail: 0 })\n return rpc('edrv.decideBatch', { sessionId, items }).then((res) => {\n if (!res || !res.ok || !Array.isArray(res.results)) {\n setError(res?.error ? String(res.error) : '批量处理失败')\n return { ok: 0, fail: items.length }\n }\n let ok = 0\n let fail = 0\n const next = {}\n for (const item of res.results) {\n if (item && item.ok) {\n ok++\n if (item.record) next[item.callId] = item.record\n } else {\n fail++\n }\n }\n // 合并结果无变化(批量全部失败/重复点击)时不 setRecords:避免 records 换引用\n // → pendingRegions 换引用 → diff 全量重渲染(内容相同,纯空转)\n if (Object.keys(next).length) setRecords((prev) => Object.assign({}, prev, next))\n return { ok, fail }\n }).catch((e) => {\n setError('批量处理异常:' + String(e))\n return { ok: 0, fail: items.length }\n })\n }\n\n /**\n * 决策项构造(与单条 actHunk 的 scope 语义一致:create 记录走 call 作用域)。\n * @author ddj 2026年08月25号\n * @param r 差异区域/待处理项(callId/idx/create)\n * @param reject true=不采纳\n * @returns decideBatch items 元素\n */\n const itemOf = (r, reject) => ({ callId: r.callId, scope: r.create ? 'call' : 'hunk', hunkIndex: r.idx, decision: reject ? 'rejected' : 'accepted' })\n\n const acceptFile = () => {\n if (batchBusyRef.current || !pendingRegions.length) return\n batchBusyRef.current = true\n actMany(pendingRegions.map((r) => itemOf(r, false))).then(({ ok, fail }) => {\n batchBusyRef.current = false\n reloadFile(true)\n emitRefresh()\n setStatus('已采纳 ' + ok + ' 处差异' + (fail ? ',' + fail + ' 处失败' : ''))\n if (fail) setError(fail + ' 处差异处理失败(可能已被后续修改影响),可刷新后重试')\n }).catch(() => { batchBusyRef.current = false })\n }\n const undoFile = () => {\n if (batchBusyRef.current || !pendingRegions.length) return\n batchBusyRef.current = true\n actMany([...pendingRegions].reverse().map((r) => itemOf(r, true))).then(({ ok, fail }) => {\n batchBusyRef.current = false\n reloadFile(true)\n emitRefresh()\n setStatus('已不采纳 ' + ok + ' 处差异' + (fail ? ',' + fail + ' 处失败' : ''))\n if (fail) setError(fail + ' 处差异处理失败(可能已被后续修改影响),可刷新后重试')\n }).catch(() => { batchBusyRef.current = false })\n }\n\n // 所有差异文件的待处理 hunk 列表(二级菜单 Keep All / Undo All 用)\n const allPending = React.useMemo(() => {\n const out = []\n for (const rec of Object.values(records)) {\n if (rec.superseded === true) continue\n const perHunk = Array.isArray(rec.decisions?.perHunk) ? rec.decisions.perHunk : []\n const hunks = Array.isArray(rec.hunks) ? rec.hunks : []\n for (let i = 0; i < hunks.length; i++) {\n const st = perHunk.length ? perHunk[i] : rec.decisions.call\n if (st === 'pending' && !noopHunk(rec, hunks[i])) out.push({ callId: rec.callId, idx: i, create: rec.create === true, at: rec.at })\n }\n }\n return out\n }, [records])\n\n /**\n * 批量处理所有差异文件:采纳全部 / 不采纳全部。不采纳按 at 降序(新改先回滚)排序后一次 RPC。\n * @author ddj 2026年08月20号\n * @param reject true=全部不采纳(回滚),false=全部采纳\n */\n const actAllPending = (reject) => {\n if (batchBusyRef.current || !allPending.length) return\n batchBusyRef.current = true\n const list = reject ? [...allPending].sort((a, b) => (a.at < b.at ? 1 : a.at > b.at ? -1 : b.idx - a.idx)) : allPending\n actMany(list.map((r) => itemOf(r, reject))).then(({ ok, fail }) => {\n batchBusyRef.current = false\n reloadFile(true)\n emitRefresh()\n setStatus((reject ? '已不采纳 ' : '已采纳 ') + ok + ' 处差异' + (fail ? ',' + fail + ' 处失败' : ''))\n if (fail) setError(fail + ' 处差异处理失败(可能已被后续修改影响),可刷新后重试')\n }).catch(() => { batchBusyRef.current = false })\n }\n const acceptAllFiles = () => actAllPending(false)\n const undoAllFiles = () => actAllPending(true)\n const rollbackFile = () => {\n if (!active) return\n if (!window.confirm('回滚当前文件到修改前状态?(相关差异将归档)')) return\n rpc('edrv.rollback', { sessionId, path: active }).then((res) => {\n if (res && res.ok) {\n setStatus('已回滚'); reloadFile()\n emitRefresh()\n } else setError(res?.error ? String(res.error) : '回滚失败')\n }).catch((e) => setError('回滚异常:' + String(e)))\n }\n\n /**\n * 关闭 Tab 右键菜单。\n * @author ddj 2026年08月25号\n */\n const dismissMenus = () => {\n setTabMenu(null)\n }\n\n /** 把「添加到对话」返回状态映射为状态栏文案。\n * @author ddj 2026年08月25号 */\n const statusOfAdd = (outcome, okText) => {\n if (outcome === 'ok') return okText\n if (outcome === 'busy') return okText + '(输入框忙,已降级纯文本)'\n return '无法添加到对话(无会话或输入框不可用)'\n }\n\n /** 添加文件/选中区引用到对话(异步,状态栏反馈)。 */\n const addRefToChat = (path, range) => {\n if (!path) { setStatus('无活动文件'); return }\n if (!addToConversation) { setStatus('添加到对话不可用'); return }\n addToConversation.appendReference(sessionId, path, range).then((o) => setStatus(statusOfAdd(o, '已添加文件引用')))\n }\n\n /**\n * 在 OS 文件浏览器中打开/定位路径(Monaco 右键菜单用,状态栏反馈)。\n * @author ddj 2026年08月27号\n * @param path 工作区相对路径(可能为 null)\n */\n const openInExplorer = (path) => {\n if (!path) { setStatus('无活动文件'); return }\n if (!sessionId) { setStatus('无活动会话'); return }\n setStatus('正在打开文件浏览器…')\n revealPathInExplorer(sessionId, path).then((outcome) => {\n setStatus(outcome.ok ? '已在文件浏览器中打开' : '打开失败')\n if (!outcome.ok && outcome.error) setError(outcome.error)\n })\n }\n\n // 供 Monaco 原生右键菜单 addAction 读取的最新动作闭包(空依赖回调不随渲染重建)\n menuHandlersRef.current = { addRefToChat, openInExplorer }\n\n const openFile = (path, focusDiff) => {\n if (!path) return\n addTab(path, true)\n if (focusDiff) pendingFocusRef.current = { path, region: null }\n }\n\n /**\n * 打开文件并跳转到指定行列(搜索面板命中跳转)。\n * @author ddj 2026年08月26号\n * @param path 文件路径\n * @param line 目标行(缺省仅打开不跳转)\n * @param column 目标列(缺省 1)\n */\n const openFileAt = (path, line, column) => {\n if (!path) return\n addTab(path, true)\n pendingFocusRef.current = { path, region: null, line: line ?? null, column: column ?? 1 }\n setFocusRequest((value) => value + 1)\n }\n\n const openPath = () => {\n const p = (pathDraft || '').trim()\n if (!p) return\n setStatus('打开中…')\n rpc('edrv.read', { sessionId, path: p }).then((res) => {\n if (res && res.ok) {\n openFile(p, false)\n setOpenInput(false); setPathDraft(''); setStatus('已打开'); setError(null)\n } else { setStatus('打开失败'); setError(res?.error ? String(res.error) : '打开失败') }\n }).catch((e) => { setStatus('打开失败'); setError('打开异常:' + String(e)) })\n }\n\n const tabsEl = React.createElement('div', { className: 'edrv-tabs', style: { flex: '1 1 auto', minWidth: 0 } },\n tabs.map((t) => React.createElement('div', {\n key: t.path,\n className: 'edrv-tab' + (t.path === active ? ' edrv-tab-active' : ''),\n title: t.path,\n onClick: () => { if (t.path !== active) { flushSave(); saveViewState(active); setActive(t.path) } },\n onContextMenu: (e) => {\n e.preventDefault()\n e.stopPropagation()\n setTabMenu({ x: e.clientX, y: e.clientY, path: t.path })\n },\n },\n React.createElement('span', { style: { overflow: 'hidden', textOverflow: 'ellipsis', maxWidth: 180 } }, t.path.split(/[\\\\/]/).pop() || t.path),\n (dirtyMap[t.path] ? React.createElement('span', { className: 'edrv-tab-dot' }) : null),\n React.createElement('span', { className: 'edrv-tab-x', onClick: (e) => { e.stopPropagation(); closeTab(t.path) } }, '×'))),\n (openInput\n ? React.createElement('input', { className: 'edrv-path-input', autoFocus: true, placeholder: '输入工作区相对/绝对路径,回车打开', value: pathDraft, onChange: (e) => setPathDraft(e.target.value), onKeyDown: (e) => { if (e.key === 'Enter') openPath(); if (e.key === 'Escape') setOpenInput(false) } })\n : React.createElement('button', { className: 'edrv-tab-add', title: '打开文件(输入路径)', onClick: () => setOpenInput(true) }, '+')))\n\n const pathBar = React.createElement('div', { className: 'edrv-pathbar', title: active || '' },\n React.createElement('span', { className: 'edrv-pb-name' }, active ? String(active).split(/[\\\\/]/).pop() : '未打开文件'),\n React.createElement('span', { className: 'edrv-pb-full' }, active || '使用右上搜索框 (' + (chordOf('edrv.quickOpen') ?? 'Ctrl+P') + ') 打开文件'),\n (active && langOf(active) ? React.createElement('span', { className: 'edrv-pb-meta' }, langOf(active)) : null),\n (cursor ? React.createElement('span', { className: 'edrv-pb-meta' }, cursor) : null),\n (status ? React.createElement('span', { className: 'edrv-pb-meta edrv-pb-status' }, status) : null))\n\n const tabRow = React.createElement('div', { style: { display: 'flex', alignItems: 'center', background: 'var(--dsw-alias-bg-layer-1,transparent)', flexShrink: 0 } },\n tabsEl,\n (sum.totalFiles > 0\n ? React.createElement('button', { className: 'edrv-diffchip', title: '打开差异总览/归档', onClick: () => setLauncherOpen((o) => !o) }, '⚠ 差异 ' + sum.totalFiles + ' 文件')\n : null),\n React.createElement('button', { className: 'edrv-chip-btn' + (sidebarOn ? ' edrv-chip-on' : ''), title: '切换侧边栏 (' + (chordOf('edrv.toggleSidebar') ?? 'Ctrl+B') + ')', onClick: () => setSidebarOn((v) => !v) }, '☰'),\n React.createElement('button', { className: 'edrv-chip-btn', title: '刷新', onClick: reloadFile }, '⟳'),\n React.createElement(QuickOpen, { sessionId, onOpen: (p) => openFile(p, false) }))\n\n const otherFiles = sum.pendingFiles.filter((f) => f.path !== active)\n\n /**\n * 渲染编辑器/文件加载进度面板。\n * @author ddj 2026年08月22号\n * @param message 当前加载阶段\n * @param progress 阶段进度\n * @param retry 可选重试回调\n * @returns 加载面板 React 元素\n */\n const loadingBody = (message, progress, retry) => React.createElement('div', { className: 'edrv-empty edrv-loading', 'aria-live': 'polite' },\n React.createElement('div', { className: 'edrv-loading-title' }, message),\n React.createElement('div', {\n className: 'edrv-progress',\n role: 'progressbar',\n 'aria-label': '编辑器加载进度',\n 'aria-valuemin': 0,\n 'aria-valuemax': 100,\n 'aria-valuenow': progress,\n }, React.createElement('div', { className: 'edrv-progress-value', style: { width: Math.max(0, Math.min(100, progress)) + '%' } })),\n React.createElement('div', { className: 'edrv-loading-percent' }, Math.round(progress) + '%'),\n retry ? React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', onClick: retry }, '重试') : null)\n\n let body\n if (!monaco && !monacoErr) {\n body = loadingBody(loadStage.message, loadStage.progress)\n } else if (monacoErr) {\n body = React.createElement('div', { className: 'edrv-empty' },\n React.createElement('div', null, 'Monaco 编辑器加载失败:' + String(monacoErr)),\n React.createElement('div', { style: { fontSize: 11 } }, '请确认插件包 assets/vendor/monaco 完整(/edrv/vendor 路由可达)'),\n React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', onClick: () => { setMonacoErr(null); setLoadStage({ progress: 0, message: '准备重试 Monaco…' }) } }, '重试'))\n } else if (!active) {\n body = React.createElement('div', { className: 'edrv-empty' },\n React.createElement('div', null, '暂无打开的文件'),\n React.createElement('div', { style: { fontSize: 12 } }, '使用右上搜索框 (' + (chordOf('edrv.quickOpen') ?? 'Ctrl+P') + ') 打开工作区文件;agent 修改文件后顶部会出现差异角标'))\n } else if (content === null && loadError) {\n body = loadingBody('文件加载失败:' + loadError, 0, () => {\n setLoadError(null)\n setContent(null)\n setContentPath(null)\n setLoadStage({ progress: 10, message: '重新读取文件…' })\n loadContent(active, sessionId)\n })\n } else if (content === null) {\n body = loadingBody(loadStage.message || '读取文件内容…', loadStage.progress)\n } else {\n body = React.createElement('div', { className: 'edrv-monaco-host' },\n React.createElement('div', { ref: ensureEditor }))\n }\n\n const hoverEl = (hoverAct && !launcherOpen)\n ? React.createElement('div', {\n className: 'edrv-hoveract',\n style: { top: hoverAct.top, right: hoverAct.right ?? 12 },\n onMouseEnter: () => { hoverPanelRef.current = true; if (hideTimerRef.current) { clearTimeout(hideTimerRef.current); hideTimerRef.current = null } },\n onMouseMove: () => { hoverPanelRef.current = true; if (hideTimerRef.current) { clearTimeout(hideTimerRef.current); hideTimerRef.current = null } },\n onMouseLeave: () => {\n hoverPanelRef.current = false\n if (hoverEditorRef.current || hideTimerRef.current) return\n hideTimerRef.current = setTimeout(() => {\n hideTimerRef.current = null\n if (hoverEditorRef.current || hoverPanelRef.current) return\n hoverKeyRef.current = null\n hoverTopRef.current = null\n setHoverAct(null)\n }, 420)\n },\n },\n React.createElement('button', { className: 'edrv-pill edrv-pill-keep', onClick: () => { dismissHover(); actHunk(hoverAct.region, false) } }, '✓ Keep'),\n React.createElement('button', { className: 'edrv-pill edrv-pill-undo', onClick: () => { dismissHover(); actHunk(hoverAct.region, true) } }, '↩ Undo'))\n : null\n\n /** 组装差异 dock 快照(发布给 conversation.input.dock 的唯一 DiffBox 实例)。 */\n const buildDockSnapshot = () => ({\n mode: editorDockMode(active),\n pendingRegions,\n staleRegions,\n onAct: actHunk,\n onAcceptFile: acceptFile,\n onUndoFile: undoFile,\n onAcceptAllFiles: acceptAllFiles,\n onUndoAllFiles: undoAllFiles,\n allPendingCount: allPending.length,\n onRollback: rollbackFile,\n onJump: jumpTo,\n otherFiles,\n onOpenOther: (path) => openFile(path, true),\n onOpenLauncher: (tab) => { setLauncherTab(tab || 'pending'); setLauncherOpen(true) },\n onRefresh: reloadFile,\n activePath: active,\n diffIdx: contentReady ? diffIdx : 0,\n diffTotal: displayDiffTotal(contentReady, pendingRegions.length, sum.files.find((file) => file.path === active)?.pending ?? 0),\n fileIdx,\n fileTotal: sum.pendingFiles.length,\n onPrevDiff: () => gotoDiff(-1),\n onNextDiff: () => gotoDiff(1),\n onPrevFile: () => gotoFile(-1),\n onNextFile: () => gotoFile(1),\n onOpenNextFile: openNextFile,\n })\n\n React.useEffect(() => {\n if (!sessionId) return\n publishDiffDock(sessionId, buildDockSnapshot(), dockSourceRef.current)\n // 侧栏形态同步 Tab 角标计数(仅本形态写入;页签形态清零避免残留)\n if (layout === 'side') setSidePending(sessionId, sum.totalFiles)\n else setSidePending(sessionId, 0)\n })\n\n const overlay = launcherOpen\n ? React.createElement(React.Fragment, null,\n React.createElement('div', { style: { position: 'fixed', inset: 0, zIndex: 30 }, onClick: () => setLauncherOpen(false) }),\n React.createElement(DiffLauncher, { sessionId, sum, tab: launcherTab, onClose: () => setLauncherOpen(false), onOpenFile: (p) => { openFile(p, true); setLauncherOpen(false) } }))\n : null\n\n // Tab 右键菜单浮层:全屏遮罩(点击/右键关闭)+ 菜单(固定定位,clamp 防越界)。\n // 编辑区右键走 Monaco 原生 context menu(editor.addAction),不在此渲染浮层。\n /**\n * 计算右键菜单固定定位(clamp 防越出视口)。\n * @author ddj 2026年08月25号\n */\n const menuPos = (x, y) => ({\n left: Math.max(4, Math.min(x, (window.innerWidth || 800) - 224)),\n top: Math.max(4, Math.min(y, (window.innerHeight || 600) - 176)),\n })\n const menuBackdrop = tabMenu\n ? React.createElement('div', {\n style: { position: 'fixed', inset: 0, zIndex: 70 },\n onClick: dismissMenus,\n onContextMenu: (e) => { e.preventDefault(); dismissMenus() },\n })\n : null\n const tabMenuEl = tabMenu\n ? React.createElement('div', { className: 'edrv-ctxmenu', style: menuPos(tabMenu.x, tabMenu.y) },\n React.createElement('button', { className: 'edrv-ctxmenu-item', onClick: () => { addRefToChat(tabMenu.path); dismissMenus() } }, '添加文件到对话'),\n React.createElement('div', { className: 'edrv-ctxmenu-sep' }),\n React.createElement('button', { className: 'edrv-ctxmenu-item edrv-ctxmenu-danger', onClick: () => { closeTab(tabMenu.path); dismissMenus() } }, '关闭标签页'))\n : null\n\n const sidebarPanels = props.sidebarPanels\n const sidebarCtx = {\n sessionId,\n openFile: (p) => openFile(p, false),\n openFileAt,\n activePath: active,\n pendingByPath,\n sum: { totalFiles: sum.totalFiles, files: sum.files },\n refreshRecords: () => refreshRecords(),\n editor: () => editorRef.current,\n outlineSources: props.outlineSources,\n fileMenuItems: props.fileMenuItems,\n notify: (message) => setStatus(message),\n }\n\n // 主编辑列(侧边栏右侧):pathBar + tabRow + 编辑/差异区(底部整条留给 DSH 对话输入栏)\n const editorArea = React.createElement('div', { className: 'edrv-editor-area' },\n body,\n hoverEl,\n overlay)\n // 侧边栏引导条(仅旧页签形态且未装 betterSidebar 时显示;可复制安装命令、可关闭)\n const dismissHint = () => {\n setHintDismissed(true)\n try { localStorage.setItem('edrv.side-hint-dismissed', '1') } catch (e) { /* 忽略 */ }\n }\n const copyInstallCmd = () => {\n if (navigator.clipboard?.writeText) navigator.clipboard.writeText(SIDEBAR_INSTALL_CMD).catch(() => {})\n }\n const sideHintEl = (layout === 'tab' && sideHint && !hintDismissed)\n ? React.createElement('div', { className: 'edrv-side-hint' },\n React.createElement('span', { className: 'edrv-side-hint-text' }, '安装 dsh-better-sidebar 后可启用侧边栏编辑(对话+编辑同屏):'),\n React.createElement('code', { className: 'edrv-side-hint-cmd' }, SIDEBAR_INSTALL_CMD),\n React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', title: '复制安装命令', onClick: copyInstallCmd }, '复制命令'),\n React.createElement('button', { className: 'edrv-side-hint-close', title: '关闭提示', 'aria-label': '关闭提示', onClick: dismissHint }, '×'))\n : null\n const mainCol = React.createElement('div', { className: 'edrv-main-col', style: { flex: 1, minWidth: 0, minHeight: 0, display: 'flex', flexDirection: 'column', overflow: 'hidden' } },\n pathBar,\n tabRow,\n sideHintEl,\n editorArea)\n // 编辑器根节点按 composer 顶部边界动态限高,底部对话区域继续由 DSH 原生渲染。\n // 侧栏形态由面板容器给高(100%),不做 composer 几何同步。\n const editorRow = React.createElement('div', { className: 'edrv-editor-row' },\n (sidebarOn && sidebarPanels\n ? React.createElement(SidebarView, {\n registry: sidebarPanels,\n ctx: sidebarCtx,\n activePanel,\n onActive: setActivePanel,\n width: sidebarW,\n onWidth: setSidebarW,\n onHide: () => setSidebarOn(false),\n })\n : null),\n mainCol)\n\n const baseStyle = { minHeight: 0, display: 'flex', flexDirection: 'column', background: 'var(--dsw-alias-bg-base,transparent)', overflow: 'hidden' }\n const rootEl = layout === 'side'\n ? React.createElement('div', { ref: viewRootRef, 'data-edrv-view': '1', 'data-edrv-layout': 'side', className: 'edrv-view-side', style: Object.assign({}, baseStyle, { height: '100%' }) },\n editorRow,\n menuBackdrop,\n tabMenuEl)\n : React.createElement('div', { ref: viewRootRef, 'data-edrv-view': '1', style: Object.assign({}, baseStyle, { height: 'var(--edrv-editor-height, 100%)', maxHeight: 'var(--edrv-editor-height, 100%)' }) },\n editorRow,\n menuBackdrop,\n tabMenuEl)\n return rootEl\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — DiffBadge:header 差异角标(仅工作区有差异时显示)。\n * 迁移自原 src/client/index.ts 的 DiffBadge,语义不改。\n * 作者 ddj 2026-08-20\n */\nimport React from 'react'\nimport { rpc } from '../rpc.js'\nimport { openEditorView, emitShowLauncher } from '../events.js'\nimport { summarize } from '../state/records.js'\n\n/**\n * 会话 header 差异角标:5s 轮询 edrv.list,有差异时显示数字徽章,点击打开编辑区并拉起 DiffLauncher。\n */\nexport function DiffBadge(props) {\n const sessionId = props?.sessionId\n const [summary, setSummary] = React.useState(null)\n const seq = React.useRef(0)\n\n const load = React.useCallback(() => {\n if (!sessionId) return\n const s = ++seq.current\n rpc('edrv.list', { sessionId }).then((res) => {\n if (s !== seq.current || !res || !res.ok || !Array.isArray(res.records)) return\n setSummary(summarize(res.records))\n }).catch(() => {})\n }, [sessionId])\n\n React.useEffect(() => {\n load()\n const t = setInterval(load, 5000)\n const onRefresh = () => load()\n window.addEventListener('edrv:refresh', onRefresh)\n return () => { clearInterval(t); window.removeEventListener('edrv:refresh', onRefresh) }\n }, [load])\n\n const n = summary?.totalFiles ?? 0\n if (!n) return null\n\n const click = () => {\n // 侧栏形态:带首个待处理文件路径(内容打开自动展开面板);旧形态行为不变\n openEditorView(summary?.pendingFiles?.[0]?.path ?? null)\n setTimeout(() => { emitShowLauncher() }, 120)\n }\n\n return React.createElement('button', {\n onClick: click,\n title: n + ' 个文件有差异,点击在编辑区查看',\n style: { position: 'relative', display: 'inline-flex', alignItems: 'center', justifyContent: 'center', width: 30, height: 30, padding: 0, background: 'transparent', border: 'none', borderRadius: 6, cursor: 'pointer' },\n },\n React.createElement('img', { src: '/edrv/assets/compare-select.png', alt: '差异', style: { width: 22, height: 22, display: 'block' } }),\n React.createElement('span', { style: { position: 'absolute', top: 1, right: 0, minWidth: 15, height: 15, padding: '0 3px', borderRadius: 8, background: 'var(--dsw-alias-state-warn-primary,#d97706)', color: '#fff', fontSize: 10, lineHeight: '15px', textAlign: 'center', fontWeight: 700, boxSizing: 'border-box' } }, String(n)))\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — DiffBox:每个文件底部紧凑差异条(per-file hunk + ⋮ 二级菜单)。\n * 迁移自原 src/client/index.ts 的 DiffBox,语义不改。\n * 作者 ddj 2026-08-20\n */\nimport React from 'react'\nimport { callIdAttr } from '../state/records.js'\nimport { diffDockText } from '../diffDock.js'\nimport { badgeOf } from './shared.js'\n\n/**\n * 折叠控制使用任务栏同尺寸的 chevron 轮廓,避免依赖未声明的运行时图标包。\n * @author ddj 2026年08月25号\n * @param open 是否已展开\n * @returns 14×14 的装饰性 chevron SVG\n */\nfunction chevronOf(open) {\n const path = open ? 'M3.25 5.25 7 9l3.75-3.75' : 'M3.25 8.75 7 5l3.75 3.75'\n return React.createElement('svg', {\n width: 14,\n height: 14,\n viewBox: '0 0 14 14',\n fill: 'none',\n 'aria-hidden': true,\n focusable: false,\n }, React.createElement('path', {\n d: path,\n stroke: 'currentColor',\n strokeWidth: 1.2,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n }))\n}\n\n/**\n * 差异条:当前文件内 diff 导航(↑↓←→)、Keep/Undo、展开 hunk 列表、⋮ 二级菜单\n * (Keep All / Undo All / 差异总览 / 归档 / 回滚 / 刷新)+ 其他差异文件小节。\n */\nexport function DiffBox(props) {\n const {\n pendingRegions = [], staleRegions = [], onAct, onAcceptFile, onUndoFile, onAcceptAllFiles, onUndoAllFiles,\n allPendingCount = 0, onRollback, onJump, otherFiles = [], onOpenOther, onOpenLauncher, onRefresh, activePath,\n diffIdx = 0, diffTotal = 0, fileIdx = 0, fileTotal = 0, onPrevDiff, onNextDiff, onPrevFile, onNextFile,\n mode = 'editor', onOpenNextFile, dock = false,\n } = props\n const [expanded, setExpanded] = React.useState(false)\n const [detailsOpen, setDetailsOpen] = React.useState(false)\n const detailsId = React.useId()\n const canAct = pendingRegions.length > 0\n\n const base = String(activePath || '').split(/[\\\\/]/).pop() || ''\n\n if (mode === 'chat' || mode === 'editor-empty') {\n return React.createElement('div', { className: 'edrv-diffbar edrv-diffbar-dock', 'data-edrv-diffbox': '1', 'data-edrv-diff-mode': mode },\n React.createElement('div', { className: 'edrv-diffbar-row edrv-diffbar-dock-row' },\n React.createElement('button', {\n type: 'button',\n className: 'edrv-diffbar-dock-button',\n title: '切换到下一个差异文件',\n 'aria-label': diffDockText(fileTotal),\n onClick: onOpenNextFile,\n }, diffDockText(fileTotal))))\n }\n\n let bodyEl = null\n if (expanded) {\n const rows = pendingRegions.map((r) => {\n const key = callIdAttr(r.callId, r.idx)\n return React.createElement('div', { key, className: 'edrv-diffrow', 'data-edrv-hunk': key, title: '跳转到 L' + (r.start ?? '?'), onClick: () => onJump(r) },\n React.createElement('span', { className: 'edrv-diffrow-l' }, 'L' + (r.start ?? '?') + '-' + (r.end ?? '?')),\n (r.oldLines.length ? React.createElement('span', { className: 'edrv-diffrow-o' }, '-' + r.oldLines.length) : null),\n (r.newLines.length ? React.createElement('span', { className: 'edrv-diffrow-n' }, '+' + r.newLines.length) : null),\n (r.create ? React.createElement('span', { className: 'edrv-diffrow-tag' }, '新建') : null),\n React.createElement('span', { style: { flex: 1 } }))\n })\n const stale = staleRegions.map((r) => React.createElement('div', { key: 'stale' + callIdAttr(r.callId, r.idx), className: 'edrv-diffrow edrv-diffrow-stale', title: '差异无法定位(文件可能已被手动修改)' },\n React.createElement('span', { className: 'edrv-diffrow-l' }, 'L' + (r.start ?? '?') + ' 无法定位'),\n React.createElement('span', { className: 'edrv-diffrow-tag' }, '冲突/需刷新'),\n React.createElement('span', { className: 'edrv-diffrow-tag' }, badgeOf(r.status))))\n let othersEl = null\n if (otherFiles.length) {\n othersEl = React.createElement('div', { className: 'edrv-diffbox-others' },\n React.createElement('span', { className: 'edrv-diffrow-tag' }, '其他差异文件 (' + otherFiles.length + '):'),\n otherFiles.map((f) => React.createElement('button', { key: f.path, className: 'edrv-diffrow-file', title: f.path, onClick: () => onOpenOther(f.path) },\n String(f.path).split(/[\\\\/]/).pop() + ' (' + f.pending + ')')))\n }\n bodyEl = React.createElement('div', { className: 'edrv-diffbar-body' }, ...rows, ...stale, othersEl)\n }\n\n const details = detailsOpen\n ? React.createElement('div', { className: 'edrv-diff-details', id: detailsId },\n React.createElement('button', { className: 'edrv-diffmenu-item', disabled: !allPendingCount, onClick: onAcceptAllFiles }, '✓ Keep All(全部文件采纳)'),\n React.createElement('button', { className: 'edrv-diffmenu-item danger', disabled: !allPendingCount, onClick: onUndoAllFiles }, '↩ Undo All(全部文件不采纳)'),\n React.createElement('div', { className: 'edrv-diffmenu-sep' }),\n React.createElement('button', { className: 'edrv-diffmenu-item', onClick: () => onOpenLauncher('pending') }, '🗂 差异总览'),\n React.createElement('button', { className: 'edrv-diffmenu-item', onClick: () => onOpenLauncher('archive') }, '📁 归档'),\n React.createElement('div', { className: 'edrv-diffmenu-sep' }),\n React.createElement('button', { className: 'edrv-diffmenu-item', disabled: !canAct, onClick: onRollback }, '⟲ 回滚文件'),\n React.createElement('button', { className: 'edrv-diffmenu-item', onClick: onRefresh }, '⟳ 刷新'))\n : null\n\n return React.createElement('div', { className: 'edrv-diffbar edrv-diffbar-dock', 'data-edrv-diffbox': '1', 'data-edrv-diff-mode': 'editor' },\n React.createElement('div', { className: 'edrv-diffbar-row edrv-diffbar-editor-row' },\n React.createElement('div', { className: 'edrv-diffbar-editor-content' },\n React.createElement('div', { className: 'edrv-diffbar-nav' },\n React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', title: '上一个差异', disabled: !canAct, onClick: onPrevDiff }, '↑'),\n React.createElement('span', { className: 'edrv-diffbar-count edrv-diffbar-progress', title: '当前文件内差异位置(点击展开/收起差异列表)', onClick: () => setExpanded((v) => !v) }, diffTotal ? (diffIdx + 1) + '/' + diffTotal : '0/0'),\n React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', title: '下一个差异', disabled: !canAct, onClick: onNextDiff }, '↓')),\n React.createElement('div', { className: 'edrv-diffbar-files' },\n React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', title: '上一个差异文件', disabled: !fileTotal, onClick: onPrevFile }, '←'),\n React.createElement('span', { className: 'edrv-diffbar-count edrv-count-file edrv-diffbar-progress', title: '差异文件位置' }, fileTotal ? (fileIdx + 1) + '/' + fileTotal + ' 文件' : '0/0 文件'),\n React.createElement('button', { className: 'edrv-pill edrv-pill-ghost', title: '下一个差异文件', disabled: !fileTotal, onClick: onNextFile }, '→'),\n React.createElement('span', { className: 'edrv-diffbar-file edrv-diffbar-summary', title: activePath || '' }, base)),\n\n React.createElement('div', { className: 'edrv-diffbar-actions' },\n React.createElement('button', { className: 'edrv-pill edrv-pill-keep', title: '采纳当前文件的全部差异', disabled: !canAct, onClick: onAcceptFile }, '✓ Keep'),\n React.createElement('button', { className: 'edrv-pill edrv-pill-undo', title: '不采纳当前文件的全部差异(回滚)', disabled: !canAct, onClick: onUndoFile }, '↩ Undo'),\n React.createElement('button', {\n className: 'edrv-pill edrv-pill-ghost edrv-diff-details-toggle',\n title: detailsOpen ? '收起差异操作' : '展开差异操作',\n 'aria-label': detailsOpen ? '收起差异操作' : '展开差异操作',\n 'aria-expanded': detailsOpen,\n 'aria-controls': detailsId,\n onClick: () => setDetailsOpen((value) => !value),\n }, chevronOf(detailsOpen))))),\n bodyEl,\n details)\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — 会话级差异 dock。\n * conversation.input.dock 是唯一实例:普通对话显示摘要,文件编辑页显示完整操作条。\n * 作者 ddj 2026-08-26\n */\nimport React from 'react'\nimport { rpc } from '../rpc.js'\nimport { openDiffView } from '../events.js'\nimport { summarize } from '../state/records.js'\nimport { nextDiffPath } from '../diffDock.js'\nimport { readDiffDock, subscribeDiffDock } from '../diffDockStore.js'\nimport { DiffBox } from './DiffBox.js'\n\nconst nextIndexBySession = new Map()\n\n/**\n * 对话输入框上方的唯一差异 dock。\n * @author ddj 2026年08月26号\n * @param props DSH 注入的会话属性\n * @returns 差异 dock React 元素或 null\n */\nexport function ConversationDiffDock(props) {\n const sessionId = props?.sessionId\n const [summary, setSummary] = React.useState(null)\n const [, setStoreRevision] = React.useState(0)\n const seq = React.useRef(0)\n\n const load = React.useCallback(() => {\n if (!sessionId) return\n const current = ++seq.current\n rpc('edrv.list', { sessionId }).then((res) => {\n if (current !== seq.current || !res || !res.ok || !Array.isArray(res.records)) return\n setSummary(summarize(res.records))\n }).catch(() => {})\n }, [sessionId])\n\n React.useEffect(() => {\n load()\n const timer = setInterval(load, 5000)\n const onRefresh = () => load()\n window.addEventListener('edrv:refresh', onRefresh)\n return () => {\n clearInterval(timer)\n window.removeEventListener('edrv:refresh', onRefresh)\n }\n }, [load])\n\n React.useEffect(() => {\n if (!sessionId) return undefined\n const sync = () => setStoreRevision((value) => value + 1)\n sync()\n return subscribeDiffDock(sessionId, sync)\n }, [sessionId])\n\n const renderDock = (content, key) => React.createElement('div', {\n key,\n className: 'edrv-diff-dock-shell',\n 'data-edrv-diff-dock-shell': '1',\n }, content)\n\n const editorSnapshot = readDiffDock(sessionId)\n if (editorSnapshot) {\n if (editorSnapshot.mode === 'editor-empty' && !editorSnapshot.fileTotal) return null\n return renderDock(React.createElement(DiffBox, Object.assign({}, editorSnapshot, { dock: true })), sessionId)\n }\n\n if (!sessionId || !summary?.pendingFiles?.length) return null\n\n const paths = summary.pendingFiles.map((file) => file.path)\n const click = () => {\n const current = nextIndexBySession.get(sessionId) ?? 0\n const next = nextDiffPath(paths, current)\n nextIndexBySession.set(sessionId, next.index)\n if (next.path) openDiffView(next.path)\n }\n\n return renderDock(React.createElement(DiffBox, {\n mode: 'chat',\n dock: true,\n fileTotal: paths.length,\n onOpenNextFile: click,\n }), sessionId || 'chat')\n}\n","/**\n * dsh-vscode-mode client — 兼容层:设置桥选择 / slot 安全注册 / openPath 链式补丁 / 外部插件常量。\n * 纯逻辑与薄 ctx 胶水,node 环境可单测(不依赖 DOM)。\n * 作者 ddj 2026年08月24号\n */\n\n/** 本插件包名(与 host compat.PLUGIN_NAME 对应)。 */\nexport const PLUGIN_NAME = 'dsh-vscode-mode'\n/** 外部侧栏插件名(dsh-web-ui-all 家族的文件打开能力提供方)。 */\nexport const SIDEBAR_PLUGIN = 'dsh-better-sidebar'\n\n/** 设置 scope 的跨组件上下文形状(与官方 settingsScope 绑定的最小面)。 */\nexport interface SettingsScopeLike {\n getSnapshot: () => { status?: string; value?: { fileOpenTool?: unknown; keybindings?: Record<string, string> }; writable?: boolean }\n subscribe: (listener: () => void) => () => void\n set: (field: string, value: unknown) => Promise<void>\n}\n\n/**\n * 设置桥三级优先:webUiSettings(linxin666 兼容桥)→ settingsScope(官方)→ 无。\n * 桥绑定抛错时降级到下一级,不让单个桥异常拖垮设置装配。\n * @author ddj 2026年08月24号\n * @param ctx 客户端服务上下文\n * @returns 激活的桥名称与绑定 scope\n */\nexport function pickSettingsBinder(ctx: { get: (name: string) => unknown }): { service: string; scope: SettingsScopeLike | undefined } {\n for (const service of ['webUiSettings', 'settingsScope']) {\n try {\n const binder = ctx.get(service) as { bind?: (spec: { namespace: string }) => SettingsScopeLike } | undefined\n const scope = binder?.bind?.({ namespace: PLUGIN_NAME })\n if (scope) return { service, scope }\n } catch {\n /* 桥异常时降级到下一级 */\n }\n }\n return { service: 'none', scope: undefined }\n}\n\n/** slot 注册描述(对齐 ctx.slots.register 的形状)。 */\nexport interface SlotSpec {\n name: string\n id: string\n order?: number\n label?: string\n inject?: (sessionId: string) => object\n}\n\n/**\n * 跨版本 slot 安全注册:封装 ctx.slots.inject 等待声明模式(新老 DSH 通用),\n * 服务缺失或注册抛错时降级为警告,不让单条 slot 拖垮装配。\n * 注意:方法必须挂在服务对象上调用(slots.register 是依赖 this.records 的类方法,\n * 解构后 this 丢失会静默失败),故禁止解构。\n * @author ddj 2026年08月24号\n * @param ctx 客户端上下文(slots 服务)\n * @param spec slot 描述\n * @param render 渲染函数\n * @returns 注销函数(未注册返回 null;形态切换时用于卸载旧 slot)\n */\nexport function registerSlotSafely(ctx: { slots?: { inject?: (name: string, register: () => unknown) => unknown; register?: (...args: unknown[]) => unknown } }, spec: SlotSpec, render: (props: unknown) => unknown): (() => void) | null {\n const slots = ctx?.slots as { inject: (name: string, register: () => unknown) => unknown; register: (...args: unknown[]) => unknown } | undefined\n if (!slots || typeof slots.inject !== 'function' || typeof slots.register !== 'function') {\n console.warn('[' + PLUGIN_NAME + '] slots 服务不可用,跳过 slot ' + spec.name)\n return null\n }\n try {\n const disposer = slots.inject(spec.name, () => slots.register(spec, render))\n return typeof disposer === 'function' ? disposer as () => void : null\n } catch (error) {\n console.warn('[' + PLUGIN_NAME + '] slot ' + spec.name + ' 注册失败(' + String(error) + '),已跳过')\n return null\n }\n}\n\n/**\n * 链式补丁对象方法:保存原实现、装入包装实现,dispose 恢复。\n * 恢复带归属校验(仅当当前实现仍是本包装时还原),多插件补丁按栈序互不踩踏。\n * @author ddj 2026年08月24号\n * @param owner 目标对象\n * @param key 方法名\n * @param wrapper 包装实现(original 为补丁前的实现)\n * @returns 恢复函数(幂等)\n */\nexport function patchMethod<T extends object, K extends keyof T>(\n owner: T,\n key: K,\n wrapper: (original: T[K], ...args: never[]) => unknown,\n): () => void {\n const original = owner[key]\n const patched = ((...args: never[]) => wrapper(original, ...args)) as T[K]\n owner[key] = patched\n return () => {\n if (owner[key] === patched) owner[key] = original\n }\n}\n","/**\n * dsh-vscode-mode client — 文件打开器注册表与自动选择。\n * @author ddj 2026年08月24号\n */\nimport { SIDEBAR_PLUGIN } from './compat.js'\n\nexport const AUTO_OPEN_TOOL = 'auto'\nexport const SYSTEM_OPEN_TOOL = 'system'\nexport const VSCODE_OPEN_TOOL = 'dsh-vscode-mode'\nexport const SIDEBAR_OPEN_TOOL = SIDEBAR_PLUGIN\n\nexport interface FileOpenContext {\n sessionId?: string\n cwd?: string\n}\n\nexport interface FileOpener {\n id: string\n label: string\n description?: string\n priority?: number\n isAvailable?: () => boolean\n open: (path: string, context: FileOpenContext) => void | Promise<void>\n}\n\nexport interface FileOpenerRegistry {\n register(opener: FileOpener): () => void\n registerFileOpener(opener: FileOpener): () => void\n list(): readonly FileOpener[]\n subscribe(listener: () => void): () => void\n get(id: string): FileOpener | undefined\n}\n\n/**\n * 写入外部打开器并触发注册表通知。\n * @author ddj 2026年08月24号\n * @param entries 打开器存储\n * @param notify 变更通知\n * @param opener 打开器\n */\nfunction registryRegister(entries: Map<string, FileOpener>, notify: () => void, opener: FileOpener): void {\n if (!opener.id || typeof opener.open !== 'function') throw new TypeError('文件打开器必须提供 id 和 open')\n entries.set(opener.id, opener)\n notify()\n}\n\n/**\n * 创建生命周期独立的文件打开器注册表。\n * @author ddj 2026年08月24号\n * @returns 文件打开器注册表\n */\nexport function createFileOpenerRegistry(): FileOpenerRegistry {\n const entries = new Map<string, FileOpener>()\n const listeners = new Set<() => void>()\n const notify = (): void => {\n for (const listener of listeners) listener()\n }\n const list = (): readonly FileOpener[] => [...entries.values()].sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0))\n return {\n register(opener: FileOpener): () => void {\n registryRegister(entries, notify, opener)\n return () => {\n if (entries.get(opener.id) !== opener) return\n entries.delete(opener.id)\n notify()\n }\n },\n registerFileOpener(opener: FileOpener): () => void {\n registryRegister(entries, notify, opener)\n return () => {\n if (entries.get(opener.id) !== opener) return\n entries.delete(opener.id)\n notify()\n }\n },\n list,\n subscribe(listener: () => void): () => void {\n listeners.add(listener)\n return () => listeners.delete(listener)\n },\n get: (id: string) => entries.get(id),\n }\n}\n\n/**\n * 检查打开器当前是否可用。\n * @author ddj 2026年08月24号\n * @param opener 待检查打开器\n * @returns 是否可用\n */\nexport function isAvailable(opener: FileOpener): boolean {\n try {\n return opener.isAvailable ? opener.isAvailable() : true\n } catch {\n return false\n }\n}\n\n/**\n * 返回当前可展示的文件打开器。\n * @author ddj 2026年08月24号\n * @param registry 文件打开器注册表\n * @returns 可用打开器列表\n */\nexport function availableOpeners(registry: FileOpenerRegistry): FileOpener[] {\n return registry.list().filter(isAvailable)\n}\n\n/**\n * 按设置选择打开器,不可用时回退自动优先级。\n * @author ddj 2026年08月24号\n * @param registry 文件打开器注册表\n * @param selected 用户选择的打开器 id\n * @returns 选中的打开器\n */\nexport function selectOpener(\n registry: FileOpenerRegistry,\n selected: string,\n): FileOpener | undefined {\n if (selected !== AUTO_OPEN_TOOL) {\n const requested = registry.get(selected)\n if (requested && isAvailable(requested)) return requested\n }\n return availableOpeners(registry)[0]\n}\n\n/**\n * 结构化探测 dsh-better-sidebar 的文件打开能力。\n * @author ddj 2026年08月24号\n * @param ctx 客户端服务上下文\n * @returns 侧边栏打开器或 undefined\n */\nexport function scanSidebar(ctx: { get: (name: string) => unknown }): FileOpener | undefined {\n try {\n const service = ctx.get('betterSidebar') as {\n openFile?: (scope: { sessionId: string; cwd?: string }, path: string, title?: string) => void\n isTabEnabled?: (id: string) => boolean\n features?: readonly string[]\n getSnapshot?: () => { state?: unknown }\n } | undefined\n if (!service || typeof service.openFile !== 'function') return undefined\n const advertised = service.features?.includes('openFile') ?? true\n if (!advertised) return undefined\n const canOpen = typeof service.isTabEnabled !== 'function' || service.isTabEnabled('editor')\n if (!canOpen) return undefined\n return {\n id: SIDEBAR_OPEN_TOOL,\n label: 'dsh-better-sidebar',\n description: '在 dsh-web-ui-all 侧边栏编辑器中打开',\n priority: 80,\n isAvailable: () => typeof service.openFile === 'function'\n && (service.features?.includes('openFile') ?? true)\n && (typeof service.isTabEnabled !== 'function' || service.isTabEnabled('editor')),\n open: (path, context) => {\n if (!context.sessionId) throw new Error('当前没有活动会话')\n service.openFile!({ sessionId: context.sessionId, cwd: context.cwd }, path, baseName(path))\n },\n }\n } catch {\n return undefined\n }\n}\n\n/**\n * 从路径提取文件名。\n * @author ddj 2026年08月24号\n * @param path 文件路径\n * @returns 文件名\n */\nexport function baseName(path: string): string {\n const normalized = path.replace(/\\\\/g, '/')\n return normalized.slice(normalized.lastIndexOf('/') + 1) || path\n}\n","/**\n * dsh-vscode-mode client — 设置 scope 的跨组件上下文。\n * 绑定逻辑(webUiSettings 兼容桥 → 官方 settingsScope 降级)统一由 compat 层提供。\n * 作者 ddj 2026年08月24号\n */\nimport React from 'react'\nimport { pickSettingsBinder, type SettingsScopeLike } from './compat.js'\n\nexport type { SettingsScopeLike }\n\nexport const SettingsContext = React.createContext<SettingsScopeLike | undefined>(undefined)\n\n/**\n * 从 Cordis 服务绑定 VSCodeMode 设置 scope(兼容桥优先,官方次之)。\n * @author ddj 2026年08月24号\n * @param ctx 客户端服务上下文\n * @returns 设置 scope 或 undefined\n */\nexport function getSettingsScope(ctx: { get: (name: string) => unknown }): SettingsScopeLike | undefined {\n return pickSettingsBinder(ctx).scope\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — VSCodeMode 设置区「快捷键」管理页。\n * 命令目录来自 client/keybindings 的 COMMANDS;当前键位读 SettingsContext scope;\n * 编辑:行内录制(捕获下一次组合键),Esc 取消、Backspace/Delete 清空(未绑定);\n * 草稿 + 显式保存(scope.set('keybindings', draft));行级恢复 + 页级「恢复默认」;\n * 冲突键位(两命令同键位)标红警告;scope 外部变更且无未保存修改时回同步草稿。\n * 作者 ddj 2026-08-26\n */\nimport React from 'react'\nimport { SettingsContext } from '../settingsContext.js'\nimport { COMMANDS, chordFromEvent, parseChord } from '../keybindings.js'\nimport { defaultKeybindings, KEYBINDING_DEFAULTS, normalizeKeybindings } from '../../shared/keybindings.js'\n\n/**\n * 草稿化:默认值 + 设置值合并,空串归一为 null(未绑定)。\n * @param raw 设置 scope 的 keybindings 字段\n * @returns 草稿映射(id → 键位弦或 null)\n */\nexport function draftOf(raw) {\n const merged = { ...defaultKeybindings(), ...normalizeKeybindings(raw) }\n const out = {}\n for (const [id, chord] of Object.entries(merged)) out[id] = chord === '' ? null : chord\n return out\n}\n\n/**\n * 存库化:null(未绑定)转空串。\n * @param draft 草稿映射\n * @returns 可存储的键位映射\n */\nexport function storeOf(draft) {\n const out = {}\n for (const [id, chord] of Object.entries(draft)) out[id] = chord === null ? '' : chord\n return out\n}\n\n/**\n * 冲突检测:同一键位被多个命令占用 → 返回冲突命令 id 集合。\n * @param draft 草稿映射\n * @returns 冲突命令 id 集合\n */\nexport function conflictsOf(draft) {\n const byChord = new Map()\n for (const [id, chord] of Object.entries(draft)) {\n if (!chord) continue\n const list = byChord.get(chord) ?? []\n list.push(id)\n byChord.set(chord, list)\n }\n const out = new Set()\n for (const list of byChord.values()) {\n if (list.length > 1) for (const id of list) out.add(id)\n }\n return out\n}\n\n/**\n * 快捷键管理页主体。\n */\nexport function KeybindingsPanel() {\n const settings = React.useContext(SettingsContext)\n const snapshot = settings?.getSnapshot?.()\n const unavailable = !settings || snapshot?.status === 'unavailable'\n const notReady = snapshot?.status !== 'ready'\n const [draft, setDraft] = React.useState(() => draftOf(snapshot?.value?.keybindings))\n const [recording, setRecording] = React.useState(null) // 正在录制的命令 id\n const [dirty, setDirty] = React.useState(false)\n const [busy, setBusy] = React.useState(false)\n const [error, setError] = React.useState('')\n const [message, setMessage] = React.useState('')\n const dirtyRef = React.useRef(false)\n dirtyRef.current = dirty\n const lastKeyRef = React.useRef(JSON.stringify(draft)) // 草稿内容指纹(内容未变不 setState,防外部快照引用不稳导致循环)\n const snapshotValue = snapshot?.value?.keybindings\n\n // scope 外部变更(如重置/其他端写入)且无未保存修改时回同步草稿\n React.useEffect(() => {\n if (dirtyRef.current) return\n const next = draftOf(snapshotValue)\n const key = JSON.stringify(next)\n if (key === lastKeyRef.current) return\n lastKeyRef.current = key\n setDraft(next)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [snapshotValue])\n\n // 录制态:窗口捕获下一次组合键(preventDefault 防浏览器默认动作)\n React.useEffect(() => {\n if (!recording) return\n const onKey = (e) => {\n e.preventDefault()\n e.stopPropagation()\n if (e.key === 'Escape') { setRecording(null); return }\n if (e.key === 'Backspace' || e.key === 'Delete') {\n setDraft((prev) => Object.assign({}, prev, { [recording]: null }))\n setRecording(null)\n setDirty(true)\n return\n }\n const chord = chordFromEvent(e)\n if (!chord) return\n setDraft((prev) => Object.assign({}, prev, { [recording]: chord }))\n setRecording(null)\n setDirty(true)\n }\n window.addEventListener('keydown', onKey, true)\n return () => window.removeEventListener('keydown', onKey, true)\n }, [recording])\n\n const conflicts = conflictsOf(draft)\n const save = () => {\n if (!settings?.set) { setError('设置服务不可用'); return }\n setBusy(true)\n setError('')\n setMessage('')\n settings.set('keybindings', storeOf(draft)).then(() => {\n setDirty(false)\n lastKeyRef.current = JSON.stringify(draft)\n setMessage('已保存')\n }).catch((e) => setError(String(e))).finally(() => setBusy(false))\n }\n\n /**\n * 恢复全部默认(确认后直接保存,一步到位)。\n */\n const resetAll = () => {\n if (!settings?.set) { setError('设置服务不可用'); return }\n if (!window.confirm('恢复全部快捷键为默认值?')) return\n setBusy(true)\n setError('')\n setMessage('')\n settings.set('keybindings', { ...defaultKeybindings() }).then(() => {\n const next = draftOf({})\n setDraft(next)\n lastKeyRef.current = JSON.stringify(next)\n setDirty(false)\n setMessage('已恢复默认')\n }).catch((e) => setError(String(e))).finally(() => setBusy(false))\n }\n\n /** 行级恢复该项默认值(进草稿,随保存提交)。 */\n const resetRow = (id) => {\n setDraft((prev) => Object.assign({}, prev, { [id]: KEYBINDING_DEFAULTS[id] ?? null }))\n setDirty(true)\n }\n\n const rows = COMMANDS.map((command) => {\n const chord = draft[command.id] ?? null\n const conflict = chord !== null && conflicts.has(command.id)\n const invalid = chord !== null && parseChord(chord) === null\n const recordingRow = recording === command.id\n let display\n if (recordingRow) {\n display = React.createElement('span', { className: 'vsm-kb-rec' }, '按下组合键…(Esc 取消 / Backspace 清除)')\n } else {\n display = React.createElement('kbd', { className: 'vsm-kb-key' + (conflict ? ' warn' : '') + (invalid ? ' invalid' : '') },\n chord ?? '未绑定')\n }\n return React.createElement('div', { key: command.id, className: 'vsm-kb-row' + (recordingRow ? ' rec' : '') },\n React.createElement('div', { className: 'vsm-kb-label' },\n React.createElement('span', null, command.label),\n conflict && React.createElement('small', { className: 'vsm-kb-warn' }, '与另一命令冲突'),\n invalid && React.createElement('small', { className: 'vsm-kb-warn' }, '键位格式无效')),\n display,\n React.createElement('div', { className: 'vsm-kb-actions' },\n recordingRow\n ? React.createElement('button', { onClick: () => setRecording(null) }, '取消')\n : React.createElement(React.Fragment, null,\n React.createElement('button', { disabled: unavailable || notReady || busy || snapshot?.writable === false, onClick: () => { setRecording(command.id); setMessage('') } }, '编辑'),\n React.createElement('button', { disabled: busy, onClick: () => resetRow(command.id) }, '恢复')),\n ))\n })\n\n return React.createElement('section', { className: 'vsm-general-page' },\n React.createElement('h2', null, '快捷键'),\n React.createElement('p', null, '配置编辑器视图的快捷键(保存 / 快速打开 / 侧边栏 / 搜索)。修改即时写入配置,重新聚焦编辑器后生效。'),\n unavailable && React.createElement('div', { className: 'vsm-mcp-error vsm-mcp-banner' }, '设置服务暂不可用,当前使用默认键位。'),\n error && React.createElement('div', { className: 'vsm-mcp-error vsm-mcp-banner' }, error),\n message && React.createElement('div', { className: 'vsm-kb-message' }, message),\n React.createElement('div', { className: 'vsm-kb-list' }, rows),\n React.createElement('div', { className: 'vsm-kb-actionsbar' },\n React.createElement('span', { className: 'vsm-kb-dirty' }, dirty ? '有未保存的修改' : ''),\n React.createElement('button', { className: 'vsm-primary vsm-small', disabled: unavailable || notReady || busy || snapshot?.writable === false || !dirty, onClick: save }, busy ? '保存中…' : '保存'),\n React.createElement('button', { className: 'vsm-small', disabled: unavailable || notReady || busy || snapshot?.writable === false, onClick: resetAll }, '恢复默认')),\n )\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — VSCodeMode 设置区:通用 / 快捷键 / MCP 管理。\n * 子 Tab:通用(文件打开工具/开发形态)/ 快捷键(编辑器键位配置,可重置)/\n * 我的 MCP(profile 全局)/ 项目 MCP(各项目 .mcp.json)/ MCP 市场(占位)/ 兼容性。\n * 作者 ddj 2026年08月22号 / 2026年08月26号\n */\nimport React from 'react'\nimport { rpc } from '../rpc.js'\nimport type { MpcProject, MpcServer } from '../../shared/mcp.js'\nimport '../styles/mcp.css'\nimport { availableOpeners, AUTO_OPEN_TOOL } from '../fileOpeners.js'\nimport { SettingsContext } from '../settingsContext.js'\nimport { KeybindingsPanel } from './KeybindingsPanel.js'\n\nconst EMPTY = { serverName: '', transport: 'stdio', command: '', args: '', cwd: '', url: '', headers: '' }\n\n/** 将表单草稿转换为 Host MCP 配置。 */\nfunction configOf(draft) {\n const config = { serverName: draft.serverName.trim(), transport: draft.transport }\n if (draft.transport === 'stdio') {\n config.command = draft.command.trim()\n config.args = draft.args.split(/\\r?\\n|\\s+/).filter(Boolean)\n if (draft.cwd.trim()) config.cwd = draft.cwd.trim()\n } else {\n config.url = draft.url.trim()\n config.headers = parsePairs(draft.headers)\n }\n return config\n}\n\n/** 解析每行 key=value 的表单字段。 */\nfunction parsePairs(text) {\n return Object.fromEntries(text.split(/\\r?\\n/).map((line) => line.trim()).filter(Boolean).map((line) => {\n const idx = line.indexOf('=')\n return idx > 0 ? [line.slice(0, idx).trim(), line.slice(idx + 1).trim()] : [line, '']\n }))\n}\n\n/** 服务状态文案。 */\nfunction statusOf(server) {\n return server.status === 'connected' ? '在线' : server.status === 'connecting' ? '连接中' : server.status === 'disabled' ? '已禁用' : '错误'\n}\n\n/** MCP 服务卡片(全局与项目共用)。 */\nfunction ServerCard({ server, onRefresh, onToggle, onRemove }) {\n return React.createElement('article', { className: 'vsm-mcp-card' },\n React.createElement('div', { className: 'vsm-mcp-card-head' },\n React.createElement('div', { className: 'vsm-mcp-title' }, React.createElement('span', { className: 'vsm-mcp-dot ' + (server.enabled ? server.status : 'disabled') }), server.serverName),\n React.createElement('div', { className: 'vsm-mcp-actions' },\n React.createElement('button', { onClick: () => onRefresh(server.id), title: '刷新连接' }, '↻'),\n React.createElement('button', { className: 'vsm-danger', onClick: () => onRemove(server.id), title: '删除 MCP' }, '⌫'),\n React.createElement('button', { className: 'vsm-switch ' + (server.enabled ? 'on' : ''), onClick: () => onToggle(server), 'aria-label': server.enabled ? '禁用' : '启用' }, server.enabled ? '●' : '○'),\n ),\n ),\n React.createElement('div', { className: 'vsm-mcp-meta' }, statusOf(server), ' · ', server.toolCount, ' 个工具 · ', server.transport),\n server.error && React.createElement('div', { className: 'vsm-mcp-error' }, server.error),\n React.createElement('div', { className: 'vsm-mcp-tools' }, server.tools.map((tool) => React.createElement('span', { key: tool.name, className: 'vsm-mcp-chip', title: tool.description || tool.name }, tool.name))),\n )\n}\n\n/** 按项目标题或路径过滤,大小写不敏感。 */\nexport function filterProjects(projects, query) {\n const needle = String(query ?? '').trim().toLowerCase()\n if (!needle) return projects\n return projects.filter((project) => `${project.title} ${project.workspacePath}`.toLowerCase().includes(needle))\n}\n\n/** 带搜索的项目组合框。 */\nfunction ProjectPicker({ projects, value, onChange }) {\n const [open, setOpen] = React.useState(false)\n const [query, setQuery] = React.useState('')\n const [highlight, setHighlight] = React.useState(0)\n const rootRef = React.useRef(null)\n const selected = projects.find((project) => project.workspacePath === value)\n const filtered = React.useMemo(() => filterProjects(projects, query), [projects, query])\n\n React.useEffect(() => {\n const close = (event) => {\n if (!rootRef.current?.contains(event.target)) setOpen(false)\n }\n document.addEventListener('mousedown', close)\n return () => document.removeEventListener('mousedown', close)\n }, [])\n\n const choose = (project) => {\n onChange(project.workspacePath)\n setQuery('')\n setOpen(false)\n }\n const move = (delta) => setHighlight((old) => Math.max(0, Math.min(Math.max(0, filtered.length - 1), old + delta)))\n const keyDown = (event) => {\n if (event.key === 'ArrowDown') { event.preventDefault(); move(1) }\n else if (event.key === 'ArrowUp') { event.preventDefault(); move(-1) }\n else if (event.key === 'Enter' && filtered[highlight]) { event.preventDefault(); choose(filtered[highlight]) }\n else if (event.key === 'Escape') { event.preventDefault(); setOpen(false) }\n }\n return React.createElement('div', { className: 'vsm-project-picker', ref: rootRef },\n React.createElement('button', { className: 'vsm-project-picker-trigger', role: 'combobox', 'aria-expanded': open, onClick: () => setOpen((old) => !old) },\n React.createElement('span', { className: 'vsm-project-picker-label' }, selected?.title || '选择项目', selected && React.createElement('small', null, selected.workspacePath)),\n React.createElement('span', { className: 'vsm-project-picker-arrow' }, open ? '⌃' : '⌄'),\n ),\n open && React.createElement('div', { className: 'vsm-project-picker-menu' },\n React.createElement('input', { autoFocus: true, className: 'vsm-project-picker-search', value: query, placeholder: '搜索项目名称或路径…', onChange: (event) => { setQuery(event.target.value); setHighlight(0) }, onKeyDown: keyDown }),\n React.createElement('div', { className: 'vsm-project-picker-options', role: 'listbox' }, filtered.length ? filtered.map((project, index) => React.createElement('button', { key: project.workspacePath, role: 'option', 'aria-selected': project.workspacePath === value, className: 'vsm-project-option ' + (index === highlight ? 'highlight' : '') + (project.workspacePath === value ? ' selected' : ''), onMouseEnter: () => setHighlight(index), onClick: () => choose(project) }, React.createElement('span', null, project.title), React.createElement('small', null, project.workspacePath, ' · ', project.servers.length, ' 个 MCP'))) : React.createElement('div', { className: 'vsm-project-picker-empty' }, '没有匹配的项目')),\n ),\n )\n}\n\n/** 单个项目的 MCP 分组。 */\nfunction ProjectGroup({ project, busy, onAdd, onRefresh, onToggle, onRemove }) {\n const head = React.createElement('div', { className: 'vsm-project-head' },\n React.createElement('div', { className: 'vsm-project-title' }, React.createElement('span', { className: 'vsm-project-icon' }, '▣'), React.createElement('div', null, React.createElement('span', { className: 'vsm-project-name' }, project.title), React.createElement('span', { className: 'vsm-project-path' }, project.workspacePath))),\n React.createElement('button', { className: 'vsm-primary vsm-small', onClick: () => onAdd(project) }, '+ 添加 MCP'),\n )\n let body\n if (project.missingDir) body = React.createElement('div', { className: 'vsm-project-empty' }, '项目目录已不存在,无法管理 MCP')\n else if (project.fileError) body = React.createElement('div', { className: 'vsm-mcp-error vsm-mcp-banner' }, project.fileError)\n else if (!project.servers.length) body = React.createElement('div', { className: 'vsm-project-empty' }, '此项目未配置 MCP')\n else body = project.servers.map((server) => React.createElement(ServerCard, { key: server.serverName, server, onRefresh: (id) => onRefresh(project, server, id), onToggle: () => onToggle(project, server), onRemove: (id) => onRemove(project, server, id) }))\n return React.createElement('section', { className: 'vsm-project' }, head, body)\n}\n\n/** 通用设置:选择当前对话文件链接的打开器 + 开发形态开关。 */\nfunction GeneralSettings({ registry }) {\n const [tool, setTool] = React.useState(AUTO_OPEN_TOOL)\n const [busy, setBusy] = React.useState(false)\n const [error, setError] = React.useState('')\n const [devForm, setDevForm] = React.useState(null)\n const [devBusy, setDevBusy] = React.useState(false)\n const [devMessage, setDevMessage] = React.useState('')\n const settings = React.useContext(SettingsContext)\n const snapshot = settings?.getSnapshot?.()\n const loading = !snapshot || snapshot.status === 'loading'\n const unavailable = snapshot?.status === 'unavailable' || !settings\n const notReady = snapshot?.status !== 'ready'\n React.useEffect(() => {\n const onChange = () => {\n const next = settings?.getSnapshot?.().value?.fileOpenTool\n if (typeof next === 'string') setTool(next)\n }\n onChange()\n return settings?.subscribe?.(onChange)\n }, [settings])\n React.useEffect(() => {\n rpc('vscode.devFormGet', {}).then((result) => {\n if (result.ok) setDevForm(result.devForm)\n }).catch(() => { /* 开发形态查询失败静默 */ })\n }, [])\n const save = (value) => {\n setTool(value); setBusy(true); setError('')\n if (!settings?.set) { setError('设置服务不可用'); setBusy(false); return }\n settings.set('fileOpenTool', value).catch((e) => setError(String(e))).finally(() => setBusy(false))\n }\n const closeDevForm = () => {\n if (!window.confirm('关闭开发形态:插件将切换为正式版安装(版本依赖 + 删除工作区链接),pnpm 装配后需重启 DSH 生效。确认关闭?')) return\n setDevBusy(true)\n setDevMessage('')\n rpc('vscode.devFormSet', { enabled: false }).then((result) => {\n if (!result.ok) { setDevMessage('关闭失败:' + String(result.error)); return }\n setDevForm(result.devForm)\n setDevMessage(result.restart ? '已切换为正式版,重启 DSH 后生效。' : '已关闭开发形态。')\n }).catch((e) => setDevMessage('关闭失败:' + String(e))).finally(() => setDevBusy(false))\n }\n const options = [{ id: AUTO_OPEN_TOOL, label: '自动选择', description: '按当前已注册工具自动选择' }, ...availableOpeners(registry).map((item) => ({ id: item.id, label: item.label, description: item.description }))]\n const currentOption = options.some((item) => item.id === tool) ? tool : AUTO_OPEN_TOOL\n const devFormRow = devForm?.enabled ? React.createElement('div', { className: 'vsm-general-row' },\n React.createElement('span', null, '开发形态', React.createElement('small', { className: 'vsm-devform-note' }, '工作区链接安装:' + devForm.path)),\n React.createElement('div', { className: 'vsm-devform-actions' },\n devMessage && React.createElement('small', { className: 'vsm-devform-msg' }, devMessage),\n React.createElement('button', { className: 'vsm-devform-close', disabled: devBusy, onClick: closeDevForm }, devBusy ? '切换中…' : '关闭开发形态'),\n ),\n ) : null\n return React.createElement('section', { className: 'vsm-general-page' },\n React.createElement('h2', null, '通用'),\n React.createElement('p', null, '配置 DSH 对话中文件链接的打开工具。工具由当前运行时自动扫描。'),\n unavailable && React.createElement('div', { className: 'vsm-mcp-error vsm-mcp-banner' }, '设置服务暂不可用,当前使用自动选择。'),\n error && React.createElement('div', { className: 'vsm-mcp-error vsm-mcp-banner' }, error),\n React.createElement('label', { className: 'vsm-general-row' }, React.createElement('span', null, '文件链接使用工具'), React.createElement('select', { value: currentOption, disabled: loading || unavailable || notReady || busy || snapshot?.writable === false, onChange: (event) => save(event.target.value) }, options.map((item) => React.createElement('option', { key: item.id, value: item.id }, item.label))), loading && React.createElement('small', null, '读取中…')),\n devFormRow,\n )\n}\n\n/** 兼容性小节:host 报告(RPC compat)+ 客户端本地适配项。 */\nfunction CompatSection({ getSummary }) {\n const [report, setReport] = React.useState(null)\n const [error, setError] = React.useState('')\n React.useEffect(() => {\n let alive = true\n rpc('compat', {}).then((result) => {\n if (!alive) return\n if (!result.ok) setError(String(result.error))\n else setReport(result.report)\n }).catch((e) => { if (alive) setError(String(e)) })\n return () => { alive = false }\n }, [])\n const renderItems = (list) => (list ?? []).map((item) => React.createElement('div', { key: item.name, className: 'vsm-compat-item ' + (item.active ? 'ok' : 'warn') },\n React.createElement('span', { className: 'vsm-compat-name' }, item.name),\n React.createElement('span', { className: 'vsm-compat-note' }, item.note ?? (item.active ? '正常' : '未生效')),\n ))\n const warnings = report?.warnings ?? []\n const devForm = report?.devForm\n return React.createElement('section', { className: 'vsm-general-page' },\n React.createElement('h2', null, '兼容性'),\n React.createElement('p', null, '检测与其他插件 / DSH 版本的适配状态与已知问题。' + (report?.pluginVersion ? '(插件版本 ' + report.pluginVersion + ')' : '')),\n error && React.createElement('div', { className: 'vsm-mcp-error vsm-mcp-banner' }, error),\n devForm?.enabled && React.createElement(React.Fragment, null,\n React.createElement('h3', { className: 'vsm-compat-h3' }, '开发形态'),\n React.createElement('div', { className: 'vsm-compat-item ok' }, React.createElement('span', { className: 'vsm-compat-name' }, '开发形态开启(工作区链接安装)'), React.createElement('span', { className: 'vsm-compat-note' }, devForm.path)),\n ),\n React.createElement('h3', { className: 'vsm-compat-h3' }, '外部插件与服务'),\n renderItems(report?.external),\n React.createElement('h3', { className: 'vsm-compat-h3' }, '客户端适配'),\n renderItems(getSummary?.() ?? []),\n React.createElement('h3', { className: 'vsm-compat-h3' }, '护栏'),\n renderItems(report?.guards),\n React.createElement('h3', { className: 'vsm-compat-h3' }, '警告'),\n warnings.length ? warnings.map((w, index) => React.createElement('div', { key: index, className: 'vsm-mcp-error vsm-mcp-banner' }, w)) : React.createElement('div', { className: 'vsm-compat-item ok' }, React.createElement('span', { className: 'vsm-compat-name' }, '未检测到兼容性问题'), React.createElement('span', { className: 'vsm-compat-note' }, '')),\n )\n}\n\n/** MCP 管理主面板。 */\nexport function McpSettings(props) {\n const openerRegistry = props?.openerRegistry ?? { list: () => [] }\n const compatSummary = props?.compatSummary ?? (() => [])\n const [servers, setServers] = React.useState<MpcServer[]>([])\n const [projects, setProjects] = React.useState<MpcProject[]>([])\n const [loading, setLoading] = React.useState(true)\n const [busy, setBusy] = React.useState('')\n const [error, setError] = React.useState('')\n const [tab, setTab] = React.useState('general')\n const [draft, setDraft] = React.useState(EMPTY)\n const [showForm, setShowForm] = React.useState(false)\n const [projectForm, setProjectForm] = React.useState(null)\n const [selectedPath, setSelectedPath] = React.useState('')\n\n React.useEffect(() => {\n if (!projects.length) {\n setSelectedPath('')\n return\n }\n if (!projects.some((project) => project.workspacePath === selectedPath)) setSelectedPath(projects[0].workspacePath)\n }, [projects, selectedPath])\n\n const loadAll = React.useCallback(() => {\n setLoading(true)\n setError('')\n Promise.all([rpc('mcp.list', {}), rpc('mcp.projects', {})]).then(([list, prj]) => {\n if (!list.ok) throw new Error(list.error)\n if (!prj.ok) throw new Error(prj.error)\n setServers(list.servers)\n setProjects(prj.projects)\n }).catch((e) => setError(String(e))).finally(() => setLoading(false))\n }, [])\n\n React.useEffect(loadAll, [loadAll])\n\n const finish = (result) => {\n if (!result.ok) throw new Error(result.error)\n return result\n }\n\n const action = (label, id, method, args, patch) => {\n setBusy(id)\n setError('')\n return rpc(method, args).then(finish).then((result) => {\n if (patch) patch(result)\n }).catch((e) => setError(String(e))).finally(() => setBusy('')).then(() => label)\n }\n\n const refreshGlobal = (id) => action('refresh', id, 'mcp.refresh', { id }, (r) => setServers((old) => old.map((s) => s.id === id ? r.server : s)))\n const toggleGlobal = (s) => action('toggle', s.id, 'mcp.toggle', { id: s.id, enabled: !s.enabled }, (r) => setServers((old) => old.map((x) => x.id === s.id ? r.server : x)))\n const removeGlobal = (s) => window.confirm('确认删除此 MCP 服务?') && action('remove', s.id, 'mcp.remove', { id: s.id }, (r) => setServers((old) => old.filter((x) => x.id !== s.id)))\n\n const replaceProject = (workspacePath) => (result) => setProjects((old) => old.map((p) => p.workspacePath === workspacePath ? result.project : p))\n const projectAction = (workspacePath, serverName, method, args, patch) => {\n setBusy(workspacePath + ':' + serverName)\n setError('')\n return rpc(method, args).then(finish).then((result) => {\n if (patch) patch(result)\n }).catch((e) => setError(String(e))).finally(() => setBusy(''))\n }\n\n const refreshProject = (p, s) => projectAction(p.workspacePath, s.serverName, 'mcp.projectRefresh', { workspacePath: p.workspacePath, serverName: s.serverName }, replaceProject(p.workspacePath))\n const toggleProject = (p, s) => projectAction(p.workspacePath, s.serverName, 'mcp.projectToggle', { workspacePath: p.workspacePath, serverName: s.serverName, enabled: !s.enabled }, replaceProject(p.workspacePath))\n const removeProject = (p, s) => window.confirm('确认删除此项目的 MCP「' + s.serverName + '」?') && projectAction(p.workspacePath, s.serverName, 'mcp.projectRemove', { workspacePath: p.workspacePath, serverName: s.serverName }, replaceProject(p.workspacePath))\n\n const saveGlobal = () => {\n setBusy('save')\n setError('')\n rpc('mcp.save', { config: configOf(draft) }).then(finish).then((result) => {\n setServers((old) => old.some((s) => s.id === result.server.id) ? old.map((s) => s.id === result.server.id ? result.server : s) : old.concat(result.server))\n setDraft(EMPTY)\n setShowForm(false)\n }).catch((e) => setError(String(e))).finally(() => setBusy(''))\n }\n\n const saveProject = () => {\n if (!projectForm) return\n setBusy('project-save')\n setError('')\n const config = configOf(draft)\n rpc('mcp.projectSave', { workspacePath: projectForm.workspacePath, serverName: config.serverName, config }).then(finish).then((result) => {\n setProjects((old) => old.map((p) => p.workspacePath === projectForm.workspacePath ? result.project : p))\n setDraft(EMPTY)\n setProjectForm(null)\n }).catch((e) => setError(String(e))).finally(() => setBusy(''))\n }\n\n const edit = (key, value) => setDraft((old) => ({ ...old, [key]: value }))\n const marketBody = React.createElement('div', { className: 'vsm-mcp-empty' }, 'MCP 市场暂未接入')\n const selectedProject = projects.find((project) => project.workspacePath === selectedPath)\n const projectBody = projects.length ? React.createElement(React.Fragment, null,\n React.createElement(ProjectPicker, { projects, value: selectedPath, onChange: setSelectedPath }),\n selectedProject ? React.createElement(ProjectGroup, { project: selectedProject, busy, onAdd: (project) => { setDraft(EMPTY); setProjectForm({ workspacePath: project.workspacePath, title: project.title }) }, onRefresh: refreshProject, onToggle: toggleProject, onRemove: removeProject }) : React.createElement('div', { className: 'vsm-mcp-empty' }, '请选择项目'),\n ) : React.createElement('div', { className: 'vsm-mcp-empty' }, '还没有项目')\n let body\n if (loading) body = React.createElement('div', { className: 'vsm-mcp-empty' }, '正在读取 MCP 服务…')\n else if (tab === 'general') body = React.createElement(GeneralSettings, { registry: openerRegistry })\n else if (tab === 'keys') body = React.createElement(KeybindingsPanel, null)\n else if (tab === 'mine') body = React.createElement('div', null, servers.length ? servers.map((s) => React.createElement(ServerCard, { key: s.id, server: s, onRefresh: refreshGlobal, onToggle: toggleGlobal, onRemove: removeGlobal })) : React.createElement('div', { className: 'vsm-mcp-empty' }, '还没有配置全局 MCP'))\n else if (tab === 'projects') body = projectBody\n else if (tab === 'compat') body = React.createElement(CompatSection, { getSummary: compatSummary })\n else body = marketBody\n const form = showForm ? React.createElement(McpForm, { title: '添加全局 MCP', draft, busy, edit, save: saveGlobal, close: () => setShowForm(false) }) : projectForm ? React.createElement(McpForm, { title: '添加项目 MCP · ' + projectForm.title, draft, busy, edit, save: saveProject, close: () => setProjectForm(null) }) : null\n return React.createElement('section', { className: 'vsm-mcp-page' },\n React.createElement('header', { className: 'vsm-mcp-header' }, React.createElement('div', null, React.createElement('h2', null, 'VSCodeMode'), React.createElement('p', null, '管理当前 profile 与各项目的 Model Context Protocol 服务。')), React.createElement('button', { className: 'vsm-primary', onClick: () => { setDraft(EMPTY); setShowForm(true) } }, '+ 添加全局 MCP')),\n React.createElement('nav', { className: 'vsm-mcp-tabs' }, React.createElement('button', { className: tab === 'general' ? 'active' : '', onClick: () => setTab('general') }, '通用'), React.createElement('button', { className: tab === 'keys' ? 'active' : '', onClick: () => setTab('keys') }, '快捷键'), React.createElement('button', { className: tab === 'mine' ? 'active' : '', onClick: () => setTab('mine') }, '我的 MCP'), React.createElement('button', { className: tab === 'projects' ? 'active' : '', onClick: () => setTab('projects') }, '项目 MCP'), React.createElement('button', { className: tab === 'market' ? 'active' : '', onClick: () => setTab('market') }, 'MCP 市场'), React.createElement('button', { className: tab === 'compat' ? 'active' : '', onClick: () => setTab('compat') }, '兼容性')),\n error && React.createElement('div', { className: 'vsm-mcp-error vsm-mcp-banner' }, error),\n body,\n form,\n )\n}\n\n/** MCP 新增表单(全局/项目共用)。 */\nfunction McpForm({ title, draft, busy, edit, save, close }) {\n const input = (key, placeholder) => React.createElement('input', { value: draft[key], onChange: (e) => edit(key, e.target.value), placeholder })\n const fields = draft.transport === 'stdio' ? React.createElement(React.Fragment, null, React.createElement('label', null, '命令', input('command', 'npx')), React.createElement('label', null, '参数(空格或换行分隔)', React.createElement('textarea', { value: draft.args, onChange: (e) => edit('args', e.target.value) })), React.createElement('label', null, '工作目录(可选)', input('cwd', ''))) : React.createElement(React.Fragment, null, React.createElement('label', null, 'URL', input('url', 'http://localhost:3000/mcp')), React.createElement('label', null, '请求头(每行 key=value)', React.createElement('textarea', { value: draft.headers, onChange: (e) => edit('headers', e.target.value) })))\n return React.createElement('div', { className: 'vsm-mcp-modal' }, React.createElement('div', { className: 'vsm-mcp-dialog' }, React.createElement('h3', null, title), React.createElement('label', null, '名称', input('serverName', '例如 codegraph')), React.createElement('label', null, '传输方式', React.createElement('select', { value: draft.transport, onChange: (e) => edit('transport', e.target.value) }, React.createElement('option', { value: 'stdio' }, 'stdio'), React.createElement('option', { value: 'streamable-http' }, 'streamable-http'))), fields, React.createElement('div', { className: 'vsm-mcp-dialog-actions' }, React.createElement('button', { onClick: close }, '取消'), React.createElement('button', { className: 'vsm-primary', disabled: busy === 'save' || busy === 'project-save', onClick: save }, '保存并连接'))))\n}\n","/**\n * dsh-vscode-mode client — DSH 对话文件链接的统一打开路由。\n * openPath 补丁经 compat.patchMethod 安装(链式恢复,多插件补丁互不踩踏)。\n * 作者 ddj 2026年08月24号\n */\nimport { patchMethod } from './compat.js'\nimport { openEditorView } from './events.js'\nimport { AUTO_OPEN_TOOL, VSCODE_OPEN_TOOL, type FileOpenContext, type FileOpenerRegistry, isAvailable, selectOpener } from './fileOpeners.js'\n\nexport interface OpenPathRouterOptions {\n workspaces: { openPath: (path: string) => Promise<void> }\n registry: FileOpenerRegistry\n selected: () => string\n context: () => FileOpenContext\n logger?: (message: string) => void\n}\n\n/**\n * 安装可卸载的 workspaces.openPath 路由。\n * @author ddj 2026年08月24号\n * @param options 路由依赖\n * @returns 恢复原方法的 disposer\n */\nexport function installOpenPathRouter(options: OpenPathRouterOptions): () => void {\n const open = async (original: (path: string) => Promise<void>, path: string): Promise<void> => {\n const context = options.context()\n const opener = selectOpener(options.registry, options.selected())\n if (!opener || !isAvailable(opener)) return original.call(options.workspaces, path)\n try {\n await opener.open(path, context)\n } catch (error) {\n options.logger?.('文件打开器 ' + opener.id + ' 失败,回退系统打开: ' + String(error))\n if (opener.id !== 'system') await original.call(options.workspaces, path)\n else throw error\n }\n }\n return patchMethod(options.workspaces, 'openPath', open as never)\n}\n\n/**\n * 创建 VSCodeMode 内置文件打开器。\n * @author ddj 2026年08月24号\n * @returns VSCodeMode 打开器\n */\nexport function vscodeOpener(): { id: string; label: string; priority: number; open: (path: string) => void } {\n return { id: VSCODE_OPEN_TOOL, label: 'VSCodeMode', priority: 100, open: (path) => openEditorView(path) }\n}\n\n/**\n * 规范化设置中的打开器 id。\n * @author ddj 2026年08月24号\n * @param value 原始设置值\n * @returns 可路由的打开器 id\n */\nexport function autoValue(value: unknown): string {\n return typeof value === 'string' && value.trim() ? value.trim() : AUTO_OPEN_TOOL\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — SideEditorTab:betterSidebar「文件编辑」Tab 的组件包装。\n * 把 TabComponentProps(scope/tab/visible)映射为 EditorView 侧栏形态 props,\n * 并按会话 key 保证切会话状态干净重建;创建种子的初始打开在挂载后投递一次。\n * 作者 ddj 2026年08月25号\n */\nimport React from 'react'\nimport { EditorView } from './EditorView.js'\nimport { resolveInitialOpen, setSideEditorMounted, takePendingSideOpen } from '../sidebarBridge.js'\n\n/**\n * 侧边栏 Tab 组件(TabDescriptor.component 装配)。\n * @param props TabComponentProps(scope.sessionId、tab.path/meta 等)\n * @returns EditorView 侧栏形态\n */\nexport function SideEditorTab(props) {\n const sessionId = props?.scope?.sessionId\n const initial = React.useMemo(() => resolveInitialOpen(props?.tab), [props?.tab])\n const dispatchedRef = React.useRef(false)\n\n React.useEffect(() => {\n setSideEditorMounted(true)\n return () => setSideEditorMounted(false)\n }, [])\n\n React.useEffect(() => {\n if (dispatchedRef.current) return\n dispatchedRef.current = true\n // 待消费打开(挂载前暂存的聚焦请求)优先于创建种子;两者都走同事件,EditorView 幂等处理\n const pending = takePendingSideOpen(sessionId)\n const request = pending ?? initial\n window.dispatchEvent(new CustomEvent('edrv:open-editor', {\n detail: { path: request?.path ?? null, focusDiff: request?.focusDiff === true },\n }))\n }, [initial.path, initial.focusDiff, sessionId])\n\n return React.createElement(EditorView, {\n key: sessionId,\n sessionId,\n layout: 'side',\n schedule: props?.schedule,\n addToConversation: props?.addToConversation,\n sidebarPanels: props?.sidebarPanels,\n outlineSources: props?.outlineSources,\n fileMenuItems: props?.fileMenuItems,\n })\n}\n","/**\n * dsh-vscode-mode client — 把文件/选中内容注入会话对话输入框(composer draft)。\n * 复用 DSH 官方输入门面:ctx.conversation.input.for(sessions.scope(sessionId)) → SessionInput。\n * 引用 chip:insertReference(reference source,发送时序列化为 @path 文本);忙态降级为纯文本 setDraft。\n * 纯函数部分 node 可单测。\n * 作者 ddj 2026-08-25\n */\n\n/** 文件引用可选的行区间(选中内容用)。 */\nexport interface RefRange {\n startLine: number\n endLine: number\n}\n\n/** 引用动作的返回状态。 */\nexport type AddOutcome = 'ok' | 'busy' | 'unavailable'\n\n/** DSH reference source 名(dsh-client-ui-reference 注册的 @file/@session 统一源)。 */\nconst REF_SOURCE = 'reference'\n\n/**\n * 生成 DSH @file 语法引用串:cwd 相对化、\\ → /、含空白时按 @\"path\" 语法加引号。\n * cwd 外/无法相对化的路径回退原路径。\n * @author ddj 2026年08月25号\n * @param path 打开的文件路径(相对 cwd 或绝对)\n * @param cwd 会话工作区目录(可选)\n * @returns 引用串(如 @src/index.ts 或 @\"a b.ts\")\n */\nexport function mentionOf(path: string, cwd: string | undefined): string {\n const raw = String(path)\n let rel = raw\n if (cwd) {\n const base = String(cwd).replace(/[\\\\/]+$/, '')\n const up = raw.replace(/\\\\/g, '/')\n const baseUp = base.replace(/\\\\/g, '/')\n if (up.startsWith(baseUp + '/')) rel = up.slice(baseUp.length + 1)\n else if (up === baseUp) rel = ''\n }\n rel = rel.replace(/\\\\/g, '/').replace(/^\\.\\//, '')\n if (!rel) rel = raw.replace(/\\\\/g, '/')\n if (/[\\u0000-\\u001f\\u007f-\\u009f\"]/u.test(rel)) return '@' + raw\n return /\\s/u.test(rel) ? `@\"${rel}\"` : `@${rel}`\n}\n\n/** 引用标签:文件名 + 可选行区间(chip 内展示,不带 @ 前缀)。\n * @author ddj 2026年08月25号 */\nexport function labelOf(path: string, range: RefRange | undefined): string {\n const base = String(path).split(/[\\\\/]/).pop() || String(path)\n if (!range || range.endLine < range.startLine) return base\n return range.startLine === range.endLine\n ? `${base} L${range.startLine}`\n : `${base} L${range.startLine}-${range.endLine}`\n}\n\n/** 引用 ref:引用串 + 可选行区间(序列化直出,agent 据此读取对应片段)。\n * @author ddj 2026年08月25号 */\nexport function refOf(mention: string, range: RefRange | undefined): string {\n if (!range || range.endLine < range.startLine) return mention\n return range.startLine === range.endLine\n ? `${mention} L${range.startLine}`\n : `${mention} L${range.startLine}-${range.endLine}`\n}\n\n/** 构造 DSH 文件引用插入载荷(source=reference,发送序列化为 mention(+range) 文本)。 */\nexport function buildFileRef(\n path: string,\n cwd: string | undefined,\n range?: RefRange,\n): { reference: ReferenceInsertLike; mention: string } {\n const mention = mentionOf(path, cwd)\n return {\n mention,\n reference: {\n source: REF_SOURCE,\n ref: refOf(mention, range),\n label: labelOf(path, range),\n appearance: 'file',\n clipboardText: mention,\n },\n }\n}\n\n/** 输入门面最小形状(运行时来自 ctx.conversation.input,避免引入新类型依赖)。 */\nexport interface InputLike {\n state: { getSnapshot: () => { draft: string; draftRev: number } }\n insertReference: (ref: ReferenceInsertLike, span: TokenSpanLike) => boolean\n setDraft: (text: string) => void\n notify: (level: 'info' | 'error', text: string) => void\n}\n\n/** ReferenceInsert 结构形状(与 dsh-client-ui-input-trigger 类型一致)。 */\nexport interface ReferenceInsertLike {\n source: string\n ref: string\n label: string\n appearance?: 'session' | 'file' | 'folder'\n clipboardText: string\n}\n\n/** TokenSpan 结构形状(start/end 为草稿字符偏移,draftRev 为 CAS 版本)。 */\nexport interface TokenSpanLike {\n start: number\n end: number\n draftRev: number\n}\n\n/** ctx 依赖的最小面(sessions.scope + conversation.input)。 */\nexport interface CtxLike {\n get: (name: string) => unknown\n}\n\n/** 注入器产物:给 EditorView 用的动作集合。 */\nexport interface AddToConversation {\n /** 追加文件引用 chip(@path [Lstart-end]);忙态自动降级纯文本。 */\n appendReference(sessionId: string | undefined, path: string, range?: RefRange): Promise<AddOutcome>\n}\n\n/**\n * 解析会话输入门面;缺失时返回 undefined(动作侧守卫降级)。\n * @author ddj 2026年08月25号\n * @param ctx 客户端服务上下文\n * @param sessionId 会话 id\n * @returns SessionInput 或 undefined\n */\nexport function inputFor(ctx: CtxLike, sessionId: string | undefined): InputLike | undefined {\n if (!sessionId) return undefined\n try {\n const sessions = ctx.get('sessions') as { scope?: (id: string) => unknown } | undefined\n const conversation = ctx.get('conversation') as { input?: { for: (actx: unknown) => unknown } } | undefined\n const actx = sessions?.scope?.(sessionId)\n const shell = actx && conversation?.input?.for?.(actx)\n return (shell && typeof (shell as InputLike).setDraft === 'function') ? shell as InputLike : undefined\n } catch {\n return undefined\n }\n}\n\n/** 取当前草稿长度与版本;无输入门面时返回 null。\n * @author ddj 2026年08月25号 */\nfunction draftCursor(input: InputLike | undefined): { draft: string; draftRev: number } | null {\n try {\n const s = input?.state?.getSnapshot?.()\n if (!s) return null\n return { draft: String(s.draft ?? ''), draftRev: Number(s.draftRev ?? 0) }\n } catch {\n return null\n }\n}\n\n/** 从 sessions 列表快照读会话工作区目录(与 index.ts 既有读取方式一致)。\n * @author ddj 2026年08月25号 */\nfunction cwdOf(ctx: CtxLike, sessionId: string | undefined): string | undefined {\n if (!sessionId) return undefined\n try {\n const sessions = ctx.get('sessions') as\n | { list?: { getSnapshot?: () => { byId?: Record<string, { cwd?: string }> } } }\n | undefined\n return sessions?.list?.getSnapshot?.()?.byId?.[sessionId]?.cwd\n } catch {\n return undefined\n }\n}\n\n/** 写入成功后的 composer 内联提示(门面可用时;失败静默)。\n * @author ddj 2026年08月25号 */\nfunction notify(input: InputLike, text: string): void {\n try {\n input.notify?.('info', text)\n } catch {\n /* 提示失败忽略 */\n }\n}\n\n/** 输入门面插入引用(拦截异常视作未应用,走降级)。\n * @author ddj 2026年08月25号 */\nfunction safeInsert(input: InputLike, reference: ReferenceInsertLike, span: TokenSpanLike): boolean {\n try {\n return input.insertReference(reference, span) === true\n } catch {\n return false\n }\n}\n\n/**\n * 创建「添加到对话」动作集(apply 阶段构建一次,随 props 传给 EditorView)。\n * @author ddj 2026年08月25号\n * @param ctx 客户端服务上下文(sessions + conversation)\n * @returns 动作集\n */\nexport function createAddToConversation(ctx: CtxLike): AddToConversation {\n const appendReference: AddToConversation['appendReference'] = async (sessionId, path, range) => {\n const input = inputFor(ctx, sessionId)\n if (!input) return 'unavailable'\n const cur = draftCursor(input)\n if (!cur) return 'unavailable'\n const { reference, mention } = buildFileRef(path, cwdOf(ctx, sessionId), range)\n const span: TokenSpanLike = { start: cur.draft.length, end: cur.draft.length, draftRev: cur.draftRev }\n const ok = safeInsert(input, reference, span)\n if (!ok) {\n // 忙态(adjudicating/submitting)或 CAS 失败:降级纯文本追加,保证动作有落点。\n const gap = cur.draft.length > 0 && !/\\s$/.test(cur.draft) ? ' ' : ''\n input.setDraft(cur.draft + gap + mention + ' ')\n notify(input, '已添加文件引用 ' + mention)\n return 'busy'\n }\n notify(input, '已添加文件引用 ' + mention)\n return 'ok'\n }\n\n return { appendReference }\n}\n","/**\n * dsh-vscode-mode client — 侧边栏面板注册表。\n * 镜像 fileOpeners.ts 的注册表模式:create + register(返回注销) + list + subscribe,\n * 由 client/index.ts `ctx.provide('edrvSidebarPanels', registry)` 对外暴露(第三方可注册)。\n * 作者 ddj 2026-08-26\n */\nimport type { SidebarPanelDef } from './types.js'\n\nexport interface SidebarPanelRegistry {\n register(panel: SidebarPanelDef): () => void\n list(): readonly SidebarPanelDef[]\n subscribe(listener: () => void): () => void\n get(id: string): SidebarPanelDef | undefined\n}\n\n/** 校验面板定义并写入注册表(缺 id/render 抛 TypeError)。 */\nfunction panelRegister(entries: Map<string, SidebarPanelDef>, notify: () => void, panel: SidebarPanelDef): void {\n if (!panel.id || typeof panel.render !== 'function') throw new TypeError('侧边栏面板必须提供 id 和 render')\n entries.set(panel.id, panel)\n notify()\n}\n\n/**\n * 创建生命周期独立的面板注册表。\n * @author ddj 2026年08月26号\n * @returns 面板注册表\n */\nexport function createSidebarPanelRegistry(): SidebarPanelRegistry {\n const entries = new Map<string, SidebarPanelDef>()\n const listeners = new Set<() => void>()\n const notify = (): void => {\n for (const listener of listeners) listener()\n }\n const list = (): readonly SidebarPanelDef[] =>\n [...entries.values()].sort((a, b) => (a.order ?? 100) - (b.order ?? 100))\n return {\n register(panel: SidebarPanelDef): () => void {\n panelRegister(entries, notify, panel)\n return () => {\n if (entries.get(panel.id) !== panel) return\n entries.delete(panel.id)\n notify()\n }\n },\n list,\n subscribe(listener: () => void): () => void {\n listeners.add(listener)\n return () => listeners.delete(listener)\n },\n get: (id: string) => entries.get(id),\n }\n}\n","/**\n * dsh-vscode-mode client — 右键菜单 viewport 定位纯函数。\n * 将目标行锚点与视口边界计算从 React 渲染层拆出,便于复用和单测。\n * 作者 ddj 2026-08-28\n */\n\nexport interface MenuPosition {\n left: number\n top: number\n}\n\nexport interface MenuAnchorRect {\n top: number\n right: number\n width: number\n height: number\n}\n\n/**\n * 将菜单坐标限制在 viewport 内。\n * @author ddj 2026年08月28号\n * @param x 期望的 viewport x 坐标\n * @param y 期望的 viewport y 坐标\n * @param viewportWidth viewport 宽度\n * @param viewportHeight viewport 高度\n * @param menuWidth 菜单估算宽度\n * @param menuHeight 菜单估算高度\n * @returns 限制后的菜单位置\n */\nexport function clampMenuPosition(\n x: number,\n y: number,\n viewportWidth: number,\n viewportHeight: number,\n menuWidth: number,\n menuHeight: number,\n): MenuPosition {\n const maxLeft = Math.max(4, viewportWidth - menuWidth)\n const maxTop = Math.max(4, viewportHeight - menuHeight)\n return {\n left: Math.max(4, Math.min(x, maxLeft)),\n top: Math.max(4, Math.min(y, maxTop)),\n }\n}\n\n/**\n * 将文件树行右键菜单锚定到目标行右侧;无法测量时回退到鼠标坐标。\n * @author ddj 2026年08月28号\n * @param rect 目标行的布局矩形\n * @param fallbackX 鼠标 viewport x 坐标\n * @param fallbackY 鼠标 viewport y 坐标\n * @returns 菜单初始位置\n */\nexport function rowMenuPosition(\n rect: MenuAnchorRect | null | undefined,\n fallbackX: number,\n fallbackY: number,\n): MenuPosition {\n if (!rect || rect.width <= 0 || rect.height <= 0) {\n return { left: fallbackX, top: fallbackY }\n }\n return { left: rect.right + 4, top: rect.top }\n}\n","/**\n * dsh-vscode-mode client — 通用浮动右键菜单(createElement 风格、类型化)。\n * 非阻塞式关闭:window capture 监听(点击菜单外/右键菜单外/Esc 关闭),\n * 不拦截菜单外事件,允许同一事件内由发起方切换/重开菜单。\n * 条目支持 danger/disabled/separator,复用既有 edrv-ctxmenu* 样式类。\n * 作者 ddj 2026-08-27\n */\nimport React from 'react'\nimport { createPortal } from 'react-dom'\nimport { clampMenuPosition } from './menuPosition.js'\n\n/** 单条菜单项(展示层形状;业务侧由 buildTreeMenu 映射而来)。 */\nexport interface ContextMenuEntry {\n id: string\n label: string\n danger?: boolean\n disabled?: boolean\n /** 前置分隔线。 */\n separator?: boolean\n onClick?: () => void\n}\n\nexport interface ContextMenuProps {\n x: number\n y: number\n entries: ContextMenuEntry[]\n onClose: () => void\n}\n\n/** 菜单估算宽高(clamp 防越出视口,与 EditorView menuPos 常量对齐)。 */\nconst MENU_W = 224\nconst MENU_H = 176\n\n/**\n * 浮动右键菜单。\n * @param props.x 视口 x 坐标\n * @param props.y 视口 y 坐标\n * @param props.entries 菜单项列表\n * @param props.onClose 关闭回调(backdrop 点击/右键/Esc/点击项后触发)\n */\nexport function ContextMenu(props: ContextMenuProps): React.ReactElement {\n const { x, y, entries, onClose } = props\n const menuRef = React.useRef<HTMLDivElement | null>(null)\n\n React.useEffect(() => {\n const onKey = (e: KeyboardEvent): void => {\n if (e.key === 'Escape') onClose()\n }\n const onPointerDown = (e: PointerEvent): void => {\n if (e.button !== 0) return\n if (menuRef.current && menuRef.current.contains(e.target as Node)) return\n onClose()\n }\n const onContextMenu = (e: MouseEvent): void => {\n if (menuRef.current && menuRef.current.contains(e.target as Node)) {\n e.preventDefault()\n }\n onClose()\n }\n window.addEventListener('keydown', onKey, true)\n window.addEventListener('pointerdown', onPointerDown, true)\n window.addEventListener('contextmenu', onContextMenu, true)\n return () => {\n window.removeEventListener('keydown', onKey, true)\n window.removeEventListener('pointerdown', onPointerDown, true)\n window.removeEventListener('contextmenu', onContextMenu, true)\n }\n }, [onClose])\n\n const safeX = Number.isFinite(x) ? x : 4\n const safeY = Number.isFinite(y) ? y : 4\n const position = clampMenuPosition(\n safeX,\n safeY,\n window.innerWidth || 800,\n window.innerHeight || 600,\n MENU_W,\n MENU_H,\n )\n\n const children: React.ReactNode[] = []\n for (const entry of entries) {\n if (entry.separator) {\n children.push(React.createElement('div', { key: 'sep-' + entry.id, className: 'edrv-ctxmenu-sep' }))\n continue\n }\n const cls = 'edrv-ctxmenu-item'\n + (entry.danger ? ' edrv-ctxmenu-danger' : '')\n + (entry.disabled ? ' edrv-ctxmenu-disabled' : '')\n children.push(React.createElement('button', {\n key: entry.id,\n className: cls,\n disabled: entry.disabled,\n onClick: () => {\n if (!entry.disabled) {\n entry.onClick?.()\n onClose()\n }\n },\n }, entry.label))\n }\n\n const overlay = React.createElement('div', { 'data-edrv-view': '1' },\n React.createElement('div', { className: 'edrv-ctxmenu', ref: menuRef, style: position }, ...children))\n\n return typeof document === 'undefined' ? overlay : createPortal(overlay, document.body)\n}\n","/**\n * dsh-vscode-mode client — 文件管理右键菜单框架(类型 + 注册表 + 纯构建函数)。\n * 镜像 sidebar/registry.ts 的注册表模式:create + register(返回注销) + list + subscribe,\n * 由 client/index.ts `ctx.provide('edrvFileContextMenuItems', registry)` 对外暴露(第三方可注册)。\n * 新增菜单项只需 register 一条 TreeMenuItem,面板在右键打开时经 buildTreeMenu 过滤/排序。\n * 本模块不触 React/浏览器,可单测。\n * 作者 ddj 2026-08-27\n */\nimport type { TreeEntry } from '../../shared/rpc.js'\nimport type { SidebarCtx } from './types.js'\n\n/** 右键目标(树行/面板空白区,path 相对工作区根,'' 表示根目录)。 */\nexport interface TreeMenuTarget {\n path: string\n type: TreeEntry['type']\n}\n\n/** 一条右键菜单项定义。 */\nexport interface TreeMenuItem {\n id: string\n label: string\n /** 排序:数值越小越靠前(缺省 100)。 */\n order?: number\n /** 红色警示样式(如删除类操作)。 */\n danger?: boolean\n /** 置灰不可点(如无权限/目标不支持时)。 */\n disabled?: boolean\n /** 前置分隔线。 */\n separator?: boolean\n /** 显隐守卫:返回 false 则不显示。 */\n visible?: (target: TreeMenuTarget, ctx: SidebarCtx) => boolean\n run: (target: TreeMenuTarget, ctx: SidebarCtx) => void\n}\n\n/** 右键菜单项注册表(生命周期独立,可注册/注销/订阅)。 */\nexport interface TreeMenuRegistry {\n register(item: TreeMenuItem): () => void\n list(): readonly TreeMenuItem[]\n subscribe(listener: () => void): () => void\n get(id: string): TreeMenuItem | undefined\n}\n\n/** 校验菜单项并写入注册表(缺 id/run/label 抛 TypeError)。 */\nfunction itemRegister(entries: Map<string, TreeMenuItem>, notify: () => void, item: TreeMenuItem): void {\n if (!item.id || typeof item.run !== 'function' || !item.label) {\n throw new TypeError('文件右键菜单项必须提供 id、label 和 run')\n }\n entries.set(item.id, item)\n notify()\n}\n\n/**\n * 创建生命周期独立的右键菜单项注册表。\n * @author ddj 2026年08月27号\n * @returns 菜单项注册表\n */\nexport function createTreeMenuRegistry(): TreeMenuRegistry {\n const entries = new Map<string, TreeMenuItem>()\n const listeners = new Set<() => void>()\n const notify = (): void => {\n for (const listener of listeners) listener()\n }\n const list = (): readonly TreeMenuItem[] =>\n [...entries.values()].sort((a, b) => (a.order ?? 100) - (b.order ?? 100))\n return {\n register(item: TreeMenuItem): () => void {\n itemRegister(entries, notify, item)\n return () => {\n if (entries.get(item.id) !== item) return\n entries.delete(item.id)\n notify()\n }\n },\n list,\n subscribe(listener: () => void): () => void {\n listeners.add(listener)\n return () => listeners.delete(listener)\n },\n get: (id: string) => entries.get(id),\n }\n}\n\n/**\n * 按目标构建当前可见菜单项(visible 过滤 + order 排序)。\n * @author ddj 2026年08月27号\n * @param registry 菜单项注册表\n * @param target 右键目标\n * @param ctx 面板共享上下文\n * @returns 可见菜单项(已排序)\n */\nexport function buildTreeMenu(registry: TreeMenuRegistry | undefined, target: TreeMenuTarget, ctx: SidebarCtx): TreeMenuItem[] {\n if (!registry) return []\n const out: TreeMenuItem[] = []\n for (const item of registry.list()) {\n if (typeof item.visible === 'function' && !item.visible(target, ctx)) continue\n out.push(item)\n }\n return out\n}\n","/**\n * dsh-vscode-mode client — 资源管理栏展开状态持久化(纯函数,可单测)。\n * 对齐 VSCode:只持久化展开路径集合,不缓存目录条目数据(条目实时 listDir)。\n * 作者 ddj 2026-08-28\n */\n\n/** localStorage 键前缀(按会话隔离)。 */\nconst KEY_PREFIX = 'edrv.cache.explorer.v1.'\n\n/** 展开路径容量上限:超出丢弃最旧(按写入顺序近似 LRU)。 */\nexport const EXPANDED_CAP = 500\n\n/** 展开状态缓存内容。 */\nexport interface ExplorerCacheData {\n root: string | null\n expanded: string[]\n}\n\n/**\n * 归一化展开路径:去空白、反斜杠→斜杠、去首尾斜杠,`..` 段拒绝。\n * @author ddj 2026年08月28号\n * @param rel 目录相对路径('' = 根)\n * @returns 归一化路径,非法返回 null\n */\nexport function normalizeExpanded(rel: string | undefined | null): string | null {\n const s = String(rel ?? '').trim().replace(/\\\\/g, '/').replace(/^\\/+|\\/+$/g, '')\n if (!s) return ''\n const segs = s.split('/').filter((seg) => seg !== '.')\n if (!segs.length) return ''\n for (const seg of segs) {\n if (seg === '..') return null\n }\n return segs.join('/')\n}\n\n/**\n * 裁剪展开路径集:去重、丢弃非法路径、超容量丢弃尾部(保持传入顺序)。\n * @author ddj 2026年08月28号\n * @param expanded 原始展开路径集合\n * @returns 规范化后的路径数组\n */\nexport function sanitizeExpanded(expanded: unknown): string[] {\n if (!Array.isArray(expanded)) return []\n const seen = new Set<string>()\n const out: string[] = []\n for (const item of expanded) {\n const rel = normalizeExpanded(typeof item === 'string' ? item : null)\n if (rel === null || seen.has(rel)) continue\n seen.add(rel)\n out.push(rel)\n if (out.length >= EXPANDED_CAP) break\n }\n return out\n}\n\n/**\n * 序列化缓存数据(JSON;root 为 null 时省略,减小体积)。\n * @author ddj 2026年08月28号\n * @param data 缓存数据\n * @returns JSON 字符串\n */\nexport function serializeExplorer(data: ExplorerCacheData): string {\n const payload = data.root === null || data.root === undefined\n ? { v: 1, expanded: data.expanded }\n : { v: 1, root: data.root, expanded: data.expanded }\n return JSON.stringify(payload)\n}\n\n/**\n * 解析缓存文本;损坏/格式不符 → null。\n * @author ddj 2026年08月28号\n * @param text localStorage 原文\n * @returns 解析后的缓存数据,非法返回 null\n */\nexport function parseExplorer(text: string | null): ExplorerCacheData | null {\n if (!text) return null\n try {\n const data = JSON.parse(text)\n if (!data || typeof data !== 'object') return null\n const root = typeof data.root === 'string' && data.root ? data.root : null\n const expanded = sanitizeExpanded(data.expanded)\n return { root, expanded }\n } catch (error) {\n return null\n }\n}\n\n/**\n * 读取某会话的展开状态缓存(localStorage 不可用 → null)。\n * @author ddj 2026年08月28号\n * @param sessionId 会话 id\n * @returns 缓存数据或 null\n */\nexport function explorerLoad(sessionId: string): ExplorerCacheData | null {\n try {\n return parseExplorer(window.localStorage.getItem(KEY_PREFIX + String(sessionId)))\n } catch (error) {\n return null\n }\n}\n\n/**\n * 写入某会话的展开状态缓存(损坏/配额满 → 忽略)。\n * @author ddj 2026年08月28号\n * @param sessionId 会话 id\n * @param data 缓存数据\n */\nexport function explorerSave(sessionId: string, data: ExplorerCacheData): void {\n try {\n window.localStorage.setItem(KEY_PREFIX + String(sessionId), serializeExplorer(data))\n } catch (error) { /* 配额满/隐私模式忽略 */ }\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — 侧边栏「文件管理」面板(懒加载目录树)。\n * 点目录展开/收起(首次经 edrv.listDir 拉取并缓存),点文件经 ctx.openFile 打开;\n * 差异角标取 pendingByPath,活动文件高亮;edrv:refresh 事件与手动刷新重载树。\n * 右键行/空白弹出菜单:项来自 ctx.fileMenuItems 注册表(可拓展),\n * 内置「在文件浏览器中打开」经 edrv.revealInExplorer 定位/打开。\n * 作者 ddj 2026-08-26 / 2026-08-27\n */\nimport React from 'react'\nimport { rpc } from '../../rpc.js'\nimport { ContextMenu } from '../../ui/ContextMenu.js'\nimport { rowMenuPosition } from '../../ui/menuPosition.js'\nimport { buildTreeMenu } from '../contextMenu.js'\nimport { explorerLoad, explorerSave } from '../../state/explorerCache.js'\nimport type { SidebarCtx } from '../types.js'\n\nconst DIR_CAP = 4000\nconst SAVE_DEBOUNCE_MS = 300\n\n/**\n * 目录树面板主体。\n * @param props.ctx 面板共享上下文(sessionId/openFile/activePath/pendingByPath/fileMenuItems/notify)\n */\nexport function FileExplorer(props) {\n const ctx = props?.ctx\n const sessionId = ctx?.sessionId\n const openFile = ctx?.openFile\n const activePath = ctx?.activePath ?? null\n const pendingByPath = ctx?.pendingByPath ?? {}\n const [root, setRoot] = React.useState(null)\n const [dirs, setDirs] = React.useState({})\n const [expanded, setExpanded] = React.useState({})\n const [loading, setLoading] = React.useState({})\n const [error, setError] = React.useState(null)\n const [menu, setMenu] = React.useState(null) // 右键菜单 { x, y, target }\n const tokensRef = React.useRef({})\n // expanded 的 ref 镜像:edrv:refresh 监听用首次渲染闭包,但需读到最新展开态\n const expandedRef = React.useRef({})\n expandedRef.current = expanded\n // 展开状态防抖写回计时器\n const saveTimerRef = React.useRef(null)\n\n const loadDir = (rel) => {\n const token = (tokensRef.current[rel] || 0) + 1\n tokensRef.current[rel] = token\n setLoading((prev) => Object.assign({}, prev, { [rel]: true }))\n setError(null)\n rpc('edrv.listDir', { sessionId, path: rel }).then((res) => {\n if (tokensRef.current[rel] !== token) return\n if (res && res.ok && Array.isArray(res.entries)) {\n setDirs((prev) => Object.assign({}, prev, { [rel]: res.entries }))\n if (res.root && !root) setRoot(res.root)\n } else {\n setError(res?.error ? String(res.error) : '读取目录失败')\n }\n }).catch((e) => {\n if (tokensRef.current[rel] !== token) return\n setError('读取目录异常:' + String(e))\n }).finally(() => {\n if (tokensRef.current[rel] !== token) return\n setLoading((prev) => {\n const next = Object.assign({}, prev)\n delete next[rel]\n return next\n })\n })\n }\n\n const toggle = (rel) => {\n if (expanded[rel] === true) {\n setExpanded((prev) => Object.assign({}, prev, { [rel]: false }))\n return\n }\n if (!dirs[rel]) void loadDir(rel)\n setExpanded((prev) => Object.assign({}, prev, { [rel]: true }))\n }\n\n const refresh = () => {\n const keep = Object.keys(expandedRef.current).filter((k) => expandedRef.current[k] === true)\n tokensRef.current = {}\n setMenu(null)\n setDirs({})\n setLoading({})\n setError(null)\n if (keep.length) {\n const next = {}\n for (const rel of keep) next[rel] = true\n setExpanded(next)\n for (const rel of keep) void loadDir(rel)\n } else {\n setExpanded({})\n }\n void loadDir('')\n }\n\n React.useEffect(() => {\n tokensRef.current = {}\n setDirs({})\n setExpanded({})\n setLoading({})\n setError(null)\n setMenu(null)\n setRoot(null)\n // 恢复上次展开状态(对齐 VSCode:持久化展开路径,目录条目实时拉取)\n const cached = sessionId ? explorerLoad(sessionId) : null\n const restored = cached?.expanded ?? []\n if (cached?.root) setRoot(cached.root)\n if (restored.length) {\n const next = {}\n for (const rel of restored) next[rel] = true\n setExpanded(next)\n }\n void loadDir('')\n for (const rel of restored) {\n if (rel) void loadDir(rel)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [sessionId])\n\n // 展开状态防抖写回 localStorage(重启后恢复展开结构)\n React.useEffect(() => {\n if (saveTimerRef.current) { clearTimeout(saveTimerRef.current); saveTimerRef.current = null }\n if (!sessionId) return\n saveTimerRef.current = setTimeout(() => {\n saveTimerRef.current = null\n const expandedList = Object.keys(expanded).filter((k) => expanded[k] === true)\n explorerSave(sessionId, { root, expanded: expandedList })\n }, SAVE_DEBOUNCE_MS)\n return () => {\n if (saveTimerRef.current) { clearTimeout(saveTimerRef.current); saveTimerRef.current = null }\n }\n }, [expanded, root, sessionId])\n\n React.useEffect(() => {\n const onRefresh = () => refresh()\n window.addEventListener('edrv:refresh', onRefresh)\n return () => window.removeEventListener('edrv:refresh', onRefresh)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n const rootName = root ? String(root).split(/[\\\\/]/).pop() || root : ''\n\n const rowEl = (e, depth, isDir, isOpen) => {\n const pending = isDir ? 0 : (pendingByPath[e.path] ?? 0)\n const active = !isDir && e.path === activePath\n const contextTarget = Boolean(menu && menuEntries.length && menu.target.path === e.path)\n const dim = e.type === 'other'\n return React.createElement('div', {\n key: e.path,\n className: 'edrv-tree-row'\n + (active ? ' edrv-tree-active' : '')\n + (contextTarget ? ' edrv-tree-context' : ''),\n title: e.path,\n style: { paddingLeft: 6 + depth * 14 },\n onClick: () => { if (isDir) toggle(e.path); else openFile(e.path) },\n onContextMenu: (ev) => {\n ev.preventDefault()\n ev.stopPropagation()\n const rect = ev.currentTarget?.getBoundingClientRect?.()\n const position = rowMenuPosition(rect, ev.clientX, ev.clientY)\n setMenu({ x: position.left, y: position.top, target: { path: e.path, type: e.type } })\n },\n },\n React.createElement('span', { className: 'edrv-tree-chev' },\n isDir ? (isOpen ? '▾' : '▸') : ''),\n React.createElement('span', { className: 'edrv-tree-name' + (dim ? ' edrv-tree-dim' : '') },\n isDir ? (isOpen ? '📂' : '📁') : '📄', ' ', e.name),\n (pending > 0\n ? React.createElement('span', { className: 'edrv-tree-badge' }, String(pending))\n : null))\n }\n\n const rowsOf = (rel, depth) => {\n const entries = dirs[rel]\n if (!entries) {\n return [React.createElement('div', { key: rel + ':loading', className: 'edrv-tree-loading', style: { paddingLeft: 6 + depth * 14 } },\n loading[rel] ? '加载中…' : '无法加载')]\n }\n const rows = []\n const cap = entries.length\n for (let i = 0; i < cap; i++) {\n const e = entries[i]\n const isDir = e.type === 'directory'\n const isOpen = expanded[e.path] === true\n rows.push(rowEl(e, depth, isDir, isOpen))\n if (isDir && isOpen) rows.push(...rowsOf(e.path, depth + 1))\n }\n if (cap >= DIR_CAP) {\n rows.push(React.createElement('div', { key: rel + ':cap', className: 'edrv-tree-loading', style: { paddingLeft: 6 + depth * 14 } },\n '目录条目过多,仅显示前 ' + DIR_CAP + ' 项'))\n }\n return rows\n }\n\n // 面板区右键(空白处)→ 工作区根目录菜单;行内右键已在 rowEl 阻止冒泡。\n const onPanelContext = (ev) => {\n ev.preventDefault()\n ev.stopPropagation()\n if (!ev.currentTarget.contains(ev.target)) return\n setMenu({ x: ev.clientX, y: ev.clientY, target: { path: '', type: 'directory' } })\n }\n // 当前右键目标的可视菜单项(构建时过滤/排序,registry 变化下次打开生效)。\n const menuEntries = menu\n ? buildTreeMenu(ctx?.fileMenuItems, menu.target, ctx).map((item) => ({\n id: item.id,\n label: item.label,\n danger: item.danger,\n disabled: item.disabled,\n separator: item.separator,\n onClick: () => item.run(menu.target, ctx),\n }))\n : []\n\n return React.createElement('div', { className: 'edrv-side-panel', onContextMenu: onPanelContext },\n React.createElement('div', { className: 'edrv-side-head' },\n React.createElement('span', { className: 'edrv-side-title' }, '资源管理器'),\n React.createElement('span', { className: 'edrv-side-root', title: root || '' }, rootName),\n React.createElement('span', { style: { flex: 1 } }),\n React.createElement('button', { className: 'edrv-side-btn', title: '刷新目录树', onClick: refresh }, '⟳')),\n React.createElement('div', { className: 'edrv-tree' },\n (error\n ? React.createElement('div', { className: 'edrv-tree-error' },\n React.createElement('span', null, String(error)),\n React.createElement('button', { className: 'edrv-side-btn', onClick: () => refresh() }, '重试'))\n : null),\n rowsOf('', 0)),\n (menu && menuEntries.length\n ? React.createElement(ContextMenu, { x: menu.x, y: menu.y, entries: menuEntries, onClose: () => setMenu(null) })\n : null))\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — 侧边栏「搜索」面板(VSCode 搜索视图形态)。\n * 内容搜索:edrv.searchContent RPC;结果按文件分组展示命中行(行号 + 高亮 + 文件计数),\n * 点击经 ctx.openFileAt 打开文件并跳转行列。\n * 选项:大小写/全词/正则;折叠区(⚙ 齿轮展开):包含的文件(📖 toggle = 仅当前打开文件)\n * 与排除的文件(⚙ toggle = 启用排除),模式为逗号分隔 rg glob;无搜索按钮,防抖 + 回车触发。\n * 作者 ddj 2026-08-26\n */\nimport React from 'react'\nimport { rpc } from '../../rpc.js'\nimport type { SidebarCtx } from '../types.js'\n\nconst DEBOUNCE_MS = 250\nconst INCLUDE_PLACEHOLDER = '例如 *.ts, src/**/include'\n\n/**\n * 逗号切分 glob 列表(trim + 去空)。\n * @param text 用户输入的逗号分隔模式\n * @returns glob 数组\n */\nexport function splitGlobs(text) {\n return String(text ?? '').split(',').map((item) => item.trim()).filter(Boolean)\n}\n\n/**\n * 命中行文本三段切分(before/命中/after,列为 1-based UTF-16)。\n * @param text 行文本\n * @param start 起始列\n * @param end 结束列\n * @returns 三段文本\n */\nfunction splitHit(text, start, end) {\n const s = Math.max(0, (start | 0) - 1)\n const e = Math.max(s, end | 0)\n return { before: String(text).slice(0, s), hit: String(text).slice(s, e), after: String(text).slice(e) }\n}\n\n/**\n * 搜索面板主体。\n * @param props.ctx 面板共享上下文(sessionId/openFileAt/activePath)\n */\nexport function SearchPanel(props) {\n const ctx = props?.ctx\n const sessionId = ctx?.sessionId\n const openFileAt = ctx?.openFileAt ?? (() => {})\n const activePath = ctx?.activePath ?? null\n const [query, setQuery] = React.useState('')\n const [matchCase, setMatchCase] = React.useState(false)\n const [wholeWord, setWholeWord] = React.useState(false)\n const [regex, setRegex] = React.useState(false)\n const [includeText, setIncludeText] = React.useState('')\n const [excludeText, setExcludeText] = React.useState('')\n const [onlyActive, setOnlyActive] = React.useState(false)\n const [excludeOn, setExcludeOn] = React.useState(false)\n const [sectionOpen, setSectionOpen] = React.useState(false)\n const [status, setStatus] = React.useState('idle') // idle | searching | done | error\n const [error, setError] = React.useState('')\n const [matches, setMatches] = React.useState(null)\n const [truncated, setTruncated] = React.useState(false)\n const [collapsed, setCollapsed] = React.useState({})\n const seqRef = React.useRef(0)\n const timerRef = React.useRef(null)\n const inputRef = React.useRef(null)\n const queryRef = React.useRef('')\n queryRef.current = query\n const activePathRef = React.useRef(activePath)\n activePathRef.current = activePath\n // 请求参数 ref:防抖/立即重搜闭包统一读最新值,避免陈旧选项\n const requestRef = React.useRef({ matchCase, wholeWord, regex, include: [], exclude: [] })\n requestRef.current = {\n matchCase, wholeWord, regex,\n include: onlyActive ? (activePath ? [activePath] : []) : splitGlobs(includeText),\n exclude: excludeOn ? splitGlobs(excludeText) : [],\n }\n\n // 按会话恢复上次查询、选项与过滤模式(VSCode 记忆搜索词)\n React.useEffect(() => {\n if (!sessionId) return\n try {\n const saved = JSON.parse(localStorage.getItem('edrv.search.v1.' + String(sessionId)) || 'null')\n if (saved && typeof saved === 'object') {\n if (typeof saved.query === 'string') setQuery(saved.query)\n if (typeof saved.matchCase === 'boolean') setMatchCase(saved.matchCase)\n if (typeof saved.wholeWord === 'boolean') setWholeWord(saved.wholeWord)\n if (typeof saved.regex === 'boolean') setRegex(saved.regex)\n if (typeof saved.includeText === 'string') setIncludeText(saved.includeText)\n if (typeof saved.excludeText === 'string') setExcludeText(saved.excludeText)\n if (typeof saved.onlyActive === 'boolean') setOnlyActive(saved.onlyActive)\n if (typeof saved.excludeOn === 'boolean') setExcludeOn(saved.excludeOn)\n if (typeof saved.sectionOpen === 'boolean') setSectionOpen(saved.sectionOpen)\n }\n } catch (e) { /* 损坏忽略 */ }\n }, [sessionId])\n\n // 查询/选项/过滤变化 → 持久化\n React.useEffect(() => {\n if (!sessionId) return\n try {\n localStorage.setItem('edrv.search.v1.' + String(sessionId), JSON.stringify({\n query, matchCase, wholeWord, regex, includeText, excludeText, onlyActive, excludeOn, sectionOpen,\n }))\n } catch (e) { /* 忽略 */ }\n }, [sessionId, query, matchCase, wholeWord, regex, includeText, excludeText, onlyActive, excludeOn, sectionOpen])\n\n /**\n * 执行内容搜索(请求参数从 ref 读最新值)。\n * @param text 搜索词\n */\n const runSearch = (text) => {\n const s = ++seqRef.current\n const clean = String(text ?? '').trim()\n if (clean.length < 2) { setMatches(null); setStatus('idle'); return }\n const req = requestRef.current\n setStatus('searching')\n setError('')\n rpc('edrv.searchContent', {\n sessionId, query: clean,\n matchCase: req.matchCase, wholeWord: req.wholeWord, regex: req.regex,\n include: req.include, exclude: req.exclude,\n }).then((res) => {\n if (s !== seqRef.current) return\n if (res && res.ok) {\n setMatches(Array.isArray(res.matches) ? res.matches : [])\n setTruncated(res.truncated === true)\n setStatus('done')\n } else {\n setError(res?.error ? String(res.error) : '搜索失败')\n setMatches(null)\n setStatus('error')\n }\n }).catch((e) => {\n if (s !== seqRef.current) return\n setError('搜索异常:' + String(e))\n setMatches(null)\n setStatus('error')\n })\n }\n\n /**\n * 输入变化:防抖触发搜索。\n * @param value 新输入\n */\n const onChange = (value) => {\n setQuery(value)\n if (timerRef.current) clearTimeout(timerRef.current)\n timerRef.current = setTimeout(() => runSearch(value), DEBOUNCE_MS)\n }\n\n /**\n * 输入框通用防抖重搜(包含/排除模式输入)。\n * @param setter 状态写入函数\n * @param value 新值\n */\n const onChangeDebounced = (setter, value) => {\n setter(value)\n if (timerRef.current) clearTimeout(timerRef.current)\n timerRef.current = setTimeout(() => runSearch(queryRef.current), DEBOUNCE_MS)\n }\n\n /**\n * 立即重搜(查询 ≥2 字符时);先同步 ref 避免本次调用读到旧请求参数。\n * @param next 新的请求参数字段\n */\n const rerun = (next) => {\n requestRef.current = Object.assign({}, requestRef.current, next)\n if (timerRef.current) clearTimeout(timerRef.current)\n if (String(queryRef.current).trim().length >= 2) runSearch(queryRef.current)\n }\n\n /** 选项开关切换(大小写/全词/正则/书本/设置):更新状态 + 立即重搜。 */\n const toggleOpt = (key, value) => {\n if (key === 'matchCase') setMatchCase(value)\n if (key === 'wholeWord') setWholeWord(value)\n if (key === 'regex') setRegex(value)\n if (key === 'onlyActive') setOnlyActive(value)\n if (key === 'excludeOn') setExcludeOn(value)\n const base = { matchCase, wholeWord, regex, onlyActive, excludeOn }\n base[key] = value\n rerun({\n matchCase: base.matchCase, wholeWord: base.wholeWord, regex: base.regex,\n include: base.onlyActive ? (activePathRef.current ? [activePathRef.current] : []) : splitGlobs(includeText),\n exclude: base.excludeOn ? splitGlobs(excludeText) : [],\n })\n }\n\n // Ctrl+Shift+F 重复触发时聚焦输入框(EditorView 派发 edrv:search-focus)\n React.useEffect(() => {\n const onFocus = () => inputRef.current?.focus?.()\n window.addEventListener('edrv:search-focus', onFocus)\n return () => window.removeEventListener('edrv:search-focus', onFocus)\n }, [])\n\n // 结果按文件分组(保持 rg 输出顺序)\n const groups = React.useMemo(() => {\n if (!Array.isArray(matches)) return []\n const map = new Map()\n for (const m of matches) {\n let list = map.get(m.path)\n if (!list) { list = []; map.set(m.path, list) }\n list.push(m)\n }\n return [...map.entries()].map(([path, list]) => ({ path, count: list.length, matches: list }))\n }, [matches])\n\n const totalFiles = groups.length\n const totalMatches = Array.isArray(matches) ? matches.length : 0\n const toggleGroup = (path) => setCollapsed((prev) => Object.assign({}, prev, { [path]: prev[path] === true ? false : true }))\n\n const optsBar = React.createElement('div', { className: 'edrv-search-opts' },\n React.createElement('button', { className: 'edrv-search-opt' + (matchCase ? ' on' : ''), title: '区分大小写', 'aria-pressed': matchCase, onClick: () => toggleOpt('matchCase', !matchCase) }, 'Aa'),\n React.createElement('button', { className: 'edrv-search-opt' + (wholeWord ? ' on' : ''), title: '全字匹配', 'aria-pressed': wholeWord, onClick: () => toggleOpt('wholeWord', !wholeWord) }, 'Ab'),\n React.createElement('button', { className: 'edrv-search-opt' + (regex ? ' on' : ''), title: '使用正则表达式', 'aria-pressed': regex, onClick: () => toggleOpt('regex', !regex) }, '.*'),\n React.createElement('span', { className: 'edrv-search-spacer' }),\n React.createElement('button', { className: 'edrv-search-opt' + (sectionOpen ? ' on' : ''), title: sectionOpen ? '收起文件过滤' : '文件过滤(包含/排除)', 'aria-pressed': sectionOpen, onClick: () => setSectionOpen((v) => !v) }, '⚙'))\n\n const filterRows = sectionOpen\n ? React.createElement('div', { className: 'edrv-search-rows' },\n React.createElement('div', { className: 'edrv-search-row' },\n React.createElement('input', {\n className: 'edrv-search-field' + (onlyActive ? ' dim' : ''), placeholder: INCLUDE_PLACEHOLDER,\n value: includeText, disabled: onlyActive,\n title: onlyActive ? '已启用「仅当前打开文件」,忽略此输入' : '',\n onChange: (e) => onChangeDebounced(setIncludeText, e.target.value),\n }),\n React.createElement('button', {\n className: 'edrv-search-toggle' + (onlyActive ? ' on' : ''), title: activePath ? '仅在当前打开的文件中搜索' : '无打开的文件(需先打开文件)',\n 'aria-pressed': onlyActive, disabled: !activePath,\n onClick: () => toggleOpt('onlyActive', !onlyActive),\n }, '📖')),\n React.createElement('div', { className: 'edrv-search-row' },\n React.createElement('input', {\n className: 'edrv-search-field' + (excludeOn ? '' : ' dim'), placeholder: INCLUDE_PLACEHOLDER,\n value: excludeText, disabled: !excludeOn,\n title: excludeOn ? '' : '排除功能未启用,先点击右侧按钮开启',\n onChange: (e) => onChangeDebounced(setExcludeText, e.target.value),\n }),\n React.createElement('button', {\n className: 'edrv-search-toggle' + (excludeOn ? ' on' : ''), title: '启用排除文件(忽略下方模式的命中)',\n 'aria-pressed': excludeOn,\n onClick: () => toggleOpt('excludeOn', !excludeOn),\n }, '⚙')))\n : null\n\n const summary = status === 'done'\n ? React.createElement('div', { className: 'edrv-search-summary' },\n totalFiles > 0\n ? totalFiles + ' 个文件 · ' + totalMatches + ' 处匹配' + (truncated ? '(已截断)' : '')\n : '无匹配结果')\n : null\n\n const body = (() => {\n if (status === 'searching') return React.createElement('div', { className: 'edrv-search-empty' }, '搜索中…')\n if (status === 'error') return React.createElement('div', { className: 'edrv-search-error' }, error)\n if (status === 'done' && !groups.length) return React.createElement('div', { className: 'edrv-search-empty' }, '无匹配结果')\n if (status !== 'done') return React.createElement('div', { className: 'edrv-search-empty' }, '输入至少 2 个字符开始搜索')\n return React.createElement('div', { className: 'edrv-search-results' },\n groups.map((group) => {\n const open = collapsed[group.path] !== true\n return React.createElement('div', { key: group.path, className: 'edrv-search-group' },\n React.createElement('div', { className: 'edrv-search-file', title: group.path, onClick: () => toggleGroup(group.path) },\n React.createElement('span', { className: 'edrv-search-chev' }, open ? '▾' : '▸'),\n React.createElement('span', { className: 'edrv-search-fname' }, String(group.path).split(/[\\\\/]/).pop() || group.path),\n React.createElement('span', { className: 'edrv-search-fdir' }, String(group.path).split(/[\\\\/]/).slice(0, -1).join('/')),\n React.createElement('span', { className: 'edrv-search-fcount' }, group.count)),\n open ? group.matches.map((m, i) => {\n const parts = splitHit(m.text, m.startColumn, m.endColumn)\n return React.createElement('div', { key: m.path + ':' + m.line + ':' + i, className: 'edrv-search-line' + (i % 2 ? ' alt' : ''), title: group.path + ':' + m.line, onClick: () => openFileAt(m.path, m.line, m.startColumn) },\n React.createElement('span', { className: 'edrv-search-ln' }, m.line),\n React.createElement('span', { className: 'edrv-search-text' },\n React.createElement('span', null, parts.before),\n React.createElement('mark', { className: 'edrv-search-hit' }, parts.hit),\n React.createElement('span', null, parts.after)))\n }) : null)\n }))\n })()\n\n return React.createElement('div', { className: 'edrv-search-panel' },\n React.createElement('div', { className: 'edrv-search-qrow' },\n React.createElement('input', {\n ref: inputRef, className: 'edrv-search-input', autoFocus: true, autoComplete: 'off', spellCheck: false,\n placeholder: '搜索',\n value: query,\n onChange: (e) => onChange(e.target.value),\n onKeyDown: (e) => {\n if (e.key === 'Enter') { if (timerRef.current) clearTimeout(timerRef.current); runSearch(queryRef.current) }\n if (e.key === 'Escape') inputRef.current?.blur?.()\n },\n })),\n optsBar,\n filterRows,\n summary,\n body)\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — 侧边栏面板定义(文件管理 + 搜索)。\n * 作者 ddj 2026-08-26 / 2026-08-26\n */\nimport React from 'react'\nimport { FileExplorer } from './FileExplorer.js'\nimport { SearchPanel } from './SearchPanel.js'\nimport type { SidebarPanelDef, SidebarCtx } from '../types.js'\n\n/**\n * 构造文件管理面板定义。\n * @author ddj 2026年08月26号\n * @returns 面板定义(含活动栏徽标 = 差异文件总数)\n */\nexport function createFilePanel(): SidebarPanelDef {\n return {\n id: 'explorer',\n title: '文件管理',\n icon: '📁',\n order: 10,\n badge: (ctx: SidebarCtx) => (ctx.sum && ctx.sum.totalFiles > 0 ? ctx.sum.totalFiles : null),\n render: (ctx: SidebarCtx) => React.createElement(FileExplorer, { ctx }),\n }\n}\n\n/**\n * 构造搜索面板定义。\n * @author ddj 2026年08月30号\n * @returns 面板定义(无徽标;活动栏图标 🔍)\n */\nexport function createSearchPanel(): SidebarPanelDef {\n return {\n id: 'search',\n title: '搜索',\n icon: '🔍',\n order: 15,\n render: (ctx: SidebarCtx) => React.createElement(SearchPanel, { ctx }),\n }\n}\n","/**\n * dsh-vscode-mode client — 文件管理右键菜单内置项。\n * 首个内置项:「在文件浏览器中打开」(文件→OS Explorer 定位选中、目录→打开目录)。\n * 反馈统一走 ctx.notify(由 EditorView 提供,落到编辑区路径栏状态)。\n * 作者 ddj 2026-08-27\n */\nimport { revealInExplorer } from '../fileReveal.js'\nimport type { TreeMenuItem } from './contextMenu.js'\n\n/**\n * 构造内置右键菜单项列表(后续内置项直接追加)。\n * @author ddj 2026年08月27号\n * @returns 内置菜单项数组\n */\nexport function createDefaultFileMenuItems(): TreeMenuItem[] {\n return [\n {\n id: 'reveal-in-explorer',\n label: '在文件浏览器中打开',\n order: 0,\n run: (target, ctx) => {\n void revealInExplorer(ctx.sessionId, target.path).then((outcome) => {\n ctx.notify?.(outcome.ok ? '已在文件浏览器中打开' : '打开失败:' + (outcome.error ?? '未知错误'))\n })\n },\n },\n ]\n}\n","/**\n * dsh-vscode-mode client — 大纲兜底解析器(纯函数,无 DOM/Monaco 依赖,node 可测)。\n * 覆盖无内置 document symbol provider 的语言:markdown/mdx、python、shell、powershell、\n * lua、go、rust、yaml、ini(toml)、花括号语言(c/cpp/csharp/java/php/ruby/kotlin/swift/dart)。\n * TS/JS/JSON/CSS/HTML 有 Monaco 原生 provider,不走这里。\n * 作者 ddj 2026-08-27\n */\nimport type { OutlineSymbol } from './types.js'\n\n/** monaco SymbolKind 数值常量(与 LSP SymbolKind 一致,面板渲染按此分组)。 */\nexport const SK = {\n File: 0, Module: 1, Namespace: 2, Package: 3, Class: 4, Method: 5,\n Property: 6, Field: 7, Constructor: 8, Enum: 9, Interface: 10,\n Function: 11, Variable: 12, Constant: 13, String: 14, Number: 15,\n Boolean: 16, Array: 17, Object: 18, Key: 19, Null: 20, EnumMember: 21,\n Struct: 22, Event: 23, Operator: 24, TypeParameter: 25,\n} as const\n\n/** 花括号语言的泛型函数名排除集(避免误把控制流/关键字当符号)。 */\nconst BRACE_KW = new Set([\n 'if', 'for', 'while', 'switch', 'catch', 'foreach', 'using', 'with', 'when',\n 'match', 'return', 'new', 'in', 'of', 'do', 'else', 'elif', 'then', 'yield',\n 'await', 'typeof', 'instanceof', 'case', 'default', 'try', 'finally', 'throw',\n])\n\n/** 花括号语言的类型关键字 → SymbolKind。 */\nconst BRACE_TYPE_KIND: Record<string, number> = {\n class: SK.Class, struct: SK.Struct, interface: SK.Interface, enum: SK.Enum,\n namespace: SK.Namespace, module: SK.Module, trait: SK.Interface, record: SK.Class,\n}\n\n/** 按文档序(先序)补齐每个符号的 endLine:叶子取“下一个符号起行 - 1”,容器取末子 endLine。 */\nfunction computeEnds(symbols: OutlineSymbol[], lastLine: number): void {\n const order: OutlineSymbol[] = []\n const collect = (list: OutlineSymbol[]): void => {\n for (const s of list) {\n order.push(s)\n if (s.children && s.children.length) collect(s.children)\n }\n }\n collect(symbols)\n for (let i = order.length - 1; i >= 0; i--) {\n const s = order[i]\n const kids = s.children ?? []\n if (kids.length) {\n s.endLine = Math.max(s.startLine, kids[kids.length - 1].endLine)\n } else {\n const next = order[i + 1]\n const end = next ? Math.max(s.startLine, next.startLine - 1) : lastLine\n s.endLine = Math.max(s.startLine, Math.min(end, lastLine))\n }\n }\n}\n\n/** 构造单行符号(起始行=跳转行=所在行;detail 为截断后的声明文本)。 */\nfunction mk(lineIndex: number, name: string, kind: number, raw: string): OutlineSymbol {\n const detail = raw.trim().replace(/\\s+/g, ' ').slice(0, 80)\n const line = lineIndex + 1\n const out: OutlineSymbol = { name, kind, startLine: line, endLine: line, selectLine: line }\n if (detail && detail !== name) out.detail = detail\n return out\n}\n\n/** Markdown/mdx:`#` 级标题,层级嵌套。 */\nfunction parseMarkdown(text: string): OutlineSymbol[] {\n const roots: OutlineSymbol[] = []\n const stack: Array<{ level: number; item: OutlineSymbol }> = []\n const lines = text.split('\\n')\n for (let i = 0; i < lines.length; i++) {\n const m = /^(\\#{1,6})\\s+(.+?)\\s*#*\\s*$/.exec(lines[i])\n if (!m) continue\n const item: OutlineSymbol = {\n name: m[2].trim(), kind: SK.Namespace,\n startLine: i + 1, endLine: i + 1, selectLine: i + 1, children: [],\n }\n while (stack.length && stack[stack.length - 1].level >= m[1].length) stack.pop()\n const parent = stack.length ? stack[stack.length - 1].item : null\n ;(parent ? parent.children : roots)!.push(item)\n stack.push({ level: m[1].length, item })\n }\n computeEnds(roots, lines.length)\n return roots\n}\n\n/** Python:def/class 按缩进栈嵌套。 */\nfunction parsePython(text: string): OutlineSymbol[] {\n const roots: OutlineSymbol[] = []\n const stack: Array<{ indent: number; item: OutlineSymbol }> = []\n const lines = text.split('\\n')\n for (let i = 0; i < lines.length; i++) {\n const m = /^([ \\t]*)(?:class|def)\\s+([A-Za-z_]\\w*)\\s*[(:]/.exec(lines[i])\n if (!m) continue\n const indent = m[1].replace(/\\t/g, ' ').length\n const isClass = /class\\s/.test(lines[i])\n const item: OutlineSymbol = {\n name: m[2], kind: isClass ? SK.Class : SK.Function,\n startLine: i + 1, endLine: i + 1, selectLine: i + 1, children: [],\n }\n while (stack.length && stack[stack.length - 1].indent >= indent) stack.pop()\n const parent = stack.length ? stack[stack.length - 1].item : null\n ;(parent ? parent.children : roots)!.push(item)\n stack.push({ indent, item })\n }\n computeEnds(roots, lines.length)\n return roots\n}\n\n/** Shell:`name() {` 函数。 */\nfunction parseShell(text: string): OutlineSymbol[] {\n const out: OutlineSymbol[] = []\n const lines = text.split('\\n')\n for (let i = 0; i < lines.length; i++) {\n const m = /^[ \\t]*([A-Za-z_][A-Za-z0-9_]*)[ \\t]*\\(\\)[ \\t]*\\{/.exec(lines[i])\n if (m) out.push(mk(i, m[1], SK.Function, lines[i]))\n }\n computeEnds(out, lines.length)\n return out\n}\n\n/** PowerShell:`function Name {` / `filter Name {`。 */\nfunction parsePwsh(text: string): OutlineSymbol[] {\n const out: OutlineSymbol[] = []\n const lines = text.split('\\n')\n for (let i = 0; i < lines.length; i++) {\n const m = /^[ \\t]*(?:function|filter)[ \\t]+([\\w.-]+)/.exec(lines[i])\n if (m) out.push(mk(i, m[1], SK.Function, lines[i]))\n }\n computeEnds(out, lines.length)\n return out\n}\n\n/** Lua:`function Foo:bar` / `M.bar = class|function`。 */\nfunction parseLua(text: string): OutlineSymbol[] {\n const out: OutlineSymbol[] = []\n const lines = text.split('\\n')\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]\n if (/^\\s*--/.test(line)) continue\n const fm = /^[ \\t]*(?:local[ \\t]+)?function[ \\t]+([A-Za-z_][\\w.:]*)/.exec(line)\n if (fm) { out.push(mk(i, fm[1], SK.Function, line)); continue }\n const cm = /^[ \\t]*([A-Za-z_][\\w.]*)[ \\t]*=[ \\t]*(?:class|function)\\b/.exec(line)\n if (cm) out.push(mk(i, cm[1], /class\\b/.test(line) ? SK.Class : SK.Function, line))\n }\n computeEnds(out, lines.length)\n return out\n}\n\n/** Go:func(含 receiver)/ type。 */\nfunction parseGo(text: string): OutlineSymbol[] {\n const out: OutlineSymbol[] = []\n const lines = text.split('\\n')\n for (let i = 0; i < lines.length; i++) {\n const fm = /^[ \\t]*func[ \\t]+(?:\\([^)]*\\)[ \\t]*)?([A-Za-z_]\\w*)/.exec(lines[i])\n if (fm) { out.push(mk(i, fm[1], SK.Function, lines[i])); continue }\n const tm = /^[ \\t]*type[ \\t]+([A-Za-z_]\\w*)/.exec(lines[i])\n if (tm) out.push(mk(i, tm[1], SK.Struct, lines[i]))\n }\n computeEnds(out, lines.length)\n return out\n}\n\n/** Rust:fn/struct/enum/trait/impl/mod/type。 */\nfunction parseRust(text: string): OutlineSymbol[] {\n const out: OutlineSymbol[] = []\n const lines = text.split('\\n')\n const kindOf: Record<string, number> = {\n fn: SK.Function, struct: SK.Struct, enum: SK.Enum, trait: SK.Interface,\n impl: SK.Module, mod: SK.Module, type: SK.TypeParameter,\n }\n for (let i = 0; i < lines.length; i++) {\n const m = /^[ \\t]*(?:pub(?:\\([^)]*\\))?[ \\t]+)?(fn|struct|enum|trait|impl|mod|type)[ \\t]+([A-Za-z_]\\w*)/.exec(lines[i])\n if (m && kindOf[m[1]]) out.push(mk(i, m[2], kindOf[m[1]], lines[i]))\n }\n computeEnds(out, lines.length)\n return out\n}\n\n/** YAML:仅顶层键。 */\nfunction parseYaml(text: string): OutlineSymbol[] {\n const out: OutlineSymbol[] = []\n const lines = text.split('\\n')\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]\n if (!line.trim() || /^\\s/.test(line) || /^\\s*[#-]/.test(line)) continue\n const m = /^([A-Za-z0-9_.\\-]+)\\s*:/.exec(line)\n if (m) out.push(mk(i, m[1], SK.Key, line))\n }\n computeEnds(out, lines.length)\n return out\n}\n\n/** INI/TOML:`[section]` + `key=value`。 */\nfunction parseIni(text: string): OutlineSymbol[] {\n const out: OutlineSymbol[] = []\n const lines = text.split('\\n')\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]\n if (!line.trim() || /^\\s*[;#]/.test(line)) continue\n const sm = /^\\[([^\\]]+)\\]/.exec(line)\n if (sm) { out.push(mk(i, sm[1], SK.Namespace, line)); continue }\n const km = /^([A-Za-z0-9_.\\-]+)\\s*[=:]/.exec(line.trim())\n if (km) out.push(mk(i, km[1], SK.Key, line))\n }\n computeEnds(out, lines.length)\n return out\n}\n\n/** 花括号语言(C 族/JVM/.NET):类型声明 + 泛型函数扫描(扁平,best-effort)。 */\nfunction parseBrace(text: string): OutlineSymbol[] {\n const out: OutlineSymbol[] = []\n const lines = text.split('\\n')\n const typeRe = /^[ \\t]*(?:(?:public|private|protected|internal|static|final|abstract|sealed|readonly|export|declare|async|open|extern|virtual|override|const|global|pub|local)\\s+)*(class|struct|interface|enum|namespace|module|trait|record)\\s+([A-Za-z_]\\w*)/\n // 泛型函数:允许任意“字词型”返回类型/修饰符前缀(含 :: 限定名),名字后跟 ( 且不以 ; 结尾\n const funcRe = /^[ \\t]*(?:[\\w<>,*&\\[\\].:]+\\s+)*([A-Za-z_]\\w*)\\s*(?:<[^>]*>)?\\s*\\(/\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]\n const t = line.trim()\n if (!t || /^\\s*\\*/.test(line)) continue\n const tm = typeRe.exec(line)\n if (tm) { out.push(mk(i, tm[2], BRACE_TYPE_KIND[tm[1]] ?? SK.Class, line)); continue }\n const fm = funcRe.exec(line)\n if (!fm) continue\n if (BRACE_KW.has(fm[1]) || /;\\s*$/.test(t)) continue\n out.push(mk(i, fm[1], SK.Function, line))\n }\n computeEnds(out, lines.length)\n return out\n}\n\n/**\n * 按 Monaco languageId 解析大纲符号(纯函数)。\n * @author ddj 2026年08月27号\n * @param languageId Monaco 语言 id\n * @param text 文件全文\n * @returns 归一化大纲符号树\n */\nexport function parseOutline(languageId: string, text: string): OutlineSymbol[] {\n switch (languageId) {\n case 'markdown':\n case 'mdx':\n return parseMarkdown(text)\n case 'python':\n return parsePython(text)\n case 'shell':\n return parseShell(text)\n case 'powershell':\n return parsePwsh(text)\n case 'lua':\n return parseLua(text)\n case 'go':\n return parseGo(text)\n case 'rust':\n return parseRust(text)\n case 'yaml':\n return parseYaml(text)\n case 'ini':\n return parseIni(text)\n case 'c':\n case 'cpp':\n case 'csharp':\n case 'java':\n case 'php':\n case 'ruby':\n case 'kotlin':\n case 'swift':\n case 'dart':\n return parseBrace(text)\n default:\n return []\n }\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — 大纲源注册表 + 内置数据源(monaco / fallback)。\n * 解析规则:按优先级降序遍历源,首个非空结果生效;全空 → 空态。\n * monaco 源吃 Monaco 原生 document symbol provider(ts/json/css/html 与未来\n * 第三方注册的 provider);fallback 源兜底无内置提供方的语言(parse.ts)。\n * 注册表对外 provide 为 edrvOutlineSources,第三方语言插件可注册更高优先级源。\n * 作者 ddj 2026-08-27\n */\nimport type { OutlineSourceRegistry, OutlineSource, OutlineSourceInput, OutlineSymbol } from './types.js'\nimport { parseOutline } from './parse.js'\n\n/** Monaco 原生有 document symbol provider 的语言(无需 fallback)。 */\nexport const OUTLINE_MONACO_LANGS = new Set([\n 'typescript', 'javascript', 'json', 'jsonc', 'css', 'scss', 'less', 'html',\n])\n\n/** 无内置 provider、由 parse.ts 兜底的语言。 */\nexport const OUTLINE_FALLBACK_LANGS = new Set([\n 'markdown', 'mdx', 'python', 'shell', 'powershell', 'lua', 'go', 'rust',\n 'yaml', 'ini', 'c', 'cpp', 'csharp', 'java', 'php', 'ruby', 'kotlin',\n 'swift', 'dart',\n])\n\n/**\n * 创建生命周期独立的大纲源注册表。\n * @author ddj 2026年08月27号\n * @returns 大纲源注册表\n */\nexport function createOutlineSourceRegistry(): OutlineSourceRegistry {\n const entries = new Map<string, OutlineSource>()\n const listeners = new Set<() => void>()\n const notify = (): void => {\n for (const listener of listeners) listener()\n }\n const list = (): readonly OutlineSource[] =>\n [...entries.values()].sort((a, b) => (b.priority - a.priority) || (a.id < b.id ? -1 : a.id > b.id ? 1 : 0))\n return {\n register(source: OutlineSource): () => void {\n if (!source || !source.id || typeof source.get !== 'function') throw new TypeError('大纲源必须提供 id 与 get')\n entries.set(source.id, source)\n notify()\n return () => {\n if (entries.get(source.id) !== source) return\n entries.delete(source.id)\n notify()\n }\n },\n list,\n subscribe(listener: () => void): () => void {\n listeners.add(listener)\n return () => listeners.delete(listener)\n },\n get: (id: string) => entries.get(id),\n }\n}\n\n/** 归一化 Monaco OutlineElement(getTopLevelSymbols 产物)→ OutlineSymbol。 */\nfunction normalizeMonaco(el): OutlineSymbol | null {\n if (!el || typeof el.name !== 'string') return null\n const range = el.range || {}\n const sel = el.selectionRange || range\n const startLine = Math.max(1, Number(sel.startLineNumber ?? range.startLineNumber ?? 1))\n const endLine = Math.max(1, Number(range.endLineNumber ?? startLine))\n const out: OutlineSymbol = {\n name: el.name,\n kind: typeof el.kind === 'number' ? el.kind : 0,\n startLine: Math.max(1, Number(range.startLineNumber ?? startLine)),\n endLine,\n selectLine: startLine,\n }\n if (typeof el.detail === 'string' && el.detail) out.detail = el.detail\n if (Array.isArray(el.children) && el.children.length) {\n const kids = el.children.map(normalizeMonaco).filter(Boolean)\n if (kids.length) out.children = kids\n }\n return out\n}\n\n/**\n * 按优先级解析大纲符号:首个非空结果生效(出错源跳过,落入下一优先级)。\n * @author ddj 2026年08月27号\n * @param sources 大纲源注册表\n * @param input 当前快照(languageId/model/editor/monaco)\n * @returns 归一化符号树(无符号时为空数组)\n */\nexport async function resolveOutline(sources: OutlineSourceRegistry, input: OutlineSourceInput): Promise<OutlineSymbol[]> {\n for (const source of sources.list()) {\n let supports = false\n try { supports = source.provides(input.languageId) } catch { supports = false }\n if (!supports) continue\n let items: OutlineSymbol[] | null = null\n try { items = await source.get(input) } catch { items = null }\n if (items && items.length) return items\n }\n return []\n}\n\n/**\n * 注册内置大纲源(monaco=50 / fallback=30)。\n * @author ddj 2026年08月27号\n * @param registry 目标注册表\n * @returns 注销函数(同时注销全部内置源)\n */\nexport function registerBuiltinOutlineSources(registry: OutlineSourceRegistry): () => void {\n const disposers = [\n registry.register({\n id: 'monaco',\n priority: 50,\n provides: () => true,\n async get(input: OutlineSourceInput): Promise<OutlineSymbol[]> {\n const ed = input.editor\n const model = input.model\n const cmd = ed?._commandService\n if (!cmd || typeof cmd.executeCommand !== 'function') return []\n const uri = model?.uri\n if (!uri) return []\n const list = await cmd.executeCommand('_executeDocumentSymbolProvider', uri)\n return Array.isArray(list) ? list.map(normalizeMonaco).filter(Boolean) : []\n },\n }),\n registry.register({\n id: 'fallback',\n priority: 30,\n provides: (languageId: string) => OUTLINE_FALLBACK_LANGS.has(languageId),\n async get(input: OutlineSourceInput): Promise<OutlineSymbol[]> {\n const model = input.model\n if (!model || typeof model.getValue !== 'function') return []\n return parseOutline(input.languageId, model.getValue())\n },\n }),\n ]\n return () => { for (const dispose of disposers) dispose() }\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — 侧边栏「大纲」面板。\n * 数据源经 resolveOutline(源注册表,优先级降序、首个非空生效)解析当前活动文件符号:\n * monaco 源吃原生 document symbol provider,fallback 源兜底无内置提供方的语言。\n * 交互:点击符号跳转编辑器、▸/▾ 折叠、光标所在符号高亮、空/加载/错误态。\n * 作者 ddj 2026-08-27\n */\nimport React from 'react'\nimport { resolveOutline } from './sources.js'\nimport type { SidebarCtx } from '../sidebar/types.js'\n\n/** 渲染符号数上限(防超大文件卡顿,超出显示截断提示)。 */\nconst RENDER_CAP = 800\n\n/** kind 分组元信息(字形 + 样式类)。 */\nconst KIND_GROUPS = {\n func: { glyph: 'ƒ', cls: 'edrv-ol-func' },\n type: { glyph: 'C', cls: 'edrv-ol-type' },\n data: { glyph: '•', cls: 'edrv-ol-data' },\n ns: { glyph: '▤', cls: 'edrv-ol-ns' },\n key: { glyph: '·', cls: 'edrv-ol-key' },\n}\n\n/** SymbolKind 数值 → 分组(File0..Package3=ns;Class4/Enum9/Interface10/Struct22/TypeParameter25=type;Method5/Constructor8/Function11=func;Key19/EnumMember21=key)。 */\nfunction kindMeta(kind) {\n const k = kind | 0\n if (k <= 3) return KIND_GROUPS.ns\n if (k === 4 || k === 9 || k === 10 || k === 22 || k === 25) return KIND_GROUPS.type\n if (k === 5 || k === 8 || k === 11) return KIND_GROUPS.func\n if (k === 19 || k === 21) return KIND_GROUPS.key\n return KIND_GROUPS.data\n}\n\n/**\n * 大纲面板主体。\n * @param props.ctx 面板共享上下文(editor/outlineSources/activePath)\n */\nexport function OutlinePanel(props) {\n const ctx = props?.ctx\n const activePath = ctx?.activePath ?? null\n const [symbols, setSymbols] = React.useState(null)\n const [error, setError] = React.useState(null)\n const [collapsed, setCollapsed] = React.useState({})\n const [cursorLine, setCursorLine] = React.useState(null)\n const seqRef = React.useRef(0)\n // ref 镜像:refresh 稳定([]),监听器只挂一次,避免 EditorView 每渲染重建 ctx 造成抖动\n const ctxRef = React.useRef(ctx)\n ctxRef.current = ctx\n const activeRef = React.useRef(activePath)\n activeRef.current = activePath\n const sourcesRef = React.useRef(ctx?.outlineSources)\n sourcesRef.current = ctx?.outlineSources\n\n const refresh = React.useCallback(() => {\n const c = ctxRef.current\n const ed = c?.editor?.()\n const model = ed?.getModel?.()\n const seq = ++seqRef.current\n if (!ed || !model) { setSymbols(null); setError(null); return }\n const uriPath = model?.uri?.path\n const modelPath = uriPath ? decodeURIComponent(String(uriPath).replace(/^\\//, '')) : null\n const active = activeRef.current\n if (active && modelPath !== active) { setSymbols(null); setError(null); return }\n const sources = sourcesRef.current\n if (!sources) { setSymbols([]); setError(null); return }\n setError(null)\n resolveOutline(sources, { languageId: model.getLanguageId(), model, editor: ed, monaco: window.monaco })\n .then((list) => { if (seq === seqRef.current) setSymbols(list || []) })\n .catch((e) => { if (seq === seqRef.current) { setError(String(e?.message ?? e)); setSymbols(null) } })\n }, [])\n\n // 编辑器监听:模型切换/内容编辑(防抖)/光标移动 + edrv:refresh;\n // 编辑器未就绪时轮询等待(避免面板先于 Monaco 挂载后永久停在加载态)\n React.useEffect(() => {\n const disposers = []\n let debounceTimer = null\n let waitTimer = null\n const attach = () => {\n const ed = ctxRef.current?.editor?.()\n if (!ed) return false\n let contentDisposable = null\n const subContent = (model) => {\n if (contentDisposable) { contentDisposable.dispose(); contentDisposable = null }\n contentDisposable = model?.onDidChangeContent?.(() => {\n if (debounceTimer) clearTimeout(debounceTimer)\n debounceTimer = setTimeout(() => { debounceTimer = null; refresh() }, 300)\n }) ?? null\n }\n const onModel = () => { subContent(ed.getModel?.()); refresh() }\n const onCursor = (e) => setCursorLine(e?.position?.lineNumber ?? null)\n subContent(ed.getModel?.())\n const subs = [\n ed.onDidChangeModel?.(onModel),\n ed.onDidChangeCursorPosition?.(onCursor),\n { dispose: () => { if (contentDisposable) contentDisposable.dispose() } },\n ]\n for (const s of subs) if (s) disposers.push(s)\n refresh()\n return true\n }\n const onRefresh = () => refresh()\n window.addEventListener('edrv:refresh', onRefresh)\n if (!attach()) {\n waitTimer = setInterval(() => { if (attach()) { clearInterval(waitTimer); waitTimer = null } }, 400)\n }\n return () => {\n if (debounceTimer) clearTimeout(debounceTimer)\n if (waitTimer) clearInterval(waitTimer)\n for (const d of disposers) if (d?.dispose) d.dispose()\n window.removeEventListener('edrv:refresh', onRefresh)\n }\n }, [refresh])\n\n // 活动文件变化 → 重拉\n React.useEffect(() => { refresh() }, [refresh, activePath])\n\n const jump = (sym) => {\n const ed = ctxRef.current?.editor?.()\n if (!ed) return\n const line = Math.max(1, sym?.selectLine ?? sym?.startLine ?? 1)\n ed.revealLineInCenter(line)\n ed.setPosition({ lineNumber: line, column: 1 })\n ed.focus()\n }\n\n const toggleCollapse = (key) => {\n setCollapsed((prev) => Object.assign({}, prev, { [key]: prev[key] === true ? false : true }))\n }\n\n const allKeys = React.useMemo(() => {\n const keys = []\n const walk = (list, prefix) => {\n for (let i = 0; i < list.length; i++) {\n const key = prefix ? prefix + '/' + i : String(i)\n const sym = list[i]\n if (sym.children && sym.children.length) { keys.push(key); walk(sym.children, key) }\n }\n }\n walk(symbols || [], '')\n return keys\n }, [symbols])\n\n const setAll = (value) => {\n const next = {}\n for (const key of allKeys) next[key] = value\n setCollapsed(next)\n }\n\n const renderTree = (list, depth, prefix) => {\n const rows = []\n const cap = Math.min(list.length, RENDER_CAP)\n for (let i = 0; i < cap; i++) {\n const sym = list[i]\n const key = prefix ? prefix + '/' + i : String(i)\n const kids = sym.children && sym.children.length ? sym.children : null\n const isCollapsed = collapsed[key] === true\n const meta = kindMeta(sym.kind)\n const active = cursorLine != null && sym.startLine <= cursorLine && cursorLine <= sym.endLine\n rows.push(React.createElement('div', {\n key,\n className: 'edrv-tree-row' + (active ? ' edrv-tree-active' : ''),\n title: sym.detail || sym.name,\n style: { paddingLeft: 6 + depth * 14 },\n onClick: () => jump(sym),\n },\n React.createElement('span', {\n className: 'edrv-tree-chev',\n onClick: (e) => { e.stopPropagation(); toggleCollapse(key) },\n }, kids ? (isCollapsed ? '▸' : '▾') : ''),\n React.createElement('span', { className: 'edrv-outline-kind ' + meta.cls }, meta.glyph),\n React.createElement('span', { className: 'edrv-tree-name' }, sym.name),\n (sym.detail ? React.createElement('span', { className: 'edrv-outline-detail' }, sym.detail) : null),\n React.createElement('span', { className: 'edrv-outline-ln' }, String(sym.selectLine ?? sym.startLine ?? ''))))\n if (kids && !isCollapsed) rows.push(...renderTree(kids, depth + 1, key))\n }\n if (list.length > RENDER_CAP) {\n rows.push(React.createElement('div', { key: 'cap', className: 'edrv-tree-loading' }, '符号过多,仅显示前 ' + RENDER_CAP + ' 个'))\n }\n return rows\n }\n\n const basename = activePath ? String(activePath).split(/[\\\\/]/).pop() || activePath : ''\n\n let body\n if (error) {\n body = React.createElement('div', { className: 'edrv-tree' },\n React.createElement('div', { className: 'edrv-tree-error' },\n React.createElement('span', null, String(error)),\n React.createElement('button', { className: 'edrv-side-btn', onClick: refresh }, '重试')))\n } else if (!activePath) {\n body = React.createElement('div', { className: 'edrv-tree' },\n React.createElement('div', { className: 'edrv-tree-loading' }, '未打开文件'))\n } else if (symbols === null) {\n body = React.createElement('div', { className: 'edrv-tree' },\n React.createElement('div', { className: 'edrv-tree-loading' }, '加载中…'))\n } else if (symbols.length === 0) {\n body = React.createElement('div', { className: 'edrv-tree' },\n React.createElement('div', { className: 'edrv-tree-loading' }, '该语言暂不支持大纲或文件无符号'))\n } else {\n body = React.createElement('div', { className: 'edrv-tree' }, ...renderTree(symbols, 0, ''))\n }\n\n return React.createElement('div', { className: 'edrv-side-panel' },\n React.createElement('div', { className: 'edrv-side-head' },\n React.createElement('span', { className: 'edrv-side-title' }, '大纲'),\n React.createElement('span', { className: 'edrv-side-root', title: activePath || '' }, basename),\n React.createElement('span', { style: { flex: 1 } }),\n React.createElement('button', { className: 'edrv-side-btn', title: '折叠全部', disabled: !(symbols && symbols.length), onClick: () => setAll(true) }, '−'),\n React.createElement('button', { className: 'edrv-side-btn', title: '展开全部', disabled: !(symbols && symbols.length), onClick: () => setAll(false) }, '+'),\n React.createElement('button', { className: 'edrv-side-btn', title: '刷新大纲', onClick: refresh }, '⟳')),\n body)\n}\n","// @ts-nocheck\n/**\n * dsh-vscode-mode client — 「大纲」面板定义(注册表一项)。\n * 数据源解析复用 outline/sources 的源注册表(ctx.outlineSources 注入)。\n * 作者 ddj 2026-08-27\n */\nimport React from 'react'\nimport { OutlinePanel } from './OutlinePanel.js'\nimport type { SidebarPanelDef, SidebarCtx } from '../sidebar/types.js'\n\n/**\n * 构造大纲面板定义。\n * @author ddj 2026年08月27号\n * @returns 面板定义(无徽标;活动栏图标 📜)\n */\nexport function createOutlinePanel(): SidebarPanelDef {\n return {\n id: 'outline',\n title: '大纲',\n icon: '📜',\n order: 20,\n render: (ctx: SidebarCtx) => React.createElement(OutlinePanel, { ctx }),\n }\n}\n","/**\n * dsh-vscode-mode client — 浏览器半入口:slot 注册 + 装配。\n * 挂点:betterSidebar「文件编辑」Tab(侧边栏形态,对话+编辑同屏;未装 dsh-better-sidebar 时\n * 回退 conversation.view 中央页签)+ conversation.input.dock 差异条 + header 差异角标。\n * 与 Host 通信:同源 fetch('/edrv/rpc')(shared/rpc 契约)。\n *\n * ⚠️ 跨版本 slot 装配(2026-08-21):新版 DSH 的 slots 系统要求 slot 必须由父 entry\n * 的 children table 先声明,直接 `ctx.slots.register({name:'conversation.view'})` 在\n * 声明未就绪时抛 `slot ... is not declared (a parent entry's children table must declare it)`。\n * 正确写法 = `ctx.slots.inject(name, () => ctx.slots.register(...))`:声明存在时同步\n * 执行,否则等待声明(官方 ui-conversation 自身即此模式);旧版(rc.8 及更早)同样支持,\n * 故跨版本兼容。slot 名:conversation.view / conversation.session.header.utilities /\n * conversation.input.dock。\n * 作者 ddj 2026-08-20\n */\nimport React from 'react'\nimport './styles/editor.css'\nimport { EditorView } from './ui/EditorView.js'\nimport { DiffBadge } from './ui/DiffBadge.js'\nimport { ConversationDiffDock } from './ui/ConversationDiffDock.js'\nimport { McpSettings } from './ui/McpSettings.js'\nimport { rpc } from './rpc.js'\nimport { loadMonaco } from './monaco/loader.js'\nimport { createFileOpenerRegistry, scanSidebar, type FileOpenContext } from './fileOpeners.js'\nimport type { FileOpenerRegistry } from './fileOpeners.js'\nimport { installOpenPathRouter, vscodeOpener, autoValue } from './openPathRouter.js'\nimport { SettingsContext } from './settingsContext.js'\nimport { SIDEBAR_PLUGIN, pickSettingsBinder, registerSlotSafely } from './compat.js'\nimport { detectSidebarService, installSideEditor, setEnsureSideEditor, SIDEBAR_INSTALL_CMD } from './sidebarBridge.js'\nimport { SideEditorTab } from './ui/SideEditorTab.js'\nimport { createAddToConversation } from './addToConversation.js'\nimport { createSidebarPanelRegistry } from './sidebar/registry.js'\nimport { createFilePanel } from './sidebar/panels/index.js'\nimport { createSearchPanel } from './sidebar/panels/index.js'\nimport { createTreeMenuRegistry } from './sidebar/contextMenu.js'\nimport { createDefaultFileMenuItems } from './sidebar/menuItems.js'\nimport { createOutlinePanel } from './outline/index.js'\nimport { createOutlineSourceRegistry, registerBuiltinOutlineSources } from './outline/sources.js'\nimport { keybindingsApply } from './keybindings.js'\nimport type { CompatAdapter } from '../shared/compat.js'\n\n// ⚠️ inject 只列必需服务:webUiSettings 是 @linxin666/dsh-client-ui-web-ui-settings 提供的\n// 可选兼容桥(非官方服务),列入 inject 会让未装该桥的部署启动时 entry 永久 pending,\n// web boot 直接失败('1 entry did not activate')。兼容层用 ctx.get 运行时探测 + 降级,不靠 inject。\nexport const inject = ['slots', 'timer', 'locale', 'connection', 'remote', 'workspaces', 'sessions', 'conversation', 'settingsScope']\n\n/**\n * 装配客户端:注册中央编辑区视图与 header 差异角标。\n * @author ddj 2026年08月20号\n * @param ctx 客户端根上下文(slots + timer 服务)\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function apply(ctx: any): void {\n const schedule = (fn: () => void, ms: number) => ctx.timeout(fn, ms)\n\n const registry: FileOpenerRegistry = createFileOpenerRegistry()\n const workspaces = ctx.get('workspaces')\n const sessions = ctx.get('sessions')\n\n // Monaco 加载时机:不再 DSH 启动即预热,改为进入会话界面(sessions.list.current 出现)后再后台加载,\n // 用户点开「文件编辑」页签即用;空闲时仍由 EditorView 挂载兜底加载。\n // 模块级 promise 去重,重复触发只首次真正加载;requestIdleCallback 让出会话首屏带宽,缺省回退延时调度;\n // 预热失败静默吞掉(loader 失败会重置 promise,页签打开时仍走原有加载/重试路径)。\n const monacoList = sessions?.list\n if (typeof window !== 'undefined' && monacoList && typeof monacoList.subscribe === 'function') {\n const list = monacoList as { getSnapshot: () => { current?: unknown }; subscribe: (listener: () => void) => () => void }\n const schedulePreload = () => {\n const preload = () => loadMonaco(() => {}).catch(() => {})\n if (typeof window.requestIdleCallback === 'function') window.requestIdleCallback(preload, { timeout: 2000 })\n else schedule(preload, 300)\n }\n const onSessionEnter = () => {\n if (!list.getSnapshot()?.current) return\n schedulePreload()\n }\n ctx.effect(() => list.subscribe(onSessionEnter), 'vscode-mode: monaco session trigger')\n onSessionEnter()\n }\n const originalOpenPath = workspaces?.openPath\n const binder = pickSettingsBinder(ctx)\n const settings = binder.scope\n let selected = autoValue('auto')\n /** 可选探测 betterSidebar 服务(不进 inject:缺失会让插件停靠等待,杀死回退路径)。 */\n let sideService = detectSidebarService(ctx)\n /** 「添加到对话」动作集:编辑区/Tab 右键菜单注入文件引用与代码块(conversation 服务缺失时各动作安全降级)。 */\n const addToConversation = createAddToConversation(ctx)\n\n /** 客户端侧兼容摘要(与 host 报告合并展示;惰性求值保证 HMR 后仍新鲜)。 */\n const compatSummary = (): CompatAdapter[] => [\n { name: '设置桥', active: settings !== undefined, note: settings !== undefined ? '使用 ' + binder.service + ' 桥' : '未绑定设置服务(fileOpenTool 持久化不可用)' },\n { name: '文件打开路由(workspaces.openPath)', active: Boolean(workspaces?.openPath), note: 'vscode 打开器优先,失败回退系统打开' },\n { name: '侧边栏打开器(' + SIDEBAR_PLUGIN + ')', active: registry.get(SIDEBAR_PLUGIN) !== undefined, note: registry.get(SIDEBAR_PLUGIN) !== undefined ? '已注册(优先级 80)' : '未检测到侧边栏打开能力' },\n { name: '侧边栏编辑区(' + SIDEBAR_PLUGIN + ')', active: sideService !== undefined, note: sideService !== undefined ? '编辑区=侧边栏 Tab(对话+编辑同屏)' : '未检测到;安装 dsh-better-sidebar 后刷新启用侧边栏形态(' + SIDEBAR_INSTALL_CMD + ')' },\n ]\n\n ctx.provide('fileOpeners', registry)\n ctx.effect(() => registry.register(vscodeOpener()), 'vscode-mode: file opener')\n\n // 侧边栏面板注册表(对外 provide,供本插件/第三方注册面板;文件管理为面板 #1)\n const sidebarPanels = createSidebarPanelRegistry()\n ctx.provide('edrvSidebarPanels', sidebarPanels)\n ctx.effect(() => sidebarPanels.register(createFilePanel()), 'vscode-mode: sidebar panel')\n // 搜索面板:活动栏「搜索」页签(Ctrl+Shift+F 唤起,VSCode 搜索视图形态)\n ctx.effect(() => sidebarPanels.register(createSearchPanel()), 'vscode-mode: sidebar panel search')\n // 文件右键菜单项注册表(对外 provide,供本插件/第三方注册;内置「在文件浏览器中打开」)\n const fileMenuItems = createTreeMenuRegistry()\n ctx.provide('edrvFileContextMenuItems', fileMenuItems)\n for (const item of createDefaultFileMenuItems()) {\n ctx.effect(() => fileMenuItems.register(item), 'vscode-mode: file context menu item ' + item.id)\n }\n // 大纲源注册表(公开预留口):第三方语言插件(LSP/VSIX 等)注册更高优先级源即可覆盖兜底\n const outlineSources = createOutlineSourceRegistry()\n ctx.provide('edrvOutlineSources', outlineSources)\n ctx.effect(() => registerBuiltinOutlineSources(outlineSources), 'vscode-mode: outline sources')\n ctx.effect(() => sidebarPanels.register(createOutlinePanel()), 'vscode-mode: sidebar panel outline')\n ctx.effect(() => registry.register({\n id: 'system', label: '系统默认应用', priority: 0,\n open: (path: string) => originalOpenPath.call(workspaces, path),\n }), 'vscode-mode: system file opener')\n ctx.effect(() => {\n const sidebar = scanSidebar(ctx)\n return sidebar ? registry.register(sidebar) : undefined\n }, 'vscode-mode: sidebar file opener')\n ctx.effect(() => {\n if (!settings) return undefined\n const sync = (): void => {\n const snapshot = settings.getSnapshot()\n if (snapshot.status === 'loading') return\n selected = autoValue(snapshot.value?.fileOpenTool)\n window.dispatchEvent(new CustomEvent('edrv:file-open-tool-change', { detail: { value: selected } }))\n }\n sync()\n return settings.subscribe(sync)\n }, 'vscode-mode: file opener setting sync')\n // 快捷键配置同步:设置提交后立即刷新键位匹配(编辑器/QuickOpen 按事件时读取)\n ctx.effect(() => {\n if (!settings) return undefined\n const sync = (): void => {\n const snapshot = settings.getSnapshot()\n if (snapshot.status === 'loading') return\n keybindingsApply(snapshot.value?.keybindings)\n }\n sync()\n return settings.subscribe(sync)\n }, 'vscode-mode: keybindings setting sync')\n if (workspaces?.openPath) {\n ctx.effect(() => installOpenPathRouter({\n workspaces,\n registry,\n selected: () => selected,\n context: () => {\n const current = sessions?.list?.getSnapshot?.()\n const sessionId = current?.current\n const summary = sessionId ? current?.byId?.[sessionId] : undefined\n return { sessionId, cwd: summary?.cwd } as FileOpenContext\n },\n logger: (message: string) => console.warn('[dsh-vscode-mode] ' + message),\n }), 'vscode-mode: file link routing')\n }\n\n // 中央「文件编辑」页签(旧形态回退):类 VSCode 编辑器;侧边栏形态可用时编辑器住 betterSidebar Tab,\n // 本页签不注册(避免双实例:Monaco×2 + diff dock 每会话单源抢占)。\n const registerLegacyTab = (): (() => void) | null => {\n return registerSlotSafely(ctx, {\n name: 'conversation.view',\n id: 'edrv-editor',\n order: 5,\n label: '文件编辑',\n inject: (sessionId: string) => ({ sessionId }),\n }, (props: unknown) => React.createElement(EditorView, Object.assign({}, props, { layout: 'tab', sideHint: SIDEBAR_INSTALL_CMD, schedule, addToConversation, sidebarPanels, outlineSources, fileMenuItems })))\n }\n\n // 侧边栏/中央页签两形态互斥切换:sideDisposer(侧边栏 Tab)与 legacyDisposer(中央页签)只保留其一。\n // ⚠️ betterSidebar 服务由 dsh-better-sidebar 的 client bundle(1MB+)在页面加载时提供,本插件\n // bundle 较小往往先执行完启动检测——一次性探测会误报「未检测到」并永久停在中央页签形态(实测\n // 竞态:better-sidebar 已装,但「文件编辑」Tab 未注册)。故启动后按 2s 间隔重试(窗口 ~30s),\n // 命中即自动切换侧边栏形态;始终未命中则保持中央页签回退。\n let sideDisposer: (() => void) | null = null\n let legacyDisposer: (() => void) | null = null\n const applySideForm = (): void => {\n if (sideService) {\n if (sideDisposer !== null) return\n if (legacyDisposer !== null) { legacyDisposer(); legacyDisposer = null }\n sideDisposer = ctx.effect(() => installSideEditor({\n service: sideService as NonNullable<typeof sideService>,\n renderTab: (props: Record<string, unknown>) => React.createElement(SideEditorTab, Object.assign({}, props, { schedule, addToConversation, sidebarPanels, outlineSources, fileMenuItems })),\n activeSession: () => {\n const snapshot = sessions?.list?.getSnapshot?.() as { current?: string; byId?: Record<string, { cwd?: string }> } | undefined\n const sessionId = snapshot?.current\n if (!sessionId) return undefined\n return { sessionId, cwd: snapshot?.byId?.[sessionId]?.cwd }\n },\n registerLegacyFallback: registerLegacyTab,\n }), 'vscode-mode: sidebar editor tab')\n } else {\n if (legacyDisposer !== null) return\n if (sideDisposer !== null) { sideDisposer(); sideDisposer = null }\n setEnsureSideEditor(null)\n legacyDisposer = registerLegacyTab()\n }\n }\n applySideForm()\n let sideRetries = 0\n const retrySideService = (): void => {\n if (sideService !== undefined || sideRetries >= 15) return\n sideRetries += 1\n schedule(() => {\n if (sideService !== undefined) return\n sideService = detectSidebarService(ctx)\n if (sideService !== undefined) {\n console.info('[dsh-vscode-mode] 检测到 ' + SIDEBAR_PLUGIN + ',切换侧边栏编辑形态')\n applySideForm()\n } else {\n retrySideService()\n }\n }, 2000)\n }\n retrySideService()\n\n // 对话输入框上方差异 dock:普通对话显示单文案按钮,文件编辑页由 EditorView 隐藏\n registerSlotSafely(ctx, {\n name: 'conversation.input.dock',\n id: 'edrv-diff-dock',\n order: 30,\n label: '差异',\n inject: (sessionId: string) => ({ sessionId }),\n }, (props: unknown) => React.createElement(ConversationDiffDock, Object.assign({}, props)))\n\n // header 差异角标:仅当前工作区存在差异时渲染\n registerSlotSafely(ctx, { name: 'conversation.session.header.utilities', id: 'edrv-diff-badge', order: 90, label: '差异' },\n (props: unknown) => React.createElement(DiffBadge, Object.assign({}, props)))\n\n // 设置页中的 VSCodeMode 专属页签,MCP 管理作为该页签的内部子 Tab。\n registerSlotSafely(ctx, {\n name: 'settings.section',\n id: 'vscode-mode',\n order: 30,\n label: 'VSCodeMode',\n }, () => React.createElement(SettingsContext.Provider, { value: settings }, React.createElement(McpSettings, { openerRegistry: registry, compatSummary })))\n}"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkBA,MAAa,WAAW;;;;;;;;;;;;;;ECJxB,MAAM,eAAe;GACnB,IAAI;IAAE,OAAO,aAAa,QAAQ,YAAY,MAAM;GAAI,SAAS,GAAG;IAAE,OAAO;GAAM;EACrF,EAAA,CAAG;;EAGH,SAAgB,IAAyB,QAAW,MAA+C;GACjG,OAAO,MAAM,UAAU;IACrB,QAAQ;IACR,SAAS,EAAE,gBAAgB,mBAAmB;IAC9C,MAAM,KAAK,UAAU;KAAE;KAAQ;IAAK,CAAC;GACvC,CAAC,CAAC,CAAC,MAAM,QAAQ,IAAI,KAAK,CAAC;EAC7B;;;;;;;EAQA,SAAgB,IAAI,WAA+B,MAAoB;GACrE,IAAI,CAAC,OAAO;GACZ,IAAI;IACF,IAAI,cAAc;KAAE;KAAW;IAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;GACvD,SAAS,GAAG,CAAe;EAC7B;;;;;;;;;;;EC3BA,MAAa,yBAAyB;;EAEtC,MAAa,cAAc;;EAE3B,MAAa,iBAAiB;;EAE9B,MAAa,sBAAsB;;;;;;;EA0BnC,SAAgB,mBAAmB,KAAwG;GACzI,MAAM,OAAQ,KAAK,QAAQ,CAAC;GAE5B,OAAO;IAAE,OADI,OAAO,KAAK,SAAS,YAAY,IAAI,OAAO,IAAI,OAAQ,OAAO,MAAM,aAAa,WAAW,KAAK,WAAW,SACnG;IAAM,WAAW,MAAM,cAAc;GAAK;EACnE;;EAGA,MAAM,8BAAc,IAAI,IAAoB;;;;;;;EAQ5C,SAAgB,eAAe,WAAmB,OAAqB;GACrE,IAAI,CAAC,WAAW;GAChB,MAAM,QAAQ,OAAO,SAAS,KAAK,IAAI,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,CAAC,IAAI;GACxE,IAAI,QAAQ,GAAG,YAAY,IAAI,WAAW,KAAK;QAC1C,YAAY,OAAO,SAAS;EACnC;;;;;;;EAQA,SAAgB,eAAe,WAA4B;GACzD,IAAI,CAAC,WAAW,OAAO;GACvB,OAAO,YAAY,IAAI,SAAS,KAAK;EACvC;;EAGA,IAAI,mBAAkF;;EAGtF,IAAI,cAAqF;;EAEzF,IAAI,oBAAoB;;;;;;EAOxB,SAAgB,oBAAoB,IAAyE;GAC3G,mBAAmB;EACrB;;;;;;EAOA,SAAgB,qBAAqB,SAAwB;GAC3D,oBAAoB;EACtB;;;;;;;;EASA,SAAgB,qBAAqB,WAAmB,MAAqB,WAA0B;GACrG,IAAI,CAAC,WAAW;GAChB,cAAc;IAAE;IAAW,MAAM,QAAQ;IAAM,WAAW,cAAc;GAAK;EAC/E;;;;;;;EAQA,SAAgB,oBAAoB,WAAwE;GAC1G,IAAI,CAAC,eAAe,CAAC,aAAa,YAAY,cAAc,WAAW,OAAO;GAC9E,MAAM,QAAQ;IAAE,MAAM,YAAY;IAAM,WAAW,YAAY;GAAU;GACzE,cAAc;GACd,OAAO;EACT;;;;;;;;EASA,SAAgB,gBAAgB,MAAqB,WAA6B;GAChF,IAAI,OAAO,qBAAqB,YAAY,OAAO;GACnD,IAAI;IACF,OAAO,iBAAiB,MAAM,SAAS,MAAM;GAC/C,SAAS,OAAO;IACd,QAAQ,KAAK,iCAAiC,OAAO,KAAK,IAAI,OAAO;IACrE,OAAO;GACT;EACF;;;;;;;EAQA,SAAgB,qBAAqB,KAAyE;GAC5G,IAAI;IACF,MAAM,UAAU,IAAI,IAAI,sBAAsB;IAC9C,IAAI,CAAC,WAAW,OAAO,QAAQ,gBAAgB,cAAc,OAAO,QAAQ,YAAY,YAAY,OAAO,KAAA;IAC3G,OAAO;GACT,QAAQ;IACN;GACF;EACF;;;;;;;;EASA,SAAgB,kBAAkB,SAKnB;GACb,MAAM,EAAE,SAAS,WAAW,eAAe,2BAA2B;GACtE,IAAI,oBAAoB;GACxB,MAAM,QAAQ,MAAqB,cAAgC;IACjE,IAAI,OAAO,QAAQ,iBAAiB,cAAc,CAAC,QAAQ,aAAA,aAAwB,GAAG;KACpF,IAAI,CAAC,mBAAmB;MACtB,oBAAoB;MACpB,IAAI;OAAE,uBAAuB;MAAE,SAAS,OAAO;OAAE,QAAQ,KAAK,8BAA8B,OAAO,KAAK,IAAI,GAAG;MAAE;KACnH;KACA,OAAO;IACT;IACA,MAAM,QAAQ,cAAc;IAC5B,MAAM,YAAY,OAAO;IACzB,IAAI,CAAC,WAAW,OAAO;IACvB,IAAI;KACF,QAAQ,QAAQ;MACd,MAAM;MACN,OAAO;MACP,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC;MACvB,MAAM;OAAE,UAAU,QAAQ,KAAA;OAAW;MAAU;KACjD,GAAG;MAAE;MAAW,KAAK,OAAO;KAAI,CAAC;IACnC,SAAS,OAAO;KACd,QAAQ,KAAK,kCAAkC,OAAO,KAAK,IAAI,GAAG;KAClE,OAAO;IACT;IACA,IAAI,mBAEF,OAAO,cAAc,IAAI,YAAY,oBAAoB,EAAE,QAAQ;KAAE;KAAM;IAAU,EAAE,CAAC,CAAC;SAGzF,qBAAqB,WAAW,MAAM,SAAS;IAEjD,OAAO;GACT;GACA,IAAI,cAAmC;GACvC,IAAI;IACF,cAAc,QAAQ,YAAY;KAChC,IAAI;KACJ,OAAO;KACP,MAAM;KACN,QAAQ;KACR,QAAQ,MAAe,UAAkC,eAAe,OAAO,SAAS,KAAK;KAC7F,WAAW;IACb,CAAC;GACH,SAAS,OAAO;IACd,QAAQ,KAAK,oCAAoC,OAAO,KAAK,IAAI,GAAG;IAEpE,IAAI,CAAC,mBAAmB;KACtB,oBAAoB;KACpB,IAAI;MAAE,uBAAuB;KAAE,SAAS,OAAO;MAAE,QAAQ,KAAK,8BAA8B,OAAO,KAAK,IAAI,GAAG;KAAE;IACnH;IACA,aAAa,CAAC;GAChB;GACA,oBAAoB,IAAI;GACxB,aAAa;IACX,IAAI,OAAO,gBAAgB,YAAY,YAAY;IACnD,oBAAoB,IAAI;GAC1B;EACF;;;;;;;EAQA,SAAS,SAAS,MAAuB;GACvC,OAAOA,MAAAA,QAAM,cAAc,OAAO;IAChC,OAAO;IAAM,QAAQ;IAAM,SAAS;IAAa,MAAM;IAAQ,eAAe;IAAM,WAAW;GACjG,GACEA,MAAAA,QAAM,cAAc,QAAQ;IAC1B,GAAG;IACH,QAAQ;IAAgB,aAAa;IAAK,eAAe;IAAS,gBAAgB;GACpF,CAAC,CAAC;EACN;;;;;;;;;;;;;EC1OA,SAAS,kBAAwB;GAC/B,MAAM,OAAO,MAAM,KAAK,SAAS,iBAAiB,4CAAwC,CAAC;GAC3F,KAAK,MAAM,OAAO,MAChB,IAAI,IAAI,eAAe,IAAI,YAAY,SAAS,MAAM,GAAG;IACvD,IAA2B,MAAM;IACjC;GACF;EAEJ;;;;;;EAOA,SAAgB,eAAe,MAA2B;GACxD,IAAI,gBAAgB,QAAQ,MAAM,KAAK,GAAG;GAC1C,gBAAgB;GAChB,MAAM,SAAS,QAAQ;GACvB,iBAAiB;IACf,OAAO,cAAc,IAAI,YAAY,oBAAoB,EAAE,QAAQ,EAAE,MAAM,OAAO,EAAE,CAAC,CAAC;GACxF,GAAG,EAAE;EACP;;;;;;EAOA,SAAgB,aAAa,MAAoB;GAC/C,IAAI,gBAAgB,MAAM,IAAI,GAAG;GACjC,gBAAgB;GAChB,iBAAiB;IACf,OAAO,cAAc,IAAI,YAAY,oBAAoB,EACvD,QAAQ;KAAE;KAAM,WAAW;IAAK,EAClC,CAAC,CAAC;GACJ,GAAG,EAAE;EACP;;EAGA,SAAgB,cAAoB;GAClC,OAAO,cAAc,IAAI,YAAY,cAAc,CAAC;EACtD;;;;;;EAYA,SAAgB,iBAAiB,KAAmC;GAClE,OAAO,cAAc,IAAI,YAAY,sBAAsB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;EACjF;;;;;;;;EC7DA,MAAa,cAAc;EAC3B,IAAI,gBAAgB;EACpB,IAAI,cAAc;GAAE,OAAO;GAAQ,UAAU;GAAG,SAAS;EAAe;EACxE,MAAM,iCAAiB,IAAI,IAAI;;;;;EAM/B,MAAa,gBAAgB;GAC3B,QAAQ;IAAE,UAAU;IAAI,SAAS;GAAkB;GACnD,MAAM;IAAE,UAAU;IAAI,SAAS;GAAa;GAC5C,OAAO;IAAE,UAAU;IAAK,SAAS;GAAgB;GACjD,OAAO;IAAE,UAAU;IAAG,SAAS;GAAiB;EAClD;;;;;;;;EASA,SAAS,aAAa,OAAO,UAAU,SAAS;GAC9C,cAAc;IAAE;IAAO;IAAU;GAAQ;GACzC,KAAK,MAAM,YAAY,gBACrB,IAAI;IAAE,SAAS,WAAW;GAAE,SAAS,OAAO,CAAkB;EAElE;;;;;;;EAQA,SAAS,eAAe,UAAU;GAChC,IAAI,OAAO,aAAa,YAAY,aAAa,CAAC;GAClD,eAAe,IAAI,QAAQ;GAC3B,SAAS,WAAW;GACpB,aAAa,eAAe,OAAO,QAAQ;EAC7C;;EAGA,MAAa,cAAc;GACzB,IAAI;GAAc,KAAK;GAAc,KAAK;GAAc,KAAK;GAC7D,IAAI;GAAc,KAAK;GAAc,KAAK;GAAc,KAAK;GAC7D,MAAM;GAAQ,OAAO;GAAQ,IAAI;GAAY,UAAU;GAAY,KAAK;GACxE,KAAK;GAAO,MAAM;GAAQ,MAAM;GAAQ,MAAM;GAAQ,KAAK;GAAQ,KAAK;GAAQ,KAAK;GACrF,MAAM;GAAQ,KAAK;GAAQ,MAAM;GAAO,KAAK;GAAO,KAAK;GACzD,IAAI;GAAU,IAAI;GAAS,MAAM;GAAS,KAAK;GAAS,KAAK;GAC7D,KAAK;GAAO,MAAM;GAAQ,GAAG;GAAK,GAAG;GAAK,KAAK;GAAO,IAAI;GAAO,KAAK;GAAO,KAAK;GAClF,IAAI;GAAU,IAAI;GAAM,IAAI;GAAQ,IAAI;GAAQ,KAAK;GAAO,KAAK;GACjE,OAAO;GAAS,IAAI;GAAU,KAAK;GAAU,MAAM;GAAQ,YAAY;EACzE;;;;;;;EAQA,SAAgB,OAAO,MAAM;GAC3B,MAAM,OAAO,OAAO,QAAQ,EAAE,CAAC,CAAC,MAAM,OAAO,CAAC,CAAC,IAAI,KAAK;GACxD,IAAI,gBAAgB,KAAK,IAAI,GAAG,OAAO;GACvC,MAAM,MAAM,KAAK,YAAY,GAAG;GAChC,IAAI,OAAO,GAAG,OAAO;GACrB,OAAO,YAAY,KAAK,MAAM,MAAM,CAAC,CAAC,CAAC,YAAY,MAAM;EAC3D;;;;;;EAOA,SAAgB,WAAW,YAAY;GACrC,MAAM,cAAc,eAAe,UAAU;GAC7C,IAAI,CAAC,eAAe;IAClB,aAAa,UAAU,cAAc,OAAO,UAAU,cAAc,OAAO,OAAO;IAClF,gBAAgB,IAAI,SAAS,SAAS,WAAW;KAC/C,MAAM,QAAQ,UAAU;MACtB,gBAAgB;MAChB,aAAa,SAAS,cAAc,MAAM,UAAU,cAAc,MAAM,OAAO;MAC/E,OAAO,KAAK;KACd;KACA,MAAM,aAAa;MACjB,IAAI;OACF,OAAO,QAAQ,OAAO,EAAE,OAAO,EAAE,IAAI,YAAY,EAAE,CAAC;OACpD,aAAa,QAAQ,cAAc,KAAK,UAAU,cAAc,KAAK,OAAO;OAC5E,OAAO,QAAQ,CAAC,uBAAuB,SAAS;QAC9C,aAAa,SAAS,cAAc,MAAM,UAAU,cAAc,MAAM,OAAO;QAC/E,QAAQ,OAAO,MAAM;OACvB,IAAI,QAAQ,qBAAK,IAAI,MAAM,mBAAmB,OAAO,GAAG,CAAC,CAAC,CAAC;MAC7D,SAAS,OAAO;OACd,KAAK,KAAK;MACZ;KACF;KAEA,IADiB,SAAS,cAAc,iCAC7B,GAAG,KAAK;UACd;MACH,MAAM,IAAI,SAAS,cAAc,QAAQ;MACzC,EAAE,MAAM,cAAc;MACtB,EAAE,QAAQ,mBAAmB;MAC7B,EAAE,SAAS;MACX,EAAE,gBAAgB,qBAAK,IAAI,MAAM,oBAAoB,CAAC;MACtD,SAAS,KAAK,YAAY,CAAC;KAC7B;IACF,CAAC;GACH;GACA,OAAO,cAAc,QAAQ,WAAW;EAC1C;;;;;;;;;;;;EC1GA,SAAgB,mBAAmB,KAAK;GACtC,IAAI,cAAc,CAAC;GACnB,IAAI,cAAc,CAAC;;GAEnB,IAAI,UAAU;;;;;;;;GASd,MAAM,UAAU,QAAQ,QAAQ,gBAAgB,cAAc;IAG5D,IAAI,CAAC,eAAe,UAAU,YAAY,WAAW,KAAK,YAAY,WAAW,GAAG;IACpF,MAAM,WAAW,KAAK,IAAI;IAC1B,MAAM,cAAc,QAAQ,QAAQ,OAAO,MAAM,IAAI,MAAM,OAAO,GAAG;IAGrE,MAAM,MAAM,eAAe,KAAK,MAAM,WAAW,EAAE,QAAQ,EAAE,GAAG,IAAI,OAAO,EAAE,SAAS,OAAO,OAAO,EAAE,OAAO,OAAO,OAAO,EAAE,WAAW,EAAE,SAAS,SAAS,KAAK,OAAO,EAAE,WAAW,EAAE,SAAS,SAAS,EAAE,CAAC,CAAC,KAAK,GAAG;IACrN,IAAI,QAAQ,SAAS;IACrB,UAAU;IACV,IAAI,WAAW,8BAA8B,eAAe,SAAS,MAAM,eAAe,KAAK,MAAM,WAAW,EAAE,QAAQ,EAAE,GAAG,IAAI,OAAO,EAAE,SAAS,OAAO,OAAO,EAAE,OAAO,OAAO,QAAQ,EAAE,WAAW,EAAE,SAAS,SAAS,KAAK,QAAQ,EAAE,WAAW,EAAE,SAAS,SAAS,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC;IAE7R,MAAM,QAAQ,CAAC;IACf,KAAK,MAAM,KAAK,gBAAgB;KAC9B,IAAI,EAAE,UAAU,KAAA,KAAa,EAAE,QAAQ,KAAA,GAAW;KAClD,IAAI,EAAE,YAAY,EAAE,SAAS,QAC3B,MAAM,KAAK;MACT,OAAO,IAAI,OAAO,MAAM,EAAE,OAAO,GAAG,KAAK,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC;MACnE,SAAS;OAAE,aAAa;OAAM,WAAW;OAAoB,2BAA2B;MAAqB;KAC/G,CAAC;IAEL;IACA,cAAc,OAAO,iBAAiB,aAAa,KAAK;IAIxD,IAAI,eAAe,CAAC;IACpB,OAAO,iBAAiB,aAAa;KACnC,KAAK,MAAM,MAAM,aAAe,IAAI;MAAE,SAAS,WAAW,EAAE;KAAE,SAAS,GAAG,CAAY;KACtF,cAAc,CAAC;KACf,MAAM,QAAQ,CAAC;KACf,KAAK,MAAM,KAAK,gBAAgB;MAC9B,IAAI,EAAE,QAAQ;MACd,MAAM,WAAW,EAAE,YAAY,EAAE,SAAS,SAAS,EAAE,WAAW;MAChE,IAAI,CAAC,UAAU;MACf,MAAM,QAAQ,KAAK,IAAI,IAAI,EAAE,SAAS,KAAK,CAAC;MAC5C,MAAM,UAAU,SAAS,cAAc,KAAK;MAC5C,QAAQ,YAAY;MACpB,QAAQ,QAAQ,WAAW,WAAW,EAAE,QAAQ,EAAE,GAAG;MACrD,KAAK,MAAM,KAAK,UAAU;OACxB,MAAM,MAAM,SAAS,cAAc,KAAK;OACxC,IAAI,YAAY;OAChB,MAAM,OAAO,SAAS,cAAc,MAAM;OAC1C,KAAK,YAAY;OACjB,KAAK,cAAc;OACnB,IAAI,YAAY,IAAI;OACpB,QAAQ,YAAY,GAAG;MACzB;MACA,MAAM,KAAK,SAAS,QAAQ;OAC1B,iBAAiB;OACjB,eAAe,SAAS;OACxB;OACA,mBAAmB;MACrB,CAAC;MACD,YAAY,KAAK,EAAE;MACnB,MAAM,KAAK;OAAE;OAAS;OAAO,GAAG,SAAS;MAAO,CAAC;KACnD;KACA,eAAe;IACjB,CAAC;IAED,IAAI,aAAa,QAAQ;KACvB,MAAM,OAAO,OAAO,WAAW;KAC/B,IAAI,MAAM;MACR,IAAI,UAAU,KAAK,cAAc,qBAAqB;MACtD,IAAI,CAAC,SAAS;OACZ,UAAU,SAAS,cAAc,KAAK;OACtC,QAAQ,YAAY;OACpB,KAAK,YAAY,OAAO;MAC1B;MACA,QAAQ,YAAY;MACpB,MAAM,QAAQ,OAAO,UAAU,OAAO,OAAO,aAAa,UAAU,KAAK;MACzE,IAAI,KAAK;MACT,IAAI;OAAE,KAAK,OAAO,cAAc;MAAE,SAAS,GAAG,CAAe;MAC7D,MAAM,UAAU,KAAK,GAAG,kBAAkB;MAC1C,MAAM,QAAQ,MAAM,GAAG,mBAAmB,IAAI,GAAG,mBAAmB;MAGpE,MAAM,UAAU,KAAK,IAAI,GAAG,KAAK,cAAc,KAAK;MAIpD,MAAM,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,SAAS,UAAU,EAAW,CAAC;MACjE,MAAM,YAAY,OAAO,SAAS,CAAC,CAAC,aAAa;MACjD,IAAI,UAAU;MACd,IAAI,KAAK;MACT,KAAK,MAAM,KAAK,cAAc;OAE5B,MAAM,SAAS,KAAK,IAAI,EAAE,QAAQ,GAAG,SAAS;OAC9C,IAAI,aAAa,OAAO,oBAAoB,MAAM;OAClD,IAAI,EAAE,SAAS,WAAW,cAAc;OACxC,MAAM,UAAU,aAAa,EAAE,IAAI;OACnC,KAAK,IAAI,IAAI,GAAG,IAAI,EAAE,GAAG,KAAK;QAC5B,MAAM,OAAO,SAAS,cAAc,KAAK;QACzC,KAAK,YAAY;QAEjB,KAAK,cAAc;QACnB,KAAK,MAAM,QAAQ,QAAQ;QAC3B,KAAK,MAAM,SAAS,QAAQ;QAC5B,KAAK,QAAQ,OAAO,OAAO,EAAE;QAC7B,KAAK,QAAQ,MAAM,OAAO,CAAC;QAC3B,KAAK,MAAM,MAAO,UAAU,IAAI,QAAS;QACzC,KAAK,MAAM,OAAO,OAAO;QACzB,QAAQ,YAAY,IAAI;QACxB;OACF;OACA;MACF;MACA,IAAI,WAAW,gCAAgC,aAAa,SAAS,YAAY,UAAU,WAAW,OAAO,QAAQ,QAAQ,SAAS,KAAK,IAAI,IAAI,YAAY,IAAI;MAEnK,MAAM,mBAAmB;OACvB,MAAM,KAAK,OAAO,aAAa,KAAK;OACpC,IAAI,SAAS,QAAQ,MAAM,YAAY,gBAAiB,CAAC,KAAM;MACjE;MACA,WAAW;MACX,QAAQ,aAAa;MACrB,IAAI,CAAC,QAAQ,aAAa;OACxB,QAAQ,cAAc;OACtB,OAAO,kBAAkB,UAAU;MACrC;MAEA,iBAAiB;OACf,IAAI;QACF,MAAM,SAAS,KAAK,sBAAsB;QAC1C,MAAM,KAAK,OAAO,aAAa,KAAK;QACpC,MAAM,QAAQ,QAAQ,iBAAiB,kBAAkB;QACzD,IAAI,gBAAgB;QACpB,IAAI;SACF,MAAM,SAAS,OAAO,cAAc;SACpC,MAAM,cAAc,OAAO,mBAAmB,IAAI,OAAO,mBAAmB;SAC5E,gBAAgB,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,IAAI,GAAG,KAAK,cAAc,WAAW,IAAI,OAAO,mBAAmB,KAAK,EAAE,CAAC;QACvH,SAAS,GAAG,CAAmB;QAC/B,KAAK,MAAM,QAAQ,OAAO;SACxB,KAAK,MAAM,OAAO,gBAAgB;SAClC,MAAM,SAAS,OAAO,KAAK,QAAQ,IAAI;SACvC,MAAM,SAAS,OAAO,KAAK,QAAQ,GAAG;SACtC,MAAM,IAAI,aAAa;SACvB,IAAI,CAAC,KAAK,CAAC,EAAE,QAAQ,aAAa;SAClC,MAAM,QAAQ,EAAE,QAAQ,iBAAiB,eAAe,CAAC,CAAC;SAC1D,IAAI,CAAC,OAAO;SACZ,MAAM,UAAU,MAAM,sBAAsB;SAC5C,IAAI,QAAQ,SAAS,GACnB,KAAK,MAAM,MAAO,QAAQ,MAAM,OAAO,MAAM,KAAM;QAEvD;OACF,SAAS,GAAG;QAAE,IAAI,WAAW,gCAAgC,OAAO,CAAC,CAAC;OAAE;MAC1E,GAAG,EAAE;KACP;IACF,OAAO;KACL,MAAM,OAAO,OAAO,WAAW;KAC/B,MAAM,UAAU,QAAQ,KAAK,cAAc,qBAAqB;KAChE,IAAI,SAAS,QAAQ,YAAY;IACnC;GACF;;GAGA,MAAM,gBAAgB;IACpB,cAAc,CAAC;IACf,cAAc,CAAC;GACjB;GAEA,OAAO;IAAE;IAAQ;GAAQ;EAC3B;;;;EC/JA,SAAgB,YAAY,QAAgD,KAA0B;GACpG,OAAO,OAAO,QAAQ,GAAG;EAC3B;;EAcA,SAAgB,OAAO,QAAgD,KAA0B;GAC/F,MAAM,OAAO,MAAM,QAAQ,OAAO,KAAK,IAAI,OAAO,MAAM,OAAO,KAAA;GAC/D,IAAI,QAAQ,OAAO,KAAK,YAAY,UAAU,OAAO;GACrD,IAAI,QAAQ,KAAK,OAAO,YAAY,OAAO,OAAO,SAAS,YAAY,UAAU,OAAO,OAAO;GAC/F,OAAO;EACT;;EAQA,SAAgB,WAAW,MAAwB;GACjD,OAAO,KAAK,SAAS,KAAK,MAAM,IAAI,IAAI,CAAC;EAC3C;;EA8CA,SAAgB,WAAW,MAAc,OAAuB;GAC9D,IAAI,IAAI;GACR,MAAM,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI,OAAO,KAAK,MAAM,CAAC;GACpD,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,KAAK,IAAI,KAAK,WAAW,CAAC,MAAM,IAAI;GAC7D,OAAO;EACT;;EAGA,SAAS,WAAW,SAAiB,QAA6B;GAChE,IAAI,CAAC,OAAO,QAAQ,OAAO,CAAC;GAC5B,MAAM,MAAmB,CAAC;GAC1B,IAAI,OAAO;GACX,OAAO,QAAQ,QAAQ,SAAS,OAAO,QAAQ;IAC7C,MAAM,KAAK,QAAQ,QAAQ,QAAQ,IAAI;IACvC,IAAI,KAAK,GAAG;IACZ,IAAI,KAAK;KAAE,OAAO;KAAI,KAAK,KAAK,OAAO;IAAO,CAAC;IAC/C,OAAO,KAAK,KAAK,IAAI,GAAG,OAAO,MAAM;GACvC;GACA,OAAO;EACT;;;;;;;;;EAUA,SAAgB,YAAY,SAAiB,OAA+B;GAC1E,MAAM,YAA4B,CAAC;GACnC,IAAI,SAAS;GACb,MAAM,WAAwB,CAAC;GAC/B,KAAK,IAAI,MAAM,GAAG,MAAM,MAAM,QAAQ,OAAO;IAC3C,MAAM,OAAO,MAAM;IACnB,MAAM,UAAU,KAAK;IACrB,MAAM,WAAW,OAAO,UAAU,KAAK,UAAU,KAAK,OAAO,UAAU,KAAK,QAAQ,IAChF;KAAE,OAAO,KAAK;KAAsB,KAAK,KAAK;IAAmB,IACjE;IACJ,MAAM,kBAAkB,YAAY,SAAS,SAAS,KAAK,SAAS,OAAO,SAAS,UAC9E,QAAQ,WAAW,KAAK,QAAQ,MAAM,SAAS,OAAO,SAAS,GAAG,MAAM,WAC1E,WACA;IACJ,MAAM,aAAa,kBAAkB,CAAC,eAAe,IAAI,WAAW,SAAS,OAAO;IACpF,MAAM,YAAY,WAAW,MAAM,UAAU,MAAM,SAAS,UAAU,CAAC,SAAS,MAAM,SAAS,SAAS,OAAO,IAAI,CAAC,CAAC,KAChH,WAAW,MAAM,UAAU,CAAC,SAAS,MAAM,SAAS,SAAS,OAAO,IAAI,CAAC,CAAC;IAC/E,IAAI,WAAW;KACb,UAAU,KAAK;MAAE;MAAK;MAAM,GAAG;MAAW,SAAS;KAAK,CAAC;KACzD,SAAS,KAAK,SAAS;KACvB,SAAS,KAAK,IAAI,QAAQ,UAAU,GAAG;KACvC;IACF;IACA,IAAI,QAAQ,WAAW,KAAK,KAAK,eAAe,KAAA,KAAa,KAAK,aAAa,KAAA,KAAa,QAAQ,WAAW,GAAG;KAEhH,UAAU,KAAK;MAAE;MAAK;MADN,OAAO;MAAG,KAAK;MACO,SAAS;KAAK,CAAC;KACrD;IACF;IACA,IAAI,QAAQ,WAAW,KAAK,KAAK,eAAe,KAAA,KAAa,KAAK,aAAa,KAAA,KAC1E,KAAK,eAAe,KAAK,YAAY,KAAK,cAAc,KAAK,KAAK,cAAc,QAAQ,QAAQ;KACnG,MAAM,QAAQ;MAAE,OAAO,KAAK;MAAY,KAAK,KAAK;KAAS;KAC3D,IAAI,CAAC,SAAS,MAAM,SAAS,SAAS,OAAO,IAAI,CAAC,GAAG;MACnD,UAAU,KAAK;OAAE;OAAK;OAAM,GAAG;OAAO,SAAS;MAAK,CAAC;MACrD,SAAS,KAAK,KAAK;MACnB,SAAS,KAAK,IAAI,QAAQ,MAAM,GAAG;MACnC;KACF;IACF;IACA,UAAU,KAAK;KAAE;KAAK;KAAM,OAAO;KAAI,KAAK;KAAI,SAAS;IAAM,CAAC;GAClE;GACA,OAAO;EACT;;EAGA,SAAS,SAAS,MAAiB,OAA2B;GAC5D,IAAI,KAAK,UAAU,KAAK,OAAO,MAAM,UAAU,MAAM,KAAK,OAAO,KAAK,UAAU,MAAM,SAAS,KAAK,QAAQ,MAAM;GAClH,OAAO,KAAK,QAAQ,MAAM,OAAO,MAAM,QAAQ,KAAK;EACtD;;;;EC3KA,MAAa,KAAK;GAAE,SAAS;GAAW,UAAU;GAAY,UAAU;EAAW;;EAgBnF,SAAgB,WAAW,QAAgB,KAAqB;GAC9D,OAAO,OAAO,MAAM,IAAI,MAAM,OAAO,GAAG;EAC1C;;EAGA,SAAgB,SAAS,KAA6B,KAAqB;GACzE,IAAI,CAAC,KAAK,OAAO,GAAG;GACpB,IAAI,MAAM,QAAQ,IAAI,WAAW,OAAO,KAAK,IAAI,UAAU,QAAQ,SAAS,KAAA,GAAW,OAAO,IAAI,UAAU,QAAQ;GACpH,OAAQ,IAAI,WAAW,QAAmB,GAAG;EAC/C;;EAGA,SAAgB,SAAS,KAA6B,GAAgD;GACpG,IAAI,CAAC,OAAO,IAAI,WAAW,MAAM,OAAO;GACxC,MAAM,UAAU,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAS,KAAK,IACxD,YAAY,KAAK,IAAI,MAAM,QAAQ,CAAS,CAAC,IAC7C;GACJ,MAAM,UAAU,SAAS,WAAW;GACpC,MAAM,UAAU,SAAS,WAAW;GACpC,OAAO,YAAY,QAAQ,YAAY;EACzC;;EAGA,SAAgB,aAAa,KAA0B;GACrD,IAAI,CAAC,OAAO,IAAI,eAAe,QAAQ,IAAI,aAAa,MAAM,OAAO;GACrE,MAAM,UAAU,MAAM,QAAQ,IAAI,WAAW,OAAO,IAAI,IAAI,UAAU,UAAU,CAAC;GACjF,IAAI,QAAQ,QAAQ;IAElB,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAClC,IAAI,QAAQ,OAAO,cAAc,QAAQ,OAAO,cAAc,CAAC,SAAS,MAAM,IAAI,SAAS,CAAC,EAAA,CAAG,EAAE,GAAG,OAAO;IAE7G,OAAO;GACT;GACA,OAAO,IAAI,UAAU,SAAS,aAAa,IAAI,UAAU,SAAS,KAAA;EACpE;;EAGA,SAAgB,aAAa,MAA4B;GACvD,IAAI,IAAI;GACR,KAAK,MAAM,OAAO,MAAM;IACtB,IAAI,CAAC,aAAa,GAAG,GAAG;IACxB,MAAM,UAAU,MAAM,QAAQ,IAAI,WAAW,OAAO,IAAI,IAAI,UAAU,UAAU,CAAC;IACjF,IAAI,QAAQ,QACL;UAAA,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAClC,IAAI,QAAQ,OAAO,aAAa,CAAC,SAAS,MAAM,IAAI,SAAS,CAAC,EAAA,CAAG,EAAE,GAAG;IAAA,OAEnE;KACL,MAAM,QAAQ,MAAM,QAAQ,IAAI,KAAK,IAAI,IAAI,QAAQ,CAAC;KACtD,KAAK,MAAM,KAAK,OAAO,IAAI,CAAC,SAAS,KAAK,CAAC,GAAG;KAC9C,IAAI,CAAC,MAAM,UAAU,CAAC,SAAS,KAAK,IAAI,QAAQ,GAAG,IAAI,KAAK,IAAI,GAAG,CAAC;IACtE;GACF;GACA,OAAO;EACT;;EAGA,SAAgB,UAAU,SAAgC;GACxD,MAAM,yBAAS,IAAI,IAA0B;GAC7C,KAAK,MAAM,KAAK,SAAS;IACvB,IAAI,CAAC,OAAO,IAAI,EAAE,IAAI,GAAG,OAAO,IAAI,EAAE,MAAM,CAAC,CAAC;IAC9C,OAAO,IAAI,EAAE,IAAI,CAAC,CAAE,KAAK,CAAC;GAC5B;GACA,MAAM,QAAuB,CAAC;GAC9B,KAAK,MAAM,CAAC,MAAM,SAAS,QAAQ,MAAM,KAAK;IAAE;IAAM;IAAM,SAAS,aAAa,IAAI;GAAE,CAAC;GACzF,MAAM,MAAM,GAAG,MAAO,EAAE,OAAO,EAAE,OAAO,KAAK,CAAE;GAC/C,MAAM,eAAe,MAAM,QAAQ,MAAM,EAAE,UAAU,CAAC;GACtD,OAAO;IAAE;IAAO;IAAc,YAAY,aAAa;GAAO;EAChE;;;;ECjEA,SAAgB,iBAAiB,MAAc,OAAuB;GACpE,OAAO,WAAW,MAAM,KAAK;EAC/B;;;;;;;;EASA,SAAgB,gBAAgB,UAAoB,UAA+E;GACjI,IAAI,SAAS;GACb,MAAM,YAAY,KAAK,IAAI,SAAS,QAAQ,SAAS,MAAM;GAC3D,OAAO,SAAS,aAAa,SAAS,YAAY,SAAS,SAAS;GACpE,IAAI,SAAS;GACb,MAAM,YAAY,KAAK,IAAI,SAAS,SAAS,QAAQ,SAAS,SAAS,MAAM;GAC7E,OAAO,SAAS,aAAa,SAAS,SAAS,SAAS,IAAI,YAAY,SAAS,SAAS,SAAS,IAAI,SAAS;GAChH,OAAO;IAAE,UAAU,SAAS,MAAM,QAAQ,SAAS,SAAS,MAAM;IAAG,UAAU,SAAS,MAAM,QAAQ,SAAS,SAAS,MAAM;IAAG,OAAO;GAAO;EACjJ;;EAGA,SAAgB,YAAY,SAAuB,SAAkC;GACnF,MAAM,UAAoB,CAAC;GAC3B,IAAI,YAAY,MAAM,OAAO;GAC7B,MAAM,QAAQ,WAAW,OAAO;GAChC,KAAK,MAAM,OAAO,SAAS;IACzB,IAAI,IAAI,QAAQ;KACd,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,MAAM,QAAQ,KAAK;MACzC,MAAM,IAAI,YAAY,KAAK,CAAC;MAC5B,IAAI,CAAC,KAAK,SAAS,KAAK,CAAC,GAAG;MAC5B,QAAQ,KAAK;OAAE,QAAQ,IAAI;OAAQ,KAAK;OAAG,OAAO;OAAG,KAAK,MAAM,SAAS;OAAG,UAAU,CAAC;OAAG,UAAU,MAAM,MAAM;OAAG,OAAO;OAAM,QAAQ,SAAS,KAAK,CAAC;OAAG,QAAQ;OAAM;OAAK,YAAY,IAAI,eAAe;MAAK,CAAC;KACpN;KACA;IACF;IACA,MAAM,UAA8C,CAAC;IACrD,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,MAAM,QAAQ,KAAK;KACzC,MAAM,OAAO,YAAY,KAAK,CAAC;KAC/B,IAAI,QAAQ,CAAC,SAAS,KAAK,IAAI,GAAG,QAAQ,KAAK;MAAE,KAAK;MAAG;KAAK,CAAC;IACjE;IACA,MAAM,YAAY,YAAY,SAAS,QAAQ,KAAK,UAAU,MAAM,IAAI,CAAC;IACzE,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;KACvC,MAAM,QAAQ,QAAQ;KACtB,MAAM,WAAW,UAAU;KAC3B,MAAM,SAAS,SAAS,KAAK,MAAM,GAAG;KACtC,IAAI,CAAC,SAAS,SAAS;MACrB,QAAQ,KAAK;OAAE,QAAQ,IAAI;OAAQ,KAAK,MAAM;OAAK,OAAO;OAAM;OAAQ,QAAQ;OAAO,UAAU,MAAM,KAAK,YAAY,OAAO,CAAC,IAAI,MAAM,KAAK,QAAQ,MAAM,IAAI;OAAG,UAAU,MAAM,KAAK,UAAU,MAAM,KAAK,QAAQ,MAAM,IAAI,IAAI,CAAC;OAAG;OAAK,YAAY,IAAI,eAAe;MAAK,CAAC;MAClR;KACF;KACA,MAAM,QAAQ,iBAAiB,SAAS,SAAS,KAAK,IAAI;KAG1D,MAAM,UAAU,gBAFC,MAAM,KAAK,YAAY,OAAO,CAAC,IAAI,MAAM,KAAK,QAAQ,MAAM,IAAI,GAChE,MAAM,KAAK,QAAQ,MAAM,IACO,CAAC;KAClD,MAAM,cAAc,QAAQ,QAAQ;KACpC,QAAQ,KAAK;MAAE,QAAQ,IAAI;MAAQ,KAAK,MAAM;MAAK,OAAO;MAAa,KAAK,cAAc,QAAQ,SAAS;MAAQ,UAAU,QAAQ;MAAU,UAAU,QAAQ;MAAU;MAAQ,QAAQ;MAAO;MAAK,YAAY,IAAI,eAAe;KAAK,CAAC;IAC9O;GACF;GACA,QAAQ,MAAM,GAAG,OAAO,EAAE,SAAS,aAAa,EAAE,SAAS,SAAS;GACpE,OAAO;EACT;;;;;;;;;;EC9EA,MAAa,sBAA8C;GACzD,aAAa;GACb,kBAAkB;GAClB,sBAAsB;GACtB,sBAAsB;EACxB;;;;;;EAOA,SAAgB,qBAA6C;GAC3D,OAAO,EAAE,GAAG,oBAAoB;EAClC;;;;;;;;EASA,SAAgB,qBAAqB,KAAsC;GACzE,MAAM,MAA8B,CAAC;GACrC,IAAI,CAAC,OAAO,OAAO,QAAQ,UAAU,OAAO;GAC5C,KAAK,MAAM,CAAC,IAAI,UAAU,OAAO,QAAQ,GAA8B,GACrE,IAAI,MAAM,uBAAuB,OAAO,UAAU,UAAU,IAAI,MAAM;GAExE,OAAO;EACT;;;;;;;;;;;EClBA,MAAa,WAAiD;GAC5D;IAAE,IAAI;IAAa,OAAO;GAAO;GACjC;IAAE,IAAI;IAAkB,OAAO;GAAS;GACxC;IAAE,IAAI;IAAsB,OAAO;GAAQ;GAC3C;IAAE,IAAI;IAAsB,OAAO;GAAU;EAC/C;EAEA,MAAM,YAA+D;GACnE,MAAM;GAAQ,KAAK;GAAQ,MAAM;GAAQ,OAAO;GAAS,KAAK;EAChE;EAEA,IAAI,UAAkC,EAAE,GAAG,oBAAoB;EAC/D,IAAI,SAAyC,CAAC;EAC9C,MAAMC,8BAAY,IAAI,IAAgB;;;;;;EAOtC,SAAgB,iBAAiB,KAAoB;GACnD,UAAU;IAAE,GAAG;IAAqB,GAAG,qBAAqB,GAAG;GAAE;GACjE,SAAS,CAAC;GACV,KAAK,MAAM,MAAM,OAAO,KAAK,OAAO,GAAG,OAAO,MAAM,WAAW,QAAQ,GAAG;GAC1E,KAAK,MAAM,YAAYA,aACrB,IAAI;IAAE,SAAS;GAAE,QAAQ,CAAqB;EAElD;;;;;;;EAQA,SAAgB,qBAAqB,UAAkC;GACrE,YAAU,IAAI,QAAQ;GACtB,aAAaA,YAAU,OAAO,QAAQ;EACxC;;;;;;;EAQA,SAAgB,QAAQ,IAA2B;GACjD,MAAM,QAAQ,QAAQ;GACtB,OAAO,OAAO,UAAU,YAAY,MAAM,KAAK,MAAM,KAAK,QAAQ;EACpE;;;;;;;EAQA,SAAgB,UAAU,IAA4B;GACpD,OAAO,OAAO,OAAO;EACvB;;;;;;;EAQA,SAAgB,aAAa,KAAqB;GAChD,MAAM,QAAQ,OAAO,OAAO,EAAE;GAC9B,IAAI,UAAU,KAAK,OAAO;GAC1B,IAAI,MAAM,WAAW,KAAK,SAAS,OAAO,SAAS,KAAK,OAAO,MAAM,YAAY;GACjF,OAAO;EACT;;;;;;;EAQA,SAAgB,WAAW,OAA+B;GACxD,MAAM,QAAQ,OAAO,SAAS,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,OAAO;GACtF,IAAI,CAAC,MAAM,QAAQ,OAAO;GAC1B,MAAM,UAAmB;IAAE,MAAM;IAAO,OAAO;IAAO,KAAK;IAAO,MAAM;IAAO,KAAK;GAAG;GACvF,KAAK,MAAM,QAAQ,OAAO;IACxB,MAAM,WAAW,UAAU,KAAK,kBAAkB,OAAO;IACzD,IAAI,UAAU;KACZ,QAAQ,YAAY;KACpB;IACF;IACA,IAAI,QAAQ,KAAK,OAAO;IACxB,QAAQ,MAAM,aAAa,IAAI;GACjC;GACA,OAAO,QAAQ,MAAM,UAAU;EACjC;;;;;;;EAQA,SAAgB,YAAY,SAA0B;GACpD,MAAM,QAAkB,CAAC;GACzB,IAAI,QAAQ,MAAM,MAAM,KAAK,MAAM;GACnC,IAAI,QAAQ,MAAM,MAAM,KAAK,KAAK;GAClC,IAAI,QAAQ,OAAO,MAAM,KAAK,OAAO;GACrC,IAAI,QAAQ,KAAK,MAAM,KAAK,KAAK;GACjC,MAAM,KAAK,QAAQ,GAAG;GACtB,OAAO,MAAM,KAAK,GAAG;EACvB;;;;;;;;EASA,SAAgB,WAAW,GAAiG,SAAkC;GAC5J,IAAI,CAAC,SAAS,OAAO;GACrB,KAAK,EAAE,WAAW,EAAE,cAAc,QAAQ,QAAQ,QAAQ,OAAO,OAAO;GACxE,IAAI,QAAQ,EAAE,QAAQ,MAAM,QAAQ,OAAO,OAAO;GAClD,IAAI,QAAQ,EAAE,MAAM,MAAM,QAAQ,KAAK,OAAO;GAC9C,OAAO,aAAa,EAAE,OAAO,EAAE,MAAM,QAAQ;EAC/C;;;;;;;EAQA,SAAgB,eAAe,GAAgH;GAC7I,MAAM,MAAM,aAAa,EAAE,OAAO,EAAE;GACpC,IAAI,CAAC,OAAO,QAAQ,aAAa,QAAQ,WAAW,QAAQ,SAAS,QAAQ,QAAQ,OAAO;GAC5F,OAAO,YAAY;IAAE,MAAM,QAAQ,EAAE,OAAO;IAAG,OAAO,QAAQ,EAAE,QAAQ;IAAG,KAAK,QAAQ,EAAE,MAAM;IAAG,MAAM,QAAQ,EAAE,OAAO;IAAG;GAAI,CAAC;EACpI;;;;;;EAOA,SAAgB,wBAAgC;GAC9C,MAAM,CAAC,SAAS,cAAcC,MAAAA,QAAM,SAAS,CAAC;GAC9C,MAAA,QAAM,gBAAgB,2BAA2B,YAAY,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;GAC9E,OAAO;EACT;;;;;;;;;;;;;;;ECvJA,SAAgB,UAAU,OAAO;GAC/B,MAAM,YAAY,OAAO;GACzB,MAAM,SAAS,OAAO;GACtB,MAAM,CAAC,GAAG,QAAQC,MAAAA,QAAM,SAAS,EAAE;GACnC,MAAM,CAAC,SAAS,cAAcA,MAAAA,QAAM,SAAS,IAAI;GACjD,MAAM,CAAC,MAAM,WAAWA,MAAAA,QAAM,SAAS,KAAK;GAC5C,MAAM,WAAWA,MAAAA,QAAM,OAAO,IAAI;GAClC,MAAM,MAAMA,MAAAA,QAAM,OAAO,CAAC;GAC1B,MAAM,QAAQA,MAAAA,QAAM,OAAO,IAAI;GAC/B,sBAAsB;GAEtB,MAAM,UAAU,UAAU;IACxB,MAAM,IAAI,EAAE,IAAI;IAChB,MAAM,QAAQ,OAAO,SAAS,EAAE,CAAC,CAAC,KAAK;IACvC,IAAI,MAAM,SAAS,GAAG;KAAE,WAAW,IAAI;KAAG;IAAO;IACjD,IAAI,oBAAoB;KAAE;KAAW,OAAO;IAAM,CAAC,CAAC,CAAC,MAAM,QAAQ;KACjE,IAAI,MAAM,IAAI,SAAS;KACvB,WAAY,OAAO,IAAI,MAAM,MAAM,QAAQ,IAAI,KAAK,IAAK,IAAI,QAAQ,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC,YAAY;KAAE,IAAI,MAAM,IAAI,SAAS,WAAW,CAAC,CAAC;IAAE,CAAC;GAC1D;GAEA,MAAM,YAAY,MAAM;IACtB,KAAK,CAAC;IAAG,QAAQ,IAAI;IACrB,IAAI,MAAM,SAAS,aAAa,MAAM,OAAO;IAC7C,MAAM,UAAU,iBAAiB,OAAO,CAAC,GAAG,GAAG;GACjD;GAEA,MAAM,QAAQ,MAAM;IAClB,OAAO,CAAC;IACR,KAAK,EAAE;IAAG,WAAW,IAAI;IAAG,QAAQ,KAAK;IACzC,SAAS,SAAS,OAAO;GAC3B;GAEA,MAAA,QAAM,gBAAgB;IACpB,MAAM,SAAS,MAAM;KACnB,IAAI,WAAW,GAAG,UAAU,gBAAgB,CAAC,GAAG;MAC9C,EAAE,eAAe;MAAG,EAAE,gBAAgB;MACtC,SAAS,SAAS,QAAQ;MAC1B,QAAQ,IAAI;KACd,OAAO,IAAI,EAAE,QAAQ,UAAU;MAC7B,QAAQ,KAAK;MAAG,SAAS,SAAS,OAAO;KAC3C;IACF;IACA,OAAO,iBAAiB,WAAW,OAAO,IAAI;IAC9C,aAAa,OAAO,oBAAoB,WAAW,OAAO,IAAI;GAChE,GAAG,CAAC,CAAC;GAEL,MAAM,WAAW,MAAM;IACrB,MAAM,OAAO,OAAO,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC;IACvD,OAAO,OAAO,CAAC,CAAC,CAAC,MAAM,GAAG,KAAK,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,WAAW,EAAE,KAAK,OAAO,CAAC;GAC3G;GAEA,IAAI,MAAM;GACV,IAAI,QAAQ,MAAM,QAAQ,OAAO,KAAK,EAAE,KAAK,CAAC,CAAC,UAAU,GAAG;IAC1D,IAAI,QAAQ,QAAQ;KAClB,MAAM,QAAQ,QAAQ,KAAK,MAAMA,MAAAA,QAAM,cAAc,OAAO;MAAE,KAAK;MAAG,WAAW;MAAoB,eAAe,KAAK,CAAC;KAAE,GAC1HA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC,GACnFA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;KAC9D,MAAMA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,kBAAkB,GAAG,GAAG,KAAK;IAC7E,OACE,MAAMA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,kBAAkB,GAAGA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,oBAAoB,GAAG,OAAO,CAAC;GAE9I;GAEA,OAAOA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,mBAAmB,GAChEA,MAAAA,QAAM,cAAc,SAAS;IAC3B,KAAK;IAAU,WAAW;IAAe,aAAa,YAAY,QAAQ,gBAAgB,KAAK,YAAY;IAC3G,OAAO;IACP,WAAW,MAAM,SAAS,EAAE,OAAO,KAAK;IACxC,eAAe;KAAE,IAAI,EAAE,KAAK,CAAC,CAAC,UAAU,KAAK,CAAC,SAAS,QAAQ,IAAI;IAAE;IACrE,YAAY,MAAM;KAChB,IAAI,EAAE,QAAQ,WAAW,MAAM,QAAQ,OAAO,KAAK,QAAQ,QAAQ,KAAK,QAAQ,EAAE;KAClF,IAAI,EAAE,QAAQ,UAAU,QAAQ,KAAK;IACvC;GACF,CAAC,GACD,GAAG;EACP;;;;;;;;;ECpFA,SAAgB,IAAI,QAAQ;GAC1B,OAAO;IACL,UAAU;IACV,SAAS;IACT,QAAQ;IACR,cAAc;IACd,QAAQ;IACR,YAAY;IACZ,OAAO,SAAS,mDAAmD;GACrE;EACF;;EAGA,SAAgB,QAAQ,QAAQ;GAC9B,OAAO,WAAW,GAAG,WAAW,QAAQ,WAAW,GAAG,WAAW,QAAQ;EAC3E;;EAGA,MAAa,OAAO;GAAE,YAAY;GAAuD,UAAU;GAAI,YAAY;EAAK;;;;;;;;;;;;ECbxH,SAAgB,aAAa,OAAO;GAClC,MAAM,YAAY,OAAO;GACzB,MAAM,MAAM,OAAO;GACnB,MAAM,UAAU,OAAO;GACvB,MAAM,aAAa,OAAO;GAC1B,MAAM,CAAC,KAAK,UAAUC,MAAAA,QAAM,SAAS,OAAO,QAAQ,YAAY,YAAY,SAAS;GACrF,MAAM,CAAC,UAAU,eAAeA,MAAAA,QAAM,SAAS,IAAI;GACnD,MAAM,CAAC,eAAe,oBAAoBA,MAAAA,QAAM,SAAS,IAAI;GAC7D,MAAM,CAAC,aAAa,kBAAkBA,MAAAA,QAAM,SAAS,IAAI;GACzD,MAAM,CAAC,YAAY,iBAAiBA,MAAAA,QAAM,SAAS,IAAI;GACvD,MAAM,CAAC,OAAO,YAAYA,MAAAA,QAAM,SAAS,IAAI;GAE7C,MAAM,qBAAqB;IACzB,IAAI,CAAC,WAAW;KAAE,cAAc,OAAO;KAAG;IAAO;IACjD,IAAI,oBAAoB,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,QAAQ;KACnD,IAAI,OAAO,IAAI,MAAM,MAAM,QAAQ,IAAI,OAAO,GAAG;MAAE,YAAY,IAAI,OAAO;MAAG,cAAc,IAAI;KAAE,OAC5F,cAAc,KAAK,QAAQ,OAAO,IAAI,KAAK,IAAI,UAAU;IAChE,CAAC,CAAC,CAAC,OAAO,MAAM,cAAc,UAAU,OAAO,CAAC,CAAC,CAAC;GACpD;GACA,MAAM,qBAAqB,SAAS;IAClC,IAAI,CAAC,WAAW;IAChB,iBAAiB,IAAI;IACrB,IAAI,oBAAoB;KAAE;KAAW;IAAK,CAAC,CAAC,CAAC,MAAM,QAAQ;KACzD,IAAI,OAAO,IAAI,MAAM,MAAM,QAAQ,IAAI,OAAO,GAAG,iBAAiB,IAAI,OAAO;UACxE,cAAc,KAAK,QAAQ,OAAO,IAAI,KAAK,IAAI,UAAU;IAChE,CAAC,CAAC,CAAC,OAAO,MAAM,cAAc,UAAU,OAAO,CAAC,CAAC,CAAC;GACpD;GACA,MAAA,QAAM,gBAAgB;IACpB,IAAI,QAAQ,WAAW;IACvB,YAAY,IAAI;IAAG,iBAAiB,IAAI;IAAG,eAAe,IAAI;IAAG,cAAc,IAAI;IACnF,aAAa;GACf,GAAG,CAAC,KAAK,SAAS,CAAC;GAEnB,IAAI;GACJ,IAAI,QAAQ,WACV,OAAQ,IAAI,aAAa,WAAW,IAChCA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,oBAAoB,GAAG,gBAAgB,IAC/E,IAAI,aAAa,KAAK,MAAMA,MAAAA,QAAM,cAAc,OAAO;IAAE,KAAK,EAAE;IAAM,WAAW;IAAmB,OAAO,cAAc,EAAE;IAAM,eAAe,WAAW,EAAE,IAAI;GAAE,GACjKA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,mBAAmB,GAAG,EAAE,IAAI,GACrEA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,kBAAkB,GAAG,SAAS,EAAE,UAAU,IAAI,GACvFA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAA+B,UAAU,MAAM;KAAE,EAAE,gBAAgB;KAAG,WAAW,EAAE,IAAI;IAAE;GAAE,GAAG,IAAI,CAAC,CAAC;QAErJ,IAAI,YAAY,OAAOA,MAAAA,QAAM,cAAc,OAAO;IAAE,WAAW;IAAqB,OAAO,EAAE,OAAO,+CAA+C;GAAE,GAAG,QAAQ,OAAO,UAAU,CAAC;QAC7K,IAAI,aAAa,MAAM,OAAOA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,oBAAoB,GAAG,MAAM;QACnG,IAAI,SAAS,WAAW,GAAG,OAAOA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,oBAAoB,GAAG,QAAQ;QACzG;IACH,MAAM,QAAQ,SAAS,KAAK,MAAM;KAChC,MAAM,OAAO,gBAAgB,EAAE;KAC/B,IAAI,WAAW;KACf,IAAI,MAAM;MACR,IAAI,kBAAkB,MAAM,WAAWA,MAAAA,QAAM,cAAc,OAAO,EAAE,OAAO;OAAE,SAAS;OAAG,UAAU;OAAI,OAAO;MAAuC,EAAE,GAAG,MAAM;WAG9J,WADgB,cAAc,QAAQ,MAAM,EAAE,SAAS,EAAE,IACxC,CAAC,CAAC,KAAK,OAAO,MAAM,QAAQ,EAAE,OAAO,IAAI,EAAE,UAAU,CAAC,EAAA,CAAG,KAAK,QAAQ;OACrF,MAAM,QAAQ,CAAC;OACf,MAAM,QAAQ,MAAM,QAAQ,IAAI,KAAK,IAAI,IAAI,QAAQ,CAAC;OACtD,KAAK,MAAM,KAAK,OAAO;QACrB,MAAM,SAAS,EAAE,WAAW,GAAA,CAAI,MAAM,IAAI;QAC1C,MAAM,SAAS,EAAE,WAAW,GAAA,CAAI,MAAM,IAAI;QAC1C,KAAK,MAAM,KAAK,OAAO,MAAM,KAAK;SAAE,GAAG;SAAO;QAAE,CAAC;QACjD,IAAI,MAAM,UAAU,MAAM,QAAQ,MAAM,KAAK;SAAE,GAAG;SAAO,GAAG;QAAG,CAAC;QAChE,KAAK,MAAM,KAAK,OAAO,MAAM,KAAK;SAAE,GAAG;SAAO;QAAE,CAAC;OACnD;OACA,MAAM,KAAK,IAAI,WAAW;QAAE,UAAU;QAAG,UAAU;QAAG,SAAS;QAAG,YAAY;OAAM;OACpF,OAAOA,MAAAA,QAAM,cAAc,OAAO;QAAE,KAAK,IAAI;QAAQ,OAAO;SAAE,SAAS;SAAW,WAAW;QAA4C;OAAE,GACzIA,MAAAA,QAAM,cAAc,OAAO,EAAE,OAAO;QAAE,SAAS;QAAQ,KAAK;QAAG,YAAY;QAAU,UAAU;QAAQ,UAAU;QAAI,cAAc;OAAE,EAAE,GACrIA,MAAAA,QAAM,cAAc,QAAQ,EAAE,OAAO;QAAE,OAAO;QAAuC,YAAY;OAAI,EAAE,GAAG,IAAI,aAAa,UAAW,IAAI,SAAS,OAAO,OAAQ,IAAI,GACtKA,MAAAA,QAAM,cAAc,QAAQ,EAAE,OAAO,EAAE,OAAO,iDAAiD,EAAE,GAAG,QAAQ,GAAG,QAAQ,GACvHA,MAAAA,QAAM,cAAc,QAAQ,EAAE,OAAO,EAAE,OAAO,+CAA+C,EAAE,GAAG,QAAQ,GAAG,QAAQ,GACpH,IAAI,aAAaA,MAAAA,QAAM,cAAc,QAAQ,EAAE,OAAO,EAAE,OAAO,8CAA8C,EAAE,GAAG,KAAK,IAAI,MAC5HA,MAAAA,QAAM,cAAc,QAAQ,EAAE,OAAO,EAAE,OAAO,uCAAuC,EAAE,GAAG,IAAI,KAAK,IAAI,EAAE,CAAC,CAAC,mBAAmB,CAAC,CAAC,GAClIA,MAAAA,QAAM,cAAc,OAAO,EAAE,OAAO;QAAE,QAAQ;QAAG,YAAY;QAAO,YAAY,KAAK;QAAY,UAAU;QAAI,YAAY;QAAK,WAAW;OAAO,EAAE,GAAG,MAAM,KAAK,IAAI,MAAMA,MAAAA,QAAM,cAAc,OAAO;QAAE,KAAK;QAAG,OAAO;SAAE,YAAY,GAAG,MAAM,QAAQ,wBAAwB,GAAG,MAAM,QAAQ,wBAAwB;SAAe,OAAO,GAAG,MAAM,QAAQ,iDAAiD,GAAG,MAAM,QAAQ,mDAAmD;QAAuC;OAAE,IAAI,GAAG,MAAM,QAAQ,OAAO,GAAG,MAAM,QAAQ,OAAO,MAAM,GAAG,CAAC,CAAC,CAAC,CAC/jB;MACF,CAAC,CAAC;KAEN;KACA,OAAOA,MAAAA,QAAM,cAAc,OAAO;MAAE,KAAK,EAAE,KAAK,EAAE;MAAM,OAAO;OAAE,QAAQ;OAA6C,cAAc;OAAG,UAAU;MAAS;KAAE,GAC1JA,MAAAA,QAAM,cAAc,OAAO;MAAE,OAAO;OAAE,SAAS;OAAQ,KAAK;OAAG,YAAY;OAAU,SAAS;OAAW,YAAY;OAA2C,QAAQ;OAAW,UAAU;MAAO;MAAG,eAAe;OAAE,IAAI,MAAM;QAAE,eAAe,IAAI;QAAG,iBAAiB,IAAI;OAAE,OAAO;QAAE,eAAe,EAAE,IAAI;QAAG,kBAAkB,EAAE,IAAI;OAAE;MAAE;KAAE,GAC9UA,MAAAA,QAAM,cAAc,QAAQ,EAAE,OAAO;MAAE,MAAM;MAAG,UAAU;MAAI,OAAO;MAAuC,WAAW;KAAY,EAAE,GAAG,EAAE,IAAI,GAC7I,EAAE,SAAS,OAAOA,MAAAA,QAAM,cAAc,QAAQ,EAAE,OAAO;MAAE,UAAU;MAAI,OAAO;KAAuC,EAAE,GAAG,QAAQ,EAAE,KAAK,IAAI,MAC7I,EAAE,SAASA,MAAAA,QAAM,cAAc,QAAQ,EAAE,OAAO;MAAE,UAAU;MAAI,OAAO;KAA8C,EAAE,GAAG,EAAE,MAAM,IAAI,MACvIA,MAAAA,QAAM,cAAc,QAAQ,EAAE,OAAO;MAAE,UAAU;MAAI,OAAO;KAAuC,EAAE,GAAG,IAAI,KAAK,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,GACvIA,MAAAA,QAAM,cAAc,QAAQ,EAAE,OAAO;MAAE,UAAU;MAAI,OAAO;KAAuC,EAAE,GAAG,QAAQ,EAAE,QAAQ,WAAW,WAAW,EAAE,QAAQ,YAAY,EAAE,QAAQ,aAAa,WAAW,EAAE,QAAQ,aAAa,GAAG,GAClOA,MAAAA,QAAM,cAAc,UAAU;MAAE,UAAU,OAAO;OAC/C,GAAG,gBAAgB;OACnB,IAAI,EAAE,SAAS,MAAM;OACrB,IAAI,CAAC,OAAO,QAAQ,cAAc,EAAE,QAAQ,sBAAsB,GAAG;OACrE,IAAI,iBAAiB;QAAE;QAAW,MAAM,EAAE;QAAM,OAAO,EAAE;OAAM,CAAC,CAAC,CAAC,MAAM,QAAQ;QAC9E,IAAI,OAAO,IAAI,IAAI;SACjB,SAAS,IAAI;SAAG,OAAO,cAAc,IAAI,YAAY,cAAc,CAAC;SACpE,eAAe,IAAI;SAAG,iBAAiB,IAAI;SAAG,aAAa;QAC7D,OAAO,SAAS,KAAK,QAAQ,OAAO,IAAI,KAAK,IAAI,MAAM;OACzD,CAAC,CAAC,CAAC,OAAO,QAAQ,SAAS,UAAU,OAAO,GAAG,CAAC,CAAC;MACnD;MAAG,OAAO,IAAI,KAAK;KAAE,GAAG,IAAI,CAAC,GAC/B,QAAQ;IACZ,CAAC;IACD,OAAOA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,mBAAmB,GAAG,KAAK;GAC5E;GAGF,OAAOA,MAAAA,QAAM,cAAc,OAAO;IAAE,WAAW;IAAe,oBAAoB;GAAI,GACpFA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,mBAAmB,GACzDA,MAAAA,QAAM,cAAc,QAAQ,EAAE,OAAO;IAAE,UAAU;IAAI,YAAY;IAAK,OAAO;IAAuC,aAAa;GAAE,EAAE,GAAG,IAAI,GAC5IA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW,qBAAqB,QAAQ,YAAY,QAAQ;IAAK,eAAe,OAAO,SAAS;GAAE,GAAG,SAAS,IAAI,aAAa,OAAO,IAAI,aAAa,MAAM,GAAG,GAChMA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW,qBAAqB,QAAQ,YAAY,QAAQ;IAAK,eAAe,OAAO,SAAS;GAAE,GAAG,IAAI,GACzIA,MAAAA,QAAM,cAAc,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,GACjD,QAAQA,MAAAA,QAAM,cAAc,QAAQ,EAAE,OAAO;IAAE,UAAU;IAAI,OAAO;IAAgD,UAAU;IAAU,cAAc;IAAY,YAAY;IAAU,UAAU;GAAM,EAAE,GAAG,QAAQ,OAAO,KAAK,CAAC,IAAI,MACvOA,MAAAA,QAAM,cAAc,UAAU;IAAE,SAAS;IAAS,OAAO,IAAI,KAAK;GAAE,GAAG,MAAM,CAAC,GAChFA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,mBAAmB,GAAG,IAAI,CAAC;EACvE;;;;;;;;;ECjHA,MAAM,QAAQ;EACd,MAAM,QAAQ;;;;;;;;;;;EAYd,SAAgB,YAAY,OAAO;GACjC,MAAM,SAAS,MAAM,UAAU,OAAO,KAAK,CAAC;GAC5C,MAAM,MAAM,MAAM;GAClB,MAAM,cAAc,MAAM;GAC1B,MAAM,WAAW,MAAM;GACvB,MAAM,QAAQ,MAAM;GACpB,MAAM,UAAU,MAAM;GACtB,MAAM,SAAS,MAAM;GAErB,MAAM,SAAS,OAAO,MAAM,MAAM,EAAE,OAAO,WAAW,KAAK,OAAO;GAElE,MAAM,iBAAiB,MAAM;IAC3B,EAAE,eAAe;IACjB,MAAM,SAAS,EAAE;IACjB,MAAM,SAAS;IACf,MAAM,UAAU,OAAO;KACrB,MAAM,IAAI,KAAK,IAAI,OAAO,KAAK,IAAI,OAAO,UAAU,GAAG,UAAU,OAAO,CAAC;KACzE,QAAQ,CAAC;IACX;IACA,MAAM,aAAa;KACjB,OAAO,oBAAoB,eAAe,MAAM;KAChD,OAAO,oBAAoB,aAAa,IAAI;IAC9C;IACA,OAAO,iBAAiB,eAAe,MAAM;IAC7C,OAAO,iBAAiB,aAAa,IAAI;GAC3C;GAEA,MAAM,OAAOC,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,YAAY,GAC/DA,MAAAA,QAAM,cAAc,OAAO,EAAE,OAAO;IAAE,MAAM;IAAG,SAAS;IAAQ,eAAe;IAAU,KAAK;GAAE,EAAE,GAChG,OAAO,KAAK,MAAM;IAChB,MAAM,QAAQ,OAAO,EAAE,UAAU,aAAa,EAAE,MAAM,GAAG,IAAI;IAC7D,OAAOA,MAAAA,QAAM,cAAc,UAAU;KACnC,KAAK,EAAE;KACP,WAAW,mBAAmB,UAAU,EAAE,OAAO,OAAO,KAAK,kBAAkB;KAC/E,OAAO,EAAE;KACT,eAAe,SAAS,EAAE,EAAE;IAC9B,GACEA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,iBAAiB,GAAG,EAAE,IAAI,GACnE,QAAQ,IACJA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,kBAAkB,GAAG,OAAO,KAAK,CAAC,IAC3E,IAAI;GACZ,CAAC,CAAC,GACJA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAAiB,OAAO;IAAkB,SAAS;GAAO,GAAG,GAAG,CAAC;GAE9G,OAAOA,MAAAA,QAAM,cAAc,OAAO;IAAE,WAAW;IAAgB,OAAO,EAAE,MAAM;GAAE,GAC9E,MACAA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,iBAAiB,GACvD,SAAS,OAAO,OAAO,GAAG,IAAI,IAAI,GACpCA,MAAAA,QAAM,cAAc,OAAO;IAAE,WAAW;IAAmC;GAAc,CAAC,CAAC;EAC/F;;;ECnDA,MAAM,yBAAS,IAAI,IAA8B;EACjD,MAAM,0BAAU,IAAI,IAA4B;EAChD,MAAM,4BAAY,IAAI,IAAmC;;EAGzD,SAAS,WAAW,WAAyB;GAC3C,KAAK,MAAM,YAAY,UAAU,IAAI,SAAS,KAAK,CAAC,GAAG,SAAS;EAClE;;;;;;;;EASA,SAAgB,gBAAgB,WAAmB,UAA4B,QAA+B;GAC5G,OAAO,IAAI,WAAW,QAAQ;GAC9B,IAAI,QAAQ,QAAQ,IAAI,WAAW,MAAM;QACpC,QAAQ,OAAO,SAAS;GAC7B,WAAW,SAAS;EACtB;;;;;;;EAQA,SAAgB,cAAc,WAAmB,QAA+B;GAC9E,IAAI,UAAU,QAAQ,IAAI,SAAS,MAAM,QAAQ;GACjD,OAAO,OAAO,SAAS;GACvB,QAAQ,OAAO,SAAS;GACxB,WAAW,SAAS;EACtB;;;;;;;EAQA,SAAgB,aAAa,WAA6C;GACxE,IAAI,CAAC,WAAW,OAAO;GACvB,OAAO,OAAO,IAAI,SAAS,KAAK;EAClC;;;;;;;;EASA,SAAgB,kBAAkB,WAAmB,UAAwC;GAC3F,IAAI,SAAS,UAAU,IAAI,SAAS;GACpC,IAAI,CAAC,QAAQ;IACX,yBAAS,IAAI,IAAI;IACjB,UAAU,IAAI,WAAW,MAAM;GACjC;GACA,OAAO,IAAI,QAAQ;GACnB,aAAa;IACX,OAAQ,OAAO,QAAQ;IACvB,IAAI,CAAC,OAAQ,MAAM,UAAU,OAAO,SAAS;GAC/C;EACF;;;;;;;;;;;;;;;ECzEA,SAAgB,aAAa,OAAiB,OAAuD;GACnG,IAAI,CAAC,MAAM,QAAQ,OAAO;IAAE,MAAM;IAAM,OAAO;GAAE;GAEjD,MAAM,MADU,OAAO,SAAS,KAAK,IAAI,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,CAAC,IAAI,KACrD,MAAM;GAC3B,OAAO;IAAE,MAAM,MAAM,OAAO;IAAM,QAAQ,KAAK,KAAK,MAAM;GAAO;EACnE;;;;;;;EAQA,SAAgB,aAAa,OAAuB;GAClD,OAAO,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,CAAC,IAAI;EAClD;;;;;;;EAQA,SAAgB,eAAe,YAAkE;GAC/F,OAAO,aAAa,WAAW;EACjC;;;;;;;;;EAUA,SAAgB,iBAAiB,OAAgB,aAAqB,eAA+B;GACnG,MAAM,QAAQ,QAAQ,cAAc;GACpC,OAAO,OAAO,SAAS,KAAK,IAAI,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,CAAC,IAAI;EACnE;;;;;;;;;;;;;;;ECtCA,SAAgB,aAAa,SAAiB,cAAsB,aAA8B;GAChG,MAAM,OAAO,OAAO,SAAS,OAAO,IAAI,UAAU;GAClD,MAAM,SAAS,OAAO,SAAS,YAAY,IAAI,eAAe;GAE9D,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,QADX,OAAO,SAAS,WAAW,IAAI,cAAwB,MAC5B,IAAI,IAAI;EACtD;;;;;;;;;;;;;;;ECCA,eAAsB,iBAAiB,WAA+B,MAAsC;GAC1G,IAAI,CAAC,WAAW,OAAO;IAAE,IAAI;IAAO,OAAO;GAAQ;GACnD,IAAI;IACF,MAAM,MAAM,MAAM,IAAI,yBAAyB;KAAE;KAAW;IAAK,CAAC;IAClE,OAAO,IAAI,KAAK,EAAE,IAAI,KAAK,IAAI;KAAE,IAAI;KAAO,OAAO,IAAI;IAAM;GAC/D,SAAS,OAAO;IACd,OAAO;KAAE,IAAI;KAAO,OAAO,UAAU,OAAO,KAAK;IAAE;GACrD;EACF;;;;;;;;;;ECnBA,MAAMC,eAAa;;;;;;;EAcnB,SAAgB,gBAAgB,OAAyB;GACvD,IAAI,CAAC,SAAS,OAAO,UAAU,UAAU,OAAO;GAChD,MAAM,IAAI;GAEV,OAAO,MAAM,QAAQ,EAAE,WAAW,KAAK,OAAO,EAAE,cAAc,YACzD,MAAM,QAAQ,EAAE,kBAAkB;EACzC;;;;;;;EAQA,SAAgB,oBAAoB,QAAyC;GAC3E,OAAO,KAAK,UAAU;IAAE,GAAG;IAAG;GAAO,CAAC;EACxC;;;;;;;EAQA,SAAgB,gBAAgB,MAAqD;GACnF,IAAI,CAAC,MAAM,OAAO;GAClB,IAAI;IACF,MAAM,OAAO,KAAK,MAAM,IAAI;IAC5B,IAAI,CAAC,QAAQ,OAAO,SAAS,UAAU,OAAO;IAC9C,MAAM,SAAU,KAAiC;IACjD,IAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,GAAG,OAAO;IAC3E,MAAM,MAA+B,CAAC;IACtC,KAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,MAAM,GAAG;KAClD,IAAI,OAAO,SAAS,YAAY,CAAC,MAAM;KACvC,IAAI,CAAC,gBAAgB,KAAK,GAAG;KAC7B,IAAI,QAAQ;IACd;IACA,OAAO;GACT,SAAS,OAAO;IACd,OAAO;GACT;EACF;;;;;;;;;EAUA,SAAgB,gBACd,QACA,MACA,OACyB;GACzB,IAAI,CAAC,QAAQ,CAAC,gBAAgB,KAAK,GAAG,OAAO;GAC7C,IAAI;IACF,IAAI,KAAK,UAAU,KAAK,CAAC,CAAC,SAAA,OAA8B,OAAO;GACjE,SAAS,OAAO;IACd,OAAO;GACT;GACA,MAAM,OAAO,OAAO,OAAO,CAAC,GAAG,MAAM;GACrC,OAAO,KAAK;GACZ,KAAK,QAAQ;GACb,MAAM,OAAO,OAAO,KAAK,IAAI;GAC7B,IAAI,KAAK,SAAA,IACP,KAAK,MAAM,KAAK,KAAK,MAAM,GAAG,KAAK,SAAA,EAAsB,GAAG,OAAO,KAAK;GAE1E,OAAO;EACT;;;;;;;EAQA,SAAgB,eAAe,WAA4C;GACzE,IAAI;IACF,OAAO,gBAAgB,OAAO,aAAa,QAAQA,eAAa,OAAO,SAAS,CAAC,CAAC,KAAK,CAAC;GAC1F,SAAS,OAAO;IACd,OAAO,CAAC;GACV;EACF;;;;;;;EAQA,SAAgB,eAAe,WAAmB,QAAuC;GACvF,IAAI;IACF,OAAO,aAAa,QAAQA,eAAa,OAAO,SAAS,GAAG,oBAAoB,MAAM,CAAC;GACzF,SAAS,OAAO,CAAmB;EACrC;;;;;;;;;;;;;;;;;ECrFA,SAAgB,WAAW,OAAO;GAChC,MAAM,YAAY,OAAO;GACzB,MAAM,WAAW,MAAM;GACvB,MAAM,oBAAoB,MAAM;GAChC,MAAM,SAAS,OAAO,WAAW,SAAS,SAAS;GACnD,MAAM,WAAW,OAAO;GACxB,MAAM,CAAC,QAAQ,aAAaC,MAAAA,QAAM,SAAS,IAAI;GAC/C,MAAM,CAAC,WAAW,gBAAgBA,MAAAA,QAAM,SAAS,IAAI;GACrD,MAAM,CAAC,SAAS,cAAcA,MAAAA,QAAM,SAAS,CAAC,CAAC;GAC/C,MAAM,CAAC,MAAM,WAAWA,MAAAA,QAAM,SAAS,CAAC,CAAC;GACzC,MAAM,CAAC,QAAQ,aAAaA,MAAAA,QAAM,SAAS,IAAI;GAC/C,MAAM,CAAC,UAAU,eAAeA,MAAAA,QAAM,SAAS,CAAC,CAAC;GACjD,MAAM,CAAC,SAAS,cAAcA,MAAAA,QAAM,SAAS,IAAI;GACjD,MAAM,CAAC,aAAa,kBAAkBA,MAAAA,QAAM,SAAS,IAAI;GACzD,MAAM,CAAC,QAAQ,aAAaA,MAAAA,QAAM,SAAS,EAAE;GAC7C,MAAM,CAAC,OAAO,YAAYA,MAAAA,QAAM,SAAS,IAAI;GAC7C,MAAM,CAAC,WAAW,gBAAgBA,MAAAA,QAAM,SAAS,IAAI;GACrD,MAAM,CAAC,WAAW,gBAAgBA,MAAAA,QAAM,SAAS;IAAE,UAAU;IAAG,SAAS;GAAW,CAAC;GACrF,MAAM,CAAC,WAAW,gBAAgBA,MAAAA,QAAM,SAAS,KAAK;GACtD,MAAM,CAAC,WAAW,gBAAgBA,MAAAA,QAAM,SAAS,EAAE;GACnD,MAAM,CAAC,QAAQ,aAAaA,MAAAA,QAAM,SAAS,EAAE;GAC7C,MAAM,CAAC,cAAc,mBAAmBA,MAAAA,QAAM,SAAS,KAAK;GAC5D,MAAM,CAAC,aAAa,kBAAkBA,MAAAA,QAAM,SAAS,SAAS;GAC9D,MAAM,CAAC,UAAU,eAAeA,MAAAA,QAAM,SAAS,IAAI;GACnD,MAAM,CAAC,SAAS,cAAcA,MAAAA,QAAM,SAAS,CAAC;GAC9C,MAAM,CAAC,SAAS,cAAcA,MAAAA,QAAM,SAAS,CAAC;GAC9C,MAAM,CAAC,SAAS,cAAcA,MAAAA,QAAM,SAAS,IAAI;GACjD,MAAM,CAAC,WAAW,gBAAgBA,MAAAA,QAAM,SAAS,WAAW,MAAM;GAClE,MAAM,CAAC,UAAU,eAAeA,MAAAA,QAAM,SAAS,GAAG;GAClD,MAAM,CAAC,aAAa,kBAAkBA,MAAAA,QAAM,SAAS,UAAU;GAC/D,MAAM,CAAC,cAAc,mBAAmBA,MAAAA,QAAM,SAAS,CAAC;GACtC,sBAAsB;GACxC,MAAM,CAAC,eAAe,oBAAoBA,MAAAA,QAAM,eAAe;IAC7D,IAAI;KAAE,OAAO,aAAa,QAAQ,0BAA0B,MAAM;IAAI,QAAQ;KAAE,OAAO;IAAM;GAC/F,CAAC;GACD,MAAM,YAAYA,MAAAA,QAAM,OAAO,IAAI;GACnC,MAAM,cAAcA,MAAAA,QAAM,OAAO,IAAI;GACrC,MAAM,YAAYA,MAAAA,QAAM,OAAO,IAAI;GACnC,MAAM,YAAYA,MAAAA,QAAM,uBAAO,IAAI,IAAI,CAAC;GAExC,MAAM,gBAAgBA,MAAAA,QAAM,OAAO,CAAC,CAAC;GACrC,MAAM,eAAeA,MAAAA,QAAM,OAAO,IAAI;GACtC,MAAM,aAAaA,MAAAA,QAAM,OAAO,CAAC;GACjC,MAAM,kBAAkBA,MAAAA,QAAM,OAAO,KAAK;GAC1C,MAAM,UAAUA,MAAAA,QAAM,OAAO,KAAK;GAClC,MAAM,kBAAkBA,MAAAA,QAAM,OAAO,IAAI;GACzC,MAAM,kBAAkBA,MAAAA,QAAM,OAAO,CAAC,CAAC;GACvC,MAAM,mBAAmBA,MAAAA,QAAM,uBAAO,IAAI,IAAI,CAAC;GAC/C,MAAM,cAAcA,MAAAA,QAAM,OAAO,IAAI;GACrC,MAAM,cAAcA,MAAAA,QAAM,OAAO,IAAI;GACrC,MAAM,gBAAgBA,MAAAA,QAAM,OAAO,IAAI;GACvC,MAAM,eAAeA,MAAAA,QAAM,OAAO,IAAI;GACtC,MAAM,iBAAiBA,MAAAA,QAAM,OAAO,KAAK;GACzC,MAAM,gBAAgBA,MAAAA,QAAM,OAAO,KAAK;GACxC,MAAM,eAAeA,MAAAA,QAAM,OAAO,KAAK;GACvC,MAAM,kBAAkBA,MAAAA,QAAM,OAAO,IAAI;GACzC,MAAM,YAAYA,MAAAA,QAAM,OAAO,IAAI;GACnC,MAAM,kBAAkBA,MAAAA,QAAM,OAAO,IAAI;GACzC,MAAM,YAAYA,MAAAA,QAAM,OAAO,MAAM;GACrC,UAAU,UAAU;GACpB,IAAI,CAAC,gBAAgB,SAAS,gBAAgB,UAAU,oBAAoB,KAAK,MAAM,IAAI,KAAK,CAAC,CAAC;GAElG,MAAM,iBAAiBA,MAAAA,QAAM,cAAc;IACzC,MAAM,OAAO,CAAC;IACd,KAAK,MAAM,OAAO,OAAO,OAAO,OAAO,GAAG,IAAI,IAAI,SAAS,UAAU,IAAI,aAAa,MAAM,KAAK,KAAK,GAAG;IACzG,OAAO;GACT,GAAG,CAAC,SAAS,MAAM,CAAC;GAEpB,MAAM,eAAe,YAAY,QAAQ,gBAAgB;GACzD,MAAM,UAAUA,MAAAA,QAAM,cAAc,YAAY,gBAAgB,eAAe,UAAU,IAAI,CAAC,CAAC,QAAQ,MAAM,CAAC,EAAE,UAAU,GAAG;IAAC;IAAgB;IAAS;IAAa;GAAM,CAAC;GAE3K,MAAM,iBAAiBA,MAAAA,QAAM,cAAc,QAAQ,QAAQ,MAAM,EAAE,WAAW,GAAG,WAAW,CAAC,EAAE,KAAK,GAAG,CAAC,OAAO,CAAC;GAChH,MAAM,eAAeA,MAAAA,QAAM,cAAc,QAAQ,QAAQ,MAAM,EAAE,WAAW,GAAG,WAAW,EAAE,KAAK,GAAG,CAAC,OAAO,CAAC;GAC7G,gBAAgB,UAAU;GAW1B,iBAAiB,UATKA,MAAAA,QAAM,cAAc;IACxC,MAAM,sBAAM,IAAI,IAAI;IACpB,KAAK,MAAM,KAAK,gBAAgB;KAC9B,IAAI,EAAE,UAAU,KAAA,KAAa,EAAE,QAAQ,KAAA,GAAW;KAClD,MAAM,OAAO,KAAK,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC;KACxC,KAAK,IAAI,KAAK,EAAE,OAAO,MAAM,MAAM,MAAM,IAAI,CAAC,IAAI,IAAI,EAAE,GAAG,IAAI,IAAI,IAAI,CAAC;IAC1E;IACA,OAAO;GACT,GAAG,CAAC,cAAc,CACqB;GACvC,MAAM,MAAMA,MAAAA,QAAM,cAAc,UAAU,OAAO,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;GAE5E,MAAM,UAAU,MAAM,WAAW;IAC/B,SAAS,SAAS;KAChB,IAAI,KAAK,MAAM,MAAM,EAAE,SAAS,IAAI,GAAG,OAAO;KAC9C,OAAO,KAAK,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC;IACD,IAAI,QAAQ,UAAU,IAAI;GAC5B;;;;;;GAOA,MAAM,iBAAiB,SAAS;IAC9B,MAAM,KAAK,UAAU;IACrB,MAAM,SAAS,QAAQ;IACvB,IAAI,CAAC,MAAM,CAAC,QAAQ;IACpB,IAAI;KACF,MAAM,QAAQ,GAAG,cAAc;KAC/B,IAAI,CAAC,OAAO;KACZ,cAAc,UAAU,gBAAgB,cAAc,SAAS,QAAQ,KAAK;KAC5E,eAAe,WAAW,cAAc,OAAO;IACjD,SAAS,GAAG,CAAmB;GACjC;;;;;;GAOA,MAAM,oBAAoB,SAAS;IACjC,MAAM,KAAK,UAAU;IACrB,IAAI,CAAC,MAAM,CAAC,MAAM;IAClB,MAAM,QAAQ,cAAc,QAAQ;IACpC,IAAI,CAAC,OAAO;IACZ,MAAM,OAAO,OAAO,OAAO,CAAC,GAAG,cAAc,OAAO;IACpD,OAAO,KAAK;IACZ,cAAc,UAAU;IACxB,IAAI;KAAE,GAAG,iBAAiB,KAAK;IAAE,SAAS,GAAG,CAAyB;GACxE;GAEA,MAAM,YAAY,SAAS;IACzB,UAAU;IACV,IAAI,SAAS,QAAQ,cAAc,IAAI;IACvC,SAAS,SAAS;KAChB,MAAM,MAAM,KAAK,WAAW,MAAM,EAAE,SAAS,IAAI;KACjD,IAAI,MAAM,GAAG,OAAO;KACpB,MAAM,OAAO,KAAK,QAAQ,MAAM,EAAE,SAAS,IAAI;KAC/C,IAAI,WAAW,MAAM,UAAU,KAAK,OAAO,KAAK,IAAI,CAAC,OAAQ,KAAK,MAAM,KAAK,KAAK,MAAM,EAAE,CAAC,OAAO,IAAK;KACvG,OAAO;IACT,CAAC;GACH;;;;;;;;;GAUA,MAAM,eAAe,MAAM,SAAS;IAClC,MAAM,KAAK,OAAO,KAAK,IAAI;IAC3B,MAAM,KAAK,OAAO,KAAK,IAAI;IAC3B,IAAI,GAAG,WAAW,GAAG,QAAQ,OAAO;IACpC,KAAK,MAAM,KAAK,IAAI;KAClB,IAAI,EAAE,KAAK,OAAO,OAAO;KACzB,IAAI,KAAK,UAAU,KAAK,EAAE,MAAM,KAAK,UAAU,KAAK,EAAE,GAAG,OAAO;IAClE;IACA,OAAO;GACT;GAEA,MAAM,kBAAkB,cAAc;IACpC,IAAI,CAAC,WAAW;IAChB,IAAI,aAAa;KAAE;KAAW,GAAI,YAAY,EAAE,WAAW,KAAK,IAAI,CAAC;IAAG,CAAC,CAAC,CAAC,MAAM,QAAQ;KACvF,IAAI,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,MAAM,QAAQ,IAAI,OAAO,GAAG;KACpD,MAAM,MAAM,CAAC;KACb,KAAK,MAAM,KAAK,IAAI,SAAS;MAC3B,IAAI,EAAE,aAAa,MAAM;MACzB,IAAI,EAAE,UAAU;KAClB;KACA,YAAY,SAAU,YAAY,MAAM,GAAG,IAAI,OAAO,GAAI;IAC5D,CAAC,CAAC,CAAC,OAAO,MAAM,SAAS,YAAY,OAAO,CAAC,CAAC,CAAC;GACjD;;;;;;;;;GAUA,MAAM,eAAe,MAAM,KAAK,UAAU;IACxC,MAAM,MAAM,EAAE,WAAW;IACzB,MAAM,cAAc,QAAQ,OAAO,UAAU,QAAQ,IAAI,IAAI;IAC7D,IAAI,aAAa;KAEf,WAAW,YAAY,SAAS,CAAC;KACjC,eAAe,IAAI;KACnB,cAAc,UAAU;MAAE,UAAU,KAAK,IAAI,IAAI,KAAK,QAAQ;MAAG,SAAS;KAAiB,EAAE;KAC7F,UAAU,KAAK;KACf,IAAI,aAAa;MAAE,WAAW;MAAK;KAAK,CAAC,CAAC,CAAC,MAAM,QAAQ;MACvD,IAAI,QAAQ,WAAW,WAAW,SAAS,QAAQ;MACnD,IAAI,OAAO,IAAI,MAAM,IAAI,YAAY,YAAY,SAAS,GAAG;OAC3D,cAAc,IAAI;OAClB,WAAW,IAAI,OAAO;OACtB,UAAU,KAAK;MACjB;KACF,CAAC,CAAC,CAAC,YAAY,CAAmB,CAAC;KACnC;IACF;IACA,aAAa,IAAI;IACjB,aAAa;KAAE,UAAU,SAAS,KAAK;KAAI,SAAS;IAAU,CAAC;IAC/D,IAAI,aAAa;KAAE,WAAW;KAAK;IAAK,CAAC,CAAC,CAAC,MAAM,QAAQ;KACvD,IAAI,QAAQ,WAAW,WAAW,SAAS,QAAQ;KACnD,IAAI,OAAO,IAAI,IAAI;MACjB,WAAW,IAAI,OAAO;MACtB,eAAe,IAAI;MACnB,cAAc,UAAU;OAAE,UAAU,KAAK,IAAI,IAAI,KAAK,QAAQ;OAAG,SAAS;MAAiB,EAAE;MAC7F,UAAU,KAAK;KACjB,OAAO;MACL,MAAM,UAAU,KAAK,QAAQ,OAAO,IAAI,KAAK,IAAI;MACjD,aAAa,OAAO;MACpB,SAAS,OAAO;MAChB,UAAU,MAAM;KAClB;IACF,CAAC,CAAC,CAAC,OAAO,MAAM;KACd,IAAI,QAAQ,WAAW,SAAS;KAChC,MAAM,UAAU,YAAY,OAAO,CAAC;KACpC,aAAa,OAAO;KACpB,SAAS,OAAO;KAChB,UAAU,MAAM;IAClB,CAAC;GACH;GAGA,MAAA,QAAM,gBAAgB;IACpB,IAAI,CAAC,WAAW;IAChB,eAAe;IACf,MAAM,IAAI,YAAY,gBAAgB,GAAI;IAC1C,MAAM,kBAAkB,eAAe;IACvC,OAAO,iBAAiB,gBAAgB,SAAS;IACjD,aAAa;KAAE,cAAc,CAAC;KAAG,OAAO,oBAAoB,gBAAgB,SAAS;IAAE;GACzF,GAAG,CAAC,SAAS,CAAC;GAEd,MAAA,QAAM,gBAAgB;IACpB,MAAM,UAAU,MAAM;KACpB,MAAM,IAAI,GAAG,QAAQ;KACrB,IAAI,CAAC,GAAG;KACR,IAAI,GAAG,QAAQ,cAAc,MAAM;MACjC,gBAAgB,UAAU;OAAE,MAAM;OAAG,QAAQ;MAAK;MAClD,iBAAiB,UAAU,QAAQ,CAAC;KACtC;KACA,OAAO,GAAG,IAAI;IAChB;IACA,MAAM,kBAAkB,UAAU;KAChC,MAAM,MAAM,OAAO,QAAQ;KAC3B,IAAI,QAAQ,aAAa,QAAQ,WAAW,eAAe,GAAG;KAC9D,gBAAgB,IAAI;IACtB;IACA,OAAO,iBAAiB,oBAAoB,MAAM;IAClD,OAAO,iBAAiB,sBAAsB,cAAc;IAC5D,aAAa;KACX,OAAO,oBAAoB,oBAAoB,MAAM;KACrD,OAAO,oBAAoB,sBAAsB,cAAc;IACjE;GACF,GAAG,CAAC,SAAS,CAAC;GAGd,MAAM,gBAAgBA,MAAAA,QAAM,OAAO,CAAC,CAAC;GACrC,MAAA,QAAM,sBAAsB;IAC1B,cAAc,WAAW,cAAc,OAAO;IAC9C,IAAI,WAAW,QAAQ,eAAe,WAAW,CAAC;GACpD,GAAG,CAAC,SAAS,CAAC;GAId,MAAA,QAAM,sBAAsB;IAC1B,IAAI,WAAW,QAAQ;IACvB,MAAM,OAAO,YAAY;IACzB,MAAM,SAAS,MAAM,UAAU,4BAA4B;IAC3D,IAAI,CAAC,QAAQ,CAAC,QAAQ;IACtB,IAAI,OAAO;IACX,IAAI,QAAQ;IACZ,IAAI,iBAAiB;IACrB,MAAM,eAAe;KACnB,QAAQ;KACR,MAAM,WAAW,KAAK,sBAAsB;KAC5C,MAAM,aAAa,OAAO,sBAAsB;KAChD,MAAM,WAAW,MAAM,wBAAwB;KAC/C,MAAM,SAAS,aAAa,SAAS,KAAK,WAAW,QAAQ,UAAU,GAAG;KAC1E,KAAK,MAAM,YAAY,wBAAwB,SAAS,IAAI;IAC9D;IACA,MAAM,uBAAuB;KAC3B,IAAI,UAAU,MAAM;KACpB,QAAQ,sBAAsB,MAAM;IACtC;IACA,MAAM,mBAAmB;KACvB,MAAM,OAAO,OAAO,gBAAgB,sBAAsB;KAC1D,IAAI,SAAS,MAAM;MACjB,eAAe;MACf;KACF;KACA,gBAAgB,WAAW;KAC3B,OAAO;KACP,iBAAiB;KACjB,IAAI,QAAQ,OAAO,mBAAmB,YAAY;MAChD,iBAAiB,IAAI,eAAe,cAAc;MAClD,eAAe,QAAQ,IAAI;KAC7B;KACA,eAAe;IACjB;IACA,WAAW;IACX,MAAM,mBAAmB,OAAO,qBAAqB,aACjD,IAAI,iBAAiB,UAAU,IAC/B;IACJ,kBAAkB,QAAQ,QAAQ,EAAE,WAAW,KAAK,CAAC;IACrD,MAAM,iBAAiB,OAAO,mBAAmB,aAAa,IAAI,eAAe,cAAc,IAAI;IACnG,gBAAgB,QAAQ,MAAM;IAC9B,OAAO,iBAAiB,UAAU,cAAc;IAChD,eAAe;IACf,aAAa;KACX,IAAI,UAAU,MAAM,qBAAqB,KAAK;KAC9C,gBAAgB,WAAW;KAC3B,gBAAgB,WAAW;KAC3B,kBAAkB,WAAW;KAC7B,OAAO,oBAAoB,UAAU,cAAc;KACnD,KAAK,MAAM,eAAe,sBAAsB;IAClD;GACF,GAAG,CAAC,WAAW,MAAM,CAAC;GAGtB,MAAA,QAAM,gBAAgB;IACpB,IAAI,QAAQ,WAAW,CAAC,WAAW;IACnC,QAAQ,UAAU;IAClB,cAAc,UAAU,eAAe,SAAS;IAChD,IAAI;KACF,MAAM,MAAM,aAAa,QAAQ,oBAAoB,OAAO,SAAS,CAAC;KACtE,IAAI,KAAK;MACP,MAAM,QAAQ,KAAK,MAAM,GAAG;MAC5B,IAAI,MAAM,QAAQ,MAAM,IAAI,KAAK,MAAM,KAAK,QAAQ;OAClD,QAAQ,MAAM,KAAK,KAAK,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC;OAC5C,IAAI,OAAO,MAAM,WAAW,UAAU,UAAU,MAAM,MAAM;MAC9D;KACF;IACF,SAAS,GAAG,CAAa;GAC3B,GAAG,CAAC,SAAS,CAAC;GAEd,MAAA,QAAM,gBAAgB;IACpB,IAAI,CAAC,WAAW;IAChB,IAAI;KAAE,aAAa,QAAQ,oBAAoB,OAAO,SAAS,GAAG,KAAK,UAAU;MAAE,MAAM,KAAK,KAAK,MAAM,EAAE,IAAI;MAAG;KAAO,CAAC,CAAC;IAAE,SACtH,GAAG,CAAW;GACvB,GAAG;IAAC;IAAM;IAAQ;GAAS,CAAC;GAG5B,MAAM,aAAa,mBAAmB,WAAW,SAAS,UAAU,MAAM,OAAO,SAAS;GAC1F,MAAA,QAAM,gBAAgB;IACpB,IAAI,CAAC,WAAW;IAChB,IAAI;KACF,MAAM,MAAM,aAAa,QAAQ,UAAU;KAC3C,IAAI,KAAK;MACP,MAAM,QAAQ,KAAK,MAAM,GAAG;MAC5B,IAAI,OAAO,MAAM,OAAO,WAAW,aAAa,MAAM,EAAE;MACxD,IAAI,OAAO,MAAM,UAAU,UAAU,YAAY,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,MAAM,KAAK,CAAC,CAAC;MAC1F,IAAI,OAAO,MAAM,UAAU,UAAU,eAAe,MAAM,KAAK;KACjE;IACF,SAAS,GAAG,CAAa;GAC3B,GAAG,CAAC,WAAW,UAAU,CAAC;GAG1B,MAAA,QAAM,gBAAgB;IACpB,IAAI,CAAC,WAAW;IAChB,IAAI;KAAE,aAAa,QAAQ,YAAY,KAAK,UAAU;MAAE,IAAI;MAAW,OAAO;MAAU,OAAO;KAAY,CAAC,CAAC;IAAE,SACxG,GAAG,CAAW;GACvB,GAAG;IAAC;IAAW;IAAU;IAAa;IAAW;GAAU,CAAC;GAG5D,MAAA,QAAM,gBAAgB;IACpB,MAAM,SAAS,MAAM;KACnB,IAAI,CAAC,WAAW,GAAG,UAAU,oBAAoB,CAAC,GAAG;KACrD,EAAE,eAAe;KAAG,EAAE,gBAAgB;KACtC,cAAc,MAAM,CAAC,CAAC;IACxB;IACA,OAAO,iBAAiB,WAAW,OAAO,IAAI;IAC9C,aAAa,OAAO,oBAAoB,WAAW,OAAO,IAAI;GAChE,GAAG,CAAC,CAAC;GAGL,MAAA,QAAM,gBAAgB;IACpB,MAAM,SAAS,MAAM;KACnB,IAAI,CAAC,WAAW,GAAG,UAAU,WAAW,CAAC,GAAG;KAC5C,IAAI,CAAC,UAAU,SAAS,WAAW,GAAG;KACtC,EAAE,eAAe;KAAG,EAAE,gBAAgB;KACtC,UAAU;KACV,UAAU,QAAQ,KAAK;IACzB;IACA,OAAO,iBAAiB,WAAW,OAAO,IAAI;IAC9C,aAAa,OAAO,oBAAoB,WAAW,OAAO,IAAI;GAChE,GAAG,CAAC,CAAC;GAGL,MAAA,QAAM,gBAAgB;IACpB,MAAM,SAAS,MAAM;KACnB,IAAI,CAAC,WAAW,GAAG,UAAU,oBAAoB,CAAC,GAAG;KACrD,EAAE,eAAe;KAAG,EAAE,gBAAgB;KACtC,aAAa,IAAI;KACjB,eAAe,QAAQ;KACvB,iBAAiB,OAAO,cAAc,IAAI,YAAY,mBAAmB,CAAC,GAAG,CAAC;IAChF;IACA,OAAO,iBAAiB,WAAW,OAAO,IAAI;IAC9C,aAAa,OAAO,oBAAoB,WAAW,OAAO,IAAI;GAChE,GAAG,CAAC,CAAC;GAGL,MAAM,gBAAgBA,MAAAA,QAAM,cAAc;IACxC,MAAM,MAAM,CAAC;IACb,KAAK,MAAM,KAAK,IAAI,OAAO,IAAI,EAAE,UAAU,GAAG,IAAI,EAAE,QAAQ,EAAE;IAC9D,OAAO;GACT,GAAG,CAAC,GAAG,CAAC;GAER,MAAA,QAAM,gBAAgB;IACpB,IAAI,CAAC,QAAQ;IACb,WAAW,IAAI;IACf,eAAe,IAAI;IACnB,aAAa,IAAI;IACjB,aAAa;KAAE,UAAU;KAAI,SAAS;IAAU,CAAC;IACjD,UAAU,MAAM;IAChB,YAAY,QAAQ,SAAS;GAC/B,GAAG,CAAC,QAAQ,SAAS,CAAC;GAGtB,MAAA,QAAM,gBAAgB;IACpB,IAAI,CAAC,SAAS;IACd,MAAM,SAAS,MAAM;KAAE,IAAI,EAAE,QAAQ,UAAU,aAAa;IAAE;IAC9D,OAAO,iBAAiB,WAAW,OAAO,IAAI;IAC9C,aAAa,OAAO,oBAAoB,WAAW,OAAO,IAAI;GAChE,GAAG,CAAC,OAAO,CAAC;GAEZ,MAAA,QAAM,gBAAgB;IACpB,IAAI,UAAU,WAAW;IACzB,IAAI,QAAQ;IACZ,MAAM,cAAc,UAAU;KAC5B,IAAI,CAAC,OAAO;KACZ,MAAM,WAAW,MAAM,UAAU,UAAU,KAAK,KAAK,MAAM,KAAK,MAAM,WAAW,EAAG;KACpF,cAAc,UAAU;MAAE,UAAU,KAAK,IAAI,KAAK,UAAU,QAAQ;MAAG,SAAS,MAAM;KAAQ,EAAE;IAClG;IACA,WAAW,UAAU,CAAC,CAAC,MAAM,MAAM;KAAE,IAAI,OAAO,UAAU,CAAC;IAAE,CAAC,CAAC,CAAC,OAAO,MAAM;KAC3E,IAAI,OAAO;MACT,aAAa,OAAO,GAAG,WAAW,CAAC,CAAC;MACpC,UAAU,YAAY;KACxB;IACF,CAAC;IACD,aAAa;KAAE,QAAQ;IAAM;GAC/B,GAAG,CAAC,QAAQ,SAAS,CAAC;GAEtB,UAAU,UAAU;GAEpB,MAAM,YAAY,MAAM,SAAS;IAC/B,MAAM,QAAQ,UAAU;IACxB,IAAI,QAAQ,MAAM,IAAI,IAAI;IAC1B,IAAI,CAAC,OAAO;KACV,QAAQ,OAAO,OAAO,OAAO,YAAY,QAAQ,IAAI,OAAO,IAAI,GAAG,OAAO,OAAO,IAAI,MAAM,aAAa,UAAU,IAAI,CAAC,CAAC;KACxH,MAAM,IAAI,MAAM,KAAK;IACvB,OAAO,IAAI,SAAS,KAAA,KAAa,MAAM,SAAS,MAAM,MAAM;KAC1D,gBAAgB,UAAU;KAC1B,MAAM,SAAS,IAAI;KACnB,gBAAgB,UAAU;IAC5B;IACA,OAAO;GACT;GAEA,MAAM,kBAAkB;IACtB,IAAI,aAAa,SAAS;KAAE,aAAa,QAAQ;KAAG,aAAa,UAAU;IAAK;GAClF;GAEA,MAAM,UAAU,WAAW;IACzB,MAAM,KAAK,UAAU;IACrB,IAAI,CAAC,UAAU,CAAC,IAAI;IACpB,MAAM,OAAO,GAAG,SAAS;IACzB,IAAI,CAAC,QAAQ,UAAU,MAAM;IAC7B,IAAI,aAAa;KAAE;KAAW,MAAM;KAAQ,SAAS;IAAK,CAAC,CAAC,CAAC,MAAM,QAAQ;KACzE,IAAI,OAAO,IAAI,IAAI;MACjB,UAAU,0BAAS,IAAI,KAAK,EAAA,CAAE,aAAa,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;MACxD,WAAW,IAAI;MACf,eAAe,MAAM;MACrB,aAAa,MAAM,OAAO,OAAO,CAAC,GAAG,GAAG,GAAG,SAAS,MAAM,CAAC,CAAC;MAC5D,eAAe;MACf,YAAY;KACd,OAAO;MAAE,UAAU,MAAM;MAAG,SAAS,KAAK,QAAQ,OAAO,IAAI,KAAK,IAAI,MAAM;KAAE;IAChF,CAAC,CAAC,CAAC,OAAO,MAAM;KAAE,UAAU,MAAM;KAAG,SAAS,UAAU,OAAO,CAAC,CAAC;IAAE,CAAC;GACtE;GACA,UAAU,UAAU;GAEpB,MAAM,eAAe;IAEnB,IAAI,CADO,UAAU,WACV,CAAC,QAAQ;IACpB,aAAa,MAAM,OAAO,OAAO,CAAC,GAAG,GAAG,GAAG,SAAS,KAAK,CAAC,CAAC;IAC3D,UAAU,MAAM;IAChB,IAAI,aAAa,SAAS,aAAa,QAAQ;IAC/C,aAAa,UAAU,eAAe,OAAO,IAAI,GAAG,GAAG;GACzD;GAGA,MAAA,QAAM,gBAAgB;IACpB,IAAI,CAAC,UAAU,CAAC,UAAU,WAAW,CAAC,UAAU,YAAY,MAAM;IAClE,MAAM,KAAK,UAAU;IACrB,MAAM,QAAQ,SAAS,QAAQ,OAAO;IACtC,IAAI,GAAG,SAAS,MAAM,OAAO,GAAG,SAAS,KAAK;IAC9C,iBAAiB,MAAM;IACvB,cAAc,UAAU;KAAE,UAAU,KAAK,IAAI,IAAI,KAAK,QAAQ;KAAG,SAAS;IAAW,EAAE;GACzF,GAAG;IAAC;IAAQ;IAAQ;GAAO,CAAC;GAG5B,MAAA,QAAM,gBAAgB;IACpB,IAAI,CAAC,UAAU,CAAC,UAAU,WAAW,CAAC,UAAU,YAAY,MAAM;IAClE,gBAAgB,QAAQ,OAAO,QAAQ,UAAU,SAAS,gBAAgB,SAAS;IACnF,aAAa;KAAE,UAAU;KAAK,SAAS;IAAS,CAAC;GACnD,GAAG;IAAC;IAAQ;IAAQ;IAAS;GAAc,CAAC;GAE5C,MAAA,QAAM,sBAAsB;IAC1B,UAAU;IACV,cAAc,MAAM;IACpB,gBAAgB,SAAS,UAAU;IACnC,IAAI,UAAU,SAAS;KAAE,UAAU,QAAQ,QAAQ;KAAG,UAAU,UAAU;IAAK;IAC/E,KAAK,MAAM,KAAK,UAAU,QAAQ,OAAO,GAAG,EAAE,QAAQ;IACtD,UAAU,QAAQ,MAAM;IACxB,MAAM,OAAO,UAAU,WAAW,UAAU,QAAQ,aAAa,UAAU,QAAQ,WAAW,IAAI;IAClG,IAAI,MAAM;KACR,MAAM,KAAK,KAAK,cAAc,qBAAqB;KACnD,IAAI,IAAI,GAAG,OAAO;IACpB;GACF,GAAG,CAAC,CAAC;GAGL,MAAM,eAAeA,MAAAA,QAAM,aAAa,SAAS;IAC/C,IAAI,CAAC,MAAM;KACT,IAAI,UAAU,SAAS;MAAE,UAAU,QAAQ,QAAQ;MAAG,UAAU,UAAU;KAAK;KAC/E;IACF;IACA,IAAI,UAAU,WAAW,CAAC,UAAU,SAAS;IAC7C,MAAM,IAAI,UAAU;IACpB,MAAM,OAAO,UAAU,YAAY;IACnC,MAAM,KAAK,EAAE,OAAO,OAAO,MAAM;KAC/B,OAAO;KACP,UAAU;KACV,OAAO;KACP,YAAY;KACZ,UAAU;KACV,YAAY;KACZ,SAAS;MAAE,SAAS,CAAC;MAAM,OAAO;KAAE;KACpC,aAAa;KACb,sBAAsB;KACtB,iBAAiB;KACjB,sBAAsB;KACtB,UAAU;KACV,SAAS;KACT,kBAAkB;KAClB,iBAAiB;KACjB,gBAAgB;KAChB,SAAS,EAAE,KAAK,OAAO,IAAI,EAAE;IAC/B,CAAC;IAED,GAAG,8BAA8B;KAC/B,IAAI,CAAC,GAAG,SAAS,KAAK,gBAAgB,SAAS;KAC/C,OAAO;IACT,CAAC;IACD,GAAG,2BAA2B,MAAM;KAClC,UAAU,QAAQ,EAAE,SAAS,aAAa,WAAW,EAAE,SAAS,MAAM;IACxE,CAAC;IAID,MAAM,qBAAqB,gBAAgB;IAC3C,MAAM,UAAU,QAAQ;KAEtB,MAAM,WADQ,KAAK,WAAW,EAAA,EACP,KAAK;KAC5B,OAAO,UAAU,mBAAmB,OAAO,OAAO,CAAC,CAAC,QAAQ,OAAO,EAAE,CAAC,IAAI;IAC5E;IACA,MAAM,eAAe,QAAQ;KAC3B,MAAM,IAAI,KAAK,eAAe;KAC9B,IAAI,CAAC,GAAG,OAAO;KACf,IAAI,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,WAAW,OAAO;KACnF,OAAO;MAAE,WAAW,EAAE;MAAiB,SAAS,EAAE;KAAc;IAClE;IACA,MAAM,SAAS,GAAG,iBAAiB,iBAAiB,KAAK;IACzD,GAAG,4BAA4B,MAAM;KACnC,MAAM,IAAI,GAAG;KACb,OAAO,IAAI,CAAC,EAAE,MAAM,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,WAAW;IAC9F,CAAC;IACD,GAAG,UAAU;KACX,IAAI;KAAmB,OAAO;KAAW,oBAAoB;KAC7D,cAAc;KACd,MAAM,QAAQ,aAAa,CAAC,EAAE,aAAa,OAAO,GAAG,CAAC;IACxD,CAAC;IACD,GAAG,UAAU;KACX,IAAI;KAAwB,OAAO;KAAa,oBAAoB;KACpE,cAAc;KACd,MAAM,QAAQ;MACZ,MAAM,IAAI,YAAY,GAAG;MACzB,MAAM,IAAI,OAAO,GAAG;MACpB,IAAI,KAAK,GAAG,aAAa,CAAC,EAAE,aAAa,GAAG;OAAE,WAAW,EAAE;OAAW,SAAS,EAAE;MAAQ,CAAC;KAC5F;IACF,CAAC;IAED,GAAG,UAAU;KACX,IAAI;KAAyB,OAAO;KAAa,oBAAoB;KACrE,cAAc;KACd,MAAM,QAAQ,aAAa,CAAC,EAAE,eAAe,OAAO,GAAG,CAAC;IAC1D,CAAC;IAID,MAAM,iBAAiB;KACrB,IAAI,eAAe,WAAW,cAAc,WAAW,aAAa,SAAS;KAC7E,aAAa,UAAU,iBAAiB;MACtC,aAAa,UAAU;MACvB,IAAI,eAAe,WAAW,cAAc,SAAS;MACrD,YAAY,UAAU;MACtB,YAAY,UAAU;MACtB,YAAY,IAAI;KAClB,GAAG,GAAG;IACR;IACA,GAAG,aAAa,MAAM;KACpB,eAAe,UAAU;KACzB,MAAM,OAAO,GAAG,QAAQ,UAAU;KAClC,MAAM,MAAM,iBAAiB;KAC7B,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM;MAAE,eAAe,UAAU;MAAO,SAAS;MAAG;KAAO;KAC7E,MAAM,MAAM,IAAI,IAAI,IAAI;KACxB,IAAI,CAAC,KAAK;MAAE,eAAe,UAAU;MAAO,SAAS;MAAG;KAAO;KAC/D,MAAM,MAAM,WAAW,IAAI,QAAQ,IAAI,GAAG;KAC1C,MAAM,MAAM,KAAK,IAAI,GAAG,GAAG,oBAAoB,KAAK,IAAI,GAAG,IAAI,KAAK,CAAC,IAAI,GAAG,aAAa,CAAC;KAC1F,MAAM,SAAS,GAAG,cAAc;KAChC,MAAM,cAAc,OAAO,SAAS,eAAe;KACnD,MAAM,QAAQ,cAAc,IAAI,KAAK,IAAI,IAAI,OAAO,QAAQ,cAAc,CAAC,IAAI,KAAK,IAAI,IAAI,OAAO,yBAAyB,CAAC;KAC7H,IAAI,YAAY,YAAY,OAAO,YAAY,YAAY,OAAO,cAAc,YAAY,OAAO;KACnG,YAAY,UAAU;KACtB,YAAY,UAAU;KACtB,cAAc,UAAU;KACxB,IAAI,aAAa,SAAS;MAAE,aAAa,aAAa,OAAO;MAAG,aAAa,UAAU;KAAK;KAC5F,YAAY;MAAE,QAAQ;MAAK;MAAK;KAAM,CAAC;IACzC,CAAC;IACD,UAAU,UAAU;GACtB,GAAG,CAAC,CAAC;GAGL,MAAA,QAAM,gBAAgB;IACpB,MAAM,KAAK,gBAAgB;IAC3B,IAAI,CAAC,MAAM,GAAG,SAAS,UAAU,YAAY,MAAM;IACnD,MAAM,KAAK,UAAU;IACrB,IAAI,CAAC,IAAI;IACT,IAAI,GAAG,QAAQ,MAAM;KAEnB,gBAAgB,UAAU;KAC1B,GAAG,mBAAmB,KAAK,IAAI,GAAG,GAAG,IAAI,CAAC;KAC1C,GAAG,YAAY;MAAE,YAAY,KAAK,IAAI,GAAG,GAAG,IAAI;MAAG,QAAQ,KAAK,IAAI,GAAG,GAAG,UAAU,CAAC;KAAE,CAAC;KACxF,GAAG,MAAM;KACT;IACF;IACA,MAAM,SAAS,GAAG,UAAU,eAAe;IAC3C,IAAI,CAAC,QAAQ;IACb,gBAAgB,UAAU;IAC1B,GAAG,mBAAmB,KAAK,IAAI,GAAG,OAAO,SAAS,CAAC,CAAC;IACpD,GAAG,YAAY;KAAE,YAAY,KAAK,IAAI,GAAG,OAAO,SAAS,CAAC;KAAG,QAAQ;IAAE,CAAC;IACxE,GAAG,MAAM;GACX,GAAG;IAAC;IAAQ;IAAS;IAAgB;GAAY,CAAC;GAElD,MAAM,UAAU,WAAW;IACzB,IAAI,UAAU,SAAS;KACrB,UAAU,QAAQ,mBAAmB,KAAK,IAAI,GAAG,QAAQ,SAAS,CAAC,CAAC;KACpE,UAAU,QAAQ,YAAY;MAAE,YAAY,KAAK,IAAI,GAAG,QAAQ,SAAS,CAAC;MAAG,QAAQ;KAAE,CAAC;KACxF,UAAU,QAAQ,MAAM;IAC1B,OACE,gBAAgB,UAAU;KAAE,MAAM;KAAQ;IAAO;GAErD;GAGA,MAAA,QAAM,gBAAgB;IACpB,IAAI,WAAW,eAAe,UAAU,eAAe,SAAS,GAAG,WAAW,eAAe,SAAS,CAAC;SAClG,IAAI,eAAe,WAAW,GAAG,WAAW,CAAC;GACpD,GAAG,CAAC,eAAe,MAAM,CAAC;GAC1B,MAAA,QAAM,gBAAgB;IACpB,MAAM,IAAI,IAAI,aAAa,WAAW,MAAM,EAAE,SAAS,MAAM;IAC7D,IAAI,KAAK,GAAS;SAAA,MAAM,SAAS,WAAW,CAAC;IAAA;GAC/C,GAAG,CAAC,IAAI,cAAc,MAAM,CAAC;GAG7B,MAAM,YAAY,UAAU;IAC1B,IAAI,CAAC,eAAe,QAAQ;IAC5B,MAAM,QAAQ,UAAU,QAAQ,eAAe,UAAU,eAAe;IACxE,WAAW,IAAI;IACf,OAAO,eAAe,KAAK;GAC7B;GAEA,MAAM,YAAY,UAAU;IAC1B,IAAI,CAAC,IAAI,aAAa,QAAQ;IAC9B,MAAM,QAAQ,UAAU,QAAQ,IAAI,aAAa,UAAU,IAAI,aAAa;IAC5E,WAAW,IAAI;IACf,SAAS,IAAI,aAAa,KAAK,CAAC,MAAM,IAAI;GAC5C;GAEA,MAAM,qBAAqB;IACzB,IAAI,CAAC,IAAI,aAAa,QAAQ;IAC9B,IAAI,IAAI,aAAa,MAAM,SAAS,KAAK,SAAS,MAAM,GAAG,SAAS,CAAC;SAChE,SAAS,IAAI,aAAa,EAAE,CAAC,MAAM,IAAI;GAC9C;GAEA,MAAM,cAAc,cAAc;IAChC,IAAI,CAAC,QAAQ;IACb,YAAY,QAAQ,WAAW,IAAI;IACnC,eAAe,cAAc,IAAI;GACnC;;;;;GAMA,MAAM,qBAAqB;IACzB,YAAY,UAAU;IACtB,YAAY,UAAU;IACtB,cAAc,UAAU;IACxB,eAAe,UAAU;IACzB,cAAc,UAAU;IACxB,IAAI,aAAa,SAAS;KAAE,aAAa,aAAa,OAAO;KAAG,aAAa,UAAU;IAAK;IAC5F,YAAY,IAAI;GAClB;;;;;;;;;GAUA,MAAM,WAAW,QAAQ,QAAQ,WAAW;IAE1C,OAAO,IADQ,SAAS,gBAAgB,eACrB;KAAE;KAAW,QAAQ,OAAO;KAAQ,OAAO,OAAO,SAAS,SAAS;KAAQ,WAAW,OAAO;IAAI,CAAC,CAAC,CAAC,MAAM,QAAQ;KACpI,IAAI,OAAO,IAAI,IAAI;MACjB,YAAY,SAAS,OAAO,OAAO,CAAC,GAAG,MAAM,GAAG,OAAO,SAAS,IAAI,OAAO,CAAC,CAAC;MAC7E,IAAI,CAAC,QAAQ;OAAE,WAAW;OAAG,YAAY;MAAE;MAC3C,OAAO;KACT;KACA,IAAI,CAAC,QAAQ,SAAS,KAAK,QAAQ,OAAO,IAAI,KAAK,IAAI,MAAM;KAC7D,OAAO;IACT,CAAC,CAAC,CAAC,OAAO,MAAM;KACd,IAAI,CAAC,QAAQ,SAAS,UAAU,OAAO,CAAC,CAAC;KACzC,OAAO;IACT,CAAC;GACH;;;;;;;;GASA,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,MAAM,QAAQ,OAAO,QAAQ,QAAQ;KAAE,IAAI;KAAG,MAAM;IAAE,CAAC;IAC5D,OAAO,IAAI,oBAAoB;KAAE;KAAW;IAAM,CAAC,CAAC,CAAC,MAAM,QAAQ;KACjE,IAAI,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,MAAM,QAAQ,IAAI,OAAO,GAAG;MAClD,SAAS,KAAK,QAAQ,OAAO,IAAI,KAAK,IAAI,QAAQ;MAClD,OAAO;OAAE,IAAI;OAAG,MAAM,MAAM;MAAO;KACrC;KACA,IAAI,KAAK;KACT,IAAI,OAAO;KACX,MAAM,OAAO,CAAC;KACd,KAAK,MAAM,QAAQ,IAAI,SACrB,IAAI,QAAQ,KAAK,IAAI;MACnB;MACA,IAAI,KAAK,QAAQ,KAAK,KAAK,UAAU,KAAK;KAC5C,OACE;KAKJ,IAAI,OAAO,KAAK,IAAI,CAAC,CAAC,QAAQ,YAAY,SAAS,OAAO,OAAO,CAAC,GAAG,MAAM,IAAI,CAAC;KAChF,OAAO;MAAE;MAAI;KAAK;IACpB,CAAC,CAAC,CAAC,OAAO,MAAM;KACd,SAAS,YAAY,OAAO,CAAC,CAAC;KAC9B,OAAO;MAAE,IAAI;MAAG,MAAM,MAAM;KAAO;IACrC,CAAC;GACH;;;;;;;;GASA,MAAM,UAAU,GAAG,YAAY;IAAE,QAAQ,EAAE;IAAQ,OAAO,EAAE,SAAS,SAAS;IAAQ,WAAW,EAAE;IAAK,UAAU,SAAS,aAAa;GAAW;GAEnJ,MAAM,mBAAmB;IACvB,IAAI,aAAa,WAAW,CAAC,eAAe,QAAQ;IACpD,aAAa,UAAU;IACvB,QAAQ,eAAe,KAAK,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,WAAW;KAC1E,aAAa,UAAU;KACvB,WAAW,IAAI;KACf,YAAY;KACZ,UAAU,SAAS,KAAK,UAAU,OAAO,MAAM,OAAO,SAAS,GAAG;KAClE,IAAI,MAAM,SAAS,OAAO,6BAA6B;IACzD,CAAC,CAAC,CAAC,YAAY;KAAE,aAAa,UAAU;IAAM,CAAC;GACjD;GACA,MAAM,iBAAiB;IACrB,IAAI,aAAa,WAAW,CAAC,eAAe,QAAQ;IACpD,aAAa,UAAU;IACvB,QAAQ,CAAC,GAAG,cAAc,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,WAAW;KACxF,aAAa,UAAU;KACvB,WAAW,IAAI;KACf,YAAY;KACZ,UAAU,UAAU,KAAK,UAAU,OAAO,MAAM,OAAO,SAAS,GAAG;KACnE,IAAI,MAAM,SAAS,OAAO,6BAA6B;IACzD,CAAC,CAAC,CAAC,YAAY;KAAE,aAAa,UAAU;IAAM,CAAC;GACjD;GAGA,MAAM,aAAaA,MAAAA,QAAM,cAAc;IACrC,MAAM,MAAM,CAAC;IACb,KAAK,MAAM,OAAO,OAAO,OAAO,OAAO,GAAG;KACxC,IAAI,IAAI,eAAe,MAAM;KAC7B,MAAM,UAAU,MAAM,QAAQ,IAAI,WAAW,OAAO,IAAI,IAAI,UAAU,UAAU,CAAC;KACjF,MAAM,QAAQ,MAAM,QAAQ,IAAI,KAAK,IAAI,IAAI,QAAQ,CAAC;KACtD,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAEhC,KADW,QAAQ,SAAS,QAAQ,KAAK,IAAI,UAAU,UAC5C,aAAa,CAAC,SAAS,KAAK,MAAM,EAAE,GAAG,IAAI,KAAK;MAAE,QAAQ,IAAI;MAAQ,KAAK;MAAG,QAAQ,IAAI,WAAW;MAAM,IAAI,IAAI;KAAG,CAAC;IAEtI;IACA,OAAO;GACT,GAAG,CAAC,OAAO,CAAC;;;;;;GAOZ,MAAM,iBAAiB,WAAW;IAChC,IAAI,aAAa,WAAW,CAAC,WAAW,QAAQ;IAChD,aAAa,UAAU;IACvB,MAAM,OAAO,SAAS,CAAC,GAAG,UAAU,CAAC,CAAC,MAAM,GAAG,MAAO,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,KAAK,EAAE,KAAK,KAAK,EAAE,MAAM,EAAE,GAAI,IAAI;IAC7G,QAAQ,KAAK,KAAK,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,WAAW;KACjE,aAAa,UAAU;KACvB,WAAW,IAAI;KACf,YAAY;KACZ,WAAW,SAAS,UAAU,UAAU,KAAK,UAAU,OAAO,MAAM,OAAO,SAAS,GAAG;KACvF,IAAI,MAAM,SAAS,OAAO,6BAA6B;IACzD,CAAC,CAAC,CAAC,YAAY;KAAE,aAAa,UAAU;IAAM,CAAC;GACjD;GACA,MAAM,uBAAuB,cAAc,KAAK;GAChD,MAAM,qBAAqB,cAAc,IAAI;GAC7C,MAAM,qBAAqB;IACzB,IAAI,CAAC,QAAQ;IACb,IAAI,CAAC,OAAO,QAAQ,wBAAwB,GAAG;IAC/C,IAAI,iBAAiB;KAAE;KAAW,MAAM;IAAO,CAAC,CAAC,CAAC,MAAM,QAAQ;KAC9D,IAAI,OAAO,IAAI,IAAI;MACjB,UAAU,KAAK;MAAG,WAAW;MAC7B,YAAY;KACd,OAAO,SAAS,KAAK,QAAQ,OAAO,IAAI,KAAK,IAAI,MAAM;IACzD,CAAC,CAAC,CAAC,OAAO,MAAM,SAAS,UAAU,OAAO,CAAC,CAAC,CAAC;GAC/C;;;;;GAMA,MAAM,qBAAqB;IACzB,WAAW,IAAI;GACjB;;;GAIA,MAAM,eAAe,SAAS,WAAW;IACvC,IAAI,YAAY,MAAM,OAAO;IAC7B,IAAI,YAAY,QAAQ,OAAO,SAAS;IACxC,OAAO;GACT;;GAGA,MAAM,gBAAgB,MAAM,UAAU;IACpC,IAAI,CAAC,MAAM;KAAE,UAAU,OAAO;KAAG;IAAO;IACxC,IAAI,CAAC,mBAAmB;KAAE,UAAU,UAAU;KAAG;IAAO;IACxD,kBAAkB,gBAAgB,WAAW,MAAM,KAAK,CAAC,CAAC,MAAM,MAAM,UAAU,YAAY,GAAG,SAAS,CAAC,CAAC;GAC5G;;;;;;GAOA,MAAM,kBAAkB,SAAS;IAC/B,IAAI,CAAC,MAAM;KAAE,UAAU,OAAO;KAAG;IAAO;IACxC,IAAI,CAAC,WAAW;KAAE,UAAU,OAAO;KAAG;IAAO;IAC7C,UAAU,YAAY;IACtB,iBAAqB,WAAW,IAAI,CAAC,CAAC,MAAM,YAAY;KACtD,UAAU,QAAQ,KAAK,eAAe,MAAM;KAC5C,IAAI,CAAC,QAAQ,MAAM,QAAQ,OAAO,SAAS,QAAQ,KAAK;IAC1D,CAAC;GACH;GAGA,gBAAgB,UAAU;IAAE;IAAc;GAAe;GAEzD,MAAM,YAAY,MAAM,cAAc;IACpC,IAAI,CAAC,MAAM;IACX,OAAO,MAAM,IAAI;IACjB,IAAI,WAAW,gBAAgB,UAAU;KAAE;KAAM,QAAQ;IAAK;GAChE;;;;;;;;GASA,MAAM,cAAc,MAAM,MAAM,WAAW;IACzC,IAAI,CAAC,MAAM;IACX,OAAO,MAAM,IAAI;IACjB,gBAAgB,UAAU;KAAE;KAAM,QAAQ;KAAM,MAAM,QAAQ;KAAM,QAAQ,UAAU;IAAE;IACxF,iBAAiB,UAAU,QAAQ,CAAC;GACtC;GAEA,MAAM,iBAAiB;IACrB,MAAM,KAAK,aAAa,GAAA,CAAI,KAAK;IACjC,IAAI,CAAC,GAAG;IACR,UAAU,MAAM;IAChB,IAAI,aAAa;KAAE;KAAW,MAAM;IAAE,CAAC,CAAC,CAAC,MAAM,QAAQ;KACrD,IAAI,OAAO,IAAI,IAAI;MACjB,SAAS,GAAG,KAAK;MACjB,aAAa,KAAK;MAAG,aAAa,EAAE;MAAG,UAAU,KAAK;MAAG,SAAS,IAAI;KACxE,OAAO;MAAE,UAAU,MAAM;MAAG,SAAS,KAAK,QAAQ,OAAO,IAAI,KAAK,IAAI,MAAM;KAAE;IAChF,CAAC,CAAC,CAAC,OAAO,MAAM;KAAE,UAAU,MAAM;KAAG,SAAS,UAAU,OAAO,CAAC,CAAC;IAAE,CAAC;GACtE;GAEA,MAAM,SAASA,MAAAA,QAAM,cAAc,OAAO;IAAE,WAAW;IAAa,OAAO;KAAE,MAAM;KAAY,UAAU;IAAE;GAAE,GAC3G,KAAK,KAAK,MAAMA,MAAAA,QAAM,cAAc,OAAO;IACzC,KAAK,EAAE;IACP,WAAW,cAAc,EAAE,SAAS,SAAS,qBAAqB;IAClE,OAAO,EAAE;IACT,eAAe;KAAE,IAAI,EAAE,SAAS,QAAQ;MAAE,UAAU;MAAG,cAAc,MAAM;MAAG,UAAU,EAAE,IAAI;KAAE;IAAE;IAClG,gBAAgB,MAAM;KACpB,EAAE,eAAe;KACjB,EAAE,gBAAgB;KAClB,WAAW;MAAE,GAAG,EAAE;MAAS,GAAG,EAAE;MAAS,MAAM,EAAE;KAAK,CAAC;IACzD;GACF,GACEA,MAAAA,QAAM,cAAc,QAAQ,EAAE,OAAO;IAAE,UAAU;IAAU,cAAc;IAAY,UAAU;GAAI,EAAE,GAAG,EAAE,KAAK,MAAM,OAAO,CAAC,CAAC,IAAI,KAAK,EAAE,IAAI,GAC5I,SAAS,EAAE,QAAQA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,eAAe,CAAC,IAAI,MACjFA,MAAAA,QAAM,cAAc,QAAQ;IAAE,WAAW;IAAc,UAAU,MAAM;KAAE,EAAE,gBAAgB;KAAG,SAAS,EAAE,IAAI;IAAE;GAAE,GAAG,GAAG,CAAC,CAAC,GAC1H,YACGA,MAAAA,QAAM,cAAc,SAAS;IAAE,WAAW;IAAmB,WAAW;IAAM,aAAa;IAAqB,OAAO;IAAW,WAAW,MAAM,aAAa,EAAE,OAAO,KAAK;IAAG,YAAY,MAAM;KAAE,IAAI,EAAE,QAAQ,SAAS,SAAS;KAAG,IAAI,EAAE,QAAQ,UAAU,aAAa,KAAK;IAAE;GAAE,CAAC,IACvRA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAAgB,OAAO;IAAc,eAAe,aAAa,IAAI;GAAE,GAAG,GAAG,CAAE;GAEhI,MAAM,UAAUA,MAAAA,QAAM,cAAc,OAAO;IAAE,WAAW;IAAgB,OAAO,UAAU;GAAG,GAC1FA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,eAAe,GAAG,SAAS,OAAO,MAAM,CAAC,CAAC,MAAM,OAAO,CAAC,CAAC,IAAI,IAAI,OAAO,GACjHA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,eAAe,GAAG,UAAU,eAAe,QAAQ,gBAAgB,KAAK,YAAY,QAAQ,GACpI,UAAU,OAAO,MAAM,IAAIA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,eAAe,GAAG,OAAO,MAAM,CAAC,IAAI,MACxG,SAASA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,eAAe,GAAG,MAAM,IAAI,MAC9E,SAASA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,8BAA8B,GAAG,MAAM,IAAI,IAAK;GAErG,MAAM,SAASA,MAAAA,QAAM,cAAc,OAAO,EAAE,OAAO;IAAE,SAAS;IAAQ,YAAY;IAAU,YAAY;IAA2C,YAAY;GAAE,EAAE,GACjK,QACC,IAAI,aAAa,IACdA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAAiB,OAAO;IAAa,eAAe,iBAAiB,MAAM,CAAC,CAAC;GAAE,GAAG,UAAU,IAAI,aAAa,KAAK,IAC7J,MACJA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW,mBAAmB,YAAY,kBAAkB;IAAK,OAAO,aAAa,QAAQ,oBAAoB,KAAK,YAAY;IAAK,eAAe,cAAc,MAAM,CAAC,CAAC;GAAE,GAAG,GAAG,GACpNA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAAiB,OAAO;IAAM,SAAS;GAAW,GAAG,GAAG,GACnGA,MAAAA,QAAM,cAAc,WAAW;IAAE;IAAW,SAAS,MAAM,SAAS,GAAG,KAAK;GAAE,CAAC,CAAC;GAElF,MAAM,aAAa,IAAI,aAAa,QAAQ,MAAM,EAAE,SAAS,MAAM;;;;;;;;;GAUnE,MAAM,eAAe,SAAS,UAAU,UAAUA,MAAAA,QAAM,cAAc,OAAO;IAAE,WAAW;IAA2B,aAAa;GAAS,GACzIA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,qBAAqB,GAAG,OAAO,GACvEA,MAAAA,QAAM,cAAc,OAAO;IACzB,WAAW;IACX,MAAM;IACN,cAAc;IACd,iBAAiB;IACjB,iBAAiB;IACjB,iBAAiB;GACnB,GAAGA,MAAAA,QAAM,cAAc,OAAO;IAAE,WAAW;IAAuB,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,QAAQ,CAAC,IAAI,IAAI;GAAE,CAAC,CAAC,GACjIA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,uBAAuB,GAAG,KAAK,MAAM,QAAQ,IAAI,GAAG,GAC5F,QAAQA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAA6B,SAAS;GAAM,GAAG,IAAI,IAAI,IAAI;GAEhH,IAAI;GACJ,IAAI,CAAC,UAAU,CAAC,WACd,OAAO,YAAY,UAAU,SAAS,UAAU,QAAQ;QACnD,IAAI,WACT,OAAOA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,aAAa,GAC1DA,MAAAA,QAAM,cAAc,OAAO,MAAM,oBAAoB,OAAO,SAAS,CAAC,GACtEA,MAAAA,QAAM,cAAc,OAAO,EAAE,OAAO,EAAE,UAAU,GAAG,EAAE,GAAG,mDAAmD,GAC3GA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAA6B,eAAe;KAAE,aAAa,IAAI;KAAG,aAAa;MAAE,UAAU;MAAG,SAAS;KAAe,CAAC;IAAE;GAAE,GAAG,IAAI,CAAC;QAC3K,IAAI,CAAC,QACV,OAAOA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,aAAa,GAC1DA,MAAAA,QAAM,cAAc,OAAO,MAAM,SAAS,GAC1CA,MAAAA,QAAM,cAAc,OAAO,EAAE,OAAO,EAAE,UAAU,GAAG,EAAE,GAAG,eAAe,QAAQ,gBAAgB,KAAK,YAAY,gCAAgC,CAAC;QAC9I,IAAI,YAAY,QAAQ,WAC7B,OAAO,YAAY,YAAY,WAAW,SAAS;IACjD,aAAa,IAAI;IACjB,WAAW,IAAI;IACf,eAAe,IAAI;IACnB,aAAa;KAAE,UAAU;KAAI,SAAS;IAAU,CAAC;IACjD,YAAY,QAAQ,SAAS;GAC/B,CAAC;QACI,IAAI,YAAY,MACrB,OAAO,YAAY,UAAU,WAAW,WAAW,UAAU,QAAQ;QAErE,OAAOA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,mBAAmB,GAChEA,MAAAA,QAAM,cAAc,OAAO,EAAE,KAAK,aAAa,CAAC,CAAC;GAGrD,MAAM,UAAW,YAAY,CAAC,eAC1BA,MAAAA,QAAM,cAAc,OAAO;IACzB,WAAW;IACX,OAAO;KAAE,KAAK,SAAS;KAAK,OAAO,SAAS,SAAS;IAAG;IACxD,oBAAoB;KAAE,cAAc,UAAU;KAAM,IAAI,aAAa,SAAS;MAAE,aAAa,aAAa,OAAO;MAAG,aAAa,UAAU;KAAK;IAAE;IAClJ,mBAAmB;KAAE,cAAc,UAAU;KAAM,IAAI,aAAa,SAAS;MAAE,aAAa,aAAa,OAAO;MAAG,aAAa,UAAU;KAAK;IAAE;IACjJ,oBAAoB;KAClB,cAAc,UAAU;KACxB,IAAI,eAAe,WAAW,aAAa,SAAS;KACpD,aAAa,UAAU,iBAAiB;MACtC,aAAa,UAAU;MACvB,IAAI,eAAe,WAAW,cAAc,SAAS;MACrD,YAAY,UAAU;MACtB,YAAY,UAAU;MACtB,YAAY,IAAI;KAClB,GAAG,GAAG;IACR;GACF,GACEA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAA4B,eAAe;KAAE,aAAa;KAAG,QAAQ,SAAS,QAAQ,KAAK;IAAE;GAAE,GAAG,QAAQ,GACrJA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAA4B,eAAe;KAAE,aAAa;KAAG,QAAQ,SAAS,QAAQ,IAAI;IAAE;GAAE,GAAG,QAAQ,CAAC,IACvJ;;GAGJ,MAAM,2BAA2B;IAC/B,MAAM,eAAe,MAAM;IAC3B;IACA;IACA,OAAO;IACP,cAAc;IACd,YAAY;IACZ,kBAAkB;IAClB,gBAAgB;IAChB,iBAAiB,WAAW;IAC5B,YAAY;IACZ,QAAQ;IACR;IACA,cAAc,SAAS,SAAS,MAAM,IAAI;IAC1C,iBAAiB,QAAQ;KAAE,eAAe,OAAO,SAAS;KAAG,gBAAgB,IAAI;IAAE;IACnF,WAAW;IACX,YAAY;IACZ,SAAS,eAAe,UAAU;IAClC,WAAW,iBAAiB,cAAc,eAAe,QAAQ,IAAI,MAAM,MAAM,SAAS,KAAK,SAAS,MAAM,CAAC,EAAE,WAAW,CAAC;IAC7H;IACA,WAAW,IAAI,aAAa;IAC5B,kBAAkB,SAAS,EAAE;IAC7B,kBAAkB,SAAS,CAAC;IAC5B,kBAAkB,SAAS,EAAE;IAC7B,kBAAkB,SAAS,CAAC;IAC5B,gBAAgB;GAClB;GAEA,MAAA,QAAM,gBAAgB;IACpB,IAAI,CAAC,WAAW;IAChB,gBAAgB,WAAW,kBAAkB,GAAG,cAAc,OAAO;IAErE,IAAI,WAAW,QAAQ,eAAe,WAAW,IAAI,UAAU;SAC1D,eAAe,WAAW,CAAC;GAClC,CAAC;GAED,MAAM,UAAU,eACZA,MAAAA,QAAM,cAAcA,MAAAA,QAAM,UAAU,MAClCA,MAAAA,QAAM,cAAc,OAAO;IAAE,OAAO;KAAE,UAAU;KAAS,OAAO;KAAG,QAAQ;IAAG;IAAG,eAAe,gBAAgB,KAAK;GAAE,CAAC,GACxHA,MAAAA,QAAM,cAAc,cAAc;IAAE;IAAW;IAAK,KAAK;IAAa,eAAe,gBAAgB,KAAK;IAAG,aAAa,MAAM;KAAE,SAAS,GAAG,IAAI;KAAG,gBAAgB,KAAK;IAAE;GAAE,CAAC,CAAC,IAClL;;;;;GAQJ,MAAM,WAAW,GAAG,OAAO;IACzB,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,cAAc,OAAO,GAAG,CAAC;IAC/D,KAAK,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,eAAe,OAAO,GAAG,CAAC;GACjE;GACA,MAAM,eAAe,UACjBA,MAAAA,QAAM,cAAc,OAAO;IACzB,OAAO;KAAE,UAAU;KAAS,OAAO;KAAG,QAAQ;IAAG;IACjD,SAAS;IACT,gBAAgB,MAAM;KAAE,EAAE,eAAe;KAAG,aAAa;IAAE;GAC7D,CAAC,IACD;GACJ,MAAM,YAAY,UACdA,MAAAA,QAAM,cAAc,OAAO;IAAE,WAAW;IAAgB,OAAO,QAAQ,QAAQ,GAAG,QAAQ,CAAC;GAAE,GAC3FA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAAqB,eAAe;KAAE,aAAa,QAAQ,IAAI;KAAG,aAAa;IAAE;GAAE,GAAG,SAAS,GAC1IA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,mBAAmB,CAAC,GAC5DA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAAyC,eAAe;KAAE,SAAS,QAAQ,IAAI;KAAG,aAAa;IAAE;GAAE,GAAG,OAAO,CAAC,IAC3J;GAEJ,MAAM,gBAAgB,MAAM;GAC5B,MAAM,aAAa;IACjB;IACA,WAAW,MAAM,SAAS,GAAG,KAAK;IAClC;IACA,YAAY;IACZ;IACA,KAAK;KAAE,YAAY,IAAI;KAAY,OAAO,IAAI;IAAM;IACpD,sBAAsB,eAAe;IACrC,cAAc,UAAU;IACxB,gBAAgB,MAAM;IACtB,eAAe,MAAM;IACrB,SAAS,YAAY,UAAU,OAAO;GACxC;GAGA,MAAM,aAAaA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,mBAAmB,GAC5E,MACA,SACA,OAAO;GAET,MAAM,oBAAoB;IACxB,iBAAiB,IAAI;IACrB,IAAI;KAAE,aAAa,QAAQ,4BAA4B,GAAG;IAAE,SAAS,GAAG,CAAW;GACrF;GACA,MAAM,uBAAuB;IAC3B,IAAI,UAAU,WAAW,WAAW,UAAU,UAAU,UAAU,mBAAmB,CAAC,CAAC,YAAY,CAAC,CAAC;GACvG;GACA,MAAM,aAAc,WAAW,SAAS,YAAY,CAAC,gBACjDA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,iBAAiB,GACvDA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,sBAAsB,GAAG,2CAA2C,GAC7GA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,qBAAqB,GAAG,mBAAmB,GACpFA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAA6B,OAAO;IAAU,SAAS;GAAe,GAAG,MAAM,GAC1HA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAAwB,OAAO;IAAQ,cAAc;IAAQ,SAAS;GAAY,GAAG,GAAG,CAAC,IACtI;GACJ,MAAM,UAAUA,MAAAA,QAAM,cAAc,OAAO;IAAE,WAAW;IAAiB,OAAO;KAAE,MAAM;KAAG,UAAU;KAAG,WAAW;KAAG,SAAS;KAAQ,eAAe;KAAU,UAAU;IAAS;GAAE,GACnL,SACA,QACA,YACA,UAAU;GAGZ,MAAM,YAAYA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,kBAAkB,GACzE,aAAa,gBACVA,MAAAA,QAAM,cAAc,aAAa;IAC/B,UAAU;IACV,KAAK;IACL;IACA,UAAU;IACV,OAAO;IACP,SAAS;IACT,cAAc,aAAa,KAAK;GAClC,CAAC,IACD,MACJ,OAAO;GAET,MAAM,YAAY;IAAE,WAAW;IAAG,SAAS;IAAQ,eAAe;IAAU,YAAY;IAAwC,UAAU;GAAS;GAUnJ,OATe,WAAW,SACtBA,MAAAA,QAAM,cAAc,OAAO;IAAE,KAAK;IAAa,kBAAkB;IAAK,oBAAoB;IAAQ,WAAW;IAAkB,OAAO,OAAO,OAAO,CAAC,GAAG,WAAW,EAAE,QAAQ,OAAO,CAAC;GAAE,GACrL,WACA,cACA,SAAS,IACXA,MAAAA,QAAM,cAAc,OAAO;IAAE,KAAK;IAAa,kBAAkB;IAAK,OAAO,OAAO,OAAO,CAAC,GAAG,WAAW;KAAE,QAAQ;KAAmC,WAAW;IAAkC,CAAC;GAAE,GACrM,WACA,cACA,SAAS;EAEjB;;;;;;;;;;;EChqCA,SAAgB,UAAU,OAAO;GAC/B,MAAM,YAAY,OAAO;GACzB,MAAM,CAAC,SAAS,cAAcC,MAAAA,QAAM,SAAS,IAAI;GACjD,MAAM,MAAMA,MAAAA,QAAM,OAAO,CAAC;GAE1B,MAAM,OAAOA,MAAAA,QAAM,kBAAkB;IACnC,IAAI,CAAC,WAAW;IAChB,MAAM,IAAI,EAAE,IAAI;IAChB,IAAI,aAAa,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,QAAQ;KAC5C,IAAI,MAAM,IAAI,WAAW,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,MAAM,QAAQ,IAAI,OAAO,GAAG;KACzE,WAAW,UAAU,IAAI,OAAO,CAAC;IACnC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;GACnB,GAAG,CAAC,SAAS,CAAC;GAEd,MAAA,QAAM,gBAAgB;IACpB,KAAK;IACL,MAAM,IAAI,YAAY,MAAM,GAAI;IAChC,MAAM,kBAAkB,KAAK;IAC7B,OAAO,iBAAiB,gBAAgB,SAAS;IACjD,aAAa;KAAE,cAAc,CAAC;KAAG,OAAO,oBAAoB,gBAAgB,SAAS;IAAE;GACzF,GAAG,CAAC,IAAI,CAAC;GAET,MAAM,IAAI,SAAS,cAAc;GACjC,IAAI,CAAC,GAAG,OAAO;GAEf,MAAM,cAAc;IAElB,eAAe,SAAS,eAAe,EAAE,EAAE,QAAQ,IAAI;IACvD,iBAAiB;KAAE,iBAAiB;IAAE,GAAG,GAAG;GAC9C;GAEA,OAAOA,MAAAA,QAAM,cAAc,UAAU;IACnC,SAAS;IACT,OAAO,IAAI;IACX,OAAO;KAAE,UAAU;KAAY,SAAS;KAAe,YAAY;KAAU,gBAAgB;KAAU,OAAO;KAAI,QAAQ;KAAI,SAAS;KAAG,YAAY;KAAe,QAAQ;KAAQ,cAAc;KAAG,QAAQ;IAAU;GAC1N,GACEA,MAAAA,QAAM,cAAc,OAAO;IAAE,KAAK;IAAmC,KAAK;IAAM,OAAO;KAAE,OAAO;KAAI,QAAQ;KAAI,SAAS;IAAQ;GAAE,CAAC,GACpIA,MAAAA,QAAM,cAAc,QAAQ,EAAE,OAAO;IAAE,UAAU;IAAY,KAAK;IAAG,OAAO;IAAG,UAAU;IAAI,QAAQ;IAAI,SAAS;IAAS,cAAc;IAAG,YAAY;IAA+C,OAAO;IAAQ,UAAU;IAAI,YAAY;IAAQ,WAAW;IAAU,YAAY;IAAK,WAAW;GAAa,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC;EACzU;;;;;;;;;;;;;;ECnCA,SAAS,UAAU,MAAM;GACvB,MAAM,OAAO,OAAO,6BAA6B;GACjD,OAAOC,MAAAA,QAAM,cAAc,OAAO;IAChC,OAAO;IACP,QAAQ;IACR,SAAS;IACT,MAAM;IACN,eAAe;IACf,WAAW;GACb,GAAGA,MAAAA,QAAM,cAAc,QAAQ;IAC7B,GAAG;IACH,QAAQ;IACR,aAAa;IACb,eAAe;IACf,gBAAgB;GAClB,CAAC,CAAC;EACJ;;;;;EAMA,SAAgB,QAAQ,OAAO;GAC7B,MAAM,EACJ,iBAAiB,CAAC,GAAG,eAAe,CAAC,GAAG,OAAO,cAAc,YAAY,kBAAkB,gBAC3F,kBAAkB,GAAG,YAAY,QAAQ,aAAa,CAAC,GAAG,aAAa,gBAAgB,WAAW,YAClG,UAAU,GAAG,YAAY,GAAG,UAAU,GAAG,YAAY,GAAG,YAAY,YAAY,YAAY,YAC5F,OAAO,UAAU,gBAAgB,OAAO,UACtC;GACJ,MAAM,CAAC,UAAU,eAAeA,MAAAA,QAAM,SAAS,KAAK;GACpD,MAAM,CAAC,aAAa,kBAAkBA,MAAAA,QAAM,SAAS,KAAK;GAC1D,MAAM,YAAYA,MAAAA,QAAM,MAAM;GAC9B,MAAM,SAAS,eAAe,SAAS;GAEvC,MAAM,OAAO,OAAO,cAAc,EAAE,CAAC,CAAC,MAAM,OAAO,CAAC,CAAC,IAAI,KAAK;GAE9D,IAAI,SAAS,UAAU,SAAS,gBAC9B,OAAOA,MAAAA,QAAM,cAAc,OAAO;IAAE,WAAW;IAAkC,qBAAqB;IAAK,uBAAuB;GAAK,GACrIA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,yCAAyC,GAC/EA,MAAAA,QAAM,cAAc,UAAU;IAC5B,MAAM;IACN,WAAW;IACX,OAAO;IACP,cAAc,aAAa,SAAS;IACpC,SAAS;GACX,GAAG,aAAa,SAAS,CAAC,CAAC,CAAC;GAGlC,IAAI,SAAS;GACb,IAAI,UAAU;IACZ,MAAM,OAAO,eAAe,KAAK,MAAM;KACrC,MAAM,MAAM,WAAW,EAAE,QAAQ,EAAE,GAAG;KACtC,OAAOA,MAAAA,QAAM,cAAc,OAAO;MAAE;MAAK,WAAW;MAAgB,kBAAkB;MAAK,OAAO,WAAW,EAAE,SAAS;MAAM,eAAe,OAAO,CAAC;KAAE,GACrJA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,iBAAiB,GAAG,OAAO,EAAE,SAAS,OAAO,OAAO,EAAE,OAAO,IAAI,GACzG,EAAE,SAAS,SAASA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,iBAAiB,GAAG,MAAM,EAAE,SAAS,MAAM,IAAI,MAC5G,EAAE,SAAS,SAASA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,iBAAiB,GAAG,MAAM,EAAE,SAAS,MAAM,IAAI,MAC5G,EAAE,SAASA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,mBAAmB,GAAG,IAAI,IAAI,MACnFA,MAAAA,QAAM,cAAc,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IACvD,CAAC;IACD,MAAM,QAAQ,aAAa,KAAK,MAAMA,MAAAA,QAAM,cAAc,OAAO;KAAE,KAAK,UAAU,WAAW,EAAE,QAAQ,EAAE,GAAG;KAAG,WAAW;KAAmC,OAAO;IAAqB,GACvLA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,iBAAiB,GAAG,OAAO,EAAE,SAAS,OAAO,OAAO,GAC7FA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,mBAAmB,GAAG,QAAQ,GACvEA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,mBAAmB,GAAG,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;IACpF,IAAI,WAAW;IACf,IAAI,WAAW,QACb,WAAWA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,sBAAsB,GACvEA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,mBAAmB,GAAG,aAAa,WAAW,SAAS,IAAI,GACpG,WAAW,KAAK,MAAMA,MAAAA,QAAM,cAAc,UAAU;KAAE,KAAK,EAAE;KAAM,WAAW;KAAqB,OAAO,EAAE;KAAM,eAAe,YAAY,EAAE,IAAI;IAAE,GACnJ,OAAO,EAAE,IAAI,CAAC,CAAC,MAAM,OAAO,CAAC,CAAC,IAAI,IAAI,OAAO,EAAE,UAAU,GAAG,CAAC,CAAC;IAEpE,SAASA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,oBAAoB,GAAG,GAAG,MAAM,GAAG,OAAO,QAAQ;GACrG;GAEA,MAAM,UAAU,cACZA,MAAAA,QAAM,cAAc,OAAO;IAAE,WAAW;IAAqB,IAAI;GAAU,GACzEA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAAsB,UAAU,CAAC;IAAiB,SAAS;GAAiB,GAAG,oBAAoB,GAC9IA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAA6B,UAAU,CAAC;IAAiB,SAAS;GAAe,GAAG,qBAAqB,GACpJA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,oBAAoB,CAAC,GAC7DA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAAsB,eAAe,eAAe,SAAS;GAAE,GAAG,SAAS,GACtHA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAAsB,eAAe,eAAe,SAAS;GAAE,GAAG,OAAO,GACpHA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,oBAAoB,CAAC,GAC7DA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAAsB,UAAU,CAAC;IAAQ,SAAS;GAAW,GAAG,QAAQ,GACnHA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAAsB,SAAS;GAAU,GAAG,MAAM,CAAC,IAChG;GAEJ,OAAOA,MAAAA,QAAM,cAAc,OAAO;IAAE,WAAW;IAAkC,qBAAqB;IAAK,uBAAuB;GAAS,GACzIA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,2CAA2C,GACjFA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,8BAA8B,GACpEA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,mBAAmB,GACzDA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAA6B,OAAO;IAAS,UAAU,CAAC;IAAQ,SAAS;GAAW,GAAG,GAAG,GACrIA,MAAAA,QAAM,cAAc,QAAQ;IAAE,WAAW;IAA4C,OAAO;IAA0B,eAAe,aAAa,MAAM,CAAC,CAAC;GAAE,GAAG,YAAa,UAAU,IAAK,MAAM,YAAY,KAAK,GAClNA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAA6B,OAAO;IAAS,UAAU,CAAC;IAAQ,SAAS;GAAW,GAAG,GAAG,CAAC,GACxIA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,qBAAqB,GAC3DA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAA6B,OAAO;IAAW,UAAU,CAAC;IAAW,SAAS;GAAW,GAAG,GAAG,GAC1IA,MAAAA,QAAM,cAAc,QAAQ;IAAE,WAAW;IAA4D,OAAO;GAAS,GAAG,YAAa,UAAU,IAAK,MAAM,YAAY,QAAQ,QAAQ,GACtLA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAA6B,OAAO;IAAW,UAAU,CAAC;IAAW,SAAS;GAAW,GAAG,GAAG,GAC1IA,MAAAA,QAAM,cAAc,QAAQ;IAAE,WAAW;IAA0C,OAAO,cAAc;GAAG,GAAG,IAAI,CAAC,GAErHA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,uBAAuB,GAC7DA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAA4B,OAAO;IAAe,UAAU,CAAC;IAAQ,SAAS;GAAa,GAAG,QAAQ,GACjJA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAA4B,OAAO;IAAoB,UAAU,CAAC;IAAQ,SAAS;GAAW,GAAG,QAAQ,GACpJA,MAAAA,QAAM,cAAc,UAAU;IAC5B,WAAW;IACX,OAAO,cAAc,WAAW;IAChC,cAAc,cAAc,WAAW;IACvC,iBAAiB;IACjB,iBAAiB;IACjB,eAAe,gBAAgB,UAAU,CAAC,KAAK;GACjD,GAAG,UAAU,WAAW,CAAC,CAAC,CAAC,CAAC,GAClC,QACA,OAAO;EACX;;;;;;;;EClHA,MAAM,qCAAqB,IAAI,IAAI;;;;;;;EAQnC,SAAgB,qBAAqB,OAAO;GAC1C,MAAM,YAAY,OAAO;GACzB,MAAM,CAAC,SAAS,cAAcC,MAAAA,QAAM,SAAS,IAAI;GACjD,MAAM,GAAG,oBAAoBA,MAAAA,QAAM,SAAS,CAAC;GAC7C,MAAM,MAAMA,MAAAA,QAAM,OAAO,CAAC;GAE1B,MAAM,OAAOA,MAAAA,QAAM,kBAAkB;IACnC,IAAI,CAAC,WAAW;IAChB,MAAM,UAAU,EAAE,IAAI;IACtB,IAAI,aAAa,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,QAAQ;KAC5C,IAAI,YAAY,IAAI,WAAW,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,MAAM,QAAQ,IAAI,OAAO,GAAG;KAC/E,WAAW,UAAU,IAAI,OAAO,CAAC;IACnC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;GACnB,GAAG,CAAC,SAAS,CAAC;GAEd,MAAA,QAAM,gBAAgB;IACpB,KAAK;IACL,MAAM,QAAQ,YAAY,MAAM,GAAI;IACpC,MAAM,kBAAkB,KAAK;IAC7B,OAAO,iBAAiB,gBAAgB,SAAS;IACjD,aAAa;KACX,cAAc,KAAK;KACnB,OAAO,oBAAoB,gBAAgB,SAAS;IACtD;GACF,GAAG,CAAC,IAAI,CAAC;GAET,MAAA,QAAM,gBAAgB;IACpB,IAAI,CAAC,WAAW,OAAO,KAAA;IACvB,MAAM,aAAa,kBAAkB,UAAU,QAAQ,CAAC;IACxD,KAAK;IACL,OAAO,kBAAkB,WAAW,IAAI;GAC1C,GAAG,CAAC,SAAS,CAAC;GAEd,MAAM,cAAc,SAAS,QAAQA,MAAAA,QAAM,cAAc,OAAO;IAC9D;IACA,WAAW;IACX,6BAA6B;GAC/B,GAAG,OAAO;GAEV,MAAM,iBAAiB,aAAa,SAAS;GAC7C,IAAI,gBAAgB;IAClB,IAAI,eAAe,SAAS,kBAAkB,CAAC,eAAe,WAAW,OAAO;IAChF,OAAO,WAAWA,MAAAA,QAAM,cAAc,SAAS,OAAO,OAAO,CAAC,GAAG,gBAAgB,EAAE,MAAM,KAAK,CAAC,CAAC,GAAG,SAAS;GAC9G;GAEA,IAAI,CAAC,aAAa,CAAC,SAAS,cAAc,QAAQ,OAAO;GAEzD,MAAM,QAAQ,QAAQ,aAAa,KAAK,SAAS,KAAK,IAAI;GAC1D,MAAM,cAAc;IAClB,MAAM,UAAU,mBAAmB,IAAI,SAAS,KAAK;IACrD,MAAM,OAAO,aAAa,OAAO,OAAO;IACxC,mBAAmB,IAAI,WAAW,KAAK,KAAK;IAC5C,IAAI,KAAK,MAAM,aAAa,KAAK,IAAI;GACvC;GAEA,OAAO,WAAWA,MAAAA,QAAM,cAAc,SAAS;IAC7C,MAAM;IACN,MAAM;IACN,WAAW,MAAM;IACjB,gBAAgB;GAClB,CAAC,GAAG,aAAa,MAAM;EACzB;;;;;;;;;;;;;;;;;;;;EC5EA,MAAa,cAAc;;EAE3B,MAAa,iBAAiB;;;;;;;;EAgB9B,SAAgB,mBAAmB,KAAoG;GACrI,KAAK,MAAM,WAAW,CAAC,iBAAiB,eAAe,GACrD,IAAI;IAEF,MAAM,QADS,IAAI,IAAI,OACJ,CAAC,EAAE,OAAO,EAAE,WAAW,YAAY,CAAC;IACvD,IAAI,OAAO,OAAO;KAAE;KAAS;IAAM;GACrC,QAAQ,CAER;GAEF,OAAO;IAAE,SAAS;IAAQ,OAAO,KAAA;GAAU;EAC7C;;;;;;;;;;;;EAsBA,SAAgB,mBAAmB,KAA8H,MAAgB,QAA0D;GACzO,MAAM,QAAQ,KAAK;GACnB,IAAI,CAAC,SAAS,OAAO,MAAM,WAAW,cAAc,OAAO,MAAM,aAAa,YAAY;IACxF,QAAQ,KAAK,2CAA+C,KAAK,IAAI;IACrE,OAAO;GACT;GACA,IAAI;IACF,MAAM,WAAW,MAAM,OAAO,KAAK,YAAY,MAAM,SAAS,MAAM,MAAM,CAAC;IAC3E,OAAO,OAAO,aAAa,aAAa,WAAyB;GACnE,SAAS,OAAO;IACd,QAAQ,KAAK,4BAAgC,KAAK,OAAO,WAAW,OAAO,KAAK,IAAI,OAAO;IAC3F,OAAO;GACT;EACF;;;;;;;;;;EAWA,SAAgB,YACd,OACA,KACA,SACY;GACZ,MAAM,WAAW,MAAM;GACvB,MAAM,YAAY,GAAG,SAAkB,QAAQ,UAAU,GAAG,IAAI;GAChE,MAAM,OAAO;GACb,aAAa;IACX,IAAI,MAAM,SAAS,SAAS,MAAM,OAAO;GAC3C;EACF;;;;;;;ECvFA,MAAa,iBAAiB;EAE9B,MAAa,mBAAmB;EAChC,MAAa,oBAAoB;;;;;;;;EA+BjC,SAAS,iBAAiB,SAAkC,QAAoB,QAA0B;GACxG,IAAI,CAAC,OAAO,MAAM,OAAO,OAAO,SAAS,YAAY,MAAM,IAAI,UAAU,qBAAqB;GAC9F,QAAQ,IAAI,OAAO,IAAI,MAAM;GAC7B,OAAO;EACT;;;;;;EAOA,SAAgB,2BAA+C;GAC7D,MAAM,0BAAU,IAAI,IAAwB;GAC5C,MAAM,4BAAY,IAAI,IAAgB;GACtC,MAAM,eAAqB;IACzB,KAAK,MAAM,YAAY,WAAW,SAAS;GAC7C;GACA,MAAM,aAAoC,CAAC,GAAG,QAAQ,OAAO,CAAC,CAAC,CAAC,MAAM,GAAG,OAAO,EAAE,YAAY,MAAM,EAAE,YAAY,EAAE;GACpH,OAAO;IACL,SAAS,QAAgC;KACvC,iBAAiB,SAAS,QAAQ,MAAM;KACxC,aAAa;MACX,IAAI,QAAQ,IAAI,OAAO,EAAE,MAAM,QAAQ;MACvC,QAAQ,OAAO,OAAO,EAAE;MACxB,OAAO;KACT;IACF;IACA,mBAAmB,QAAgC;KACjD,iBAAiB,SAAS,QAAQ,MAAM;KACxC,aAAa;MACX,IAAI,QAAQ,IAAI,OAAO,EAAE,MAAM,QAAQ;MACvC,QAAQ,OAAO,OAAO,EAAE;MACxB,OAAO;KACT;IACF;IACA;IACA,UAAU,UAAkC;KAC1C,UAAU,IAAI,QAAQ;KACtB,aAAa,UAAU,OAAO,QAAQ;IACxC;IACA,MAAM,OAAe,QAAQ,IAAI,EAAE;GACrC;EACF;;;;;;;EAQA,SAAgB,YAAY,QAA6B;GACvD,IAAI;IACF,OAAO,OAAO,cAAc,OAAO,YAAY,IAAI;GACrD,QAAQ;IACN,OAAO;GACT;EACF;;;;;;;EAQA,SAAgB,iBAAiB,UAA4C;GAC3E,OAAO,SAAS,KAAK,CAAC,CAAC,OAAO,WAAW;EAC3C;;;;;;;;EASA,SAAgB,aACd,UACA,UACwB;GACxB,IAAI,aAAA,QAA6B;IAC/B,MAAM,YAAY,SAAS,IAAI,QAAQ;IACvC,IAAI,aAAa,YAAY,SAAS,GAAG,OAAO;GAClD;GACA,OAAO,iBAAiB,QAAQ,CAAC,CAAC;EACpC;;;;;;;EAQA,SAAgB,YAAY,KAAiE;GAC3F,IAAI;IACF,MAAM,UAAU,IAAI,IAAI,eAAe;IAMvC,IAAI,CAAC,WAAW,OAAO,QAAQ,aAAa,YAAY,OAAO,KAAA;IAE/D,IAAI,EADe,QAAQ,UAAU,SAAS,UAAU,KAAK,OAC5C,OAAO,KAAA;IAExB,IAAI,EADY,OAAO,QAAQ,iBAAiB,cAAc,QAAQ,aAAa,QAAQ,IAC7E,OAAO,KAAA;IACrB,OAAO;KACL,IAAI;KACJ,OAAO;KACP,aAAa;KACb,UAAU;KACV,mBAAmB,OAAO,QAAQ,aAAa,eACzC,QAAQ,UAAU,SAAS,UAAU,KAAK,UAC1C,OAAO,QAAQ,iBAAiB,cAAc,QAAQ,aAAa,QAAQ;KACjF,OAAO,MAAM,YAAY;MACvB,IAAI,CAAC,QAAQ,WAAW,MAAM,IAAI,MAAM,UAAU;MAClD,QAAQ,SAAU;OAAE,WAAW,QAAQ;OAAW,KAAK,QAAQ;MAAI,GAAG,MAAM,SAAS,IAAI,CAAC;KAC5F;IACF;GACF,QAAQ;IACN;GACF;EACF;;;;;;;EAQA,SAAgB,SAAS,MAAsB;GAC7C,MAAM,aAAa,KAAK,QAAQ,OAAO,GAAG;GAC1C,OAAO,WAAW,MAAM,WAAW,YAAY,GAAG,IAAI,CAAC,KAAK;EAC9D;;;;;;;;EClKA,MAAa,kBAAkBC,MAAAA,QAAM,cAA6C,KAAA,CAAS;;;;;;;;;;;;;;;;ECS3F,SAAgB,QAAQ,KAAK;GAC3B,MAAM,SAAS;IAAE,GAAG,mBAAmB;IAAG,GAAG,qBAAqB,GAAG;GAAE;GACvE,MAAM,MAAM,CAAC;GACb,KAAK,MAAM,CAAC,IAAI,UAAU,OAAO,QAAQ,MAAM,GAAG,IAAI,MAAM,UAAU,KAAK,OAAO;GAClF,OAAO;EACT;;;;;;EAOA,SAAgB,QAAQ,OAAO;GAC7B,MAAM,MAAM,CAAC;GACb,KAAK,MAAM,CAAC,IAAI,UAAU,OAAO,QAAQ,KAAK,GAAG,IAAI,MAAM,UAAU,OAAO,KAAK;GACjF,OAAO;EACT;;;;;;EAOA,SAAgB,YAAY,OAAO;GACjC,MAAM,0BAAU,IAAI,IAAI;GACxB,KAAK,MAAM,CAAC,IAAI,UAAU,OAAO,QAAQ,KAAK,GAAG;IAC/C,IAAI,CAAC,OAAO;IACZ,MAAM,OAAO,QAAQ,IAAI,KAAK,KAAK,CAAC;IACpC,KAAK,KAAK,EAAE;IACZ,QAAQ,IAAI,OAAO,IAAI;GACzB;GACA,MAAM,sBAAM,IAAI,IAAI;GACpB,KAAK,MAAM,QAAQ,QAAQ,OAAO,GAChC,IAAI,KAAK,SAAS,GAAG,KAAK,MAAM,MAAM,MAAM,IAAI,IAAI,EAAE;GAExD,OAAO;EACT;;;;EAKA,SAAgB,mBAAmB;GACjC,MAAM,WAAWC,MAAAA,QAAM,WAAW,eAAe;GACjD,MAAM,WAAW,UAAU,cAAc;GACzC,MAAM,cAAc,CAAC,YAAY,UAAU,WAAW;GACtD,MAAM,WAAW,UAAU,WAAW;GACtC,MAAM,CAAC,OAAO,YAAYA,MAAAA,QAAM,eAAe,QAAQ,UAAU,OAAO,WAAW,CAAC;GACpF,MAAM,CAAC,WAAW,gBAAgBA,MAAAA,QAAM,SAAS,IAAI;GACrD,MAAM,CAAC,OAAO,YAAYA,MAAAA,QAAM,SAAS,KAAK;GAC9C,MAAM,CAAC,MAAM,WAAWA,MAAAA,QAAM,SAAS,KAAK;GAC5C,MAAM,CAAC,OAAO,YAAYA,MAAAA,QAAM,SAAS,EAAE;GAC3C,MAAM,CAAC,SAAS,cAAcA,MAAAA,QAAM,SAAS,EAAE;GAC/C,MAAM,WAAWA,MAAAA,QAAM,OAAO,KAAK;GACnC,SAAS,UAAU;GACnB,MAAM,aAAaA,MAAAA,QAAM,OAAO,KAAK,UAAU,KAAK,CAAC;GACrD,MAAM,gBAAgB,UAAU,OAAO;GAGvC,MAAA,QAAM,gBAAgB;IACpB,IAAI,SAAS,SAAS;IACtB,MAAM,OAAO,QAAQ,aAAa;IAClC,MAAM,MAAM,KAAK,UAAU,IAAI;IAC/B,IAAI,QAAQ,WAAW,SAAS;IAChC,WAAW,UAAU;IACrB,SAAS,IAAI;GAEf,GAAG,CAAC,aAAa,CAAC;GAGlB,MAAA,QAAM,gBAAgB;IACpB,IAAI,CAAC,WAAW;IAChB,MAAM,SAAS,MAAM;KACnB,EAAE,eAAe;KACjB,EAAE,gBAAgB;KAClB,IAAI,EAAE,QAAQ,UAAU;MAAE,aAAa,IAAI;MAAG;KAAO;KACrD,IAAI,EAAE,QAAQ,eAAe,EAAE,QAAQ,UAAU;MAC/C,UAAU,SAAS,OAAO,OAAO,CAAC,GAAG,MAAM,GAAG,YAAY,KAAK,CAAC,CAAC;MACjE,aAAa,IAAI;MACjB,SAAS,IAAI;MACb;KACF;KACA,MAAM,QAAQ,eAAe,CAAC;KAC9B,IAAI,CAAC,OAAO;KACZ,UAAU,SAAS,OAAO,OAAO,CAAC,GAAG,MAAM,GAAG,YAAY,MAAM,CAAC,CAAC;KAClE,aAAa,IAAI;KACjB,SAAS,IAAI;IACf;IACA,OAAO,iBAAiB,WAAW,OAAO,IAAI;IAC9C,aAAa,OAAO,oBAAoB,WAAW,OAAO,IAAI;GAChE,GAAG,CAAC,SAAS,CAAC;GAEd,MAAM,YAAY,YAAY,KAAK;GACnC,MAAM,aAAa;IACjB,IAAI,CAAC,UAAU,KAAK;KAAE,SAAS,SAAS;KAAG;IAAO;IAClD,QAAQ,IAAI;IACZ,SAAS,EAAE;IACX,WAAW,EAAE;IACb,SAAS,IAAI,eAAe,QAAQ,KAAK,CAAC,CAAC,CAAC,WAAW;KACrD,SAAS,KAAK;KACd,WAAW,UAAU,KAAK,UAAU,KAAK;KACzC,WAAW,KAAK;IAClB,CAAC,CAAC,CAAC,OAAO,MAAM,SAAS,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,QAAQ,KAAK,CAAC;GACnE;;;;GAKA,MAAM,iBAAiB;IACrB,IAAI,CAAC,UAAU,KAAK;KAAE,SAAS,SAAS;KAAG;IAAO;IAClD,IAAI,CAAC,OAAO,QAAQ,cAAc,GAAG;IACrC,QAAQ,IAAI;IACZ,SAAS,EAAE;IACX,WAAW,EAAE;IACb,SAAS,IAAI,eAAe,EAAE,GAAG,mBAAmB,EAAE,CAAC,CAAC,CAAC,WAAW;KAClE,MAAM,OAAO,QAAQ,CAAC,CAAC;KACvB,SAAS,IAAI;KACb,WAAW,UAAU,KAAK,UAAU,IAAI;KACxC,SAAS,KAAK;KACd,WAAW,OAAO;IACpB,CAAC,CAAC,CAAC,OAAO,MAAM,SAAS,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,QAAQ,KAAK,CAAC;GACnE;;GAGA,MAAM,YAAY,OAAO;IACvB,UAAU,SAAS,OAAO,OAAO,CAAC,GAAG,MAAM,GAAG,KAAK,oBAAoB,OAAO,KAAK,CAAC,CAAC;IACrF,SAAS,IAAI;GACf;GAEA,MAAM,OAAO,SAAS,KAAK,YAAY;IACrC,MAAM,QAAQ,MAAM,QAAQ,OAAO;IACnC,MAAM,WAAW,UAAU,QAAQ,UAAU,IAAI,QAAQ,EAAE;IAC3D,MAAM,UAAU,UAAU,QAAQ,WAAW,KAAK,MAAM;IACxD,MAAM,eAAe,cAAc,QAAQ;IAC3C,IAAI;IACJ,IAAI,cACF,UAAUA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,aAAa,GAAG,+BAA+B;SAElG,UAAUA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,gBAAgB,WAAW,UAAU,OAAO,UAAU,aAAa,IAAI,GACvH,SAAS,KAAK;IAElB,OAAOA,MAAAA,QAAM,cAAc,OAAO;KAAE,KAAK,QAAQ;KAAI,WAAW,gBAAgB,eAAe,SAAS;IAAI,GAC1GA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,eAAe,GACrDA,MAAAA,QAAM,cAAc,QAAQ,MAAM,QAAQ,KAAK,GAC/C,YAAYA,MAAAA,QAAM,cAAc,SAAS,EAAE,WAAW,cAAc,GAAG,SAAS,GAChF,WAAWA,MAAAA,QAAM,cAAc,SAAS,EAAE,WAAW,cAAc,GAAG,QAAQ,CAAC,GACjF,SACAA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,iBAAiB,GACvD,eACIA,MAAAA,QAAM,cAAc,UAAU,EAAE,eAAe,aAAa,IAAI,EAAE,GAAG,IAAI,IACzEA,MAAAA,QAAM,cAAcA,MAAAA,QAAM,UAAU,MAClCA,MAAAA,QAAM,cAAc,UAAU;KAAE,UAAU,eAAe,YAAY,QAAQ,UAAU,aAAa;KAAO,eAAe;MAAE,aAAa,QAAQ,EAAE;MAAG,WAAW,EAAE;KAAE;IAAE,GAAG,IAAI,GAC9KA,MAAAA,QAAM,cAAc,UAAU;KAAE,UAAU;KAAM,eAAe,SAAS,QAAQ,EAAE;IAAE,GAAG,IAAI,CAAC,CACpG,CAAC;GACL,CAAC;GAED,OAAOA,MAAAA,QAAM,cAAc,WAAW,EAAE,WAAW,mBAAmB,GACpEA,MAAAA,QAAM,cAAc,MAAM,MAAM,KAAK,GACrCA,MAAAA,QAAM,cAAc,KAAK,MAAM,wDAAwD,GACvF,eAAeA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,+BAA+B,GAAG,oBAAoB,GAC7G,SAASA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,+BAA+B,GAAG,KAAK,GACxF,WAAWA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,iBAAiB,GAAG,OAAO,GAC9EA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,cAAc,GAAG,IAAI,GAC7DA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,oBAAoB,GAC1DA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,eAAe,GAAG,QAAQ,YAAY,EAAE,GACjFA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAAyB,UAAU,eAAe,YAAY,QAAQ,UAAU,aAAa,SAAS,CAAC;IAAO,SAAS;GAAK,GAAG,OAAO,SAAS,IAAI,GAC9LA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAAa,UAAU,eAAe,YAAY,QAAQ,UAAU,aAAa;IAAO,SAAS;GAAS,GAAG,MAAM,CAAC,CACnK;EACF;;;;;;;;;EC3KA,MAAM,QAAQ;GAAE,YAAY;GAAI,WAAW;GAAS,SAAS;GAAI,MAAM;GAAI,KAAK;GAAI,KAAK;GAAI,SAAS;EAAG;;EAGzG,SAAS,SAAS,OAAO;GACvB,MAAM,SAAS;IAAE,YAAY,MAAM,WAAW,KAAK;IAAG,WAAW,MAAM;GAAU;GACjF,IAAI,MAAM,cAAc,SAAS;IAC/B,OAAO,UAAU,MAAM,QAAQ,KAAK;IACpC,OAAO,OAAO,MAAM,KAAK,MAAM,WAAW,CAAC,CAAC,OAAO,OAAO;IAC1D,IAAI,MAAM,IAAI,KAAK,GAAG,OAAO,MAAM,MAAM,IAAI,KAAK;GACpD,OAAO;IACL,OAAO,MAAM,MAAM,IAAI,KAAK;IAC5B,OAAO,UAAU,WAAW,MAAM,OAAO;GAC3C;GACA,OAAO;EACT;;EAGA,SAAS,WAAW,MAAM;GACxB,OAAO,OAAO,YAAY,KAAK,MAAM,OAAO,CAAC,CAAC,KAAK,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,SAAS;IACrG,MAAM,MAAM,KAAK,QAAQ,GAAG;IAC5B,OAAO,MAAM,IAAI,CAAC,KAAK,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,GAAG,KAAK,MAAM,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE;GACtF,CAAC,CAAC;EACJ;;EAGA,SAAS,SAAS,QAAQ;GACxB,OAAO,OAAO,WAAW,cAAc,OAAO,OAAO,WAAW,eAAe,QAAQ,OAAO,WAAW,aAAa,QAAQ;EAChI;;EAGA,SAAS,WAAW,EAAE,QAAQ,WAAW,UAAU,YAAY;GAC7D,OAAOC,MAAAA,QAAM,cAAc,WAAW,EAAE,WAAW,eAAe,GAChEA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,oBAAoB,GAC1DA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,gBAAgB,GAAGA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,kBAAkB,OAAO,UAAU,OAAO,SAAS,YAAY,CAAC,GAAG,OAAO,UAAU,GACxLA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,kBAAkB,GACxDA,MAAAA,QAAM,cAAc,UAAU;IAAE,eAAe,UAAU,OAAO,EAAE;IAAG,OAAO;GAAO,GAAG,GAAG,GACzFA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAAc,eAAe,SAAS,OAAO,EAAE;IAAG,OAAO;GAAS,GAAG,GAAG,GACnHA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW,iBAAiB,OAAO,UAAU,OAAO;IAAK,eAAe,SAAS,MAAM;IAAG,cAAc,OAAO,UAAU,OAAO;GAAK,GAAG,OAAO,UAAU,MAAM,GAAG,CACpM,CACF,GACAA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,eAAe,GAAG,SAAS,MAAM,GAAG,OAAO,OAAO,WAAW,WAAW,OAAO,SAAS,GAChI,OAAO,SAASA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,gBAAgB,GAAG,OAAO,KAAK,GACvFA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,gBAAgB,GAAG,OAAO,MAAM,KAAK,SAASA,MAAAA,QAAM,cAAc,QAAQ;IAAE,KAAK,KAAK;IAAM,WAAW;IAAgB,OAAO,KAAK,eAAe,KAAK;GAAK,GAAG,KAAK,IAAI,CAAC,CAAC,CACpN;EACF;;EAGA,SAAgB,eAAe,UAAU,OAAO;GAC9C,MAAM,SAAS,OAAO,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY;GACtD,IAAI,CAAC,QAAQ,OAAO;GACpB,OAAO,SAAS,QAAQ,YAAY,GAAG,QAAQ,MAAM,GAAG,QAAQ,gBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,CAAC;EAChH;;EAGA,SAAS,cAAc,EAAE,UAAU,OAAO,YAAY;GACpD,MAAM,CAAC,MAAM,WAAWA,MAAAA,QAAM,SAAS,KAAK;GAC5C,MAAM,CAAC,OAAO,YAAYA,MAAAA,QAAM,SAAS,EAAE;GAC3C,MAAM,CAAC,WAAW,gBAAgBA,MAAAA,QAAM,SAAS,CAAC;GAClD,MAAM,UAAUA,MAAAA,QAAM,OAAO,IAAI;GACjC,MAAM,WAAW,SAAS,MAAM,YAAY,QAAQ,kBAAkB,KAAK;GAC3E,MAAM,WAAWA,MAAAA,QAAM,cAAc,eAAe,UAAU,KAAK,GAAG,CAAC,UAAU,KAAK,CAAC;GAEvF,MAAA,QAAM,gBAAgB;IACpB,MAAM,SAAS,UAAU;KACvB,IAAI,CAAC,QAAQ,SAAS,SAAS,MAAM,MAAM,GAAG,QAAQ,KAAK;IAC7D;IACA,SAAS,iBAAiB,aAAa,KAAK;IAC5C,aAAa,SAAS,oBAAoB,aAAa,KAAK;GAC9D,GAAG,CAAC,CAAC;GAEL,MAAM,UAAU,YAAY;IAC1B,SAAS,QAAQ,aAAa;IAC9B,SAAS,EAAE;IACX,QAAQ,KAAK;GACf;GACA,MAAM,QAAQ,UAAU,cAAc,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,IAAI,GAAG,SAAS,SAAS,CAAC,GAAG,MAAM,KAAK,CAAC,CAAC;GAClH,MAAM,WAAW,UAAU;IACzB,IAAI,MAAM,QAAQ,aAAa;KAAE,MAAM,eAAe;KAAG,KAAK,CAAC;IAAE,OAC5D,IAAI,MAAM,QAAQ,WAAW;KAAE,MAAM,eAAe;KAAG,KAAK,EAAE;IAAE,OAChE,IAAI,MAAM,QAAQ,WAAW,SAAS,YAAY;KAAE,MAAM,eAAe;KAAG,OAAO,SAAS,UAAU;IAAE,OACxG,IAAI,MAAM,QAAQ,UAAU;KAAE,MAAM,eAAe;KAAG,QAAQ,KAAK;IAAE;GAC5E;GACA,OAAOA,MAAAA,QAAM,cAAc,OAAO;IAAE,WAAW;IAAsB,KAAK;GAAQ,GAChFA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAA8B,MAAM;IAAY,iBAAiB;IAAM,eAAe,SAAS,QAAQ,CAAC,GAAG;GAAE,GACtJA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,2BAA2B,GAAG,UAAU,SAAS,QAAQ,YAAYA,MAAAA,QAAM,cAAc,SAAS,MAAM,SAAS,aAAa,CAAC,GACxKA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,2BAA2B,GAAG,OAAO,MAAM,GAAG,CACzF,GACA,QAAQA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,0BAA0B,GACxEA,MAAAA,QAAM,cAAc,SAAS;IAAE,WAAW;IAAM,WAAW;IAA6B,OAAO;IAAO,aAAa;IAAc,WAAW,UAAU;KAAE,SAAS,MAAM,OAAO,KAAK;KAAG,aAAa,CAAC;IAAE;IAAG,WAAW;GAAQ,CAAC,GAC7NA,MAAAA,QAAM,cAAc,OAAO;IAAE,WAAW;IAA8B,MAAM;GAAU,GAAG,SAAS,SAAS,SAAS,KAAK,SAAS,UAAUA,MAAAA,QAAM,cAAc,UAAU;IAAE,KAAK,QAAQ;IAAe,MAAM;IAAU,iBAAiB,QAAQ,kBAAkB;IAAO,WAAW,yBAAyB,UAAU,YAAY,cAAc,OAAO,QAAQ,kBAAkB,QAAQ,cAAc;IAAK,oBAAoB,aAAa,KAAK;IAAG,eAAe,OAAO,OAAO;GAAE,GAAGA,MAAAA,QAAM,cAAc,QAAQ,MAAM,QAAQ,KAAK,GAAGA,MAAAA,QAAM,cAAc,SAAS,MAAM,QAAQ,eAAe,OAAO,QAAQ,QAAQ,QAAQ,QAAQ,CAAC,CAAC,IAAIA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,2BAA2B,GAAG,SAAS,CAAC,CACpsB,CACF;EACF;;EAGA,SAAS,aAAa,EAAE,SAAS,MAAM,OAAO,WAAW,UAAU,YAAY;GAC7E,MAAM,OAAOA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,mBAAmB,GACtEA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,oBAAoB,GAAGA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,mBAAmB,GAAG,GAAG,GAAGA,MAAAA,QAAM,cAAc,OAAO,MAAMA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,mBAAmB,GAAG,QAAQ,KAAK,GAAGA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,mBAAmB,GAAG,QAAQ,aAAa,CAAC,CAAC,GAC1UA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAAyB,eAAe,MAAM,OAAO;GAAE,GAAG,UAAU,CACjH;GACA,IAAI;GACJ,IAAI,QAAQ,YAAY,OAAOA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,oBAAoB,GAAG,mBAAmB;QAC5G,IAAI,QAAQ,WAAW,OAAOA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,+BAA+B,GAAG,QAAQ,SAAS;QACzH,IAAI,CAAC,QAAQ,QAAQ,QAAQ,OAAOA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,oBAAoB,GAAG,YAAY;QAC/G,OAAO,QAAQ,QAAQ,KAAK,WAAWA,MAAAA,QAAM,cAAc,YAAY;IAAE,KAAK,OAAO;IAAY;IAAQ,YAAY,OAAO,UAAU,SAAS,QAAQ,EAAE;IAAG,gBAAgB,SAAS,SAAS,MAAM;IAAG,WAAW,OAAO,SAAS,SAAS,QAAQ,EAAE;GAAE,CAAC,CAAC;GAC9P,OAAOA,MAAAA,QAAM,cAAc,WAAW,EAAE,WAAW,cAAc,GAAG,MAAM,IAAI;EAChF;;EAGA,SAAS,gBAAgB,EAAE,YAAY;GACrC,MAAM,CAAC,MAAM,WAAWA,MAAAA,QAAM,SAAS,cAAc;GACrD,MAAM,CAAC,MAAM,WAAWA,MAAAA,QAAM,SAAS,KAAK;GAC5C,MAAM,CAAC,OAAO,YAAYA,MAAAA,QAAM,SAAS,EAAE;GAC3C,MAAM,CAAC,SAAS,cAAcA,MAAAA,QAAM,SAAS,IAAI;GACjD,MAAM,CAAC,SAAS,cAAcA,MAAAA,QAAM,SAAS,KAAK;GAClD,MAAM,CAAC,YAAY,iBAAiBA,MAAAA,QAAM,SAAS,EAAE;GACrD,MAAM,WAAWA,MAAAA,QAAM,WAAW,eAAe;GACjD,MAAM,WAAW,UAAU,cAAc;GACzC,MAAM,UAAU,CAAC,YAAY,SAAS,WAAW;GACjD,MAAM,cAAc,UAAU,WAAW,iBAAiB,CAAC;GAC3D,MAAM,WAAW,UAAU,WAAW;GACtC,MAAA,QAAM,gBAAgB;IACpB,MAAM,iBAAiB;KACrB,MAAM,OAAO,UAAU,cAAc,CAAC,CAAC,OAAO;KAC9C,IAAI,OAAO,SAAS,UAAU,QAAQ,IAAI;IAC5C;IACA,SAAS;IACT,OAAO,UAAU,YAAY,QAAQ;GACvC,GAAG,CAAC,QAAQ,CAAC;GACb,MAAA,QAAM,gBAAgB;IACpB,IAAI,qBAAqB,CAAC,CAAC,CAAC,CAAC,MAAM,WAAW;KAC5C,IAAI,OAAO,IAAI,WAAW,OAAO,OAAO;IAC1C,CAAC,CAAC,CAAC,YAAY,CAAmB,CAAC;GACrC,GAAG,CAAC,CAAC;GACL,MAAM,QAAQ,UAAU;IACtB,QAAQ,KAAK;IAAG,QAAQ,IAAI;IAAG,SAAS,EAAE;IAC1C,IAAI,CAAC,UAAU,KAAK;KAAE,SAAS,SAAS;KAAG,QAAQ,KAAK;KAAG;IAAO;IAClE,SAAS,IAAI,gBAAgB,KAAK,CAAC,CAAC,OAAO,MAAM,SAAS,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,QAAQ,KAAK,CAAC;GACpG;GACA,MAAM,qBAAqB;IACzB,IAAI,CAAC,OAAO,QAAQ,6DAA6D,GAAG;IACpF,WAAW,IAAI;IACf,cAAc,EAAE;IAChB,IAAI,qBAAqB,EAAE,SAAS,MAAM,CAAC,CAAC,CAAC,MAAM,WAAW;KAC5D,IAAI,CAAC,OAAO,IAAI;MAAE,cAAc,UAAU,OAAO,OAAO,KAAK,CAAC;MAAG;KAAO;KACxE,WAAW,OAAO,OAAO;KACzB,cAAc,OAAO,UAAU,wBAAwB,UAAU;IACnE,CAAC,CAAC,CAAC,OAAO,MAAM,cAAc,UAAU,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,WAAW,KAAK,CAAC;GACrF;GACA,MAAM,UAAU,CAAC;IAAE,IAAI;IAAgB,OAAO;IAAQ,aAAa;GAAe,GAAG,GAAG,iBAAiB,QAAQ,CAAC,CAAC,KAAK,UAAU;IAAE,IAAI,KAAK;IAAI,OAAO,KAAK;IAAO,aAAa,KAAK;GAAY,EAAE,CAAC;GACrM,MAAM,gBAAgB,QAAQ,MAAM,SAAS,KAAK,OAAO,IAAI,IAAI,OAAO;GACxE,MAAM,aAAa,SAAS,UAAUA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,kBAAkB,GAC9FA,MAAAA,QAAM,cAAc,QAAQ,MAAM,QAAQA,MAAAA,QAAM,cAAc,SAAS,EAAE,WAAW,mBAAmB,GAAG,aAAa,QAAQ,IAAI,CAAC,GACpIA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,sBAAsB,GAC5D,cAAcA,MAAAA,QAAM,cAAc,SAAS,EAAE,WAAW,kBAAkB,GAAG,UAAU,GACvFA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAAqB,UAAU;IAAS,SAAS;GAAa,GAAG,UAAU,SAAS,QAAQ,CACzI,CACF,IAAI;GACJ,OAAOA,MAAAA,QAAM,cAAc,WAAW,EAAE,WAAW,mBAAmB,GACpEA,MAAAA,QAAM,cAAc,MAAM,MAAM,IAAI,GACpCA,MAAAA,QAAM,cAAc,KAAK,MAAM,mCAAmC,GAClE,eAAeA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,+BAA+B,GAAG,oBAAoB,GAC7G,SAASA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,+BAA+B,GAAG,KAAK,GACxFA,MAAAA,QAAM,cAAc,SAAS,EAAE,WAAW,kBAAkB,GAAGA,MAAAA,QAAM,cAAc,QAAQ,MAAM,UAAU,GAAGA,MAAAA,QAAM,cAAc,UAAU;IAAE,OAAO;IAAe,UAAU,WAAW,eAAe,YAAY,QAAQ,UAAU,aAAa;IAAO,WAAW,UAAU,KAAK,MAAM,OAAO,KAAK;GAAE,GAAG,QAAQ,KAAK,SAASA,MAAAA,QAAM,cAAc,UAAU;IAAE,KAAK,KAAK;IAAI,OAAO,KAAK;GAAG,GAAG,KAAK,KAAK,CAAC,CAAC,GAAG,WAAWA,MAAAA,QAAM,cAAc,SAAS,MAAM,MAAM,CAAC,GACrc,UACF;EACF;;EAGA,SAAS,cAAc,EAAE,cAAc;GACrC,MAAM,CAAC,QAAQ,aAAaA,MAAAA,QAAM,SAAS,IAAI;GAC/C,MAAM,CAAC,OAAO,YAAYA,MAAAA,QAAM,SAAS,EAAE;GAC3C,MAAA,QAAM,gBAAgB;IACpB,IAAI,QAAQ;IACZ,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,WAAW;KACjC,IAAI,CAAC,OAAO;KACZ,IAAI,CAAC,OAAO,IAAI,SAAS,OAAO,OAAO,KAAK,CAAC;UACxC,UAAU,OAAO,MAAM;IAC9B,CAAC,CAAC,CAAC,OAAO,MAAM;KAAE,IAAI,OAAO,SAAS,OAAO,CAAC,CAAC;IAAE,CAAC;IAClD,aAAa;KAAE,QAAQ;IAAM;GAC/B,GAAG,CAAC,CAAC;GACL,MAAM,eAAe,UAAU,QAAQ,CAAC,EAAA,CAAG,KAAK,SAASA,MAAAA,QAAM,cAAc,OAAO;IAAE,KAAK,KAAK;IAAM,WAAW,sBAAsB,KAAK,SAAS,OAAO;GAAQ,GAClKA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,kBAAkB,GAAG,KAAK,IAAI,GACvEA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,kBAAkB,GAAG,KAAK,SAAS,KAAK,SAAS,OAAO,MAAM,CACzG,CAAC;GACD,MAAM,WAAW,QAAQ,YAAY,CAAC;GACtC,MAAM,UAAU,QAAQ;GACxB,OAAOA,MAAAA,QAAM,cAAc,WAAW,EAAE,WAAW,mBAAmB,GACpEA,MAAAA,QAAM,cAAc,MAAM,MAAM,KAAK,GACrCA,MAAAA,QAAM,cAAc,KAAK,MAAM,iCAAiC,QAAQ,gBAAgB,WAAW,OAAO,gBAAgB,MAAM,GAAG,GACnI,SAASA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,+BAA+B,GAAG,KAAK,GACxF,SAAS,WAAWA,MAAAA,QAAM,cAAcA,MAAAA,QAAM,UAAU,MACtDA,MAAAA,QAAM,cAAc,MAAM,EAAE,WAAW,gBAAgB,GAAG,MAAM,GAChEA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,qBAAqB,GAAGA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,kBAAkB,GAAG,iBAAiB,GAAGA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,kBAAkB,GAAG,QAAQ,IAAI,CAAC,CAC/N,GACAA,MAAAA,QAAM,cAAc,MAAM,EAAE,WAAW,gBAAgB,GAAG,SAAS,GACnE,YAAY,QAAQ,QAAQ,GAC5BA,MAAAA,QAAM,cAAc,MAAM,EAAE,WAAW,gBAAgB,GAAG,OAAO,GACjE,YAAY,aAAa,KAAK,CAAC,CAAC,GAChCA,MAAAA,QAAM,cAAc,MAAM,EAAE,WAAW,gBAAgB,GAAG,IAAI,GAC9D,YAAY,QAAQ,MAAM,GAC1BA,MAAAA,QAAM,cAAc,MAAM,EAAE,WAAW,gBAAgB,GAAG,IAAI,GAC9D,SAAS,SAAS,SAAS,KAAK,GAAG,UAAUA,MAAAA,QAAM,cAAc,OAAO;IAAE,KAAK;IAAO,WAAW;GAA+B,GAAG,CAAC,CAAC,IAAIA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,qBAAqB,GAAGA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,kBAAkB,GAAG,WAAW,GAAGA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,kBAAkB,GAAG,EAAE,CAAC,CACxV;EACF;;EAGA,SAAgB,YAAY,OAAO;GACjC,MAAM,iBAAiB,OAAO,kBAAkB,EAAE,YAAY,CAAC,EAAE;GACjE,MAAM,gBAAgB,OAAO,wBAAwB,CAAC;GACtD,MAAM,CAAC,SAAS,cAAcA,MAAAA,QAAM,SAAsB,CAAC,CAAC;GAC5D,MAAM,CAAC,UAAU,eAAeA,MAAAA,QAAM,SAAuB,CAAC,CAAC;GAC/D,MAAM,CAAC,SAAS,cAAcA,MAAAA,QAAM,SAAS,IAAI;GACjD,MAAM,CAAC,MAAM,WAAWA,MAAAA,QAAM,SAAS,EAAE;GACzC,MAAM,CAAC,OAAO,YAAYA,MAAAA,QAAM,SAAS,EAAE;GAC3C,MAAM,CAAC,KAAK,UAAUA,MAAAA,QAAM,SAAS,SAAS;GAC9C,MAAM,CAAC,OAAO,YAAYA,MAAAA,QAAM,SAAS,KAAK;GAC9C,MAAM,CAAC,UAAU,eAAeA,MAAAA,QAAM,SAAS,KAAK;GACpD,MAAM,CAAC,aAAa,kBAAkBA,MAAAA,QAAM,SAAS,IAAI;GACzD,MAAM,CAAC,cAAc,mBAAmBA,MAAAA,QAAM,SAAS,EAAE;GAEzD,MAAA,QAAM,gBAAgB;IACpB,IAAI,CAAC,SAAS,QAAQ;KACpB,gBAAgB,EAAE;KAClB;IACF;IACA,IAAI,CAAC,SAAS,MAAM,YAAY,QAAQ,kBAAkB,YAAY,GAAG,gBAAgB,SAAS,EAAE,CAAC,aAAa;GACpH,GAAG,CAAC,UAAU,YAAY,CAAC;GAE3B,MAAM,UAAUA,MAAAA,QAAM,kBAAkB;IACtC,WAAW,IAAI;IACf,SAAS,EAAE;IACX,QAAQ,IAAI,CAAC,IAAI,YAAY,CAAC,CAAC,GAAG,IAAI,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,SAAS;KAChF,IAAI,CAAC,KAAK,IAAI,MAAM,IAAI,MAAM,KAAK,KAAK;KACxC,IAAI,CAAC,IAAI,IAAI,MAAM,IAAI,MAAM,IAAI,KAAK;KACtC,WAAW,KAAK,OAAO;KACvB,YAAY,IAAI,QAAQ;IAC1B,CAAC,CAAC,CAAC,OAAO,MAAM,SAAS,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,WAAW,KAAK,CAAC;GACtE,GAAG,CAAC,CAAC;GAEL,MAAA,QAAM,UAAU,SAAS,CAAC,OAAO,CAAC;GAElC,MAAM,UAAU,WAAW;IACzB,IAAI,CAAC,OAAO,IAAI,MAAM,IAAI,MAAM,OAAO,KAAK;IAC5C,OAAO;GACT;GAEA,MAAM,UAAU,OAAO,IAAI,QAAQ,MAAM,UAAU;IACjD,QAAQ,EAAE;IACV,SAAS,EAAE;IACX,OAAO,IAAI,QAAQ,IAAI,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,MAAM,WAAW;KACrD,IAAI,OAAO,MAAM,MAAM;IACzB,CAAC,CAAC,CAAC,OAAO,MAAM,SAAS,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,QAAQ,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK;GAClF;GAEA,MAAM,iBAAiB,OAAO,OAAO,WAAW,IAAI,eAAe,EAAE,GAAG,IAAI,MAAM,YAAY,QAAQ,IAAI,KAAK,MAAM,EAAE,OAAO,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;GACjJ,MAAM,gBAAgB,MAAM,OAAO,UAAU,EAAE,IAAI,cAAc;IAAE,IAAI,EAAE;IAAI,SAAS,CAAC,EAAE;GAAQ,IAAI,MAAM,YAAY,QAAQ,IAAI,KAAK,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;GAC5K,MAAM,gBAAgB,MAAM,OAAO,QAAQ,eAAe,KAAK,OAAO,UAAU,EAAE,IAAI,cAAc,EAAE,IAAI,EAAE,GAAG,IAAI,MAAM,YAAY,QAAQ,IAAI,QAAQ,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;GAE9K,MAAM,kBAAkB,mBAAmB,WAAW,aAAa,QAAQ,IAAI,KAAK,MAAM,EAAE,kBAAkB,gBAAgB,OAAO,UAAU,CAAC,CAAC;GACjJ,MAAM,iBAAiB,eAAe,YAAY,QAAQ,MAAM,UAAU;IACxE,QAAQ,gBAAgB,MAAM,UAAU;IACxC,SAAS,EAAE;IACX,OAAO,IAAI,QAAQ,IAAI,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,MAAM,WAAW;KACrD,IAAI,OAAO,MAAM,MAAM;IACzB,CAAC,CAAC,CAAC,OAAO,MAAM,SAAS,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,QAAQ,EAAE,CAAC;GAChE;GAEA,MAAM,kBAAkB,GAAG,MAAM,cAAc,EAAE,eAAe,EAAE,YAAY,sBAAsB;IAAE,eAAe,EAAE;IAAe,YAAY,EAAE;GAAW,GAAG,eAAe,EAAE,aAAa,CAAC;GACjM,MAAM,iBAAiB,GAAG,MAAM,cAAc,EAAE,eAAe,EAAE,YAAY,qBAAqB;IAAE,eAAe,EAAE;IAAe,YAAY,EAAE;IAAY,SAAS,CAAC,EAAE;GAAQ,GAAG,eAAe,EAAE,aAAa,CAAC;GACpN,MAAM,iBAAiB,GAAG,MAAM,OAAO,QAAQ,kBAAkB,EAAE,aAAa,IAAI,KAAK,cAAc,EAAE,eAAe,EAAE,YAAY,qBAAqB;IAAE,eAAe,EAAE;IAAe,YAAY,EAAE;GAAW,GAAG,eAAe,EAAE,aAAa,CAAC;GAExP,MAAM,mBAAmB;IACvB,QAAQ,MAAM;IACd,SAAS,EAAE;IACX,IAAI,YAAY,EAAE,QAAQ,SAAS,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,MAAM,WAAW;KACzE,YAAY,QAAQ,IAAI,MAAM,MAAM,EAAE,OAAO,OAAO,OAAO,EAAE,IAAI,IAAI,KAAK,MAAM,EAAE,OAAO,OAAO,OAAO,KAAK,OAAO,SAAS,CAAC,IAAI,IAAI,OAAO,OAAO,MAAM,CAAC;KAC1J,SAAS,KAAK;KACd,YAAY,KAAK;IACnB,CAAC,CAAC,CAAC,OAAO,MAAM,SAAS,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,QAAQ,EAAE,CAAC;GAChE;GAEA,MAAM,oBAAoB;IACxB,IAAI,CAAC,aAAa;IAClB,QAAQ,cAAc;IACtB,SAAS,EAAE;IACX,MAAM,SAAS,SAAS,KAAK;IAC7B,IAAI,mBAAmB;KAAE,eAAe,YAAY;KAAe,YAAY,OAAO;KAAY;IAAO,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,MAAM,WAAW;KACxI,aAAa,QAAQ,IAAI,KAAK,MAAM,EAAE,kBAAkB,YAAY,gBAAgB,OAAO,UAAU,CAAC,CAAC;KACvG,SAAS,KAAK;KACd,eAAe,IAAI;IACrB,CAAC,CAAC,CAAC,OAAO,MAAM,SAAS,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,QAAQ,EAAE,CAAC;GAChE;GAEA,MAAM,QAAQ,KAAK,UAAU,UAAU,SAAS;IAAE,GAAG;KAAM,MAAM;GAAM,EAAE;GACzE,MAAM,aAAaA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,gBAAgB,GAAG,YAAY;GAC1F,MAAM,kBAAkB,SAAS,MAAM,YAAY,QAAQ,kBAAkB,YAAY;GACzF,MAAM,cAAc,SAAS,SAASA,MAAAA,QAAM,cAAcA,MAAAA,QAAM,UAAU,MACxEA,MAAAA,QAAM,cAAc,eAAe;IAAE;IAAU,OAAO;IAAc,UAAU;GAAgB,CAAC,GAC/F,kBAAkBA,MAAAA,QAAM,cAAc,cAAc;IAAE,SAAS;IAAiB;IAAM,QAAQ,YAAY;KAAE,SAAS,KAAK;KAAG,eAAe;MAAE,eAAe,QAAQ;MAAe,OAAO,QAAQ;KAAM,CAAC;IAAE;IAAG,WAAW;IAAgB,UAAU;IAAe,UAAU;GAAc,CAAC,IAAIA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,gBAAgB,GAAG,OAAO,CACpW,IAAIA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,gBAAgB,GAAG,OAAO;GACtE,IAAI;GACJ,IAAI,SAAS,OAAOA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,gBAAgB,GAAG,cAAc;QACxF,IAAI,QAAQ,WAAW,OAAOA,MAAAA,QAAM,cAAc,iBAAiB,EAAE,UAAU,eAAe,CAAC;QAC/F,IAAI,QAAQ,QAAQ,OAAOA,MAAAA,QAAM,cAAc,kBAAkB,IAAI;QACrE,IAAI,QAAQ,QAAQ,OAAOA,MAAAA,QAAM,cAAc,OAAO,MAAM,QAAQ,SAAS,QAAQ,KAAK,MAAMA,MAAAA,QAAM,cAAc,YAAY;IAAE,KAAK,EAAE;IAAI,QAAQ;IAAG,WAAW;IAAe,UAAU;IAAc,UAAU;GAAa,CAAC,CAAC,IAAIA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,gBAAgB,GAAG,aAAa,CAAC;QAChT,IAAI,QAAQ,YAAY,OAAO;QAC/B,IAAI,QAAQ,UAAU,OAAOA,MAAAA,QAAM,cAAc,eAAe,EAAE,YAAY,cAAc,CAAC;QAC7F,OAAO;GACZ,MAAM,OAAO,WAAWA,MAAAA,QAAM,cAAc,SAAS;IAAE,OAAO;IAAY;IAAO;IAAM;IAAM,MAAM;IAAY,aAAa,YAAY,KAAK;GAAE,CAAC,IAAI,cAAcA,MAAAA,QAAM,cAAc,SAAS;IAAE,OAAO,gBAAgB,YAAY;IAAO;IAAO;IAAM;IAAM,MAAM;IAAa,aAAa,eAAe,IAAI;GAAE,CAAC,IAAI;GACxT,OAAOA,MAAAA,QAAM,cAAc,WAAW,EAAE,WAAW,eAAe,GAChEA,MAAAA,QAAM,cAAc,UAAU,EAAE,WAAW,iBAAiB,GAAGA,MAAAA,QAAM,cAAc,OAAO,MAAMA,MAAAA,QAAM,cAAc,MAAM,MAAM,YAAY,GAAGA,MAAAA,QAAM,cAAc,KAAK,MAAM,+CAA+C,CAAC,GAAGA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAAe,eAAe;KAAE,SAAS,KAAK;KAAG,YAAY,IAAI;IAAE;GAAE,GAAG,YAAY,CAAC,GACjWA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,eAAe,GAAGA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW,QAAQ,YAAY,WAAW;IAAI,eAAe,OAAO,SAAS;GAAE,GAAG,IAAI,GAAGA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW,QAAQ,SAAS,WAAW;IAAI,eAAe,OAAO,MAAM;GAAE,GAAG,KAAK,GAAGA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW,QAAQ,SAAS,WAAW;IAAI,eAAe,OAAO,MAAM;GAAE,GAAG,QAAQ,GAAGA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW,QAAQ,aAAa,WAAW;IAAI,eAAe,OAAO,UAAU;GAAE,GAAG,QAAQ,GAAGA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW,QAAQ,WAAW,WAAW;IAAI,eAAe,OAAO,QAAQ;GAAE,GAAG,QAAQ,GAAGA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW,QAAQ,WAAW,WAAW;IAAI,eAAe,OAAO,QAAQ;GAAE,GAAG,KAAK,CAAC,GAC9wB,SAASA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,+BAA+B,GAAG,KAAK,GACxF,MACA,IACF;EACF;;EAGA,SAAS,QAAQ,EAAE,OAAO,OAAO,MAAM,MAAM,MAAM,SAAS;GAC1D,MAAM,SAAS,KAAK,gBAAgBA,MAAAA,QAAM,cAAc,SAAS;IAAE,OAAO,MAAM;IAAM,WAAW,MAAM,KAAK,KAAK,EAAE,OAAO,KAAK;IAAG;GAAY,CAAC;GAC/I,MAAM,SAAS,MAAM,cAAc,UAAUA,MAAAA,QAAM,cAAcA,MAAAA,QAAM,UAAU,MAAMA,MAAAA,QAAM,cAAc,SAAS,MAAM,MAAM,MAAM,WAAW,KAAK,CAAC,GAAGA,MAAAA,QAAM,cAAc,SAAS,MAAM,eAAeA,MAAAA,QAAM,cAAc,YAAY;IAAE,OAAO,MAAM;IAAM,WAAW,MAAM,KAAK,QAAQ,EAAE,OAAO,KAAK;GAAE,CAAC,CAAC,GAAGA,MAAAA,QAAM,cAAc,SAAS,MAAM,YAAY,MAAM,OAAO,EAAE,CAAC,CAAC,IAAIA,MAAAA,QAAM,cAAcA,MAAAA,QAAM,UAAU,MAAMA,MAAAA,QAAM,cAAc,SAAS,MAAM,OAAO,MAAM,OAAO,2BAA2B,CAAC,GAAGA,MAAAA,QAAM,cAAc,SAAS,MAAM,qBAAqBA,MAAAA,QAAM,cAAc,YAAY;IAAE,OAAO,MAAM;IAAS,WAAW,MAAM,KAAK,WAAW,EAAE,OAAO,KAAK;GAAE,CAAC,CAAC,CAAC;GAC5pB,OAAOA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,gBAAgB,GAAGA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,iBAAiB,GAAGA,MAAAA,QAAM,cAAc,MAAM,MAAM,KAAK,GAAGA,MAAAA,QAAM,cAAc,SAAS,MAAM,MAAM,MAAM,cAAc,cAAc,CAAC,GAAGA,MAAAA,QAAM,cAAc,SAAS,MAAM,QAAQA,MAAAA,QAAM,cAAc,UAAU;IAAE,OAAO,MAAM;IAAW,WAAW,MAAM,KAAK,aAAa,EAAE,OAAO,KAAK;GAAE,GAAGA,MAAAA,QAAM,cAAc,UAAU,EAAE,OAAO,QAAQ,GAAG,OAAO,GAAGA,MAAAA,QAAM,cAAc,UAAU,EAAE,OAAO,kBAAkB,GAAG,iBAAiB,CAAC,CAAC,GAAG,QAAQA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,yBAAyB,GAAGA,MAAAA,QAAM,cAAc,UAAU,EAAE,SAAS,MAAM,GAAG,IAAI,GAAGA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAAe,UAAU,SAAS,UAAU,SAAS;IAAgB,SAAS;GAAK,GAAG,OAAO,CAAC,CAAC,CAAC;EAC9yB;;;;;;;;;;;;;;EC5TA,SAAgB,sBAAsB,SAA4C;GAChF,MAAM,OAAO,OAAO,UAA2C,SAAgC;IAC7F,MAAM,UAAU,QAAQ,QAAQ;IAChC,MAAM,SAAS,aAAa,QAAQ,UAAU,QAAQ,SAAS,CAAC;IAChE,IAAI,CAAC,UAAU,CAAC,YAAY,MAAM,GAAG,OAAO,SAAS,KAAK,QAAQ,YAAY,IAAI;IAClF,IAAI;KACF,MAAM,OAAO,KAAK,MAAM,OAAO;IACjC,SAAS,OAAO;KACd,QAAQ,SAAS,WAAW,OAAO,KAAK,iBAAiB,OAAO,KAAK,CAAC;KACtE,IAAI,OAAO,OAAO,UAAU,MAAM,SAAS,KAAK,QAAQ,YAAY,IAAI;UACnE,MAAM;IACb;GACF;GACA,OAAO,YAAY,QAAQ,YAAY,YAAY,IAAa;EAClE;;;;;;EAOA,SAAgB,eAA8F;GAC5G,OAAO;IAAE,IAAI;IAAkB,OAAO;IAAc,UAAU;IAAK,OAAO,SAAS,eAAe,IAAI;GAAE;EAC1G;;;;;;;EAQA,SAAgB,UAAU,OAAwB;GAChD,OAAO,OAAO,UAAU,YAAY,MAAM,KAAK,IAAI,MAAM,KAAK,IAAI;EACpE;;;;;;;;;;;;;;ECxCA,SAAgB,cAAc,OAAO;GACnC,MAAM,YAAY,OAAO,OAAO;GAChC,MAAM,UAAUC,MAAAA,QAAM,cAAc,mBAAmB,OAAO,GAAG,GAAG,CAAC,OAAO,GAAG,CAAC;GAChF,MAAM,gBAAgBA,MAAAA,QAAM,OAAO,KAAK;GAExC,MAAA,QAAM,gBAAgB;IACpB,qBAAqB,IAAI;IACzB,aAAa,qBAAqB,KAAK;GACzC,GAAG,CAAC,CAAC;GAEL,MAAA,QAAM,gBAAgB;IACpB,IAAI,cAAc,SAAS;IAC3B,cAAc,UAAU;IAGxB,MAAM,UADU,oBAAoB,SACd,KAAK;IAC3B,OAAO,cAAc,IAAI,YAAY,oBAAoB,EACvD,QAAQ;KAAE,MAAM,SAAS,QAAQ;KAAM,WAAW,SAAS,cAAc;IAAK,EAChF,CAAC,CAAC;GACJ,GAAG;IAAC,QAAQ;IAAM,QAAQ;IAAW;GAAS,CAAC;GAE/C,OAAOA,MAAAA,QAAM,cAAc,YAAY;IACrC,KAAK;IACL;IACA,QAAQ;IACR,UAAU,OAAO;IACjB,mBAAmB,OAAO;IAC1B,eAAe,OAAO;IACtB,gBAAgB,OAAO;IACvB,eAAe,OAAO;GACxB,CAAC;EACH;;;;EC7BA,MAAM,aAAa;;;;;;;;;EAUnB,SAAgB,UAAU,MAAc,KAAiC;GACvE,MAAM,MAAM,OAAO,IAAI;GACvB,IAAI,MAAM;GACV,IAAI,KAAK;IACP,MAAM,OAAO,OAAO,GAAG,CAAC,CAAC,QAAQ,WAAW,EAAE;IAC9C,MAAM,KAAK,IAAI,QAAQ,OAAO,GAAG;IACjC,MAAM,SAAS,KAAK,QAAQ,OAAO,GAAG;IACtC,IAAI,GAAG,WAAW,SAAS,GAAG,GAAG,MAAM,GAAG,MAAM,OAAO,SAAS,CAAC;SAC5D,IAAI,OAAO,QAAQ,MAAM;GAChC;GACA,MAAM,IAAI,QAAQ,OAAO,GAAG,CAAC,CAAC,QAAQ,SAAS,EAAE;GACjD,IAAI,CAAC,KAAK,MAAM,IAAI,QAAQ,OAAO,GAAG;GACtC,IAAI,iCAAiC,KAAK,GAAG,GAAG,OAAO,MAAM;GAC7D,OAAO,MAAM,KAAK,GAAG,IAAI,KAAK,IAAI,KAAK,IAAI;EAC7C;;;EAIA,SAAgB,QAAQ,MAAc,OAAqC;GACzE,MAAM,OAAO,OAAO,IAAI,CAAC,CAAC,MAAM,OAAO,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI;GAC7D,IAAI,CAAC,SAAS,MAAM,UAAU,MAAM,WAAW,OAAO;GACtD,OAAO,MAAM,cAAc,MAAM,UAC7B,GAAG,KAAK,IAAI,MAAM,cAClB,GAAG,KAAK,IAAI,MAAM,UAAU,GAAG,MAAM;EAC3C;;;EAIA,SAAgB,MAAM,SAAiB,OAAqC;GAC1E,IAAI,CAAC,SAAS,MAAM,UAAU,MAAM,WAAW,OAAO;GACtD,OAAO,MAAM,cAAc,MAAM,UAC7B,GAAG,QAAQ,IAAI,MAAM,cACrB,GAAG,QAAQ,IAAI,MAAM,UAAU,GAAG,MAAM;EAC9C;;EAGA,SAAgB,aACd,MACA,KACA,OACqD;GACrD,MAAM,UAAU,UAAU,MAAM,GAAG;GACnC,OAAO;IACL;IACA,WAAW;KACT,QAAQ;KACR,KAAK,MAAM,SAAS,KAAK;KACzB,OAAO,QAAQ,MAAM,KAAK;KAC1B,YAAY;KACZ,eAAe;IACjB;GACF;EACF;;;;;;;;EA4CA,SAAgB,SAAS,KAAc,WAAsD;GAC3F,IAAI,CAAC,WAAW,OAAO,KAAA;GACvB,IAAI;IACF,MAAM,WAAW,IAAI,IAAI,UAAU;IACnC,MAAM,eAAe,IAAI,IAAI,cAAc;IAC3C,MAAM,OAAO,UAAU,QAAQ,SAAS;IACxC,MAAM,QAAQ,QAAQ,cAAc,OAAO,MAAM,IAAI;IACrD,OAAQ,SAAS,OAAQ,MAAoB,aAAa,aAAc,QAAqB,KAAA;GAC/F,QAAQ;IACN;GACF;EACF;;;EAIA,SAAS,YAAY,OAA0E;GAC7F,IAAI;IACF,MAAM,IAAI,OAAO,OAAO,cAAc;IACtC,IAAI,CAAC,GAAG,OAAO;IACf,OAAO;KAAE,OAAO,OAAO,EAAE,SAAS,EAAE;KAAG,UAAU,OAAO,EAAE,YAAY,CAAC;IAAE;GAC3E,QAAQ;IACN,OAAO;GACT;EACF;;;EAIA,SAAS,MAAM,KAAc,WAAmD;GAC9E,IAAI,CAAC,WAAW,OAAO,KAAA;GACvB,IAAI;IAIF,OAHiB,IAAI,IAAI,UAGX,CAAC,EAAE,MAAM,cAAc,CAAC,EAAE,OAAO,UAAU,EAAE;GAC7D,QAAQ;IACN;GACF;EACF;;;EAIA,SAAS,OAAO,OAAkB,MAAoB;GACpD,IAAI;IACF,MAAM,SAAS,QAAQ,IAAI;GAC7B,QAAQ,CAER;EACF;;;EAIA,SAAS,WAAW,OAAkB,WAAgC,MAA8B;GAClG,IAAI;IACF,OAAO,MAAM,gBAAgB,WAAW,IAAI,MAAM;GACpD,QAAQ;IACN,OAAO;GACT;EACF;;;;;;;EAQA,SAAgB,wBAAwB,KAAiC;GACvE,MAAM,kBAAwD,OAAO,WAAW,MAAM,UAAU;IAC9F,MAAM,QAAQ,SAAS,KAAK,SAAS;IACrC,IAAI,CAAC,OAAO,OAAO;IACnB,MAAM,MAAM,YAAY,KAAK;IAC7B,IAAI,CAAC,KAAK,OAAO;IACjB,MAAM,EAAE,WAAW,YAAY,aAAa,MAAM,MAAM,KAAK,SAAS,GAAG,KAAK;IAG9E,IAAI,CADO,WAAW,OAAO,WAAW;KADV,OAAO,IAAI,MAAM;KAAQ,KAAK,IAAI,MAAM;KAAQ,UAAU,IAAI;IACjD,CACrC,GAAG;KAEP,MAAM,MAAM,IAAI,MAAM,SAAS,KAAK,CAAC,MAAM,KAAK,IAAI,KAAK,IAAI,MAAM;KACnE,MAAM,SAAS,IAAI,QAAQ,MAAM,UAAU,GAAG;KAC9C,OAAO,OAAO,aAAa,OAAO;KAClC,OAAO;IACT;IACA,OAAO,OAAO,aAAa,OAAO;IAClC,OAAO;GACT;GAEA,OAAO,EAAE,gBAAgB;EAC3B;;;;EClMA,SAAS,cAAc,SAAuC,QAAoB,OAA8B;GAC9G,IAAI,CAAC,MAAM,MAAM,OAAO,MAAM,WAAW,YAAY,MAAM,IAAI,UAAU,uBAAuB;GAChG,QAAQ,IAAI,MAAM,IAAI,KAAK;GAC3B,OAAO;EACT;;;;;;EAOA,SAAgB,6BAAmD;GACjE,MAAM,0BAAU,IAAI,IAA6B;GACjD,MAAM,4BAAY,IAAI,IAAgB;GACtC,MAAM,eAAqB;IACzB,KAAK,MAAM,YAAY,WAAW,SAAS;GAC7C;GACA,MAAM,aACJ,CAAC,GAAG,QAAQ,OAAO,CAAC,CAAC,CAAC,MAAM,GAAG,OAAO,EAAE,SAAS,QAAQ,EAAE,SAAS,IAAI;GAC1E,OAAO;IACL,SAAS,OAAoC;KAC3C,cAAc,SAAS,QAAQ,KAAK;KACpC,aAAa;MACX,IAAI,QAAQ,IAAI,MAAM,EAAE,MAAM,OAAO;MACrC,QAAQ,OAAO,MAAM,EAAE;MACvB,OAAO;KACT;IACF;IACA;IACA,UAAU,UAAkC;KAC1C,UAAU,IAAI,QAAQ;KACtB,aAAa,UAAU,OAAO,QAAQ;IACxC;IACA,MAAM,OAAe,QAAQ,IAAI,EAAE;GACrC;EACF;;;;;;;;;;;;;;ECtBA,SAAgB,kBACd,GACA,GACA,eACA,gBACA,WACA,YACc;GACd,MAAM,UAAU,KAAK,IAAI,GAAG,gBAAgB,SAAS;GACrD,MAAM,SAAS,KAAK,IAAI,GAAG,iBAAiB,UAAU;GACtD,OAAO;IACL,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,OAAO,CAAC;IACtC,KAAK,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,MAAM,CAAC;GACtC;EACF;;;;;;;;;EAUA,SAAgB,gBACd,MACA,WACA,WACc;GACd,IAAI,CAAC,QAAQ,KAAK,SAAS,KAAK,KAAK,UAAU,GAC7C,OAAO;IAAE,MAAM;IAAW,KAAK;GAAU;GAE3C,OAAO;IAAE,MAAM,KAAK,QAAQ;IAAG,KAAK,KAAK;GAAI;EAC/C;;;;;;;;;;;EChCA,MAAM,SAAS;EACf,MAAM,SAAS;;;;;;;;EASf,SAAgB,YAAY,OAA6C;GACvE,MAAM,EAAE,GAAG,GAAG,SAAS,YAAY;GACnC,MAAM,UAAUC,MAAAA,QAAM,OAA8B,IAAI;GAExD,MAAA,QAAM,gBAAgB;IACpB,MAAM,SAAS,MAA2B;KACxC,IAAI,EAAE,QAAQ,UAAU,QAAQ;IAClC;IACA,MAAM,iBAAiB,MAA0B;KAC/C,IAAI,EAAE,WAAW,GAAG;KACpB,IAAI,QAAQ,WAAW,QAAQ,QAAQ,SAAS,EAAE,MAAc,GAAG;KACnE,QAAQ;IACV;IACA,MAAM,iBAAiB,MAAwB;KAC7C,IAAI,QAAQ,WAAW,QAAQ,QAAQ,SAAS,EAAE,MAAc,GAC9D,EAAE,eAAe;KAEnB,QAAQ;IACV;IACA,OAAO,iBAAiB,WAAW,OAAO,IAAI;IAC9C,OAAO,iBAAiB,eAAe,eAAe,IAAI;IAC1D,OAAO,iBAAiB,eAAe,eAAe,IAAI;IAC1D,aAAa;KACX,OAAO,oBAAoB,WAAW,OAAO,IAAI;KACjD,OAAO,oBAAoB,eAAe,eAAe,IAAI;KAC7D,OAAO,oBAAoB,eAAe,eAAe,IAAI;IAC/D;GACF,GAAG,CAAC,OAAO,CAAC;GAIZ,MAAM,WAAW,kBAFH,OAAO,SAAS,CAAC,IAAI,IAAI,GACzB,OAAO,SAAS,CAAC,IAAI,IAAI,GAIrC,OAAO,cAAc,KACrB,OAAO,eAAe,KACtB,QACA,MACF;GAEA,MAAM,WAA8B,CAAC;GACrC,KAAK,MAAM,SAAS,SAAS;IAC3B,IAAI,MAAM,WAAW;KACnB,SAAS,KAAKA,MAAAA,QAAM,cAAc,OAAO;MAAE,KAAK,SAAS,MAAM;MAAI,WAAW;KAAmB,CAAC,CAAC;KACnG;IACF;IACA,MAAM,MAAM,uBACP,MAAM,SAAS,yBAAyB,OACxC,MAAM,WAAW,2BAA2B;IACjD,SAAS,KAAKA,MAAAA,QAAM,cAAc,UAAU;KAC1C,KAAK,MAAM;KACX,WAAW;KACX,UAAU,MAAM;KAChB,eAAe;MACb,IAAI,CAAC,MAAM,UAAU;OACnB,MAAM,UAAU;OAChB,QAAQ;MACV;KACF;IACF,GAAG,MAAM,KAAK,CAAC;GACjB;GAEA,MAAM,UAAUA,MAAAA,QAAM,cAAc,OAAO,EAAE,kBAAkB,IAAI,GACjEA,MAAAA,QAAM,cAAc,OAAO;IAAE,WAAW;IAAgB,KAAK;IAAS,OAAO;GAAS,GAAG,GAAG,QAAQ,CAAC;GAEvG,OAAO,OAAO,aAAa,cAAc,WAAA,GAAUC,UAAAA,aAAAA,CAAa,SAAS,SAAS,IAAI;EACxF;;;;EC/DA,SAAS,aAAa,SAAoC,QAAoB,MAA0B;GACtG,IAAI,CAAC,KAAK,MAAM,OAAO,KAAK,QAAQ,cAAc,CAAC,KAAK,OACtD,MAAM,IAAI,UAAU,4BAA4B;GAElD,QAAQ,IAAI,KAAK,IAAI,IAAI;GACzB,OAAO;EACT;;;;;;EAOA,SAAgB,yBAA2C;GACzD,MAAM,0BAAU,IAAI,IAA0B;GAC9C,MAAM,4BAAY,IAAI,IAAgB;GACtC,MAAM,eAAqB;IACzB,KAAK,MAAM,YAAY,WAAW,SAAS;GAC7C;GACA,MAAM,aACJ,CAAC,GAAG,QAAQ,OAAO,CAAC,CAAC,CAAC,MAAM,GAAG,OAAO,EAAE,SAAS,QAAQ,EAAE,SAAS,IAAI;GAC1E,OAAO;IACL,SAAS,MAAgC;KACvC,aAAa,SAAS,QAAQ,IAAI;KAClC,aAAa;MACX,IAAI,QAAQ,IAAI,KAAK,EAAE,MAAM,MAAM;MACnC,QAAQ,OAAO,KAAK,EAAE;MACtB,OAAO;KACT;IACF;IACA;IACA,UAAU,UAAkC;KAC1C,UAAU,IAAI,QAAQ;KACtB,aAAa,UAAU,OAAO,QAAQ;IACxC;IACA,MAAM,OAAe,QAAQ,IAAI,EAAE;GACrC;EACF;;;;;;;;;EAUA,SAAgB,cAAc,UAAwC,QAAwB,KAAiC;GAC7H,IAAI,CAAC,UAAU,OAAO,CAAC;GACvB,MAAM,MAAsB,CAAC;GAC7B,KAAK,MAAM,QAAQ,SAAS,KAAK,GAAG;IAClC,IAAI,OAAO,KAAK,YAAY,cAAc,CAAC,KAAK,QAAQ,QAAQ,GAAG,GAAG;IACtE,IAAI,KAAK,IAAI;GACf;GACA,OAAO;EACT;;;;;;;;;EC3FA,MAAM,aAAa;;;;;;;EAiBnB,SAAgB,kBAAkB,KAA+C;GAC/E,MAAM,IAAI,OAAO,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,OAAO,GAAG,CAAC,CAAC,QAAQ,cAAc,EAAE;GAC/E,IAAI,CAAC,GAAG,OAAO;GACf,MAAM,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC,QAAQ,QAAQ,QAAQ,GAAG;GACrD,IAAI,CAAC,KAAK,QAAQ,OAAO;GACzB,KAAK,MAAM,OAAO,MAChB,IAAI,QAAQ,MAAM,OAAO;GAE3B,OAAO,KAAK,KAAK,GAAG;EACtB;;;;;;;EAQA,SAAgB,iBAAiB,UAA6B;GAC5D,IAAI,CAAC,MAAM,QAAQ,QAAQ,GAAG,OAAO,CAAC;GACtC,MAAM,uBAAO,IAAI,IAAY;GAC7B,MAAM,MAAgB,CAAC;GACvB,KAAK,MAAM,QAAQ,UAAU;IAC3B,MAAM,MAAM,kBAAkB,OAAO,SAAS,WAAW,OAAO,IAAI;IACpE,IAAI,QAAQ,QAAQ,KAAK,IAAI,GAAG,GAAG;IACnC,KAAK,IAAI,GAAG;IACZ,IAAI,KAAK,GAAG;IACZ,IAAI,IAAI,UAAA,KAAwB;GAClC;GACA,OAAO;EACT;;;;;;;EAQA,SAAgB,kBAAkB,MAAiC;GACjE,MAAM,UAAU,KAAK,SAAS,QAAQ,KAAK,SAAS,KAAA,IAChD;IAAE,GAAG;IAAG,UAAU,KAAK;GAAS,IAChC;IAAE,GAAG;IAAG,MAAM,KAAK;IAAM,UAAU,KAAK;GAAS;GACrD,OAAO,KAAK,UAAU,OAAO;EAC/B;;;;;;;EAQA,SAAgB,cAAc,MAA+C;GAC3E,IAAI,CAAC,MAAM,OAAO;GAClB,IAAI;IACF,MAAM,OAAO,KAAK,MAAM,IAAI;IAC5B,IAAI,CAAC,QAAQ,OAAO,SAAS,UAAU,OAAO;IAG9C,OAAO;KAAE,MAFI,OAAO,KAAK,SAAS,YAAY,KAAK,OAAO,KAAK,OAAO;KAEvD,UADE,iBAAiB,KAAK,QACjB;IAAE;GAC1B,SAAS,OAAO;IACd,OAAO;GACT;EACF;;;;;;;EAQA,SAAgB,aAAa,WAA6C;GACxE,IAAI;IACF,OAAO,cAAc,OAAO,aAAa,QAAQ,aAAa,OAAO,SAAS,CAAC,CAAC;GAClF,SAAS,OAAO;IACd,OAAO;GACT;EACF;;;;;;;EAQA,SAAgB,aAAa,WAAmB,MAA+B;GAC7E,IAAI;IACF,OAAO,aAAa,QAAQ,aAAa,OAAO,SAAS,GAAG,kBAAkB,IAAI,CAAC;GACrF,SAAS,OAAO,CAAmB;EACrC;;;;;;;;;;;EC9FA,MAAM,UAAU;EAChB,MAAM,mBAAmB;;;;;EAMzB,SAAgB,aAAa,OAAO;GAClC,MAAM,MAAM,OAAO;GACnB,MAAM,YAAY,KAAK;GACvB,MAAM,WAAW,KAAK;GACtB,MAAM,aAAa,KAAK,cAAc;GACtC,MAAM,gBAAgB,KAAK,iBAAiB,CAAC;GAC7C,MAAM,CAAC,MAAM,WAAWC,MAAAA,QAAM,SAAS,IAAI;GAC3C,MAAM,CAAC,MAAM,WAAWA,MAAAA,QAAM,SAAS,CAAC,CAAC;GACzC,MAAM,CAAC,UAAU,eAAeA,MAAAA,QAAM,SAAS,CAAC,CAAC;GACjD,MAAM,CAAC,SAAS,cAAcA,MAAAA,QAAM,SAAS,CAAC,CAAC;GAC/C,MAAM,CAAC,OAAO,YAAYA,MAAAA,QAAM,SAAS,IAAI;GAC7C,MAAM,CAAC,MAAM,WAAWA,MAAAA,QAAM,SAAS,IAAI;GAC3C,MAAM,YAAYA,MAAAA,QAAM,OAAO,CAAC,CAAC;GAEjC,MAAM,cAAcA,MAAAA,QAAM,OAAO,CAAC,CAAC;GACnC,YAAY,UAAU;GAEtB,MAAM,eAAeA,MAAAA,QAAM,OAAO,IAAI;GAEtC,MAAM,WAAW,QAAQ;IACvB,MAAM,SAAS,UAAU,QAAQ,QAAQ,KAAK;IAC9C,UAAU,QAAQ,OAAO;IACzB,YAAY,SAAS,OAAO,OAAO,CAAC,GAAG,MAAM,GAAG,MAAM,KAAK,CAAC,CAAC;IAC7D,SAAS,IAAI;IACb,IAAI,gBAAgB;KAAE;KAAW,MAAM;IAAI,CAAC,CAAC,CAAC,MAAM,QAAQ;KAC1D,IAAI,UAAU,QAAQ,SAAS,OAAO;KACtC,IAAI,OAAO,IAAI,MAAM,MAAM,QAAQ,IAAI,OAAO,GAAG;MAC/C,SAAS,SAAS,OAAO,OAAO,CAAC,GAAG,MAAM,GAAG,MAAM,IAAI,QAAQ,CAAC,CAAC;MACjE,IAAI,IAAI,QAAQ,CAAC,MAAM,QAAQ,IAAI,IAAI;KACzC,OACE,SAAS,KAAK,QAAQ,OAAO,IAAI,KAAK,IAAI,QAAQ;IAEtD,CAAC,CAAC,CAAC,OAAO,MAAM;KACd,IAAI,UAAU,QAAQ,SAAS,OAAO;KACtC,SAAS,YAAY,OAAO,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC,cAAc;KACf,IAAI,UAAU,QAAQ,SAAS,OAAO;KACtC,YAAY,SAAS;MACnB,MAAM,OAAO,OAAO,OAAO,CAAC,GAAG,IAAI;MACnC,OAAO,KAAK;MACZ,OAAO;KACT,CAAC;IACH,CAAC;GACH;GAEA,MAAM,UAAU,QAAQ;IACtB,IAAI,SAAS,SAAS,MAAM;KAC1B,aAAa,SAAS,OAAO,OAAO,CAAC,GAAG,MAAM,GAAG,MAAM,MAAM,CAAC,CAAC;KAC/D;IACF;IACA,IAAI,CAAC,KAAK,MAAM,QAAa,GAAG;IAChC,aAAa,SAAS,OAAO,OAAO,CAAC,GAAG,MAAM,GAAG,MAAM,KAAK,CAAC,CAAC;GAChE;GAEA,MAAM,gBAAgB;IACpB,MAAM,OAAO,OAAO,KAAK,YAAY,OAAO,CAAC,CAAC,QAAQ,MAAM,YAAY,QAAQ,OAAO,IAAI;IAC3F,UAAU,UAAU,CAAC;IACrB,QAAQ,IAAI;IACZ,QAAQ,CAAC,CAAC;IACV,WAAW,CAAC,CAAC;IACb,SAAS,IAAI;IACb,IAAI,KAAK,QAAQ;KACf,MAAM,OAAO,CAAC;KACd,KAAK,MAAM,OAAO,MAAM,KAAK,OAAO;KACpC,YAAY,IAAI;KAChB,KAAK,MAAM,OAAO,MAAM,QAAa,GAAG;IAC1C,OACE,YAAY,CAAC,CAAC;IAEhB,QAAa,EAAE;GACjB;GAEA,MAAA,QAAM,gBAAgB;IACpB,UAAU,UAAU,CAAC;IACrB,QAAQ,CAAC,CAAC;IACV,YAAY,CAAC,CAAC;IACd,WAAW,CAAC,CAAC;IACb,SAAS,IAAI;IACb,QAAQ,IAAI;IACZ,QAAQ,IAAI;IAEZ,MAAM,SAAS,YAAY,aAAa,SAAS,IAAI;IACrD,MAAM,WAAW,QAAQ,YAAY,CAAC;IACtC,IAAI,QAAQ,MAAM,QAAQ,OAAO,IAAI;IACrC,IAAI,SAAS,QAAQ;KACnB,MAAM,OAAO,CAAC;KACd,KAAK,MAAM,OAAO,UAAU,KAAK,OAAO;KACxC,YAAY,IAAI;IAClB;IACA,QAAa,EAAE;IACf,KAAK,MAAM,OAAO,UAChB,IAAI,KAAK,QAAa,GAAG;GAG7B,GAAG,CAAC,SAAS,CAAC;GAGd,MAAA,QAAM,gBAAgB;IACpB,IAAI,aAAa,SAAS;KAAE,aAAa,aAAa,OAAO;KAAG,aAAa,UAAU;IAAK;IAC5F,IAAI,CAAC,WAAW;IAChB,aAAa,UAAU,iBAAiB;KACtC,aAAa,UAAU;KACvB,MAAM,eAAe,OAAO,KAAK,QAAQ,CAAC,CAAC,QAAQ,MAAM,SAAS,OAAO,IAAI;KAC7E,aAAa,WAAW;MAAE;MAAM,UAAU;KAAa,CAAC;IAC1D,GAAG,gBAAgB;IACnB,aAAa;KACX,IAAI,aAAa,SAAS;MAAE,aAAa,aAAa,OAAO;MAAG,aAAa,UAAU;KAAK;IAC9F;GACF,GAAG;IAAC;IAAU;IAAM;GAAS,CAAC;GAE9B,MAAA,QAAM,gBAAgB;IACpB,MAAM,kBAAkB,QAAQ;IAChC,OAAO,iBAAiB,gBAAgB,SAAS;IACjD,aAAa,OAAO,oBAAoB,gBAAgB,SAAS;GAEnE,GAAG,CAAC,CAAC;GAEL,MAAM,WAAW,OAAO,OAAO,IAAI,CAAC,CAAC,MAAM,OAAO,CAAC,CAAC,IAAI,KAAK,OAAO;GAEpE,MAAM,SAAS,GAAG,OAAO,OAAO,WAAW;IACzC,MAAM,UAAU,QAAQ,IAAK,cAAc,EAAE,SAAS;IACtD,MAAM,SAAS,CAAC,SAAS,EAAE,SAAS;IACpC,MAAM,gBAAgB,QAAQ,QAAQ,YAAY,UAAU,KAAK,OAAO,SAAS,EAAE,IAAI;IACvF,MAAM,MAAM,EAAE,SAAS;IACvB,OAAOA,MAAAA,QAAM,cAAc,OAAO;KAChC,KAAK,EAAE;KACP,WAAW,mBACN,SAAS,sBAAsB,OAC/B,gBAAgB,uBAAuB;KAC5C,OAAO,EAAE;KACT,OAAO,EAAE,aAAa,IAAI,QAAQ,GAAG;KACrC,eAAe;MAAE,IAAI,OAAO,OAAO,EAAE,IAAI;WAAQ,SAAS,EAAE,IAAI;KAAE;KAClE,gBAAgB,OAAO;MACrB,GAAG,eAAe;MAClB,GAAG,gBAAgB;MACnB,MAAM,OAAO,GAAG,eAAe,wBAAwB;MACvD,MAAM,WAAW,gBAAgB,MAAM,GAAG,SAAS,GAAG,OAAO;MAC7D,QAAQ;OAAE,GAAG,SAAS;OAAM,GAAG,SAAS;OAAK,QAAQ;QAAE,MAAM,EAAE;QAAM,MAAM,EAAE;OAAK;MAAE,CAAC;KACvF;IACF,GACEA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,iBAAiB,GACxD,QAAS,SAAS,MAAM,MAAO,EAAE,GACnCA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,oBAAoB,MAAM,mBAAmB,IAAI,GACxF,QAAS,SAAS,OAAO,OAAQ,MAAM,KAAK,EAAE,IAAI,GACnD,UAAU,IACPA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,kBAAkB,GAAG,OAAO,OAAO,CAAC,IAC7E,IAAK;GACb;GAEA,MAAM,UAAU,KAAK,UAAU;IAC7B,MAAM,UAAU,KAAK;IACrB,IAAI,CAAC,SACH,OAAO,CAACA,MAAAA,QAAM,cAAc,OAAO;KAAE,KAAK,MAAM;KAAY,WAAW;KAAqB,OAAO,EAAE,aAAa,IAAI,QAAQ,GAAG;IAAE,GACjI,QAAQ,OAAO,SAAS,MAAM,CAAC;IAEnC,MAAM,OAAO,CAAC;IACd,MAAM,MAAM,QAAQ;IACpB,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,KAAK;KAC5B,MAAM,IAAI,QAAQ;KAClB,MAAM,QAAQ,EAAE,SAAS;KACzB,MAAM,SAAS,SAAS,EAAE,UAAU;KACpC,KAAK,KAAK,MAAM,GAAG,OAAO,OAAO,MAAM,CAAC;KACxC,IAAI,SAAS,QAAQ,KAAK,KAAK,GAAG,OAAO,EAAE,MAAM,QAAQ,CAAC,CAAC;IAC7D;IACA,IAAI,OAAO,SACT,KAAK,KAAKA,MAAAA,QAAM,cAAc,OAAO;KAAE,KAAK,MAAM;KAAQ,WAAW;KAAqB,OAAO,EAAE,aAAa,IAAI,QAAQ,GAAG;IAAE,GAC/H,oBAA+B,CAAC;IAEpC,OAAO;GACT;GAGA,MAAM,kBAAkB,OAAO;IAC7B,GAAG,eAAe;IAClB,GAAG,gBAAgB;IACnB,IAAI,CAAC,GAAG,cAAc,SAAS,GAAG,MAAM,GAAG;IAC3C,QAAQ;KAAE,GAAG,GAAG;KAAS,GAAG,GAAG;KAAS,QAAQ;MAAE,MAAM;MAAI,MAAM;KAAY;IAAE,CAAC;GACnF;GAEA,MAAM,cAAc,OAChB,cAAc,KAAK,eAAe,KAAK,QAAQ,GAAG,CAAC,CAAC,KAAK,UAAU;IACjE,IAAI,KAAK;IACT,OAAO,KAAK;IACZ,QAAQ,KAAK;IACb,UAAU,KAAK;IACf,WAAW,KAAK;IAChB,eAAe,KAAK,IAAI,KAAK,QAAQ,GAAG;GAC1C,EAAE,IACF,CAAC;GAEL,OAAOA,MAAAA,QAAM,cAAc,OAAO;IAAE,WAAW;IAAmB,eAAe;GAAe,GAC9FA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,iBAAiB,GACvDA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,kBAAkB,GAAG,OAAO,GACrEA,MAAAA,QAAM,cAAc,QAAQ;IAAE,WAAW;IAAkB,OAAO,QAAQ;GAAG,GAAG,QAAQ,GACxFA,MAAAA,QAAM,cAAc,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,GAClDA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAAiB,OAAO;IAAS,SAAS;GAAQ,GAAG,GAAG,CAAC,GACtGA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,YAAY,GACjD,QACGA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,kBAAkB,GACxDA,MAAAA,QAAM,cAAc,QAAQ,MAAM,OAAO,KAAK,CAAC,GAC/CA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAAiB,eAAe,QAAQ;GAAE,GAAG,IAAI,CAAC,IAC/F,MACJ,OAAO,IAAI,CAAC,CAAC,GACd,QAAQ,YAAY,SACjBA,MAAAA,QAAM,cAAc,aAAa;IAAE,GAAG,KAAK;IAAG,GAAG,KAAK;IAAG,SAAS;IAAa,eAAe,QAAQ,IAAI;GAAE,CAAC,IAC7G,IAAK;EACb;;;;;;;;;;;ECzNA,MAAM,cAAc;EACpB,MAAM,sBAAsB;;;;;;EAO5B,SAAgB,WAAW,MAAM;GAC/B,OAAO,OAAO,QAAQ,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,OAAO;EAChF;;;;;;;;EASA,SAAS,SAAS,MAAM,OAAO,KAAK;GAClC,MAAM,IAAI,KAAK,IAAI,IAAI,QAAQ,KAAK,CAAC;GACrC,MAAM,IAAI,KAAK,IAAI,GAAG,MAAM,CAAC;GAC7B,OAAO;IAAE,QAAQ,OAAO,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;IAAG,KAAK,OAAO,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;IAAG,OAAO,OAAO,IAAI,CAAC,CAAC,MAAM,CAAC;GAAE;EACzG;;;;;EAMA,SAAgB,YAAY,OAAO;GACjC,MAAM,MAAM,OAAO;GACnB,MAAM,YAAY,KAAK;GACvB,MAAM,aAAa,KAAK,qBAAqB,CAAC;GAC9C,MAAM,aAAa,KAAK,cAAc;GACtC,MAAM,CAAC,OAAO,YAAYC,MAAAA,QAAM,SAAS,EAAE;GAC3C,MAAM,CAAC,WAAW,gBAAgBA,MAAAA,QAAM,SAAS,KAAK;GACtD,MAAM,CAAC,WAAW,gBAAgBA,MAAAA,QAAM,SAAS,KAAK;GACtD,MAAM,CAAC,OAAO,YAAYA,MAAAA,QAAM,SAAS,KAAK;GAC9C,MAAM,CAAC,aAAa,kBAAkBA,MAAAA,QAAM,SAAS,EAAE;GACvD,MAAM,CAAC,aAAa,kBAAkBA,MAAAA,QAAM,SAAS,EAAE;GACvD,MAAM,CAAC,YAAY,iBAAiBA,MAAAA,QAAM,SAAS,KAAK;GACxD,MAAM,CAAC,WAAW,gBAAgBA,MAAAA,QAAM,SAAS,KAAK;GACtD,MAAM,CAAC,aAAa,kBAAkBA,MAAAA,QAAM,SAAS,KAAK;GAC1D,MAAM,CAAC,QAAQ,aAAaA,MAAAA,QAAM,SAAS,MAAM;GACjD,MAAM,CAAC,OAAO,YAAYA,MAAAA,QAAM,SAAS,EAAE;GAC3C,MAAM,CAAC,SAAS,cAAcA,MAAAA,QAAM,SAAS,IAAI;GACjD,MAAM,CAAC,WAAW,gBAAgBA,MAAAA,QAAM,SAAS,KAAK;GACtD,MAAM,CAAC,WAAW,gBAAgBA,MAAAA,QAAM,SAAS,CAAC,CAAC;GACnD,MAAM,SAASA,MAAAA,QAAM,OAAO,CAAC;GAC7B,MAAM,WAAWA,MAAAA,QAAM,OAAO,IAAI;GAClC,MAAM,WAAWA,MAAAA,QAAM,OAAO,IAAI;GAClC,MAAM,WAAWA,MAAAA,QAAM,OAAO,EAAE;GAChC,SAAS,UAAU;GACnB,MAAM,gBAAgBA,MAAAA,QAAM,OAAO,UAAU;GAC7C,cAAc,UAAU;GAExB,MAAM,aAAaA,MAAAA,QAAM,OAAO;IAAE;IAAW;IAAW;IAAO,SAAS,CAAC;IAAG,SAAS,CAAC;GAAE,CAAC;GACzF,WAAW,UAAU;IACnB;IAAW;IAAW;IACtB,SAAS,aAAc,aAAa,CAAC,UAAU,IAAI,CAAC,IAAK,WAAW,WAAW;IAC/E,SAAS,YAAY,WAAW,WAAW,IAAI,CAAC;GAClD;GAGA,MAAA,QAAM,gBAAgB;IACpB,IAAI,CAAC,WAAW;IAChB,IAAI;KACF,MAAM,QAAQ,KAAK,MAAM,aAAa,QAAQ,oBAAoB,OAAO,SAAS,CAAC,KAAK,MAAM;KAC9F,IAAI,SAAS,OAAO,UAAU,UAAU;MACtC,IAAI,OAAO,MAAM,UAAU,UAAU,SAAS,MAAM,KAAK;MACzD,IAAI,OAAO,MAAM,cAAc,WAAW,aAAa,MAAM,SAAS;MACtE,IAAI,OAAO,MAAM,cAAc,WAAW,aAAa,MAAM,SAAS;MACtE,IAAI,OAAO,MAAM,UAAU,WAAW,SAAS,MAAM,KAAK;MAC1D,IAAI,OAAO,MAAM,gBAAgB,UAAU,eAAe,MAAM,WAAW;MAC3E,IAAI,OAAO,MAAM,gBAAgB,UAAU,eAAe,MAAM,WAAW;MAC3E,IAAI,OAAO,MAAM,eAAe,WAAW,cAAc,MAAM,UAAU;MACzE,IAAI,OAAO,MAAM,cAAc,WAAW,aAAa,MAAM,SAAS;MACtE,IAAI,OAAO,MAAM,gBAAgB,WAAW,eAAe,MAAM,WAAW;KAC9E;IACF,SAAS,GAAG,CAAa;GAC3B,GAAG,CAAC,SAAS,CAAC;GAGd,MAAA,QAAM,gBAAgB;IACpB,IAAI,CAAC,WAAW;IAChB,IAAI;KACF,aAAa,QAAQ,oBAAoB,OAAO,SAAS,GAAG,KAAK,UAAU;MACzE;MAAO;MAAW;MAAW;MAAO;MAAa;MAAa;MAAY;MAAW;KACvF,CAAC,CAAC;IACJ,SAAS,GAAG,CAAW;GACzB,GAAG;IAAC;IAAW;IAAO;IAAW;IAAW;IAAO;IAAa;IAAa;IAAY;IAAW;GAAW,CAAC;;;;;GAMhH,MAAM,aAAa,SAAS;IAC1B,MAAM,IAAI,EAAE,OAAO;IACnB,MAAM,QAAQ,OAAO,QAAQ,EAAE,CAAC,CAAC,KAAK;IACtC,IAAI,MAAM,SAAS,GAAG;KAAE,WAAW,IAAI;KAAG,UAAU,MAAM;KAAG;IAAO;IACpE,MAAM,MAAM,WAAW;IACvB,UAAU,WAAW;IACrB,SAAS,EAAE;IACX,IAAI,sBAAsB;KACxB;KAAW,OAAO;KAClB,WAAW,IAAI;KAAW,WAAW,IAAI;KAAW,OAAO,IAAI;KAC/D,SAAS,IAAI;KAAS,SAAS,IAAI;IACrC,CAAC,CAAC,CAAC,MAAM,QAAQ;KACf,IAAI,MAAM,OAAO,SAAS;KAC1B,IAAI,OAAO,IAAI,IAAI;MACjB,WAAW,MAAM,QAAQ,IAAI,OAAO,IAAI,IAAI,UAAU,CAAC,CAAC;MACxD,aAAa,IAAI,cAAc,IAAI;MACnC,UAAU,MAAM;KAClB,OAAO;MACL,SAAS,KAAK,QAAQ,OAAO,IAAI,KAAK,IAAI,MAAM;MAChD,WAAW,IAAI;MACf,UAAU,OAAO;KACnB;IACF,CAAC,CAAC,CAAC,OAAO,MAAM;KACd,IAAI,MAAM,OAAO,SAAS;KAC1B,SAAS,UAAU,OAAO,CAAC,CAAC;KAC5B,WAAW,IAAI;KACf,UAAU,OAAO;IACnB,CAAC;GACH;;;;;GAMA,MAAM,YAAY,UAAU;IAC1B,SAAS,KAAK;IACd,IAAI,SAAS,SAAS,aAAa,SAAS,OAAO;IACnD,SAAS,UAAU,iBAAiB,UAAU,KAAK,GAAG,WAAW;GACnE;;;;;;GAOA,MAAM,qBAAqB,QAAQ,UAAU;IAC3C,OAAO,KAAK;IACZ,IAAI,SAAS,SAAS,aAAa,SAAS,OAAO;IACnD,SAAS,UAAU,iBAAiB,UAAU,SAAS,OAAO,GAAG,WAAW;GAC9E;;;;;GAMA,MAAM,SAAS,SAAS;IACtB,WAAW,UAAU,OAAO,OAAO,CAAC,GAAG,WAAW,SAAS,IAAI;IAC/D,IAAI,SAAS,SAAS,aAAa,SAAS,OAAO;IACnD,IAAI,OAAO,SAAS,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,GAAG,UAAU,SAAS,OAAO;GAC7E;;GAGA,MAAM,aAAa,KAAK,UAAU;IAChC,IAAI,QAAQ,aAAa,aAAa,KAAK;IAC3C,IAAI,QAAQ,aAAa,aAAa,KAAK;IAC3C,IAAI,QAAQ,SAAS,SAAS,KAAK;IACnC,IAAI,QAAQ,cAAc,cAAc,KAAK;IAC7C,IAAI,QAAQ,aAAa,aAAa,KAAK;IAC3C,MAAM,OAAO;KAAE;KAAW;KAAW;KAAO;KAAY;IAAU;IAClE,KAAK,OAAO;IACZ,MAAM;KACJ,WAAW,KAAK;KAAW,WAAW,KAAK;KAAW,OAAO,KAAK;KAClE,SAAS,KAAK,aAAc,cAAc,UAAU,CAAC,cAAc,OAAO,IAAI,CAAC,IAAK,WAAW,WAAW;KAC1G,SAAS,KAAK,YAAY,WAAW,WAAW,IAAI,CAAC;IACvD,CAAC;GACH;GAGA,MAAA,QAAM,gBAAgB;IACpB,MAAM,gBAAgB,SAAS,SAAS,QAAQ;IAChD,OAAO,iBAAiB,qBAAqB,OAAO;IACpD,aAAa,OAAO,oBAAoB,qBAAqB,OAAO;GACtE,GAAG,CAAC,CAAC;GAGL,MAAM,SAASA,MAAAA,QAAM,cAAc;IACjC,IAAI,CAAC,MAAM,QAAQ,OAAO,GAAG,OAAO,CAAC;IACrC,MAAM,sBAAM,IAAI,IAAI;IACpB,KAAK,MAAM,KAAK,SAAS;KACvB,IAAI,OAAO,IAAI,IAAI,EAAE,IAAI;KACzB,IAAI,CAAC,MAAM;MAAE,OAAO,CAAC;MAAG,IAAI,IAAI,EAAE,MAAM,IAAI;KAAE;KAC9C,KAAK,KAAK,CAAC;IACb;IACA,OAAO,CAAC,GAAG,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,WAAW;KAAE;KAAM,OAAO,KAAK;KAAQ,SAAS;IAAK,EAAE;GAC/F,GAAG,CAAC,OAAO,CAAC;GAEZ,MAAM,aAAa,OAAO;GAC1B,MAAM,eAAe,MAAM,QAAQ,OAAO,IAAI,QAAQ,SAAS;GAC/D,MAAM,eAAe,SAAS,cAAc,SAAS,OAAO,OAAO,CAAC,GAAG,MAAM,GAAG,OAAO,KAAK,UAAU,OAAO,QAAQ,KAAK,CAAC,CAAC;GAE5H,MAAM,UAAUA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,mBAAmB,GACzEA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW,qBAAqB,YAAY,QAAQ;IAAK,OAAO;IAAS,gBAAgB;IAAW,eAAe,UAAU,aAAa,CAAC,SAAS;GAAE,GAAG,IAAI,GAC7LA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW,qBAAqB,YAAY,QAAQ;IAAK,OAAO;IAAQ,gBAAgB;IAAW,eAAe,UAAU,aAAa,CAAC,SAAS;GAAE,GAAG,IAAI,GAC5LA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW,qBAAqB,QAAQ,QAAQ;IAAK,OAAO;IAAW,gBAAgB;IAAO,eAAe,UAAU,SAAS,CAAC,KAAK;GAAE,GAAG,IAAI,GAC/KA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,qBAAqB,CAAC,GAC/DA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW,qBAAqB,cAAc,QAAQ;IAAK,OAAO,cAAc,WAAW;IAAe,gBAAgB;IAAa,eAAe,gBAAgB,MAAM,CAAC,CAAC;GAAE,GAAG,GAAG,CAAC;GAEzN,MAAM,aAAa,cACfA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,mBAAmB,GACzDA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,kBAAkB,GACxDA,MAAAA,QAAM,cAAc,SAAS;IAC3B,WAAW,uBAAuB,aAAa,SAAS;IAAK,aAAa;IAC1E,OAAO;IAAa,UAAU;IAC9B,OAAO,aAAa,uBAAuB;IAC3C,WAAW,MAAM,kBAAkB,gBAAgB,EAAE,OAAO,KAAK;GACnE,CAAC,GACDA,MAAAA,QAAM,cAAc,UAAU;IAC5B,WAAW,wBAAwB,aAAa,QAAQ;IAAK,OAAO,aAAa,iBAAiB;IAClG,gBAAgB;IAAY,UAAU,CAAC;IACvC,eAAe,UAAU,cAAc,CAAC,UAAU;GACpD,GAAG,IAAI,CAAC,GACVA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,kBAAkB,GACxDA,MAAAA,QAAM,cAAc,SAAS;IAC3B,WAAW,uBAAuB,YAAY,KAAK;IAAS,aAAa;IACzE,OAAO;IAAa,UAAU,CAAC;IAC/B,OAAO,YAAY,KAAK;IACxB,WAAW,MAAM,kBAAkB,gBAAgB,EAAE,OAAO,KAAK;GACnE,CAAC,GACDA,MAAAA,QAAM,cAAc,UAAU;IAC5B,WAAW,wBAAwB,YAAY,QAAQ;IAAK,OAAO;IACnE,gBAAgB;IAChB,eAAe,UAAU,aAAa,CAAC,SAAS;GAClD,GAAG,GAAG,CAAC,CAAC,IACZ;GAEJ,MAAM,UAAU,WAAW,SACvBA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,sBAAsB,GAC5D,aAAa,IACT,aAAa,YAAY,eAAe,UAAU,YAAY,UAAU,MACxE,OAAO,IACb;GAEJ,MAAM,cAAc;IAClB,IAAI,WAAW,aAAa,OAAOA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,oBAAoB,GAAG,MAAM;IACxG,IAAI,WAAW,SAAS,OAAOA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,oBAAoB,GAAG,KAAK;IACnG,IAAI,WAAW,UAAU,CAAC,OAAO,QAAQ,OAAOA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,oBAAoB,GAAG,OAAO;IACtH,IAAI,WAAW,QAAQ,OAAOA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,oBAAoB,GAAG,gBAAgB;IAC7G,OAAOA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,sBAAsB,GACnE,OAAO,KAAK,UAAU;KACpB,MAAM,OAAO,UAAU,MAAM,UAAU;KACvC,OAAOA,MAAAA,QAAM,cAAc,OAAO;MAAE,KAAK,MAAM;MAAM,WAAW;KAAoB,GAClFA,MAAAA,QAAM,cAAc,OAAO;MAAE,WAAW;MAAoB,OAAO,MAAM;MAAM,eAAe,YAAY,MAAM,IAAI;KAAE,GACpHA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,mBAAmB,GAAG,OAAO,MAAM,GAAG,GAC/EA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,oBAAoB,GAAG,OAAO,MAAM,IAAI,CAAC,CAAC,MAAM,OAAO,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,GACrHA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,mBAAmB,GAAG,OAAO,MAAM,IAAI,CAAC,CAAC,MAAM,OAAO,CAAC,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,GACvHA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,qBAAqB,GAAG,MAAM,KAAK,CAAC,GAC/E,OAAO,MAAM,QAAQ,KAAK,GAAG,MAAM;MACjC,MAAM,QAAQ,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS;MACzD,OAAOA,MAAAA,QAAM,cAAc,OAAO;OAAE,KAAK,EAAE,OAAO,MAAM,EAAE,OAAO,MAAM;OAAG,WAAW,sBAAsB,IAAI,IAAI,SAAS;OAAK,OAAO,MAAM,OAAO,MAAM,EAAE;OAAM,eAAe,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW;MAAE,GAC1NA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,iBAAiB,GAAG,EAAE,IAAI,GACnEA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,mBAAmB,GAC1DA,MAAAA,QAAM,cAAc,QAAQ,MAAM,MAAM,MAAM,GAC9CA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,kBAAkB,GAAG,MAAM,GAAG,GACvEA,MAAAA,QAAM,cAAc,QAAQ,MAAM,MAAM,KAAK,CAAC,CAAC;KACrD,CAAC,IAAI,IAAI;IACb,CAAC,CAAC;GACN,EAAA,CAAG;GAEH,OAAOA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,oBAAoB,GACjEA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,mBAAmB,GACzDA,MAAAA,QAAM,cAAc,SAAS;IAC3B,KAAK;IAAU,WAAW;IAAqB,WAAW;IAAM,cAAc;IAAO,YAAY;IACjG,aAAa;IACb,OAAO;IACP,WAAW,MAAM,SAAS,EAAE,OAAO,KAAK;IACxC,YAAY,MAAM;KAChB,IAAI,EAAE,QAAQ,SAAS;MAAE,IAAI,SAAS,SAAS,aAAa,SAAS,OAAO;MAAG,UAAU,SAAS,OAAO;KAAE;KAC3G,IAAI,EAAE,QAAQ,UAAU,SAAS,SAAS,OAAO;IACnD;GACF,CAAC,CAAC,GACJ,SACA,YACA,SACA,IAAI;EACR;;;;;;;;;;;;ECtRA,SAAgB,kBAAmC;GACjD,OAAO;IACL,IAAI;IACJ,OAAO;IACP,MAAM;IACN,OAAO;IACP,QAAQ,QAAqB,IAAI,OAAO,IAAI,IAAI,aAAa,IAAI,IAAI,IAAI,aAAa;IACtF,SAAS,QAAoBC,MAAAA,QAAM,cAAc,cAAc,EAAE,IAAI,CAAC;GACxE;EACF;;;;;;EAOA,SAAgB,oBAAqC;GACnD,OAAO;IACL,IAAI;IACJ,OAAO;IACP,MAAM;IACN,OAAO;IACP,SAAS,QAAoBA,MAAAA,QAAM,cAAc,aAAa,EAAE,IAAI,CAAC;GACvE;EACF;;;;;;;;;;;;;;ECzBA,SAAgB,6BAA6C;GAC3D,OAAO,CACL;IACE,IAAI;IACJ,OAAO;IACP,OAAO;IACP,MAAM,QAAQ,QAAQ;KACpB,iBAAsB,IAAI,WAAW,OAAO,IAAI,CAAC,CAAC,MAAM,YAAY;MAClE,IAAI,SAAS,QAAQ,KAAK,eAAe,WAAW,QAAQ,SAAS,OAAO;KAC9E,CAAC;IACH;GACF,CACF;EACF;;;;ECjBA,MAAa,KAAK;GAChB,MAAM;GAAG,QAAQ;GAAG,WAAW;GAAG,SAAS;GAAG,OAAO;GAAG,QAAQ;GAChE,UAAU;GAAG,OAAO;GAAG,aAAa;GAAG,MAAM;GAAG,WAAW;GAC3D,UAAU;GAAI,UAAU;GAAI,UAAU;GAAI,QAAQ;GAAI,QAAQ;GAC9D,SAAS;GAAI,OAAO;GAAI,QAAQ;GAAI,KAAK;GAAI,MAAM;GAAI,YAAY;GACnE,QAAQ;GAAI,OAAO;GAAI,UAAU;GAAI,eAAe;EACtD;;EAGA,MAAM,2BAAW,IAAI,IAAI;GACvB;GAAM;GAAO;GAAS;GAAU;GAAS;GAAW;GAAS;GAAQ;GACrE;GAAS;GAAU;GAAO;GAAM;GAAM;GAAM;GAAQ;GAAQ;GAAQ;GACpE;GAAS;GAAU;GAAc;GAAQ;GAAW;GAAO;GAAW;EACxE,CAAC;;EAGD,MAAM,kBAA0C;GAC9C,OAAO,GAAG;GAAO,QAAQ,GAAG;GAAQ,WAAW,GAAG;GAAW,MAAM,GAAG;GACtE,WAAW,GAAG;GAAW,QAAQ,GAAG;GAAQ,OAAO,GAAG;GAAW,QAAQ,GAAG;EAC9E;;EAGA,SAAS,YAAY,SAA0B,UAAwB;GACrE,MAAM,QAAyB,CAAC;GAChC,MAAM,WAAW,SAAgC;IAC/C,KAAK,MAAM,KAAK,MAAM;KACpB,MAAM,KAAK,CAAC;KACZ,IAAI,EAAE,YAAY,EAAE,SAAS,QAAQ,QAAQ,EAAE,QAAQ;IACzD;GACF;GACA,QAAQ,OAAO;GACf,KAAK,IAAI,IAAI,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK;IAC1C,MAAM,IAAI,MAAM;IAChB,MAAM,OAAO,EAAE,YAAY,CAAC;IAC5B,IAAI,KAAK,QACP,EAAE,UAAU,KAAK,IAAI,EAAE,WAAW,KAAK,KAAK,SAAS,EAAE,CAAC,OAAO;SAC1D;KACL,MAAM,OAAO,MAAM,IAAI;KACvB,MAAM,MAAM,OAAO,KAAK,IAAI,EAAE,WAAW,KAAK,YAAY,CAAC,IAAI;KAC/D,EAAE,UAAU,KAAK,IAAI,EAAE,WAAW,KAAK,IAAI,KAAK,QAAQ,CAAC;IAC3D;GACF;EACF;;EAGA,SAAS,GAAG,WAAmB,MAAc,MAAc,KAA4B;GACrF,MAAM,SAAS,IAAI,KAAK,CAAC,CAAC,QAAQ,QAAQ,GAAG,CAAC,CAAC,MAAM,GAAG,EAAE;GAC1D,MAAM,OAAO,YAAY;GACzB,MAAM,MAAqB;IAAE;IAAM;IAAM,WAAW;IAAM,SAAS;IAAM,YAAY;GAAK;GAC1F,IAAI,UAAU,WAAW,MAAM,IAAI,SAAS;GAC5C,OAAO;EACT;;EAGA,SAAS,cAAc,MAA+B;GACpD,MAAM,QAAyB,CAAC;GAChC,MAAM,QAAuD,CAAC;GAC9D,MAAM,QAAQ,KAAK,MAAM,IAAI;GAC7B,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;IACrC,MAAM,IAAI,8BAA8B,KAAK,MAAM,EAAE;IACrD,IAAI,CAAC,GAAG;IACR,MAAM,OAAsB;KAC1B,MAAM,EAAE,EAAE,CAAC,KAAK;KAAG,MAAM,GAAG;KAC5B,WAAW,IAAI;KAAG,SAAS,IAAI;KAAG,YAAY,IAAI;KAAG,UAAU,CAAC;IAClE;IACA,OAAO,MAAM,UAAU,MAAM,MAAM,SAAS,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,QAAQ,MAAM,IAAI;IAC/E,MAAM,SAAS,MAAM,SAAS,MAAM,MAAM,SAAS,EAAE,CAAC,OAAO;IAC5D,CAAC,SAAS,OAAO,WAAW,MAAA,CAAQ,KAAK,IAAI;IAC9C,MAAM,KAAK;KAAE,OAAO,EAAE,EAAE,CAAC;KAAQ;IAAK,CAAC;GACzC;GACA,YAAY,OAAO,MAAM,MAAM;GAC/B,OAAO;EACT;;EAGA,SAAS,YAAY,MAA+B;GAClD,MAAM,QAAyB,CAAC;GAChC,MAAM,QAAwD,CAAC;GAC/D,MAAM,QAAQ,KAAK,MAAM,IAAI;GAC7B,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;IACrC,MAAM,IAAI,iDAAiD,KAAK,MAAM,EAAE;IACxE,IAAI,CAAC,GAAG;IACR,MAAM,SAAS,EAAE,EAAE,CAAC,QAAQ,OAAO,IAAI,CAAC,CAAC;IACzC,MAAM,UAAU,UAAU,KAAK,MAAM,EAAE;IACvC,MAAM,OAAsB;KAC1B,MAAM,EAAE;KAAI,MAAM,UAAU,GAAG,QAAQ,GAAG;KAC1C,WAAW,IAAI;KAAG,SAAS,IAAI;KAAG,YAAY,IAAI;KAAG,UAAU,CAAC;IAClE;IACA,OAAO,MAAM,UAAU,MAAM,MAAM,SAAS,EAAE,CAAC,UAAU,QAAQ,MAAM,IAAI;IAC3E,MAAM,SAAS,MAAM,SAAS,MAAM,MAAM,SAAS,EAAE,CAAC,OAAO;IAC5D,CAAC,SAAS,OAAO,WAAW,MAAA,CAAQ,KAAK,IAAI;IAC9C,MAAM,KAAK;KAAE;KAAQ;IAAK,CAAC;GAC7B;GACA,YAAY,OAAO,MAAM,MAAM;GAC/B,OAAO;EACT;;EAGA,SAAS,WAAW,MAA+B;GACjD,MAAM,MAAuB,CAAC;GAC9B,MAAM,QAAQ,KAAK,MAAM,IAAI;GAC7B,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;IACrC,MAAM,IAAI,oDAAoD,KAAK,MAAM,EAAE;IAC3E,IAAI,GAAG,IAAI,KAAK,GAAG,GAAG,EAAE,IAAI,GAAG,UAAU,MAAM,EAAE,CAAC;GACpD;GACA,YAAY,KAAK,MAAM,MAAM;GAC7B,OAAO;EACT;;EAGA,SAAS,UAAU,MAA+B;GAChD,MAAM,MAAuB,CAAC;GAC9B,MAAM,QAAQ,KAAK,MAAM,IAAI;GAC7B,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;IACrC,MAAM,IAAI,4CAA4C,KAAK,MAAM,EAAE;IACnE,IAAI,GAAG,IAAI,KAAK,GAAG,GAAG,EAAE,IAAI,GAAG,UAAU,MAAM,EAAE,CAAC;GACpD;GACA,YAAY,KAAK,MAAM,MAAM;GAC7B,OAAO;EACT;;EAGA,SAAS,SAAS,MAA+B;GAC/C,MAAM,MAAuB,CAAC;GAC9B,MAAM,QAAQ,KAAK,MAAM,IAAI;GAC7B,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;IACrC,MAAM,OAAO,MAAM;IACnB,IAAI,SAAS,KAAK,IAAI,GAAG;IACzB,MAAM,KAAK,0DAA0D,KAAK,IAAI;IAC9E,IAAI,IAAI;KAAE,IAAI,KAAK,GAAG,GAAG,GAAG,IAAI,GAAG,UAAU,IAAI,CAAC;KAAG;IAAS;IAC9D,MAAM,KAAK,4DAA4D,KAAK,IAAI;IAChF,IAAI,IAAI,IAAI,KAAK,GAAG,GAAG,GAAG,IAAI,UAAU,KAAK,IAAI,IAAI,GAAG,QAAQ,GAAG,UAAU,IAAI,CAAC;GACpF;GACA,YAAY,KAAK,MAAM,MAAM;GAC7B,OAAO;EACT;;EAGA,SAAS,QAAQ,MAA+B;GAC9C,MAAM,MAAuB,CAAC;GAC9B,MAAM,QAAQ,KAAK,MAAM,IAAI;GAC7B,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;IACrC,MAAM,KAAK,sDAAsD,KAAK,MAAM,EAAE;IAC9E,IAAI,IAAI;KAAE,IAAI,KAAK,GAAG,GAAG,GAAG,IAAI,GAAG,UAAU,MAAM,EAAE,CAAC;KAAG;IAAS;IAClE,MAAM,KAAK,kCAAkC,KAAK,MAAM,EAAE;IAC1D,IAAI,IAAI,IAAI,KAAK,GAAG,GAAG,GAAG,IAAI,GAAG,QAAQ,MAAM,EAAE,CAAC;GACpD;GACA,YAAY,KAAK,MAAM,MAAM;GAC7B,OAAO;EACT;;EAGA,SAAS,UAAU,MAA+B;GAChD,MAAM,MAAuB,CAAC;GAC9B,MAAM,QAAQ,KAAK,MAAM,IAAI;GAC7B,MAAM,SAAiC;IACrC,IAAI,GAAG;IAAU,QAAQ,GAAG;IAAQ,MAAM,GAAG;IAAM,OAAO,GAAG;IAC7D,MAAM,GAAG;IAAQ,KAAK,GAAG;IAAQ,MAAM,GAAG;GAC5C;GACA,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;IACrC,MAAM,IAAI,8FAA8F,KAAK,MAAM,EAAE;IACrH,IAAI,KAAK,OAAO,EAAE,KAAK,IAAI,KAAK,GAAG,GAAG,EAAE,IAAI,OAAO,EAAE,KAAK,MAAM,EAAE,CAAC;GACrE;GACA,YAAY,KAAK,MAAM,MAAM;GAC7B,OAAO;EACT;;EAGA,SAAS,UAAU,MAA+B;GAChD,MAAM,MAAuB,CAAC;GAC9B,MAAM,QAAQ,KAAK,MAAM,IAAI;GAC7B,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;IACrC,MAAM,OAAO,MAAM;IACnB,IAAI,CAAC,KAAK,KAAK,KAAK,MAAM,KAAK,IAAI,KAAK,WAAW,KAAK,IAAI,GAAG;IAC/D,MAAM,IAAI,0BAA0B,KAAK,IAAI;IAC7C,IAAI,GAAG,IAAI,KAAK,GAAG,GAAG,EAAE,IAAI,GAAG,KAAK,IAAI,CAAC;GAC3C;GACA,YAAY,KAAK,MAAM,MAAM;GAC7B,OAAO;EACT;;EAGA,SAAS,SAAS,MAA+B;GAC/C,MAAM,MAAuB,CAAC;GAC9B,MAAM,QAAQ,KAAK,MAAM,IAAI;GAC7B,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;IACrC,MAAM,OAAO,MAAM;IACnB,IAAI,CAAC,KAAK,KAAK,KAAK,WAAW,KAAK,IAAI,GAAG;IAC3C,MAAM,KAAK,gBAAgB,KAAK,IAAI;IACpC,IAAI,IAAI;KAAE,IAAI,KAAK,GAAG,GAAG,GAAG,IAAI,GAAG,WAAW,IAAI,CAAC;KAAG;IAAS;IAC/D,MAAM,KAAK,6BAA6B,KAAK,KAAK,KAAK,CAAC;IACxD,IAAI,IAAI,IAAI,KAAK,GAAG,GAAG,GAAG,IAAI,GAAG,KAAK,IAAI,CAAC;GAC7C;GACA,YAAY,KAAK,MAAM,MAAM;GAC7B,OAAO;EACT;;EAGA,SAAS,WAAW,MAA+B;GACjD,MAAM,MAAuB,CAAC;GAC9B,MAAM,QAAQ,KAAK,MAAM,IAAI;GAC7B,MAAM,SAAS;GAEf,MAAM,SAAS;GACf,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;IACrC,MAAM,OAAO,MAAM;IACnB,MAAM,IAAI,KAAK,KAAK;IACpB,IAAI,CAAC,KAAK,SAAS,KAAK,IAAI,GAAG;IAC/B,MAAM,KAAK,OAAO,KAAK,IAAI;IAC3B,IAAI,IAAI;KAAE,IAAI,KAAK,GAAG,GAAG,GAAG,IAAI,gBAAgB,GAAG,OAAO,GAAG,OAAO,IAAI,CAAC;KAAG;IAAS;IACrF,MAAM,KAAK,OAAO,KAAK,IAAI;IAC3B,IAAI,CAAC,IAAI;IACT,IAAI,SAAS,IAAI,GAAG,EAAE,KAAK,QAAQ,KAAK,CAAC,GAAG;IAC5C,IAAI,KAAK,GAAG,GAAG,GAAG,IAAI,GAAG,UAAU,IAAI,CAAC;GAC1C;GACA,YAAY,KAAK,MAAM,MAAM;GAC7B,OAAO;EACT;;;;;;;;EASA,SAAgB,aAAa,YAAoB,MAA+B;GAC9E,QAAQ,YAAR;IACE,KAAK;IACL,KAAK,OACH,OAAO,cAAc,IAAI;IAC3B,KAAK,UACH,OAAO,YAAY,IAAI;IACzB,KAAK,SACH,OAAO,WAAW,IAAI;IACxB,KAAK,cACH,OAAO,UAAU,IAAI;IACvB,KAAK,OACH,OAAO,SAAS,IAAI;IACtB,KAAK,MACH,OAAO,QAAQ,IAAI;IACrB,KAAK,QACH,OAAO,UAAU,IAAI;IACvB,KAAK,QACH,OAAO,UAAU,IAAI;IACvB,KAAK,OACH,OAAO,SAAS,IAAI;IACtB,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK,QACH,OAAO,WAAW,IAAI;IACxB,SACE,OAAO,CAAC;GACZ;EACF;;;;EC5PA,MAAa,yCAAyB,IAAI,IAAI;GAC5C;GAAY;GAAO;GAAU;GAAS;GAAc;GAAO;GAAM;GACjE;GAAQ;GAAO;GAAK;GAAO;GAAU;GAAQ;GAAO;GAAQ;GAC5D;GAAS;EACX,CAAC;;;;;;EAOD,SAAgB,8BAAqD;GACnE,MAAM,0BAAU,IAAI,IAA2B;GAC/C,MAAM,4BAAY,IAAI,IAAgB;GACtC,MAAM,eAAqB;IACzB,KAAK,MAAM,YAAY,WAAW,SAAS;GAC7C;GACA,MAAM,aACJ,CAAC,GAAG,QAAQ,OAAO,CAAC,CAAC,CAAC,MAAM,GAAG,MAAO,EAAE,WAAW,EAAE,aAAc,EAAE,KAAK,EAAE,KAAK,KAAK,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE;GAC5G,OAAO;IACL,SAAS,QAAmC;KAC1C,IAAI,CAAC,UAAU,CAAC,OAAO,MAAM,OAAO,OAAO,QAAQ,YAAY,MAAM,IAAI,UAAU,kBAAkB;KACrG,QAAQ,IAAI,OAAO,IAAI,MAAM;KAC7B,OAAO;KACP,aAAa;MACX,IAAI,QAAQ,IAAI,OAAO,EAAE,MAAM,QAAQ;MACvC,QAAQ,OAAO,OAAO,EAAE;MACxB,OAAO;KACT;IACF;IACA;IACA,UAAU,UAAkC;KAC1C,UAAU,IAAI,QAAQ;KACtB,aAAa,UAAU,OAAO,QAAQ;IACxC;IACA,MAAM,OAAe,QAAQ,IAAI,EAAE;GACrC;EACF;;EAGA,SAAS,gBAAgB,IAA0B;GACjD,IAAI,CAAC,MAAM,OAAO,GAAG,SAAS,UAAU,OAAO;GAC/C,MAAM,QAAQ,GAAG,SAAS,CAAC;GAC3B,MAAM,MAAM,GAAG,kBAAkB;GACjC,MAAM,YAAY,KAAK,IAAI,GAAG,OAAO,IAAI,mBAAmB,MAAM,mBAAmB,CAAC,CAAC;GACvF,MAAM,UAAU,KAAK,IAAI,GAAG,OAAO,MAAM,iBAAiB,SAAS,CAAC;GACpE,MAAM,MAAqB;IACzB,MAAM,GAAG;IACT,MAAM,OAAO,GAAG,SAAS,WAAW,GAAG,OAAO;IAC9C,WAAW,KAAK,IAAI,GAAG,OAAO,MAAM,mBAAmB,SAAS,CAAC;IACjE;IACA,YAAY;GACd;GACA,IAAI,OAAO,GAAG,WAAW,YAAY,GAAG,QAAQ,IAAI,SAAS,GAAG;GAChE,IAAI,MAAM,QAAQ,GAAG,QAAQ,KAAK,GAAG,SAAS,QAAQ;IACpD,MAAM,OAAO,GAAG,SAAS,IAAI,eAAe,CAAC,CAAC,OAAO,OAAO;IAC5D,IAAI,KAAK,QAAQ,IAAI,WAAW;GAClC;GACA,OAAO;EACT;;;;;;;;EASA,eAAsB,eAAe,SAAgC,OAAqD;GACxH,KAAK,MAAM,UAAU,QAAQ,KAAK,GAAG;IACnC,IAAI,WAAW;IACf,IAAI;KAAE,WAAW,OAAO,SAAS,MAAM,UAAU;IAAE,QAAQ;KAAE,WAAW;IAAM;IAC9E,IAAI,CAAC,UAAU;IACf,IAAI,QAAgC;IACpC,IAAI;KAAE,QAAQ,MAAM,OAAO,IAAI,KAAK;IAAE,QAAQ;KAAE,QAAQ;IAAK;IAC7D,IAAI,SAAS,MAAM,QAAQ,OAAO;GACpC;GACA,OAAO,CAAC;EACV;;;;;;;EAQA,SAAgB,8BAA8B,UAA6C;GACzF,MAAM,YAAY,CAChB,SAAS,SAAS;IAChB,IAAI;IACJ,UAAU;IACV,gBAAgB;IAChB,MAAM,IAAI,OAAqD;KAC7D,MAAM,KAAK,MAAM;KACjB,MAAM,QAAQ,MAAM;KACpB,MAAM,MAAM,IAAI;KAChB,IAAI,CAAC,OAAO,OAAO,IAAI,mBAAmB,YAAY,OAAO,CAAC;KAC9D,MAAM,MAAM,OAAO;KACnB,IAAI,CAAC,KAAK,OAAO,CAAC;KAClB,MAAM,OAAO,MAAM,IAAI,eAAe,kCAAkC,GAAG;KAC3E,OAAO,MAAM,QAAQ,IAAI,IAAI,KAAK,IAAI,eAAe,CAAC,CAAC,OAAO,OAAO,IAAI,CAAC;IAC5E;GACF,CAAC,GACD,SAAS,SAAS;IAChB,IAAI;IACJ,UAAU;IACV,WAAW,eAAuB,uBAAuB,IAAI,UAAU;IACvE,MAAM,IAAI,OAAqD;KAC7D,MAAM,QAAQ,MAAM;KACpB,IAAI,CAAC,SAAS,OAAO,MAAM,aAAa,YAAY,OAAO,CAAC;KAC5D,OAAO,aAAa,MAAM,YAAY,MAAM,SAAS,CAAC;IACxD;GACF,CAAC,CACH;GACA,aAAa;IAAE,KAAK,MAAM,WAAW,WAAW,QAAQ;GAAE;EAC5D;;;;;;;;;;;ECxHA,MAAM,aAAa;;EAGnB,MAAM,cAAc;GAClB,MAAM;IAAE,OAAO;IAAK,KAAK;GAAe;GACxC,MAAM;IAAE,OAAO;IAAK,KAAK;GAAe;GACxC,MAAM;IAAE,OAAO;IAAK,KAAK;GAAe;GACxC,IAAI;IAAE,OAAO;IAAK,KAAK;GAAa;GACpC,KAAK;IAAE,OAAO;IAAK,KAAK;GAAc;EACxC;;EAGA,SAAS,SAAS,MAAM;GACtB,MAAM,IAAI,OAAO;GACjB,IAAI,KAAK,GAAG,OAAO,YAAY;GAC/B,IAAI,MAAM,KAAK,MAAM,KAAK,MAAM,MAAM,MAAM,MAAM,MAAM,IAAI,OAAO,YAAY;GAC/E,IAAI,MAAM,KAAK,MAAM,KAAK,MAAM,IAAI,OAAO,YAAY;GACvD,IAAI,MAAM,MAAM,MAAM,IAAI,OAAO,YAAY;GAC7C,OAAO,YAAY;EACrB;;;;;EAMA,SAAgB,aAAa,OAAO;GAClC,MAAM,MAAM,OAAO;GACnB,MAAM,aAAa,KAAK,cAAc;GACtC,MAAM,CAAC,SAAS,cAAcC,MAAAA,QAAM,SAAS,IAAI;GACjD,MAAM,CAAC,OAAO,YAAYA,MAAAA,QAAM,SAAS,IAAI;GAC7C,MAAM,CAAC,WAAW,gBAAgBA,MAAAA,QAAM,SAAS,CAAC,CAAC;GACnD,MAAM,CAAC,YAAY,iBAAiBA,MAAAA,QAAM,SAAS,IAAI;GACvD,MAAM,SAASA,MAAAA,QAAM,OAAO,CAAC;GAE7B,MAAM,SAASA,MAAAA,QAAM,OAAO,GAAG;GAC/B,OAAO,UAAU;GACjB,MAAM,YAAYA,MAAAA,QAAM,OAAO,UAAU;GACzC,UAAU,UAAU;GACpB,MAAM,aAAaA,MAAAA,QAAM,OAAO,KAAK,cAAc;GACnD,WAAW,UAAU,KAAK;GAE1B,MAAM,UAAUA,MAAAA,QAAM,kBAAkB;IAEtC,MAAM,KADI,OAAO,SACH,SAAS;IACvB,MAAM,QAAQ,IAAI,WAAW;IAC7B,MAAM,MAAM,EAAE,OAAO;IACrB,IAAI,CAAC,MAAM,CAAC,OAAO;KAAE,WAAW,IAAI;KAAG,SAAS,IAAI;KAAG;IAAO;IAC9D,MAAM,UAAU,OAAO,KAAK;IAC5B,MAAM,YAAY,UAAU,mBAAmB,OAAO,OAAO,CAAC,CAAC,QAAQ,OAAO,EAAE,CAAC,IAAI;IACrF,MAAM,SAAS,UAAU;IACzB,IAAI,UAAU,cAAc,QAAQ;KAAE,WAAW,IAAI;KAAG,SAAS,IAAI;KAAG;IAAO;IAC/E,MAAM,UAAU,WAAW;IAC3B,IAAI,CAAC,SAAS;KAAE,WAAW,CAAC,CAAC;KAAG,SAAS,IAAI;KAAG;IAAO;IACvD,SAAS,IAAI;IACb,eAAe,SAAS;KAAE,YAAY,MAAM,cAAc;KAAG;KAAO,QAAQ;KAAI,QAAQ,OAAO;IAAO,CAAC,CAAC,CACrG,MAAM,SAAS;KAAE,IAAI,QAAQ,OAAO,SAAS,WAAW,QAAQ,CAAC,CAAC;IAAE,CAAC,CAAC,CACtE,OAAO,MAAM;KAAE,IAAI,QAAQ,OAAO,SAAS;MAAE,SAAS,OAAO,GAAG,WAAW,CAAC,CAAC;MAAG,WAAW,IAAI;KAAE;IAAE,CAAC;GACzG,GAAG,CAAC,CAAC;GAIL,MAAA,QAAM,gBAAgB;IACpB,MAAM,YAAY,CAAC;IACnB,IAAI,gBAAgB;IACpB,IAAI,YAAY;IAChB,MAAM,eAAe;KACnB,MAAM,KAAK,OAAO,SAAS,SAAS;KACpC,IAAI,CAAC,IAAI,OAAO;KAChB,IAAI,oBAAoB;KACxB,MAAM,cAAc,UAAU;MAC5B,IAAI,mBAAmB;OAAE,kBAAkB,QAAQ;OAAG,oBAAoB;MAAK;MAC/E,oBAAoB,OAAO,2BAA2B;OACpD,IAAI,eAAe,aAAa,aAAa;OAC7C,gBAAgB,iBAAiB;QAAE,gBAAgB;QAAM,QAAQ;OAAE,GAAG,GAAG;MAC3E,CAAC,KAAK;KACR;KACA,MAAM,gBAAgB;MAAE,WAAW,GAAG,WAAW,CAAC;MAAG,QAAQ;KAAE;KAC/D,MAAM,YAAY,MAAM,cAAc,GAAG,UAAU,cAAc,IAAI;KACrE,WAAW,GAAG,WAAW,CAAC;KAC1B,MAAM,OAAO;MACX,GAAG,mBAAmB,OAAO;MAC7B,GAAG,4BAA4B,QAAQ;MACvC,EAAE,eAAe;OAAE,IAAI,mBAAmB,kBAAkB,QAAQ;MAAE,EAAE;KAC1E;KACA,KAAK,MAAM,KAAK,MAAM,IAAI,GAAG,UAAU,KAAK,CAAC;KAC7C,QAAQ;KACR,OAAO;IACT;IACA,MAAM,kBAAkB,QAAQ;IAChC,OAAO,iBAAiB,gBAAgB,SAAS;IACjD,IAAI,CAAC,OAAO,GACV,YAAY,kBAAkB;KAAE,IAAI,OAAO,GAAG;MAAE,cAAc,SAAS;MAAG,YAAY;KAAK;IAAE,GAAG,GAAG;IAErG,aAAa;KACX,IAAI,eAAe,aAAa,aAAa;KAC7C,IAAI,WAAW,cAAc,SAAS;KACtC,KAAK,MAAM,KAAK,WAAW,IAAI,GAAG,SAAS,EAAE,QAAQ;KACrD,OAAO,oBAAoB,gBAAgB,SAAS;IACtD;GACF,GAAG,CAAC,OAAO,CAAC;GAGZ,MAAA,QAAM,gBAAgB;IAAE,QAAQ;GAAE,GAAG,CAAC,SAAS,UAAU,CAAC;GAE1D,MAAM,QAAQ,QAAQ;IACpB,MAAM,KAAK,OAAO,SAAS,SAAS;IACpC,IAAI,CAAC,IAAI;IACT,MAAM,OAAO,KAAK,IAAI,GAAG,KAAK,cAAc,KAAK,aAAa,CAAC;IAC/D,GAAG,mBAAmB,IAAI;IAC1B,GAAG,YAAY;KAAE,YAAY;KAAM,QAAQ;IAAE,CAAC;IAC9C,GAAG,MAAM;GACX;GAEA,MAAM,kBAAkB,QAAQ;IAC9B,cAAc,SAAS,OAAO,OAAO,CAAC,GAAG,MAAM,GAAG,MAAM,KAAK,SAAS,OAAO,QAAQ,KAAK,CAAC,CAAC;GAC9F;GAEA,MAAM,UAAUA,MAAAA,QAAM,cAAc;IAClC,MAAM,OAAO,CAAC;IACd,MAAM,QAAQ,MAAM,WAAW;KAC7B,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;MACpC,MAAM,MAAM,SAAS,SAAS,MAAM,IAAI,OAAO,CAAC;MAChD,MAAM,MAAM,KAAK;MACjB,IAAI,IAAI,YAAY,IAAI,SAAS,QAAQ;OAAE,KAAK,KAAK,GAAG;OAAG,KAAK,IAAI,UAAU,GAAG;MAAE;KACrF;IACF;IACA,KAAK,WAAW,CAAC,GAAG,EAAE;IACtB,OAAO;GACT,GAAG,CAAC,OAAO,CAAC;GAEZ,MAAM,UAAU,UAAU;IACxB,MAAM,OAAO,CAAC;IACd,KAAK,MAAM,OAAO,SAAS,KAAK,OAAO;IACvC,aAAa,IAAI;GACnB;GAEA,MAAM,cAAc,MAAM,OAAO,WAAW;IAC1C,MAAM,OAAO,CAAC;IACd,MAAM,MAAM,KAAK,IAAI,KAAK,QAAQ,UAAU;IAC5C,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,KAAK;KAC5B,MAAM,MAAM,KAAK;KACjB,MAAM,MAAM,SAAS,SAAS,MAAM,IAAI,OAAO,CAAC;KAChD,MAAM,OAAO,IAAI,YAAY,IAAI,SAAS,SAAS,IAAI,WAAW;KAClE,MAAM,cAAc,UAAU,SAAS;KACvC,MAAM,OAAO,SAAS,IAAI,IAAI;KAC9B,MAAM,SAAS,cAAc,QAAQ,IAAI,aAAa,cAAc,cAAc,IAAI;KACtF,KAAK,KAAKA,MAAAA,QAAM,cAAc,OAAO;MACnC;MACA,WAAW,mBAAmB,SAAS,sBAAsB;MAC7D,OAAO,IAAI,UAAU,IAAI;MACzB,OAAO,EAAE,aAAa,IAAI,QAAQ,GAAG;MACrC,eAAe,KAAK,GAAG;KACzB,GACEA,MAAAA,QAAM,cAAc,QAAQ;MAC1B,WAAW;MACX,UAAU,MAAM;OAAE,EAAE,gBAAgB;OAAG,eAAe,GAAG;MAAE;KAC7D,GAAG,OAAQ,cAAc,MAAM,MAAO,EAAE,GACxCA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,uBAAuB,KAAK,IAAI,GAAG,KAAK,KAAK,GACtFA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,iBAAiB,GAAG,IAAI,IAAI,GACpE,IAAI,SAASA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,sBAAsB,GAAG,IAAI,MAAM,IAAI,MAC9FA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,kBAAkB,GAAG,OAAO,IAAI,cAAc,IAAI,aAAa,EAAE,CAAC,CAAC,CAAC;KAC/G,IAAI,QAAQ,CAAC,aAAa,KAAK,KAAK,GAAG,WAAW,MAAM,QAAQ,GAAG,GAAG,CAAC;IACzE;IACA,IAAI,KAAK,SAAS,YAChB,KAAK,KAAKA,MAAAA,QAAM,cAAc,OAAO;KAAE,KAAK;KAAO,WAAW;IAAoB,GAAG,iBAAgC,CAAC;IAExH,OAAO;GACT;GAEA,MAAM,WAAW,aAAa,OAAO,UAAU,CAAC,CAAC,MAAM,OAAO,CAAC,CAAC,IAAI,KAAK,aAAa;GAEtF,IAAI;GACJ,IAAI,OACF,OAAOA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,YAAY,GACzDA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,kBAAkB,GACxDA,MAAAA,QAAM,cAAc,QAAQ,MAAM,OAAO,KAAK,CAAC,GAC/CA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAAiB,SAAS;GAAQ,GAAG,IAAI,CAAC,CAAC;QACrF,IAAI,CAAC,YACV,OAAOA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,YAAY,GACzDA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,oBAAoB,GAAG,OAAO,CAAC;QACpE,IAAI,YAAY,MACrB,OAAOA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,YAAY,GACzDA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,oBAAoB,GAAG,MAAM,CAAC;QACnE,IAAI,QAAQ,WAAW,GAC5B,OAAOA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,YAAY,GACzDA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,oBAAoB,GAAG,iBAAiB,CAAC;QAEnF,OAAOA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,YAAY,GAAG,GAAG,WAAW,SAAS,GAAG,EAAE,CAAC;GAG7F,OAAOA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,kBAAkB,GAC/DA,MAAAA,QAAM,cAAc,OAAO,EAAE,WAAW,iBAAiB,GACvDA,MAAAA,QAAM,cAAc,QAAQ,EAAE,WAAW,kBAAkB,GAAG,IAAI,GAClEA,MAAAA,QAAM,cAAc,QAAQ;IAAE,WAAW;IAAkB,OAAO,cAAc;GAAG,GAAG,QAAQ,GAC9FA,MAAAA,QAAM,cAAc,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,GAClDA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAAiB,OAAO;IAAQ,UAAU,EAAE,WAAW,QAAQ;IAAS,eAAe,OAAO,IAAI;GAAE,GAAG,GAAG,GACrJA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAAiB,OAAO;IAAQ,UAAU,EAAE,WAAW,QAAQ;IAAS,eAAe,OAAO,KAAK;GAAE,GAAG,GAAG,GACtJA,MAAAA,QAAM,cAAc,UAAU;IAAE,WAAW;IAAiB,OAAO;IAAQ,SAAS;GAAQ,GAAG,GAAG,CAAC,GACrG,IAAI;EACR;;;;;;;;;;;;;ECrMA,SAAgB,qBAAsC;GACpD,OAAO;IACL,IAAI;IACJ,OAAO;IACP,MAAM;IACN,OAAO;IACP,SAAS,QAAoBC,MAAAA,QAAM,cAAc,cAAc,EAAE,IAAI,CAAC;GACxE;EACF;;;;;;;;;;;;;;;;;;ECqBA,MAAa,SAAS;GAAC;GAAS;GAAS;GAAU;GAAc;GAAU;GAAc;GAAY;GAAgB;EAAe;;;;;;EAQpI,SAAgB,MAAM,KAAgB;GACpC,MAAM,YAAY,IAAgB,OAAe,IAAI,QAAQ,IAAI,EAAE;GAEnE,MAAM,WAA+B,yBAAyB;GAC9D,MAAM,aAAa,IAAI,IAAI,YAAY;GACvC,MAAM,WAAW,IAAI,IAAI,UAAU;GAMnC,MAAM,aAAa,UAAU;GAC7B,IAAI,OAAO,WAAW,eAAe,cAAc,OAAO,WAAW,cAAc,YAAY;IAC7F,MAAM,OAAO;IACb,MAAM,wBAAwB;KAC5B,MAAM,gBAAgB,iBAAiB,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;KACzD,IAAI,OAAO,OAAO,wBAAwB,YAAY,OAAO,oBAAoB,SAAS,EAAE,SAAS,IAAK,CAAC;UACtG,SAAS,SAAS,GAAG;IAC5B;IACA,MAAM,uBAAuB;KAC3B,IAAI,CAAC,KAAK,YAAY,CAAC,EAAE,SAAS;KAClC,gBAAgB;IAClB;IACA,IAAI,aAAa,KAAK,UAAU,cAAc,GAAG,qCAAqC;IACtF,eAAe;GACjB;GACA,MAAM,mBAAmB,YAAY;GACrC,MAAM,SAAS,mBAAmB,GAAG;GACrC,MAAM,WAAW,OAAO;GACxB,IAAI,WAAW,UAAU,MAAM;;GAE/B,IAAI,cAAc,qBAAqB,GAAG;;GAE1C,MAAM,oBAAoB,wBAAwB,GAAG;;GAGrD,MAAM,sBAAuC;IAC3C;KAAE,MAAM;KAAO,QAAQ,aAAa,KAAA;KAAW,MAAM,aAAa,KAAA,IAAY,QAAQ,OAAO,UAAU,OAAO;IAA+B;IAC7I;KAAE,MAAM;KAA+B,QAAQ,QAAQ,YAAY,QAAQ;KAAG,MAAM;IAAwB;IAC5G;KAAE,MAAM;KAAkC,QAAQ,SAAS,IAAI,cAAc,MAAM,KAAA;KAAW,MAAM,SAAS,IAAA,oBAAkB,MAAM,KAAA,IAAY,gBAAgB;IAAc;IAC/K;KAAE,MAAM;KAAkC,QAAQ,gBAAgB,KAAA;KAAW,MAAM,gBAAgB,KAAA,IAAY,yBAAyB,2CAA2C,sBAAsB;IAAI;GAC/M;GAEA,IAAI,QAAQ,eAAe,QAAQ;GACnC,IAAI,aAAa,SAAS,SAAS,aAAa,CAAC,GAAG,0BAA0B;GAG9E,MAAM,gBAAgB,2BAA2B;GACjD,IAAI,QAAQ,qBAAqB,aAAa;GAC9C,IAAI,aAAa,cAAc,SAAS,gBAAgB,CAAC,GAAG,4BAA4B;GAExF,IAAI,aAAa,cAAc,SAAS,kBAAkB,CAAC,GAAG,mCAAmC;GAEjG,MAAM,gBAAgB,uBAAuB;GAC7C,IAAI,QAAQ,4BAA4B,aAAa;GACrD,KAAK,MAAM,QAAQ,2BAA2B,GAC5C,IAAI,aAAa,cAAc,SAAS,IAAI,GAAG,yCAAyC,KAAK,EAAE;GAGjG,MAAM,iBAAiB,4BAA4B;GACnD,IAAI,QAAQ,sBAAsB,cAAc;GAChD,IAAI,aAAa,8BAA8B,cAAc,GAAG,8BAA8B;GAC9F,IAAI,aAAa,cAAc,SAAS,mBAAmB,CAAC,GAAG,oCAAoC;GACnG,IAAI,aAAa,SAAS,SAAS;IACjC,IAAI;IAAU,OAAO;IAAU,UAAU;IACzC,OAAO,SAAiB,iBAAiB,KAAK,YAAY,IAAI;GAChE,CAAC,GAAG,iCAAiC;GACrC,IAAI,aAAa;IACf,MAAM,UAAU,YAAY,GAAG;IAC/B,OAAO,UAAU,SAAS,SAAS,OAAO,IAAI,KAAA;GAChD,GAAG,kCAAkC;GACrC,IAAI,aAAa;IACf,IAAI,CAAC,UAAU,OAAO,KAAA;IACtB,MAAM,aAAmB;KACvB,MAAM,WAAW,SAAS,YAAY;KACtC,IAAI,SAAS,WAAW,WAAW;KACnC,WAAW,UAAU,SAAS,OAAO,YAAY;KACjD,OAAO,cAAc,IAAI,YAAY,8BAA8B,EAAE,QAAQ,EAAE,OAAO,SAAS,EAAE,CAAC,CAAC;IACrG;IACA,KAAK;IACL,OAAO,SAAS,UAAU,IAAI;GAChC,GAAG,uCAAuC;GAE1C,IAAI,aAAa;IACf,IAAI,CAAC,UAAU,OAAO,KAAA;IACtB,MAAM,aAAmB;KACvB,MAAM,WAAW,SAAS,YAAY;KACtC,IAAI,SAAS,WAAW,WAAW;KACnC,iBAAiB,SAAS,OAAO,WAAW;IAC9C;IACA,KAAK;IACL,OAAO,SAAS,UAAU,IAAI;GAChC,GAAG,uCAAuC;GAC1C,IAAI,YAAY,UACd,IAAI,aAAa,sBAAsB;IACrC;IACA;IACA,gBAAgB;IAChB,eAAe;KACb,MAAM,UAAU,UAAU,MAAM,cAAc;KAC9C,MAAM,YAAY,SAAS;KAE3B,OAAO;MAAE;MAAW,MADJ,YAAY,SAAS,OAAO,aAAa,KAAA,EAAA,EACvB;KAAI;IACxC;IACA,SAAS,YAAoB,QAAQ,KAAK,uBAAuB,OAAO;GAC1E,CAAC,GAAG,gCAAgC;GAKtC,MAAM,0BAA+C;IACnD,OAAO,mBAAmB,KAAK;KAC7B,MAAM;KACN,IAAI;KACJ,OAAO;KACP,OAAO;KACP,SAAS,eAAuB,EAAE,UAAU;IAC9C,IAAI,UAAmBC,MAAAA,QAAM,cAAc,YAAY,OAAO,OAAO,CAAC,GAAG,OAAO;KAAE,QAAQ;KAAO,UAAU;KAAqB;KAAU;KAAmB;KAAe;KAAgB;IAAc,CAAC,CAAC,CAAC;GAC/M;GAOA,IAAI,eAAoC;GACxC,IAAI,iBAAsC;GAC1C,MAAM,sBAA4B;IAChC,IAAI,aAAa;KACf,IAAI,iBAAiB,MAAM;KAC3B,IAAI,mBAAmB,MAAM;MAAE,eAAe;MAAG,iBAAiB;KAAK;KACvE,eAAe,IAAI,aAAa,kBAAkB;MAChD,SAAS;MACT,YAAY,UAAmCA,MAAAA,QAAM,cAAc,eAAe,OAAO,OAAO,CAAC,GAAG,OAAO;OAAE;OAAU;OAAmB;OAAe;OAAgB;MAAc,CAAC,CAAC;MACzL,qBAAqB;OACnB,MAAM,WAAW,UAAU,MAAM,cAAc;OAC/C,MAAM,YAAY,UAAU;OAC5B,IAAI,CAAC,WAAW,OAAO,KAAA;OACvB,OAAO;QAAE;QAAW,KAAK,UAAU,OAAO,UAAU,EAAE;OAAI;MAC5D;MACA,wBAAwB;KAC1B,CAAC,GAAG,iCAAiC;IACvC,OAAO;KACL,IAAI,mBAAmB,MAAM;KAC7B,IAAI,iBAAiB,MAAM;MAAE,aAAa;MAAG,eAAe;KAAK;KACjE,oBAAoB,IAAI;KACxB,iBAAiB,kBAAkB;IACrC;GACF;GACA,cAAc;GACd,IAAI,cAAc;GAClB,MAAM,yBAA+B;IACnC,IAAI,gBAAgB,KAAA,KAAa,eAAe,IAAI;IACpD,eAAe;IACf,eAAe;KACb,IAAI,gBAAgB,KAAA,GAAW;KAC/B,cAAc,qBAAqB,GAAG;KACtC,IAAI,gBAAgB,KAAA,GAAW;MAC7B,QAAQ,KAAK,oDAAwD;MACrE,cAAc;KAChB,OACE,iBAAiB;IAErB,GAAG,GAAI;GACT;GACA,iBAAiB;GAGjB,mBAAmB,KAAK;IACtB,MAAM;IACN,IAAI;IACJ,OAAO;IACP,OAAO;IACP,SAAS,eAAuB,EAAE,UAAU;GAC9C,IAAI,UAAmBA,MAAAA,QAAM,cAAc,sBAAsB,OAAO,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;GAG1F,mBAAmB,KAAK;IAAE,MAAM;IAAyC,IAAI;IAAmB,OAAO;IAAI,OAAO;GAAK,IACpH,UAAmBA,MAAAA,QAAM,cAAc,WAAW,OAAO,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;GAG9E,mBAAmB,KAAK;IACtB,MAAM;IACN,IAAI;IACJ,OAAO;IACP,OAAO;GACT,SAASA,MAAAA,QAAM,cAAc,gBAAgB,UAAU,EAAE,OAAO,SAAS,GAAGA,MAAAA,QAAM,cAAc,aAAa;IAAE,gBAAgB;IAAU;GAAc,CAAC,CAAC,CAAC;EAC5J"}