@tutti-os/workbench-surface 0.0.21 → 0.0.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/store/commands.ts","../src/core/types.ts","../src/core/geometry.ts","../src/core/stack.ts","../src/core/reducer.ts","../src/store/subscribe.ts","../src/store/createWorkbenchStore.ts","../src/store/createWorkbenchController.ts","../src/host/WorkbenchHost.tsx","../src/mission-control/WorkbenchMissionControlOverlay.tsx","../src/mission-control/layoutDock.ts","../src/mission-control/useWorkbenchMissionControlPresence.ts","../src/mission-control/useWorkbenchMissionControlState.ts","../src/mission-control/layout.ts","../src/react/WorkbenchSurface.tsx","../src/react/WorkbenchDockFrame.tsx","../src/core/selectors.ts","../src/react/WorkbenchProvider.tsx","../src/react/dockNodeSelectors.ts","../src/react/hooks/useWorkbenchSelector.ts","../src/react/WorkbenchNodeLayer.tsx","../src/react/WorkbenchWindowFrame.tsx","../src/react/WorkbenchWindowFullscreenToggle.tsx","../src/react/hooks/useWorkbenchDrag.ts","../src/react/hooks/useWorkbenchSnap.ts","../src/react/hooks/useWorkbenchResize.ts","../src/react/windowHeader.ts","../src/react/renderedNodeIds.ts","../src/react/hooks/useWorkbenchShortcuts.ts","../src/react/hooks/useWorkbenchSurfaceSize.ts","../src/react/useWorkbenchGenieAnimation.tsx","../src/react/genieAnimation.ts","../src/host/hostConfig.ts","../src/host/useWorkbenchHostRuntime.ts","../src/store/createDerivedSnapshotGetter.ts","../src/host/activations.ts","../src/host/missionControlAdapter.ts","../src/core/snapshot.ts","../src/core/placement.ts","../src/host/nodeIdentity.ts","../src/host/sessionState.ts","../src/host/externalState.ts","../src/host/snapshotSanitizer.ts","../src/host/session.ts","../src/host/useWorkbenchHostSurfaceRenderers.tsx","../src/host/WorkbenchHostDock.tsx","../src/host/dockEntries.ts","../src/host/dockMagnification.ts","../src/host/dockScrollState.ts","../src/host/minimizedDockSlots.ts","../src/host/minimizedDockStackPromotion.ts","../src/host/minimizedDockRestoreIntent.ts","../src/host/WorkbenchHostDockPopup.tsx","../src/host/minimizedStackScroll.ts","../src/host/windowActions.ts","../src/host/hostNodeContext.ts","../src/host/WorkbenchHostWindowActions.tsx"],"sourcesContent":["import type {\n WorkbenchFrame,\n WorkbenchLayoutPreset,\n WorkbenchNode,\n WorkbenchNodeSizeConstraints,\n WorkbenchQuickLayoutTarget,\n WorkbenchLayoutConstraintsInput,\n WorkbenchSize,\n WorkbenchSnapTarget,\n WorkbenchState\n} from \"../core/types.ts\";\nimport type { WorkbenchStore } from \"./types.ts\";\n\nexport interface WorkbenchCommands<TData = unknown> {\n replaceState(state: Partial<WorkbenchState<TData>>): void;\n replaceNodes(nodes: WorkbenchNode<TData>[]): void;\n openNode(node: WorkbenchNode<TData>): void;\n closeNode(nodeID: string): void;\n focusNode(nodeID: string): void;\n minimizeNode(nodeID: string): void;\n restoreNode(nodeID: string): void;\n enterFullscreen(nodeID: string): void;\n exitFullscreen(nodeID: string): void;\n applyQuickLayout(nodeID: string, target: WorkbenchQuickLayoutTarget): void;\n applyLayoutPreset(nodeIDs: string[], preset: WorkbenchLayoutPreset): void;\n applyActiveSnapTarget(nodeID: string): void;\n applySnapTarget(nodeID: string, snapTarget: WorkbenchSnapTarget): void;\n dragNode(nodeID: string, frame: WorkbenchFrame): void;\n moveNode(nodeID: string, frame: WorkbenchFrame): void;\n resizeNode(nodeID: string, frame: WorkbenchFrame): void;\n setActiveDragNode(nodeID: string | null): void;\n setActiveResizeNode(nodeID: string | null): void;\n setActiveSnapTarget(snapTarget: WorkbenchSnapTarget): void;\n setSurfaceSize(size: WorkbenchSize): void;\n setLayoutConstraints(constraints: WorkbenchLayoutConstraintsInput): void;\n setNodeSizeConstraints(\n nodeID: string,\n sizeConstraints: WorkbenchNodeSizeConstraints | null\n ): void;\n}\n\nexport function createWorkbenchCommands<TData>(\n store: WorkbenchStore<TData>\n): WorkbenchCommands<TData> {\n return {\n replaceState(state) {\n store.dispatch({ type: \"replaceState\", state });\n },\n replaceNodes(nodes) {\n store.dispatch({ type: \"replaceNodes\", nodes });\n },\n openNode(node) {\n store.dispatch({ type: \"openNode\", node });\n },\n closeNode(nodeID) {\n store.dispatch({ type: \"closeNode\", nodeID });\n },\n focusNode(nodeID) {\n store.dispatch({ type: \"focusNode\", nodeID });\n },\n minimizeNode(nodeID) {\n store.dispatch({ type: \"minimizeNode\", nodeID });\n },\n restoreNode(nodeID) {\n store.dispatch({ type: \"restoreNode\", nodeID });\n },\n enterFullscreen(nodeID) {\n store.dispatch({ type: \"enterFullscreen\", nodeID });\n },\n exitFullscreen(nodeID) {\n store.dispatch({ type: \"exitFullscreen\", nodeID });\n },\n applyQuickLayout(nodeID, target) {\n store.dispatch({ type: \"applyQuickLayout\", nodeID, target });\n },\n applyLayoutPreset(nodeIDs, preset) {\n store.dispatch({ type: \"applyLayoutPreset\", nodeIDs, preset });\n },\n applyActiveSnapTarget(nodeID) {\n store.dispatch({ type: \"applyActiveSnapTarget\", nodeID });\n },\n applySnapTarget(nodeID, snapTarget) {\n store.dispatch({ type: \"applySnapTarget\", nodeID, snapTarget });\n },\n dragNode(nodeID, frame) {\n store.dispatch({ type: \"dragNode\", nodeID, frame });\n },\n moveNode(nodeID, frame) {\n store.dispatch({ type: \"moveNode\", nodeID, frame });\n },\n resizeNode(nodeID, frame) {\n store.dispatch({ type: \"resizeNode\", nodeID, frame });\n },\n setActiveDragNode(nodeID) {\n store.dispatch({ type: \"setActiveDragNode\", nodeID });\n },\n setActiveResizeNode(nodeID) {\n store.dispatch({ type: \"setActiveResizeNode\", nodeID });\n },\n setActiveSnapTarget(snapTarget) {\n store.dispatch({ type: \"setActiveSnapTarget\", snapTarget });\n },\n setSurfaceSize(size) {\n store.dispatch({ type: \"setSurfaceSize\", size });\n },\n setLayoutConstraints(constraints) {\n store.dispatch({ type: \"setLayoutConstraints\", constraints });\n },\n setNodeSizeConstraints(nodeID, sizeConstraints) {\n store.dispatch({\n type: \"setNodeSizeConstraints\",\n nodeID,\n sizeConstraints\n });\n }\n };\n}\n","import type {\n WorkbenchFrame as WorkbenchSnapshotFrame,\n WorkbenchSnapshotDisplayModeV1\n} from \"@tutti-os/workbench-snapshot\";\n\nexport interface WorkbenchSize {\n width: number;\n height: number;\n}\n\nexport type WorkbenchFrame = WorkbenchSnapshotFrame;\n\nexport interface WorkbenchSafeArea {\n top: number;\n right: number;\n bottom: number;\n left: number;\n}\n\nexport type WorkbenchDisplayMode = WorkbenchSnapshotDisplayModeV1;\nexport type WorkbenchSnapTarget = \"left\" | \"right\" | \"top\" | null;\nexport type WorkbenchQuickLayoutTarget = \"left\" | \"right\" | \"top\" | \"bottom\";\nexport type WorkbenchLayoutPreset =\n | { kind: \"balanced\" }\n | { kind: \"row\" }\n | { kind: \"column\" };\nexport type WorkbenchResizeHandle =\n | \"north\"\n | \"east\"\n | \"south\"\n | \"west\"\n | \"north-east\"\n | \"north-west\"\n | \"south-east\"\n | \"south-west\";\n\nexport interface WorkbenchNode<TData = unknown> {\n id: string;\n kind: string;\n title: string;\n frame: WorkbenchFrame;\n displayMode: WorkbenchDisplayMode;\n restoreFrame: WorkbenchFrame | null;\n isMinimized: boolean;\n minimizedAtUnixMs?: number | null;\n sizeConstraints?: WorkbenchNodeSizeConstraints | null;\n data: TData;\n}\n\nexport interface WorkbenchNodeSizeConstraints {\n minWidth?: number;\n minHeight?: number;\n}\n\nexport interface WorkbenchState<TData = unknown> {\n nodes: WorkbenchNode<TData>[];\n nodeStack: string[];\n activeDragNodeId: string | null;\n activeResizeNodeId: string | null;\n activeSnapTarget: WorkbenchSnapTarget;\n surfaceSize: WorkbenchSize;\n layoutConstraints: WorkbenchLayoutConstraints;\n}\n\nexport interface WorkbenchLayoutConstraints {\n minWidth: number;\n minHeight: number;\n surfacePadding: number;\n safeArea: WorkbenchSafeArea;\n}\n\nexport interface WorkbenchLayoutConstraintsInput extends Partial<\n Omit<WorkbenchLayoutConstraints, \"safeArea\">\n> {\n safeArea?: Partial<WorkbenchSafeArea>;\n}\n\nexport const defaultWorkbenchSafeArea: WorkbenchSafeArea = {\n top: 52,\n right: 0,\n bottom: 88,\n left: 0\n};\n\nexport const defaultWorkbenchLayoutConstraints: WorkbenchLayoutConstraints = {\n minWidth: 280,\n minHeight: 160,\n surfacePadding: 0,\n safeArea: defaultWorkbenchSafeArea\n};\n\nexport const defaultWorkbenchSurfaceSize: WorkbenchSize = {\n width: 1024,\n height: 720\n};\n","import {\n defaultWorkbenchLayoutConstraints,\n type WorkbenchFrame,\n type WorkbenchLayoutPreset,\n type WorkbenchLayoutConstraints,\n type WorkbenchLayoutConstraintsInput,\n type WorkbenchNodeSizeConstraints,\n type WorkbenchQuickLayoutTarget,\n type WorkbenchSafeArea,\n type WorkbenchSize,\n type WorkbenchSnapTarget\n} from \"./types.ts\";\n\nexport const WORKBENCH_MIN_VISIBLE_PX = 40;\nexport const WORKBENCH_LAYOUT_PRESET_GAP_PX = 12;\n\nexport function normalizeWorkbenchLayoutConstraints(\n constraints: WorkbenchLayoutConstraintsInput = {}\n): WorkbenchLayoutConstraints {\n return {\n minWidth:\n constraints.minWidth ?? defaultWorkbenchLayoutConstraints.minWidth,\n minHeight:\n constraints.minHeight ?? defaultWorkbenchLayoutConstraints.minHeight,\n surfacePadding:\n constraints.surfacePadding ??\n defaultWorkbenchLayoutConstraints.surfacePadding,\n safeArea: normalizeWorkbenchSafeArea(constraints.safeArea)\n };\n}\n\nexport function normalizeWorkbenchSafeArea(\n safeArea: Partial<WorkbenchSafeArea> = {}\n): WorkbenchSafeArea {\n return {\n top: Math.max(0, safeArea.top ?? 0),\n right: Math.max(0, safeArea.right ?? 0),\n bottom: Math.max(0, safeArea.bottom ?? 0),\n left: Math.max(0, safeArea.left ?? 0)\n };\n}\n\nexport function getWorkbenchLayoutFrame(\n surfaceSize: WorkbenchSize,\n constraints: WorkbenchLayoutConstraints = defaultWorkbenchLayoutConstraints\n): WorkbenchFrame {\n const normalized = normalizeWorkbenchLayoutConstraints(constraints);\n const width = Math.max(\n normalized.minWidth,\n surfaceSize.width - normalized.safeArea.left - normalized.safeArea.right\n );\n const height = Math.max(\n normalized.minHeight,\n surfaceSize.height - normalized.safeArea.top - normalized.safeArea.bottom\n );\n\n return {\n x: normalized.safeArea.left,\n y: normalized.safeArea.top,\n width,\n height\n };\n}\n\nexport function clampWorkbenchRect(\n rect: WorkbenchFrame,\n surfaceSize: WorkbenchSize,\n constraints: WorkbenchLayoutConstraints = defaultWorkbenchLayoutConstraints,\n sizeConstraints?: WorkbenchNodeSizeConstraints | null\n): WorkbenchFrame {\n const normalized = resolveWorkbenchRectConstraints(\n constraints,\n sizeConstraints\n );\n const frame = getWorkbenchLayoutFrame(surfaceSize, normalized);\n const width = clamp(\n rect.width,\n normalized.minWidth,\n Math.max(normalized.minWidth, frame.width - normalized.surfacePadding * 2)\n );\n const height = clamp(\n rect.height,\n normalized.minHeight,\n Math.max(normalized.minHeight, frame.height - normalized.surfacePadding * 2)\n );\n const maxX = Math.max(\n frame.x + normalized.surfacePadding,\n frame.x + frame.width - width - normalized.surfacePadding\n );\n const maxY = Math.max(\n frame.y + normalized.surfacePadding,\n frame.y + frame.height - height - normalized.surfacePadding\n );\n\n return {\n x: clamp(rect.x, frame.x + normalized.surfacePadding, maxX),\n y: clamp(rect.y, frame.y + normalized.surfacePadding, maxY),\n width,\n height\n };\n}\n\nexport function clampWorkbenchRectToVisibleArea(\n rect: WorkbenchFrame,\n surfaceSize: WorkbenchSize,\n constraints: WorkbenchLayoutConstraints = defaultWorkbenchLayoutConstraints,\n minVisiblePx = WORKBENCH_MIN_VISIBLE_PX,\n sizeConstraints?: WorkbenchNodeSizeConstraints | null\n): WorkbenchFrame {\n const normalized = resolveWorkbenchRectConstraints(\n constraints,\n sizeConstraints\n );\n const visibleFrame = getWorkbenchSafeLayoutRect(surfaceSize, normalized);\n const sizedRect = clampWorkbenchRect(\n {\n ...rect,\n x: visibleFrame.x,\n y: visibleFrame.y\n },\n surfaceSize,\n normalized\n );\n const minVisibleX = Math.min(minVisiblePx, visibleFrame.width);\n const minVisibleY = Math.min(minVisiblePx, visibleFrame.height);\n const minX = visibleFrame.x + minVisibleX - sizedRect.width;\n const maxX = visibleFrame.x + visibleFrame.width - minVisibleX;\n const minY = visibleFrame.y + minVisibleY - sizedRect.height;\n const maxY = visibleFrame.y + visibleFrame.height - minVisibleY;\n\n return {\n ...sizedRect,\n x: Math.round(clamp(rect.x, minX, maxX)),\n y: Math.round(clamp(rect.y, minY, maxY))\n };\n}\n\nexport function clampWorkbenchDragRect(\n rect: WorkbenchFrame,\n surfaceSize: WorkbenchSize,\n constraints: WorkbenchLayoutConstraints = defaultWorkbenchLayoutConstraints,\n sizeConstraints?: WorkbenchNodeSizeConstraints | null\n): WorkbenchFrame {\n const normalized = resolveWorkbenchRectConstraints(\n constraints,\n sizeConstraints\n );\n const layoutFrame = getWorkbenchLayoutFrame(surfaceSize, normalized);\n const visibleRect = clampWorkbenchRectToVisibleArea(\n rect,\n surfaceSize,\n normalized,\n WORKBENCH_MIN_VISIBLE_PX\n );\n\n return {\n ...visibleRect,\n y: Math.max(layoutFrame.y + normalized.surfacePadding, visibleRect.y)\n };\n}\n\nexport function getWorkbenchFullscreenRect(\n surfaceSize: WorkbenchSize,\n constraints: WorkbenchLayoutConstraints = defaultWorkbenchLayoutConstraints,\n sizeConstraints?: WorkbenchNodeSizeConstraints | null\n): WorkbenchFrame {\n const normalized = resolveWorkbenchRectConstraints(\n constraints,\n sizeConstraints\n );\n const fullscreenSafeArea = {\n ...normalized.safeArea,\n bottom: 0,\n left: 0\n };\n return {\n x: fullscreenSafeArea.left + normalized.surfacePadding,\n y: fullscreenSafeArea.top + normalized.surfacePadding,\n width: Math.max(\n normalized.minWidth,\n surfaceSize.width -\n fullscreenSafeArea.left -\n fullscreenSafeArea.right -\n normalized.surfacePadding * 2\n ),\n height: Math.max(\n normalized.minHeight,\n surfaceSize.height -\n fullscreenSafeArea.top -\n fullscreenSafeArea.bottom -\n normalized.surfacePadding * 2\n )\n };\n}\n\nexport function getWorkbenchSnapRect(\n snapTarget: WorkbenchSnapTarget,\n surfaceSize: WorkbenchSize,\n constraints: WorkbenchLayoutConstraints = defaultWorkbenchLayoutConstraints,\n sizeConstraints?: WorkbenchNodeSizeConstraints | null\n): WorkbenchFrame | null {\n const normalized = resolveWorkbenchRectConstraints(\n constraints,\n sizeConstraints\n );\n const full = getWorkbenchSafeLayoutRect(surfaceSize, normalized);\n const clampSnapRect = (rect: WorkbenchFrame): WorkbenchFrame =>\n clampWorkbenchRect(rect, surfaceSize, normalized);\n if (snapTarget === \"left\") {\n return clampSnapRect({ ...full, width: Math.round(full.width / 2) });\n }\n if (snapTarget === \"right\") {\n const width = Math.round(full.width / 2);\n return clampSnapRect({ ...full, x: full.x + full.width - width, width });\n }\n if (snapTarget === \"top\") {\n return clampSnapRect(full);\n }\n return null;\n}\n\nexport function getWorkbenchQuickLayoutRect(\n target: WorkbenchQuickLayoutTarget,\n surfaceSize: WorkbenchSize,\n constraints: WorkbenchLayoutConstraints = defaultWorkbenchLayoutConstraints,\n sizeConstraints?: WorkbenchNodeSizeConstraints | null\n): WorkbenchFrame {\n const normalized = resolveWorkbenchRectConstraints(\n constraints,\n sizeConstraints\n );\n const full = getWorkbenchSafeLayoutRect(surfaceSize, normalized);\n const clampQuickLayoutRect = (rect: WorkbenchFrame): WorkbenchFrame =>\n clampWorkbenchRect(rect, surfaceSize, normalized);\n\n switch (target) {\n case \"left\":\n return clampQuickLayoutRect({\n ...full,\n width: Math.round(full.width / 4)\n });\n case \"right\": {\n const width = Math.round(full.width / 4);\n return clampQuickLayoutRect({\n ...full,\n x: full.x + full.width - width,\n width\n });\n }\n case \"top\":\n return clampQuickLayoutRect({\n ...full,\n height: Math.round(full.height / 2)\n });\n case \"bottom\": {\n const height = Math.round(full.height / 2);\n return clampQuickLayoutRect({\n ...full,\n y: full.y + full.height - height,\n height\n });\n }\n }\n}\n\nfunction resolveWorkbenchRectConstraints(\n constraints: WorkbenchLayoutConstraints = defaultWorkbenchLayoutConstraints,\n sizeConstraints?: WorkbenchNodeSizeConstraints | null\n): WorkbenchLayoutConstraints {\n const normalized = normalizeWorkbenchLayoutConstraints(constraints);\n return {\n ...normalized,\n minHeight: Math.max(\n normalized.minHeight,\n normalizeNodeMinimum(sizeConstraints?.minHeight)\n ),\n minWidth: Math.max(\n normalized.minWidth,\n normalizeNodeMinimum(sizeConstraints?.minWidth)\n )\n };\n}\n\nfunction normalizeNodeMinimum(value: number | undefined): number {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0\n ? value\n : 0;\n}\n\nexport function getWorkbenchLayoutPresetFrames(\n itemCount: number,\n preset: WorkbenchLayoutPreset,\n surfaceSize: WorkbenchSize,\n constraints: WorkbenchLayoutConstraints = defaultWorkbenchLayoutConstraints\n): WorkbenchFrame[] | null {\n if (itemCount <= 0) {\n return [];\n }\n\n const normalized = normalizeWorkbenchLayoutConstraints(constraints);\n const frame = getWorkbenchSafeLayoutRect(surfaceSize, normalized);\n switch (preset.kind) {\n case \"balanced\":\n return getBalancedLayoutFrames(itemCount, frame, normalized);\n case \"row\":\n return getGridLayoutFrames(itemCount, itemCount, frame, normalized);\n case \"column\":\n return getSingleColumnLayoutFrames(itemCount, frame, normalized);\n }\n}\n\nfunction getWorkbenchSafeLayoutRect(\n surfaceSize: WorkbenchSize,\n constraints: WorkbenchLayoutConstraints = defaultWorkbenchLayoutConstraints\n): WorkbenchFrame {\n const normalized = normalizeWorkbenchLayoutConstraints(constraints);\n const frame = getWorkbenchLayoutFrame(surfaceSize, normalized);\n return {\n x: frame.x + normalized.surfacePadding,\n y: frame.y + normalized.surfacePadding,\n width: Math.max(\n normalized.minWidth,\n frame.width - normalized.surfacePadding * 2\n ),\n height: Math.max(\n normalized.minHeight,\n frame.height - normalized.surfacePadding * 2\n )\n };\n}\n\nexport function inferWorkbenchSnapTarget(\n dragPoint: Pick<WorkbenchFrame, \"y\">,\n surfaceSize: WorkbenchSize,\n threshold = 0,\n constraints: WorkbenchLayoutConstraints = defaultWorkbenchLayoutConstraints\n): WorkbenchSnapTarget {\n const frame = getWorkbenchLayoutFrame(surfaceSize, constraints);\n const topSnapBoundary = frame.y - threshold;\n if (\n dragPoint.y < topSnapBoundary ||\n (topSnapBoundary === 0 && dragPoint.y <= 0)\n ) {\n return \"top\";\n }\n return null;\n}\n\nexport function rectsEqual(\n left: WorkbenchFrame,\n right: WorkbenchFrame\n): boolean {\n return (\n left.x === right.x &&\n left.y === right.y &&\n left.width === right.width &&\n left.height === right.height\n );\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n\nfunction getGridLayoutFrames(\n itemCount: number,\n columns: number,\n frame: WorkbenchFrame,\n constraints: WorkbenchLayoutConstraints\n): WorkbenchFrame[] | null {\n const rows = Math.ceil(itemCount / columns);\n const horizontalGap =\n WORKBENCH_LAYOUT_PRESET_GAP_PX * Math.max(0, columns - 1);\n const verticalGap = WORKBENCH_LAYOUT_PRESET_GAP_PX * Math.max(0, rows - 1);\n const cellWidth = Math.floor((frame.width - horizontalGap) / columns);\n const cellHeight = Math.floor((frame.height - verticalGap) / rows);\n\n if (cellWidth < constraints.minWidth || cellHeight < constraints.minHeight) {\n return null;\n }\n\n const contentHeight =\n rows * cellHeight + (rows - 1) * WORKBENCH_LAYOUT_PRESET_GAP_PX;\n let index = 0;\n const frames: WorkbenchFrame[] = [];\n\n for (let rowIndex = 0; rowIndex < rows; rowIndex += 1) {\n const remaining = itemCount - index;\n const itemsInRow = Math.min(columns, remaining);\n const rowWidth =\n itemsInRow * cellWidth +\n Math.max(0, itemsInRow - 1) * WORKBENCH_LAYOUT_PRESET_GAP_PX;\n const rowX = frame.x + Math.round((frame.width - rowWidth) / 2);\n const rowY =\n frame.y +\n Math.round((frame.height - contentHeight) / 2) +\n rowIndex * (cellHeight + WORKBENCH_LAYOUT_PRESET_GAP_PX);\n\n for (let columnIndex = 0; columnIndex < itemsInRow; columnIndex += 1) {\n frames.push({\n x: rowX + columnIndex * (cellWidth + WORKBENCH_LAYOUT_PRESET_GAP_PX),\n y: rowY,\n width: cellWidth,\n height: cellHeight\n });\n index += 1;\n }\n }\n\n return frames;\n}\n\nfunction getBalancedLayoutFrames(\n itemCount: number,\n frame: WorkbenchFrame,\n constraints: WorkbenchLayoutConstraints\n): WorkbenchFrame[] | null {\n if (itemCount === 1) {\n return [frame];\n }\n\n if (itemCount === 2) {\n return getGridLayoutFrames(itemCount, 2, frame, constraints);\n }\n\n if (itemCount >= 4) {\n return getBestBalancedGridLayoutFrames(itemCount, frame, constraints);\n }\n\n const gap = WORKBENCH_LAYOUT_PRESET_GAP_PX;\n const primaryWidth = Math.floor((frame.width - gap) * 0.58);\n const secondaryWidth = frame.width - gap - primaryWidth;\n\n if (\n primaryWidth < constraints.minWidth ||\n secondaryWidth < constraints.minWidth\n ) {\n return null;\n }\n\n const secondaryCount = itemCount - 1;\n const verticalGap =\n WORKBENCH_LAYOUT_PRESET_GAP_PX * Math.max(0, secondaryCount - 1);\n const secondaryHeight = Math.floor(\n (frame.height - verticalGap) / secondaryCount\n );\n\n if (secondaryHeight < constraints.minHeight) {\n return null;\n }\n\n const frames: WorkbenchFrame[] = [\n {\n x: frame.x,\n y: frame.y,\n width: primaryWidth,\n height: frame.height\n }\n ];\n\n const secondaryX = frame.x + primaryWidth + gap;\n for (let index = 0; index < secondaryCount; index += 1) {\n frames.push({\n x: secondaryX,\n y: frame.y + index * (secondaryHeight + WORKBENCH_LAYOUT_PRESET_GAP_PX),\n width: secondaryWidth,\n height: secondaryHeight\n });\n }\n\n return frames;\n}\n\nfunction getBestBalancedGridLayoutFrames(\n itemCount: number,\n frame: WorkbenchFrame,\n constraints: WorkbenchLayoutConstraints\n): WorkbenchFrame[] | null {\n let best: {\n columns: number;\n emptySlots: number;\n frames: WorkbenchFrame[];\n shapeDistance: number;\n } | null = null;\n\n for (let columns = 2; columns <= itemCount; columns += 1) {\n const rows = Math.ceil(itemCount / columns);\n const frames = getGridLayoutFrames(itemCount, columns, frame, constraints);\n if (!frames) {\n continue;\n }\n\n const candidate = {\n columns,\n emptySlots: rows * columns - itemCount,\n frames,\n shapeDistance: Math.abs(columns - rows)\n };\n\n if (\n !best ||\n candidate.shapeDistance < best.shapeDistance ||\n (candidate.shapeDistance === best.shapeDistance &&\n candidate.emptySlots < best.emptySlots) ||\n (candidate.shapeDistance === best.shapeDistance &&\n candidate.emptySlots === best.emptySlots &&\n candidate.columns < best.columns)\n ) {\n best = candidate;\n }\n }\n\n return best?.frames ?? null;\n}\n\nfunction getSingleColumnLayoutFrames(\n itemCount: number,\n frame: WorkbenchFrame,\n constraints: WorkbenchLayoutConstraints\n): WorkbenchFrame[] | null {\n const verticalGap =\n WORKBENCH_LAYOUT_PRESET_GAP_PX * Math.max(0, itemCount - 1);\n const cellHeight = Math.floor((frame.height - verticalGap) / itemCount);\n\n if (cellHeight < constraints.minHeight) {\n return null;\n }\n\n const frames: WorkbenchFrame[] = [];\n for (let index = 0; index < itemCount; index += 1) {\n frames.push({\n x: frame.x,\n y: frame.y + index * (cellHeight + WORKBENCH_LAYOUT_PRESET_GAP_PX),\n width: frame.width,\n height: cellHeight\n });\n }\n\n return frames;\n}\n","import type { WorkbenchNode } from \"./types.ts\";\n\nexport function normalizeWorkbenchStack(\n nodes: readonly WorkbenchNode[],\n stack: readonly string[]\n): string[] {\n const nodeIDs = new Set(nodes.map((node) => node.id));\n const normalized = Array.from(new Set(stack)).filter((id) => nodeIDs.has(id));\n\n for (const node of nodes) {\n if (!normalized.includes(node.id)) {\n normalized.push(node.id);\n }\n }\n\n return normalized;\n}\n\nexport function focusWorkbenchStack(\n stack: readonly string[],\n nodeID: string\n): string[] {\n return [...stack.filter((id) => id !== nodeID), nodeID];\n}\n\nexport function removeFromWorkbenchStack(\n stack: readonly string[],\n nodeID: string\n): string[] {\n return stack.filter((id) => id !== nodeID);\n}\n\nexport function orderWorkbenchNodesForRender<TData>(\n nodes: readonly WorkbenchNode<TData>[],\n stack: readonly string[]\n): WorkbenchNode<TData>[] {\n const order = new Map(stack.map((id, index) => [id, index]));\n return [...nodes].sort(\n (left, right) =>\n (order.get(left.id) ?? Number.MAX_SAFE_INTEGER) -\n (order.get(right.id) ?? Number.MAX_SAFE_INTEGER)\n );\n}\n","import type { WorkbenchAction } from \"./actions.ts\";\nimport {\n clampWorkbenchDragRect,\n clampWorkbenchRect,\n clampWorkbenchRectToVisibleArea,\n getWorkbenchFullscreenRect,\n getWorkbenchLayoutPresetFrames,\n getWorkbenchQuickLayoutRect,\n getWorkbenchSnapRect,\n normalizeWorkbenchLayoutConstraints,\n rectsEqual\n} from \"./geometry.ts\";\nimport {\n focusWorkbenchStack,\n normalizeWorkbenchStack,\n removeFromWorkbenchStack\n} from \"./stack.ts\";\nimport {\n defaultWorkbenchSurfaceSize,\n defaultWorkbenchLayoutConstraints,\n type WorkbenchNode,\n type WorkbenchState\n} from \"./types.ts\";\n\nexport function createWorkbenchInitialState<TData = unknown>(\n partial: Partial<WorkbenchState<TData>> = {}\n): WorkbenchState<TData> {\n const nodes = partial.nodes ?? [];\n return {\n nodes,\n nodeStack: normalizeWorkbenchStack(nodes, partial.nodeStack ?? []),\n activeDragNodeId: partial.activeDragNodeId ?? null,\n activeResizeNodeId: partial.activeResizeNodeId ?? null,\n activeSnapTarget: partial.activeSnapTarget ?? null,\n surfaceSize: partial.surfaceSize ?? defaultWorkbenchSurfaceSize,\n layoutConstraints: normalizeWorkbenchLayoutConstraints(\n partial.layoutConstraints ?? defaultWorkbenchLayoutConstraints\n )\n };\n}\n\nexport function reduceWorkbenchState<TData>(\n state: WorkbenchState<TData>,\n action: WorkbenchAction<TData>\n): WorkbenchState<TData> {\n switch (action.type) {\n case \"replaceState\": {\n const nextState = createWorkbenchInitialState({\n ...state,\n ...action.state\n });\n if (\n state.nodes === nextState.nodes &&\n state.nodeStack === nextState.nodeStack &&\n state.activeDragNodeId === nextState.activeDragNodeId &&\n state.activeResizeNodeId === nextState.activeResizeNodeId &&\n state.activeSnapTarget === nextState.activeSnapTarget &&\n state.surfaceSize === nextState.surfaceSize &&\n layoutConstraintsEqual(\n state.layoutConstraints,\n nextState.layoutConstraints\n )\n ) {\n return state;\n }\n return nextState;\n }\n\n case \"replaceNodes\": {\n const nodeStack = normalizeWorkbenchStack(action.nodes, state.nodeStack);\n if (state.nodes === action.nodes && state.nodeStack === nodeStack) {\n return state;\n }\n return { ...state, nodes: action.nodes, nodeStack };\n }\n\n case \"openNode\": {\n const existing = state.nodes.some((node) => node.id === action.node.id);\n const nodes = existing\n ? state.nodes.map((node) =>\n node.id === action.node.id ? action.node : node\n )\n : [...state.nodes, action.node];\n return {\n ...state,\n nodes,\n nodeStack: focusWorkbenchStack(\n normalizeWorkbenchStack(nodes, state.nodeStack),\n action.node.id\n )\n };\n }\n\n case \"closeNode\":\n if (!state.nodes.some((node) => node.id === action.nodeID)) {\n return state;\n }\n return {\n ...state,\n nodes: state.nodes.filter((node) => node.id !== action.nodeID),\n nodeStack: removeFromWorkbenchStack(state.nodeStack, action.nodeID)\n };\n\n case \"focusNode\":\n if (!state.nodes.some((node) => node.id === action.nodeID)) {\n return state;\n }\n return {\n ...state,\n nodes: state.nodes.map((node) =>\n node.id === action.nodeID\n ? { ...node, isMinimized: false, minimizedAtUnixMs: null }\n : node\n ),\n nodeStack: focusWorkbenchStack(state.nodeStack, action.nodeID)\n };\n\n case \"minimizeNode\":\n return updateNode(state, action.nodeID, (node) =>\n node.isMinimized\n ? node\n : {\n ...node,\n isMinimized: true,\n minimizedAtUnixMs: Date.now()\n }\n );\n\n case \"restoreNode\":\n return updateNode(state, action.nodeID, (node) =>\n node.isMinimized\n ? { ...node, isMinimized: false, minimizedAtUnixMs: null }\n : node\n );\n\n case \"enterFullscreen\":\n return updateNode(state, action.nodeID, (node) => {\n if (node.displayMode === \"fullscreen\") {\n return node;\n }\n return {\n ...node,\n displayMode: \"fullscreen\",\n restoreFrame: node.frame,\n isMinimized: false,\n minimizedAtUnixMs: null,\n frame: getWorkbenchFullscreenRect(\n state.surfaceSize,\n state.layoutConstraints,\n node.sizeConstraints\n )\n };\n });\n\n case \"exitFullscreen\":\n return updateNode(state, action.nodeID, (node) => {\n if (node.displayMode !== \"fullscreen\") {\n return node;\n }\n return {\n ...node,\n displayMode: \"floating\",\n frame: node.restoreFrame ?? node.frame,\n restoreFrame: null\n };\n });\n\n case \"applyQuickLayout\":\n return updateNode(state, action.nodeID, (node) => {\n const frame = getWorkbenchQuickLayoutRect(\n action.target,\n state.surfaceSize,\n state.layoutConstraints,\n node.sizeConstraints\n );\n if (\n node.displayMode === \"floating\" &&\n !node.isMinimized &&\n node.restoreFrame === null &&\n rectsEqual(node.frame, frame)\n ) {\n return node;\n }\n return {\n ...node,\n frame,\n displayMode: \"floating\" as const,\n restoreFrame: null,\n isMinimized: false,\n minimizedAtUnixMs: null\n };\n });\n\n case \"applyLayoutPreset\": {\n const nodeIDs = uniqueKnownNodeIDs(state.nodes, action.nodeIDs);\n if (nodeIDs.length === 0) {\n return state;\n }\n\n const frames = getWorkbenchLayoutPresetFrames(\n nodeIDs.length,\n action.preset,\n state.surfaceSize,\n state.layoutConstraints\n );\n if (!frames) {\n return state;\n }\n\n const frameByNodeID = new Map(\n nodeIDs.map((nodeID, index) => [nodeID, frames[index]] as const)\n );\n const nodes: WorkbenchNode<TData>[] = state.nodes.map((node) => {\n const frame = frameByNodeID.get(node.id);\n if (!frame) {\n return node;\n }\n const nextFrame = clampWorkbenchRect(\n frame,\n state.surfaceSize,\n state.layoutConstraints,\n node.sizeConstraints\n );\n return {\n ...node,\n frame: nextFrame,\n displayMode: \"floating\" as const,\n restoreFrame: null,\n isMinimized: false,\n minimizedAtUnixMs: null\n };\n });\n\n let nodeStack = state.nodeStack;\n for (const nodeID of nodeIDs) {\n nodeStack = focusWorkbenchStack(nodeStack, nodeID);\n }\n\n return { ...state, nodes, nodeStack };\n }\n\n case \"applyActiveSnapTarget\":\n case \"applySnapTarget\":\n return updateNode(state, action.nodeID, (node) => {\n const frame = getWorkbenchSnapRect(\n action.type === \"applySnapTarget\"\n ? action.snapTarget\n : state.activeSnapTarget,\n state.surfaceSize,\n state.layoutConstraints,\n node.sizeConstraints\n );\n if (!frame) {\n return node;\n }\n if (\n node.displayMode === \"floating\" &&\n !node.isMinimized &&\n node.restoreFrame === null &&\n rectsEqual(node.frame, frame)\n ) {\n return node;\n }\n return {\n ...node,\n frame,\n displayMode: \"floating\",\n restoreFrame: null,\n isMinimized: false,\n minimizedAtUnixMs: null\n };\n });\n\n case \"dragNode\":\n return updateNode(state, action.nodeID, (node) => {\n const frame = clampWorkbenchDragRect(\n action.frame,\n state.surfaceSize,\n state.layoutConstraints,\n node.sizeConstraints\n );\n if (rectsEqual(node.frame, frame)) {\n return node;\n }\n return {\n ...node,\n frame,\n displayMode: \"floating\",\n restoreFrame:\n node.displayMode === \"fullscreen\" ? node.restoreFrame : null\n };\n });\n\n case \"moveNode\":\n case \"resizeNode\":\n return updateNode(state, action.nodeID, (node) => {\n const frame = clampWorkbenchRect(\n action.frame,\n state.surfaceSize,\n state.layoutConstraints,\n node.sizeConstraints\n );\n if (rectsEqual(node.frame, frame)) {\n return node;\n }\n return {\n ...node,\n frame,\n displayMode: \"floating\",\n restoreFrame:\n node.displayMode === \"fullscreen\" ? node.restoreFrame : null\n };\n });\n\n case \"setActiveDragNode\":\n if (state.activeDragNodeId === action.nodeID) {\n return state;\n }\n return { ...state, activeDragNodeId: action.nodeID };\n\n case \"setActiveResizeNode\":\n if (state.activeResizeNodeId === action.nodeID) {\n return state;\n }\n return { ...state, activeResizeNodeId: action.nodeID };\n\n case \"setActiveSnapTarget\":\n if (state.activeSnapTarget === action.snapTarget) {\n return state;\n }\n return { ...state, activeSnapTarget: action.snapTarget };\n\n case \"setSurfaceSize\":\n if (\n state.surfaceSize.width === action.size.width &&\n state.surfaceSize.height === action.size.height\n ) {\n return state;\n }\n return {\n ...state,\n surfaceSize: action.size,\n nodes: state.nodes.map((node) =>\n node.displayMode === \"fullscreen\"\n ? {\n ...node,\n frame: getWorkbenchFullscreenRect(\n action.size,\n state.layoutConstraints,\n node.sizeConstraints\n )\n }\n : {\n ...node,\n frame: clampWorkbenchRectToVisibleArea(\n node.frame,\n action.size,\n state.layoutConstraints,\n undefined,\n node.sizeConstraints\n )\n }\n )\n };\n\n case \"setLayoutConstraints\": {\n const constraints = normalizeWorkbenchLayoutConstraints({\n ...state.layoutConstraints,\n ...action.constraints,\n safeArea: {\n ...state.layoutConstraints.safeArea,\n ...action.constraints.safeArea\n }\n });\n if (\n state.layoutConstraints.minWidth === constraints.minWidth &&\n state.layoutConstraints.minHeight === constraints.minHeight &&\n state.layoutConstraints.surfacePadding === constraints.surfacePadding &&\n state.layoutConstraints.safeArea.top === constraints.safeArea.top &&\n state.layoutConstraints.safeArea.right === constraints.safeArea.right &&\n state.layoutConstraints.safeArea.bottom ===\n constraints.safeArea.bottom &&\n state.layoutConstraints.safeArea.left === constraints.safeArea.left\n ) {\n return state;\n }\n return {\n ...state,\n layoutConstraints: constraints,\n nodes: state.nodes.map((node) =>\n node.displayMode === \"fullscreen\"\n ? {\n ...node,\n frame: getWorkbenchFullscreenRect(\n state.surfaceSize,\n constraints,\n node.sizeConstraints\n )\n }\n : {\n ...node,\n frame: clampWorkbenchRectToVisibleArea(\n node.frame,\n state.surfaceSize,\n constraints,\n undefined,\n node.sizeConstraints\n ),\n restoreFrame: node.restoreFrame\n ? clampWorkbenchRectToVisibleArea(\n node.restoreFrame,\n state.surfaceSize,\n constraints,\n undefined,\n node.sizeConstraints\n )\n : null\n }\n )\n };\n }\n\n case \"setNodeSizeConstraints\":\n return updateNode(state, action.nodeID, (node) => {\n if (\n sizeConstraintsEqual(node.sizeConstraints, action.sizeConstraints)\n ) {\n return node;\n }\n const frame =\n node.displayMode === \"fullscreen\"\n ? getWorkbenchFullscreenRect(\n state.surfaceSize,\n state.layoutConstraints,\n action.sizeConstraints\n )\n : clampWorkbenchRectToVisibleArea(\n node.frame,\n state.surfaceSize,\n state.layoutConstraints,\n undefined,\n action.sizeConstraints\n );\n const restoreFrame = node.restoreFrame\n ? clampWorkbenchRectToVisibleArea(\n node.restoreFrame,\n state.surfaceSize,\n state.layoutConstraints,\n undefined,\n action.sizeConstraints\n )\n : null;\n return {\n ...node,\n frame,\n restoreFrame,\n sizeConstraints: action.sizeConstraints\n };\n });\n }\n}\n\nfunction layoutConstraintsEqual(\n left: WorkbenchState[\"layoutConstraints\"],\n right: WorkbenchState[\"layoutConstraints\"]\n): boolean {\n return (\n left.minWidth === right.minWidth &&\n left.minHeight === right.minHeight &&\n left.surfacePadding === right.surfacePadding &&\n left.safeArea.top === right.safeArea.top &&\n left.safeArea.right === right.safeArea.right &&\n left.safeArea.bottom === right.safeArea.bottom &&\n left.safeArea.left === right.safeArea.left\n );\n}\n\nfunction sizeConstraintsEqual(\n left: WorkbenchNode[\"sizeConstraints\"],\n right: WorkbenchNode[\"sizeConstraints\"]\n): boolean {\n return (\n (left?.minWidth ?? null) === (right?.minWidth ?? null) &&\n (left?.minHeight ?? null) === (right?.minHeight ?? null)\n );\n}\n\nfunction updateNode<TData>(\n state: WorkbenchState<TData>,\n nodeID: string,\n update: (node: WorkbenchNode<TData>) => WorkbenchNode<TData>\n): WorkbenchState<TData> {\n let changed = false;\n const nodes = state.nodes.map((node) => {\n if (node.id !== nodeID) {\n return node;\n }\n\n const nextNode = update(node);\n changed = changed || nextNode !== node;\n return nextNode;\n });\n\n if (!changed) {\n return state;\n }\n\n return {\n ...state,\n nodes,\n nodeStack: focusWorkbenchStack(state.nodeStack, nodeID)\n };\n}\n\nfunction uniqueKnownNodeIDs<TData>(\n nodes: readonly WorkbenchNode<TData>[],\n nodeIDs: readonly string[]\n): string[] {\n const knownNodeIDs = new Set(nodes.map((node) => node.id));\n const orderedNodeIDs: string[] = [];\n\n for (const nodeID of nodeIDs) {\n if (!knownNodeIDs.has(nodeID) || orderedNodeIDs.includes(nodeID)) {\n continue;\n }\n orderedNodeIDs.push(nodeID);\n }\n\n return orderedNodeIDs;\n}\n","import type { WorkbenchListener, WorkbenchUnsubscribe } from \"./types.ts\";\n\nexport function createWorkbenchSubscriptionSet() {\n const listeners = new Set<WorkbenchListener>();\n\n return {\n subscribe(listener: WorkbenchListener): WorkbenchUnsubscribe {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n notify(): void {\n for (const listener of listeners) {\n listener();\n }\n }\n };\n}\n","import type { WorkbenchAction } from \"../core/actions.ts\";\nimport {\n createWorkbenchInitialState,\n reduceWorkbenchState\n} from \"../core/reducer.ts\";\nimport type { WorkbenchState } from \"../core/types.ts\";\nimport { createWorkbenchSubscriptionSet } from \"./subscribe.ts\";\nimport type { WorkbenchDebugDiagnostics, WorkbenchStore } from \"./types.ts\";\n\nexport function createWorkbenchStore<TData = unknown>(\n initialState: Partial<WorkbenchState<TData>> = {},\n options: { debugDiagnostics?: WorkbenchDebugDiagnostics } = {}\n): WorkbenchStore<TData> {\n let state = createWorkbenchInitialState(initialState);\n const subscriptions = createWorkbenchSubscriptionSet();\n\n return {\n getSnapshot() {\n return state;\n },\n subscribe(listener) {\n return subscriptions.subscribe(listener);\n },\n dispatch(action: WorkbenchAction<TData>) {\n const nextState = reduceWorkbenchState(state, action);\n if (nextState === state) {\n return;\n }\n\n logWorkbenchFrameChanges(action, state, nextState, options);\n state = nextState;\n subscriptions.notify();\n }\n };\n}\n\nfunction logWorkbenchFrameChanges<TData>(\n action: WorkbenchAction<TData>,\n previousState: WorkbenchState<TData>,\n nextState: WorkbenchState<TData>,\n options: { debugDiagnostics?: WorkbenchDebugDiagnostics }\n): void {\n if (!options.debugDiagnostics?.isEnabled()) {\n return;\n }\n\n const previousNodesByID = new Map(\n previousState.nodes.map((node) => [node.id, node])\n );\n const changes = nextState.nodes\n .map((node) => {\n const previousNode = previousNodesByID.get(node.id);\n if (!previousNode) {\n return {\n id: node.id,\n kind: \"opened\",\n nextFrame: node.frame\n };\n }\n if (\n previousNode.frame.x === node.frame.x &&\n previousNode.frame.y === node.frame.y &&\n previousNode.frame.width === node.frame.width &&\n previousNode.frame.height === node.frame.height\n ) {\n return null;\n }\n return {\n id: node.id,\n kind: \"frame-changed\",\n nextFrame: node.frame,\n previousFrame: previousNode.frame\n };\n })\n .filter((change): change is NonNullable<typeof change> => change !== null);\n\n if (changes.length === 0) {\n return;\n }\n\n console.info(\"[workbench:frame]\", {\n action: summarizeWorkbenchAction(action),\n changes,\n nextSurfaceSize: nextState.surfaceSize,\n previousSurfaceSize: previousState.surfaceSize\n });\n void Promise.resolve(\n options.debugDiagnostics.log?.({\n details: {\n action: summarizeWorkbenchAction(action),\n changes,\n nextSurfaceSize: nextState.surfaceSize,\n previousSurfaceSize: previousState.surfaceSize\n },\n event: \"frame-changed\",\n level: \"info\",\n source: \"workbench-frame\"\n })\n ).catch(() => undefined);\n}\n\nfunction summarizeWorkbenchAction<TData>(\n action: WorkbenchAction<TData>\n): Record<string, unknown> {\n switch (action.type) {\n case \"replaceState\":\n return {\n type: action.type,\n nodeCount: action.state.nodes?.length,\n nodeStack: action.state.nodeStack,\n surfaceSize: action.state.surfaceSize\n };\n case \"replaceNodes\":\n return {\n type: action.type,\n nodeIDs: action.nodes.map((node) => node.id)\n };\n case \"openNode\":\n return {\n type: action.type,\n frame: action.node.frame,\n nodeID: action.node.id\n };\n case \"dragNode\":\n case \"moveNode\":\n case \"resizeNode\":\n return {\n type: action.type,\n frame: action.frame,\n nodeID: action.nodeID\n };\n case \"setSurfaceSize\":\n return {\n type: action.type,\n size: action.size\n };\n case \"setLayoutConstraints\":\n return {\n type: action.type,\n constraints: action.constraints\n };\n case \"applyQuickLayout\":\n return {\n type: action.type,\n nodeID: action.nodeID,\n target: action.target\n };\n case \"applyLayoutPreset\":\n return {\n type: action.type,\n nodeIDs: action.nodeIDs,\n preset: action.preset\n };\n case \"applySnapTarget\":\n return {\n type: action.type,\n nodeID: action.nodeID,\n snapTarget: action.snapTarget\n };\n default:\n return \"nodeID\" in action\n ? { type: action.type, nodeID: action.nodeID }\n : { type: action.type };\n }\n}\n","import type { WorkbenchState } from \"../core/types.ts\";\nimport { createWorkbenchCommands } from \"./commands.ts\";\nimport { createWorkbenchStore } from \"./createWorkbenchStore.ts\";\nimport type {\n WorkbenchController,\n WorkbenchDebugDiagnostics\n} from \"./types.ts\";\n\nexport function createWorkbenchController<TData = unknown>(\n initialState: Partial<WorkbenchState<TData>> = {},\n options: { debugDiagnostics?: WorkbenchDebugDiagnostics } = {}\n): WorkbenchController<TData> {\n const store = createWorkbenchStore(initialState, options);\n\n return {\n ...store,\n commands: createWorkbenchCommands(store)\n };\n}\n","import { useMemo } from \"react\";\nimport {\n WorkbenchMissionControlBackdrop,\n WorkbenchMissionControlOverlay\n} from \"../mission-control/WorkbenchMissionControlOverlay.tsx\";\nimport { useWorkbenchMissionControlPresence } from \"../mission-control/useWorkbenchMissionControlPresence.ts\";\nimport { useWorkbenchMissionControlState } from \"../mission-control/useWorkbenchMissionControlState.ts\";\nimport { WorkbenchSurface } from \"../react/WorkbenchSurface.tsx\";\nimport {\n resolveWorkbenchHostDockEntries,\n resolveWorkbenchHostRuntimeConfig\n} from \"./hostConfig.ts\";\nimport type { WorkbenchHostNodeData, WorkbenchHostProps } from \"./types.ts\";\nimport { useWorkbenchHostRuntime } from \"./useWorkbenchHostRuntime.ts\";\nimport { useWorkbenchHostSurfaceRenderers } from \"./useWorkbenchHostSurfaceRenderers.tsx\";\n\nconst noop = () => {};\n\nexport function WorkbenchHost({\n captureNodePreviewImage,\n className,\n contributions,\n debugDiagnostics,\n dockPreviewCache,\n dockPlacement,\n dockEntries,\n dockStateSource,\n externalStateSource,\n i18n,\n layoutConstraints,\n missionControl,\n minimizeAnimation,\n nodes,\n onDockEntryAction,\n onDockEntryClick,\n onHandleReady,\n onLaunchRequest,\n onMissionControlAdapterReady,\n onMissionControlRequestOpen,\n onNodeCloseRequest,\n projectedNodes,\n renderBottomChrome,\n renderTopChrome,\n snapshotRepository,\n shortcutsEnabled,\n wallpaper,\n workspaceId\n}: WorkbenchHostProps) {\n const hostRuntimeConfig = useMemo(\n () =>\n resolveWorkbenchHostRuntimeConfig({\n contributions,\n externalStateSource,\n nodes,\n onLaunchRequest,\n onNodeCloseRequest\n }),\n [\n contributions,\n externalStateSource,\n nodes,\n onLaunchRequest,\n onNodeCloseRequest\n ]\n );\n const hostDockEntries = useMemo(\n () =>\n resolveWorkbenchHostDockEntries({\n contributions,\n dockEntries\n }),\n [contributions, dockEntries]\n );\n const missionControlMode = missionControl?.mode ?? null;\n const missionControlNodeIds = missionControl?.nodeIds;\n const missionControlClose = missionControl?.onRequestClose ?? noop;\n const missionControlEnabled =\n missionControlMode !== null || onMissionControlAdapterReady !== undefined;\n const {\n chromeContext,\n externalStateRevision,\n hostI18n,\n hostSession,\n isHydrating,\n missionControlI18n,\n missionControlAdapter,\n nodeDefinitionByType,\n windowChromeI18n\n } = useWorkbenchHostRuntime({\n debugDiagnostics,\n externalStateSource: hostRuntimeConfig.externalStateSource,\n i18n,\n missionControlEnabled,\n nodes: hostRuntimeConfig.nodes,\n onHandleReady,\n onLaunchRequest: hostRuntimeConfig.onLaunchRequest,\n onMissionControlAdapterReady,\n onNodeCloseRequest: hostRuntimeConfig.onNodeCloseRequest,\n projectedNodes,\n snapshotRepository,\n workspaceId\n });\n const surfaceRenderers = useWorkbenchHostSurfaceRenderers({\n captureNodePreviewImage,\n chromeContext,\n debugDiagnostics,\n dockPreviewCache,\n dockPlacement,\n dockStateSource,\n dockEntries: hostDockEntries,\n externalStateSource: hostRuntimeConfig.externalStateSource,\n externalStateRevision,\n hostI18n,\n hostSession,\n nodeDefinitionByType,\n onDockEntryAction,\n onDockEntryClick,\n onMissionControlRequestOpen,\n renderBottomChrome,\n renderTopChrome,\n workspaceId\n });\n const missionControlState = useWorkbenchMissionControlState({\n adapter: missionControlAdapter,\n mode: missionControlMode,\n nodeIds: missionControlNodeIds,\n onRequestClose: missionControlClose\n });\n const missionControlPresence =\n useWorkbenchMissionControlPresence(missionControlState);\n const missionControlRenderedState = missionControlPresence.state;\n\n return (\n <WorkbenchSurface<WorkbenchHostNodeData>\n className={className}\n captureNodePreviewImage={surfaceRenderers.captureNodePreviewImage}\n controller={hostSession.controller}\n dockPreviewCache={dockPreviewCache}\n dockPlacement={dockPlacement}\n interactive={!isHydrating}\n layoutConstraints={layoutConstraints}\n missionControlPhase={missionControlPresence.phase}\n minimizeAnimation={minimizeAnimation}\n presentation={missionControlState?.presentation ?? null}\n renderBackdrop={\n missionControlRenderedState\n ? () => (\n <WorkbenchMissionControlBackdrop\n onExitTransitionComplete={() =>\n missionControlPresence.completeExitTransition()\n }\n phase={missionControlPresence.phase}\n />\n )\n : undefined\n }\n renderBottomChrome={surfaceRenderers.renderBottomChrome}\n renderDock={surfaceRenderers.renderDock}\n renderNode={surfaceRenderers.renderNode}\n renderOverlay={\n missionControlRenderedState\n ? () => (\n <WorkbenchMissionControlOverlay\n i18n={missionControlI18n}\n phase={missionControlPresence.phase}\n state={missionControlRenderedState}\n />\n )\n : undefined\n }\n renderTopChrome={surfaceRenderers.renderTopChrome}\n renderWindowActions={surfaceRenderers.renderWindowActions}\n renderWindowHeader={surfaceRenderers.renderWindowHeader}\n shouldKeepMinimizedNodeMounted={\n surfaceRenderers.shouldKeepMinimizedNodeMounted\n }\n resolveDockPreviewCacheKey={surfaceRenderers.resolveDockPreviewCacheKey}\n resolveFullscreenHeaderMode={surfaceRenderers.resolveFullscreenHeaderMode}\n resolveDockAnchorKey={surfaceRenderers.resolveDockAnchorKey}\n shortcutsEnabled={shortcutsEnabled}\n shouldCaptureNodePreviewImage={\n surfaceRenderers.shouldCaptureNodePreviewImage\n }\n wallpaper={wallpaper}\n windowChromeI18n={windowChromeI18n}\n windowChromeMode={surfaceRenderers.windowChromeMode}\n />\n );\n}\n","import {\n useLayoutEffect,\n useRef,\n useState,\n type ComponentType,\n type TransitionEvent\n} from \"react\";\nimport {\n AppWindowIcon,\n Button,\n GridHorizontalLinedIcon,\n GridVerticalLinedIcon,\n type IconProps\n} from \"@tutti-os/ui-system\";\nimport {\n shouldShowWorkbenchMissionControlLayoutHint,\n shouldShowWorkbenchMissionControlLayoutPreset,\n shouldShowWorkbenchMissionControlNoAvailableLayoutMessage\n} from \"./layoutDock.ts\";\nimport type { WorkbenchMissionControlState } from \"./useWorkbenchMissionControlState.ts\";\nimport type { WorkbenchMissionControlPhase } from \"./useWorkbenchMissionControlPresence.ts\";\nimport type { WorkbenchMissionControlI18nRuntime } from \"./workbenchMissionControlI18n.ts\";\n\nexport interface WorkbenchMissionControlBackdropProps {\n className?: string;\n onExitTransitionComplete?: () => void;\n phase: WorkbenchMissionControlPhase;\n}\n\nexport function WorkbenchMissionControlBackdrop({\n className,\n onExitTransitionComplete,\n phase\n}: WorkbenchMissionControlBackdropProps) {\n return (\n <div\n aria-hidden\n className={[\"workbench-mission-control-backdrop\", className]\n .filter(Boolean)\n .join(\" \")}\n data-phase={phase}\n onTransitionEnd={(event: TransitionEvent<HTMLDivElement>) => {\n if (\n phase !== \"closing\" ||\n event.target !== event.currentTarget ||\n event.propertyName !== \"opacity\"\n ) {\n return;\n }\n onExitTransitionComplete?.();\n }}\n />\n );\n}\n\nexport interface WorkbenchMissionControlOverlayProps {\n i18n: WorkbenchMissionControlI18nRuntime;\n phase: WorkbenchMissionControlPhase;\n state: WorkbenchMissionControlState;\n}\n\nexport function WorkbenchMissionControlOverlay({\n i18n,\n phase,\n state\n}: WorkbenchMissionControlOverlayProps) {\n const layoutDockContentRef = useRef<HTMLDivElement | null>(null);\n const [layoutDockWidth, setLayoutDockWidth] = useState<number | null>(null);\n const layoutPresets: Array<{\n icon: ComponentType<IconProps>;\n key: \"balanced\" | \"row\" | \"column\";\n label: string;\n preset: { kind: \"balanced\" } | { kind: \"row\" } | { kind: \"column\" };\n }> = [\n {\n icon: AppWindowIcon,\n key: \"balanced\" as const,\n label: i18n.t(\"presets.balanced\"),\n preset: { kind: \"balanced\" } as const\n },\n {\n icon: GridHorizontalLinedIcon,\n key: \"row\" as const,\n label: i18n.t(\"presets.row\"),\n preset: { kind: \"row\" } as const\n },\n {\n icon: GridVerticalLinedIcon,\n key: \"column\" as const,\n label: i18n.t(\"presets.column\"),\n preset: { kind: \"column\" } as const\n }\n ].filter((option) =>\n shouldShowWorkbenchMissionControlLayoutPreset(\n state.selectedCount,\n option.preset\n )\n );\n const showLayoutSelectionHint = shouldShowWorkbenchMissionControlLayoutHint(\n state.selectedCount\n );\n const hasUsableLayoutPreset = layoutPresets.some((option) =>\n state.canUsePreset(option.preset)\n );\n const showNoAvailableLayoutMessage =\n shouldShowWorkbenchMissionControlNoAvailableLayoutMessage(\n state.selectedCount,\n hasUsableLayoutPreset\n );\n\n useLayoutEffect(() => {\n const element = layoutDockContentRef.current;\n if (!element) {\n return;\n }\n const computedStyle = window.getComputedStyle(element.parentElement!);\n const horizontalChrome =\n Number.parseFloat(computedStyle.paddingLeft) +\n Number.parseFloat(computedStyle.paddingRight) +\n Number.parseFloat(computedStyle.borderLeftWidth) +\n Number.parseFloat(computedStyle.borderRightWidth);\n setLayoutDockWidth(element.scrollWidth + horizontalChrome);\n }, [\n i18n,\n layoutPresets.length,\n showLayoutSelectionHint,\n showNoAvailableLayoutMessage,\n state.selectedCount\n ]);\n\n return (\n <div\n className=\"workbench-mission-control pointer-events-none absolute inset-0 z-[1100] overflow-hidden\"\n data-phase={phase}\n >\n {state.mode === \"layout\" ? (\n <div className=\"workbench-mission-control__footer-shell pointer-events-none absolute inset-x-0 bottom-0 flex justify-center px-6 pb-6\">\n <div\n className=\"workbench-mission-control__layout-dock desktop-dock-plate pointer-events-auto\"\n style={\n layoutDockWidth === null ? undefined : { width: layoutDockWidth }\n }\n onClick={(event) => event.stopPropagation()}\n >\n <div\n ref={layoutDockContentRef}\n className=\"workbench-mission-control__layout-dock-content\"\n >\n {showLayoutSelectionHint ? (\n <span className=\"workbench-mission-control__layout-hint\">\n {i18n.t(\"layoutSelectionHint\")}\n </span>\n ) : showNoAvailableLayoutMessage ? (\n <span className=\"workbench-mission-control__layout-hint\">\n {i18n.t(\"noAvailableLayout\")}\n </span>\n ) : (\n <div className=\"flex items-end gap-2\">\n {layoutPresets.map((option) => {\n const canApply = state.canApplyPreset(option.preset);\n const LayoutIcon = option.icon;\n\n return (\n <Button\n key={option.key}\n aria-label={option.label}\n className=\"workbench-mission-control__layout-dock-button\"\n data-layout-key={option.key}\n disabled={!canApply}\n size=\"icon\"\n title={option.label}\n type=\"button\"\n variant=\"ghost\"\n onClick={() => state.applyPreset(option.preset)}\n >\n <LayoutIcon\n aria-hidden\n className=\"workbench-mission-control__layout-glyph\"\n />\n </Button>\n );\n })}\n </div>\n )}\n </div>\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n","import type { WorkbenchLayoutPreset } from \"../core/types.ts\";\n\nexport function shouldShowWorkbenchMissionControlLayoutHint(\n selectedCount: number\n): boolean {\n return selectedCount < 2;\n}\n\nexport function shouldShowWorkbenchMissionControlNoAvailableLayoutMessage(\n selectedCount: number,\n hasUsablePreset: boolean\n): boolean {\n return selectedCount >= 2 && !hasUsablePreset;\n}\n\nexport function shouldShowWorkbenchMissionControlLayoutPreset(\n selectedCount: number,\n preset: WorkbenchLayoutPreset\n): boolean {\n if (selectedCount === 2) {\n return preset.kind !== \"balanced\";\n }\n\n if (selectedCount >= 4) {\n return preset.kind === \"balanced\";\n }\n\n return true;\n}\n","import { useCallback, useLayoutEffect, useRef, useState } from \"react\";\nimport type { WorkbenchMissionControlState } from \"./useWorkbenchMissionControlState.ts\";\n\nexport type WorkbenchMissionControlPhase =\n | \"closed\"\n | \"entering\"\n | \"open\"\n | \"closing\";\n\nexport interface WorkbenchMissionControlPresence {\n completeExitTransition(): void;\n phase: WorkbenchMissionControlPhase;\n state: WorkbenchMissionControlState | null;\n}\n\nexport function useWorkbenchMissionControlPresence(\n state: WorkbenchMissionControlState | null\n): WorkbenchMissionControlPresence {\n const [renderedState, setRenderedState] =\n useState<WorkbenchMissionControlState | null>(state);\n const [phase, setPhase] = useState<WorkbenchMissionControlPhase>(\n state ? \"open\" : \"closed\"\n );\n const phaseRef = useRef<WorkbenchMissionControlPhase>(\n state ? \"open\" : \"closed\"\n );\n const enterFrameRef = useRef<number | null>(null);\n const setPresencePhase = useCallback(\n (nextPhase: WorkbenchMissionControlPhase) => {\n phaseRef.current = nextPhase;\n setPhase(nextPhase);\n },\n []\n );\n const completeExitTransition = useCallback(() => {\n if (phaseRef.current !== \"closing\") {\n return;\n }\n setRenderedState(null);\n setPresencePhase(\"closed\");\n }, [setPresencePhase]);\n\n useLayoutEffect(() => {\n if (enterFrameRef.current !== null) {\n window.cancelAnimationFrame(enterFrameRef.current);\n enterFrameRef.current = null;\n }\n\n if (state) {\n setRenderedState(state);\n if (phaseRef.current === \"closed\" || phaseRef.current === \"closing\") {\n setPresencePhase(\"entering\");\n }\n enterFrameRef.current = window.requestAnimationFrame(() => {\n setPresencePhase(\"open\");\n enterFrameRef.current = null;\n });\n\n return () => {\n if (enterFrameRef.current !== null) {\n window.cancelAnimationFrame(enterFrameRef.current);\n enterFrameRef.current = null;\n }\n };\n }\n\n if (renderedState === null) {\n setPresencePhase(\"closed\");\n return undefined;\n }\n\n setPresencePhase(\"closing\");\n return undefined;\n }, [renderedState, setPresencePhase, state]);\n\n return {\n completeExitTransition,\n phase,\n state: renderedState\n };\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport {\n useExternalStoreSnapshot,\n type ExternalStoreSnapshotSource\n} from \"@tutti-os/ui-react-hooks\";\nimport {\n defaultWorkbenchLayoutConstraints,\n defaultWorkbenchSurfaceSize,\n type WorkbenchLayoutConstraints,\n type WorkbenchFrame,\n type WorkbenchLayoutPreset,\n type WorkbenchSize\n} from \"../core/types.ts\";\nimport { getWorkbenchLayoutPresetFrames } from \"../core/geometry.ts\";\nimport type { WorkbenchSurfacePresentation } from \"../react/types.ts\";\nimport {\n orderWorkbenchNodesForMissionControl,\n resolveWorkbenchMissionControlPreviewLayout\n} from \"./layout.ts\";\nimport type {\n WorkbenchMissionControlAdapter,\n WorkbenchMissionControlMode\n} from \"./types.ts\";\n\nconst missionControlStagePaddingX = 24;\nconst missionControlStageTop = 64;\nconst missionControlStageBottom = 104;\nconst inactiveMissionControlSnapshotSource: ExternalStoreSnapshotSource<null> =\n {\n getSnapshot() {\n return null;\n },\n subscribe() {\n return () => {};\n }\n };\n\nexport interface WorkbenchMissionControlState {\n applyPreset(preset: WorkbenchLayoutPreset): void;\n canApplyPreset(preset: WorkbenchLayoutPreset): boolean;\n canUsePreset(preset: WorkbenchLayoutPreset): boolean;\n mode: WorkbenchMissionControlMode;\n presentation: WorkbenchSurfacePresentation;\n selectedCount: number;\n}\n\nexport function useWorkbenchMissionControlState<TData>({\n adapter,\n mode,\n nodeIds,\n onRequestClose\n}: {\n adapter: WorkbenchMissionControlAdapter<TData> | null;\n mode: WorkbenchMissionControlMode | null;\n nodeIds?: readonly string[];\n onRequestClose: () => void;\n}): WorkbenchMissionControlState | null {\n const isActive = mode !== null && adapter !== null;\n const snapshot = useExternalStoreSnapshot(\n isActive\n ? {\n getSnapshot() {\n return adapter.getSnapshot();\n },\n subscribe(listener) {\n return adapter.subscribe(listener);\n }\n }\n : inactiveMissionControlSnapshotSource\n );\n const layoutConstraints: WorkbenchLayoutConstraints =\n snapshot?.layoutConstraints ?? defaultWorkbenchLayoutConstraints;\n const surfaceSize: WorkbenchSize =\n snapshot?.surfaceSize ?? defaultWorkbenchSurfaceSize;\n const scopedNodeIdSet = useMemo(\n () => (nodeIds === undefined ? null : new Set(nodeIds)),\n [nodeIds]\n );\n const visibleNodes = useMemo(() => {\n const nextVisibleNodes = snapshot?.visibleNodes ?? [];\n if (scopedNodeIdSet === null) {\n return nextVisibleNodes;\n }\n return nextVisibleNodes.filter((node) => scopedNodeIdSet.has(node.id));\n }, [scopedNodeIdSet, snapshot?.visibleNodes]);\n const [selectedNodeIds, setSelectedNodeIds] = useState<string[]>([]);\n\n useEffect(() => {\n if (mode === null) {\n return;\n }\n setSelectedNodeIds([]);\n }, [mode]);\n\n useEffect(() => {\n if (mode !== null && visibleNodes.length === 0) {\n onRequestClose();\n }\n }, [mode, onRequestClose, visibleNodes.length]);\n\n const orderedNodes = useMemo(\n () => (isActive ? orderWorkbenchNodesForMissionControl(visibleNodes) : []),\n [isActive, visibleNodes]\n );\n const orderedSelectedNodeIds = useMemo(\n () =>\n orderedNodes\n .map((node) => node.id)\n .filter((nodeId) => selectedNodeIds.includes(nodeId)),\n [orderedNodes, selectedNodeIds]\n );\n\n const previewFrame = useMemo<WorkbenchFrame>(\n () =>\n isActive\n ? {\n x: missionControlStagePaddingX,\n y: missionControlStageTop,\n width: Math.max(\n 240,\n surfaceSize.width - missionControlStagePaddingX * 2\n ),\n height: Math.max(\n 180,\n surfaceSize.height -\n missionControlStageTop -\n missionControlStageBottom\n )\n }\n : {\n x: 0,\n y: 0,\n width: 0,\n height: 0\n },\n [isActive, surfaceSize]\n );\n const previewItems = useMemo(\n () =>\n isActive\n ? resolveWorkbenchMissionControlPreviewLayout({\n container: previewFrame,\n nodes: orderedNodes\n })\n : [],\n [isActive, orderedNodes, previewFrame]\n );\n const canUsePreset = useCallback(\n (nextPreset: WorkbenchLayoutPreset) =>\n orderedSelectedNodeIds.length < 2\n ? true\n : getWorkbenchLayoutPresetFrames(\n orderedSelectedNodeIds.length,\n nextPreset,\n surfaceSize,\n layoutConstraints\n ) !== null,\n [layoutConstraints, orderedSelectedNodeIds.length, surfaceSize]\n );\n const canApplyPreset = useCallback(\n (nextPreset: WorkbenchLayoutPreset) =>\n mode === \"layout\" &&\n orderedSelectedNodeIds.length >= 2 &&\n canUsePreset(nextPreset),\n [canUsePreset, mode, orderedSelectedNodeIds.length]\n );\n const applyActivationAndClose = useCallback(\n (nodeId: string) => {\n const nextAdapter = adapter;\n if (!nextAdapter) {\n return;\n }\n const nextSnapshot = nextAdapter.getSnapshot();\n if (!nextSnapshot.visibleNodes.some((node) => node.id === nodeId)) {\n return;\n }\n onRequestClose();\n window.requestAnimationFrame(() => {\n nextAdapter.focusNode(nodeId);\n });\n },\n [adapter, onRequestClose]\n );\n const applyLayoutAndClose = useCallback(\n (nodeIds: string[], nextPreset: WorkbenchLayoutPreset) => {\n if (!adapter || nodeIds.length < 2) {\n return;\n }\n onRequestClose();\n window.requestAnimationFrame(() => {\n adapter.applyLayoutPreset(nodeIds, nextPreset);\n });\n },\n [adapter, onRequestClose]\n );\n const onPreviewPress = useCallback(\n (nodeId: string) => {\n if (mode === null) {\n return;\n }\n if (mode === \"activate\") {\n applyActivationAndClose(nodeId);\n return;\n }\n\n setSelectedNodeIds((current) =>\n current.includes(nodeId)\n ? current.filter((entry) => entry !== nodeId)\n : [...current, nodeId]\n );\n },\n [applyActivationAndClose, mode]\n );\n const selectedNodeIdSet = useMemo(\n () => new Set(selectedNodeIds),\n [selectedNodeIds]\n );\n const applyPreset = useCallback(\n (nextPreset: WorkbenchLayoutPreset) => {\n if (!canApplyPreset(nextPreset)) {\n return;\n }\n applyLayoutAndClose(orderedSelectedNodeIds, nextPreset);\n },\n [applyLayoutAndClose, canApplyPreset, orderedSelectedNodeIds]\n );\n\n const presentation = useMemo<WorkbenchSurfacePresentation | null>(\n () =>\n mode === null\n ? null\n : {\n frameByNodeId: new Map(\n previewItems.map((item) => [item.node.id, item.frame])\n ),\n interaction: {\n mode,\n onBackdropPress: onRequestClose,\n onNodePress: onPreviewPress,\n selectedNodeIds: selectedNodeIdSet\n },\n mode: \"mission-control\",\n visibleNodeIds: new Set(orderedNodes.map((node) => node.id))\n },\n [\n mode,\n onPreviewPress,\n onRequestClose,\n orderedNodes,\n previewItems,\n selectedNodeIdSet\n ]\n );\n\n useEffect(() => {\n if (mode === null) {\n return undefined;\n }\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n onRequestClose();\n }\n };\n\n window.addEventListener(\"keydown\", onKeyDown, true);\n return () => {\n window.removeEventListener(\"keydown\", onKeyDown, true);\n };\n }, [mode, onRequestClose]);\n\n if (mode === null || presentation === null) {\n return null;\n }\n\n return {\n applyPreset,\n canApplyPreset,\n canUsePreset,\n mode,\n presentation,\n selectedCount: orderedSelectedNodeIds.length\n };\n}\n","import type { WorkbenchFrame, WorkbenchNode } from \"../core/types.ts\";\n\nexport const WORKBENCH_MISSION_CONTROL_GAP_PX = 20;\n\nexport interface WorkbenchMissionControlPreviewLayoutItem<TData = unknown> {\n frame: WorkbenchFrame;\n node: WorkbenchNode<TData>;\n}\n\nexport function orderWorkbenchNodesForMissionControl<TData>(\n nodes: readonly WorkbenchNode<TData>[]\n): WorkbenchNode<TData>[] {\n return [...nodes].sort((left, right) => {\n const topDelta = left.frame.y - right.frame.y;\n if (Math.abs(topDelta) > 24) {\n return topDelta;\n }\n\n const leftDelta = left.frame.x - right.frame.x;\n if (leftDelta !== 0) {\n return leftDelta;\n }\n\n return left.id.localeCompare(right.id);\n });\n}\n\nexport function resolveWorkbenchMissionControlPreviewLayout<TData>(input: {\n container: WorkbenchFrame;\n gap?: number;\n nodes: readonly WorkbenchNode<TData>[];\n}): WorkbenchMissionControlPreviewLayoutItem<TData>[] {\n const nodes = orderWorkbenchNodesForMissionControl(input.nodes);\n if (nodes.length === 0) {\n return [];\n }\n\n const gap = input.gap ?? WORKBENCH_MISSION_CONTROL_GAP_PX;\n const container = input.container;\n const scale = resolveBestPreviewScale(nodes, container, gap);\n if (scale <= 0) {\n return [];\n }\n const rows = packNodesIntoRows(nodes, container.width, gap, scale);\n if (rows.length === 0) {\n return [];\n }\n\n const totalHeight =\n rows.reduce((sum, row) => sum + row.height, 0) +\n Math.max(0, rows.length - 1) * gap;\n const startY = container.y + (container.height - totalHeight) / 2;\n const layout: WorkbenchMissionControlPreviewLayoutItem<TData>[] = [];\n let cursorY = startY;\n\n rows.forEach((row) => {\n let cursorX = container.x + (container.width - row.width) / 2;\n\n row.items.forEach((item) => {\n layout.push({\n frame: {\n x: cursorX,\n y: cursorY + (row.height - item.height) / 2,\n width: item.width,\n height: item.height\n },\n node: item.node\n });\n cursorX += item.width + gap;\n });\n\n cursorY += row.height + gap;\n });\n\n return layout;\n}\n\nfunction resolveBestPreviewScale<TData>(\n nodes: readonly WorkbenchNode<TData>[],\n container: WorkbenchFrame,\n gap: number\n): number {\n if (container.width <= 0 || container.height <= 0) {\n return 0;\n }\n\n let lowerBound = 0;\n let upperBound = 1;\n\n while (\n scaleFitsInsideContainer(\n nodes,\n container.width,\n container.height,\n gap,\n upperBound\n )\n ) {\n lowerBound = upperBound;\n upperBound *= 2;\n\n if (upperBound > 64) {\n return lowerBound;\n }\n }\n\n for (let iteration = 0; iteration < 20; iteration += 1) {\n const next = (lowerBound + upperBound) / 2;\n\n if (\n scaleFitsInsideContainer(\n nodes,\n container.width,\n container.height,\n gap,\n next\n )\n ) {\n lowerBound = next;\n } else {\n upperBound = next;\n }\n }\n\n return lowerBound;\n}\n\nfunction scaleFitsInsideContainer<TData>(\n nodes: readonly WorkbenchNode<TData>[],\n containerWidth: number,\n containerHeight: number,\n gap: number,\n scale: number\n): boolean {\n if (scale <= 0) {\n return false;\n }\n\n const rows = packNodesIntoRows(nodes, containerWidth, gap, scale);\n if (rows.length === 0) {\n return false;\n }\n\n const totalHeight =\n rows.reduce((sum, row) => sum + row.height, 0) +\n Math.max(0, rows.length - 1) * gap;\n return totalHeight <= containerHeight;\n}\n\nfunction packNodesIntoRows<TData>(\n nodes: readonly WorkbenchNode<TData>[],\n containerWidth: number,\n gap: number,\n scale: number\n): PackedPreviewRow<TData>[] {\n const rows: PackedPreviewRow<TData>[] = [];\n let currentRow: PackedPreviewRow<TData> | null = null;\n\n const commitCurrentRow = () => {\n if (currentRow && currentRow.items.length > 0) {\n rows.push(currentRow);\n }\n };\n\n for (const node of nodes) {\n const width = Math.max(1, node.frame.width * scale);\n const height = Math.max(1, node.frame.height * scale);\n\n if (width > containerWidth) {\n return [];\n }\n\n if (!currentRow) {\n currentRow = {\n height,\n items: [{ height, node, width }],\n width\n };\n continue;\n }\n\n const nextWidth = currentRow.width + gap + width;\n if (nextWidth > containerWidth) {\n commitCurrentRow();\n currentRow = {\n height,\n items: [{ height, node, width }],\n width\n };\n continue;\n }\n\n currentRow.items.push({ height, node, width });\n currentRow.width = nextWidth;\n currentRow.height = Math.max(currentRow.height, height);\n }\n\n commitCurrentRow();\n\n return rows;\n}\n\ninterface PackedPreviewRow<TData> {\n height: number;\n items: Array<{\n height: number;\n node: WorkbenchNode<TData>;\n width: number;\n }>;\n width: number;\n}\n","import {\n useCallback,\n useEffect,\n type CSSProperties,\n type ReactNode\n} from \"react\";\nimport type { WorkbenchController } from \"../store/types.ts\";\nimport type {\n WorkbenchLayoutConstraintsInput,\n WorkbenchNode\n} from \"../core/types.ts\";\nimport { WorkbenchDockFrame } from \"./WorkbenchDockFrame.tsx\";\nimport { WorkbenchNodeLayer } from \"./WorkbenchNodeLayer.tsx\";\nimport {\n WorkbenchProvider,\n useWorkbenchController\n} from \"./WorkbenchProvider.tsx\";\nimport { useWorkbenchShortcuts } from \"./hooks/useWorkbenchShortcuts.ts\";\nimport { useWorkbenchSurfaceSize } from \"./hooks/useWorkbenchSurfaceSize.ts\";\nimport { useWorkbenchGenieAnimation } from \"./useWorkbenchGenieAnimation.tsx\";\nimport type {\n WorkbenchDockContext,\n WorkbenchDockPlacement,\n WorkbenchKeepMinimizedNodeMounted,\n WorkbenchMinimizeAnimation,\n WorkbenchRenderNode,\n WorkbenchSurfacePresentation,\n WorkbenchRenderWindowActions,\n WorkbenchRenderWindowHeader,\n WorkbenchResolveFullscreenHeaderMode,\n WorkbenchResolveWindowChromeMode,\n WorkbenchWindowChromeMode\n} from \"./types.ts\";\nimport type {\n WorkbenchDockPreviewCache,\n WorkbenchDockPreviewCacheKeyResolver\n} from \"./dockPreviewCache.ts\";\nimport type { WorkbenchWindowChromeI18nRuntime } from \"./workbenchWindowI18n.ts\";\n\nexport interface WorkbenchSurfaceProps<TData = unknown> {\n captureNodePreviewImage?: (\n node: WorkbenchNode<TData>\n ) => Promise<string | null> | string | null;\n className?: string;\n controller: WorkbenchController<TData>;\n dockPreviewCache?: WorkbenchDockPreviewCache;\n dockPlacement?: WorkbenchDockPlacement;\n interactive?: boolean;\n layoutConstraints?: WorkbenchLayoutConstraintsInput;\n missionControlPhase?: \"closed\" | \"entering\" | \"open\" | \"closing\";\n minimizeAnimation?: WorkbenchMinimizeAnimation;\n presentation?: WorkbenchSurfacePresentation | null;\n renderBackdrop?: () => ReactNode;\n renderBottomChrome?: () => ReactNode;\n renderDock?: (context: WorkbenchDockContext<TData>) => ReactNode;\n renderNode: WorkbenchRenderNode<TData>;\n renderOverlay?: () => ReactNode;\n renderTopChrome?: () => ReactNode;\n renderWindowActions?: WorkbenchRenderWindowActions<TData>;\n renderWindowHeader?: WorkbenchRenderWindowHeader<TData>;\n shouldKeepMinimizedNodeMounted?: WorkbenchKeepMinimizedNodeMounted<TData>;\n resolveFullscreenHeaderMode?: WorkbenchResolveFullscreenHeaderMode<TData>;\n resolveDockAnchorKey?: (node: WorkbenchNode<TData>) => string;\n resolveDockPreviewCacheKey?: WorkbenchDockPreviewCacheKeyResolver<TData>;\n shortcutsEnabled?: boolean;\n shouldCaptureNodePreviewImage?: (node: WorkbenchNode<TData>) => boolean;\n wallpaper?: WorkbenchSurfaceWallpaper;\n windowChromeMode?:\n | WorkbenchWindowChromeMode\n | WorkbenchResolveWindowChromeMode<TData>;\n windowChromeI18n?: WorkbenchWindowChromeI18nRuntime;\n}\n\nexport type WorkbenchSurfaceWallpaperFit =\n | \"contain\"\n | \"cover\"\n | \"stretch\"\n | \"center\";\n\nexport interface WorkbenchSurfaceWallpaper {\n appearance?: \"dark\" | \"light\";\n fit?: WorkbenchSurfaceWallpaperFit;\n position?: string;\n url: string;\n}\n\nexport function WorkbenchSurface<TData>({\n captureNodePreviewImage,\n className,\n controller,\n dockPreviewCache,\n dockPlacement,\n interactive,\n layoutConstraints,\n missionControlPhase,\n minimizeAnimation,\n presentation,\n renderBackdrop,\n renderBottomChrome,\n renderDock,\n renderNode,\n renderOverlay,\n renderTopChrome,\n renderWindowActions,\n renderWindowHeader,\n shouldKeepMinimizedNodeMounted,\n resolveFullscreenHeaderMode,\n resolveDockAnchorKey,\n resolveDockPreviewCacheKey,\n shortcutsEnabled,\n shouldCaptureNodePreviewImage,\n wallpaper,\n windowChromeMode,\n windowChromeI18n\n}: WorkbenchSurfaceProps<TData>) {\n return (\n <WorkbenchProvider controller={controller}>\n <WorkbenchSurfaceInner\n captureNodePreviewImage={captureNodePreviewImage}\n className={className}\n dockPreviewCache={dockPreviewCache}\n dockPlacement={dockPlacement}\n interactive={interactive}\n layoutConstraints={layoutConstraints}\n missionControlPhase={missionControlPhase}\n minimizeAnimation={minimizeAnimation}\n presentation={presentation}\n renderBackdrop={renderBackdrop}\n renderBottomChrome={renderBottomChrome}\n renderDock={renderDock}\n renderNode={renderNode}\n renderOverlay={renderOverlay}\n renderTopChrome={renderTopChrome}\n renderWindowActions={renderWindowActions}\n renderWindowHeader={renderWindowHeader}\n shouldKeepMinimizedNodeMounted={shouldKeepMinimizedNodeMounted}\n resolveFullscreenHeaderMode={resolveFullscreenHeaderMode}\n resolveDockAnchorKey={resolveDockAnchorKey}\n resolveDockPreviewCacheKey={resolveDockPreviewCacheKey}\n shortcutsEnabled={shortcutsEnabled}\n shouldCaptureNodePreviewImage={shouldCaptureNodePreviewImage}\n wallpaper={wallpaper}\n windowChromeMode={windowChromeMode}\n windowChromeI18n={windowChromeI18n}\n />\n </WorkbenchProvider>\n );\n}\n\nfunction WorkbenchSurfaceInner<TData>({\n captureNodePreviewImage,\n className,\n dockPreviewCache,\n dockPlacement,\n interactive = true,\n layoutConstraints,\n missionControlPhase,\n minimizeAnimation,\n presentation,\n renderBackdrop,\n renderBottomChrome,\n renderDock,\n renderNode,\n renderOverlay,\n renderTopChrome,\n renderWindowActions,\n renderWindowHeader,\n shouldKeepMinimizedNodeMounted,\n resolveFullscreenHeaderMode,\n resolveDockAnchorKey,\n resolveDockPreviewCacheKey,\n shortcutsEnabled,\n shouldCaptureNodePreviewImage,\n wallpaper,\n windowChromeMode,\n windowChromeI18n\n}: Omit<WorkbenchSurfaceProps<TData>, \"controller\">) {\n const controller = useWorkbenchController<TData>();\n const onSizeChange = useCallback(\n (size: { width: number; height: number }) => {\n controller.commands.setSurfaceSize(size);\n },\n [controller]\n );\n const ref = useWorkbenchSurfaceSize<HTMLDivElement>(onSizeChange);\n const genie = useWorkbenchGenieAnimation({\n captureNodePreviewImage,\n controller,\n dockPreviewCache,\n minimizeAnimation,\n resolveDockAnchorKey,\n resolveDockPreviewCacheKey,\n shouldCaptureNodePreviewImage\n });\n useWorkbenchShortcuts<TData>((shortcutsEnabled ?? true) && interactive);\n useEffect(() => {\n if (!layoutConstraints) {\n return;\n }\n controller.commands.setLayoutConstraints(layoutConstraints);\n }, [controller, layoutConstraints]);\n const wallpaperStyle: CSSProperties | undefined = wallpaper\n ? {\n backgroundImage: `url(${JSON.stringify(wallpaper.url)})`,\n backgroundPosition: wallpaper.position ?? \"center\",\n backgroundSize: resolveWorkbenchSurfaceWallpaperBackgroundSize(\n wallpaper.fit ?? \"cover\"\n )\n }\n : undefined;\n\n return (\n <div\n ref={ref}\n className={[\"workbench-surface\", className].filter(Boolean).join(\" \")}\n data-mission-control-phase={missionControlPhase ?? \"closed\"}\n data-presentation-mode={presentation?.mode ?? \"default\"}\n data-workbench-interactive={interactive ? \"true\" : \"false\"}\n >\n {wallpaper ? (\n <div\n className=\"workbench-surface__wallpaper\"\n style={wallpaperStyle}\n aria-hidden\n />\n ) : null}\n {renderTopChrome ? (\n <div className=\"workbench-surface__top-chrome\">{renderTopChrome()}</div>\n ) : null}\n {renderBackdrop ? renderBackdrop() : null}\n <WorkbenchNodeLayer\n genie={genie}\n interactive={interactive}\n presentation={presentation}\n renderNode={renderNode}\n renderWindowActions={renderWindowActions}\n renderWindowHeader={renderWindowHeader}\n shouldKeepMinimizedNodeMounted={shouldKeepMinimizedNodeMounted}\n resolveFullscreenHeaderMode={resolveFullscreenHeaderMode}\n windowChromeMode={windowChromeMode}\n windowChromeI18n={windowChromeI18n}\n />\n <WorkbenchDockFrame\n dockPlacement={dockPlacement}\n genie={genie}\n interactive={interactive}\n renderDock={renderDock}\n />\n {renderBottomChrome ? (\n <div className=\"workbench-surface__bottom-chrome\">\n {renderBottomChrome()}\n </div>\n ) : null}\n {renderOverlay ? renderOverlay() : null}\n {genie.genieLayer}\n </div>\n );\n}\n\nfunction resolveWorkbenchSurfaceWallpaperBackgroundSize(\n fit: WorkbenchSurfaceWallpaperFit\n): string {\n switch (fit) {\n case \"contain\":\n return \"contain\";\n case \"cover\":\n return \"cover\";\n case \"stretch\":\n return \"100% 100%\";\n case \"center\":\n return \"auto\";\n }\n}\n","import { useMemo, type ReactNode } from \"react\";\nimport {\n selectFocusedWorkbenchNode,\n selectFullscreenNodeToExitBeforeDockLaunch\n} from \"../core/selectors.ts\";\nimport type { WorkbenchNode } from \"../core/types.ts\";\nimport type { WorkbenchDockContext, WorkbenchDockPlacement } from \"./types.ts\";\nimport { useWorkbenchController } from \"./WorkbenchProvider.tsx\";\nimport { createWorkbenchDockNodesSelector } from \"./dockNodeSelectors.ts\";\nimport { useWorkbenchSelector } from \"./hooks/useWorkbenchSelector.ts\";\nimport type { WorkbenchGenieController } from \"./useWorkbenchGenieAnimation.tsx\";\n\nexport interface WorkbenchDockFrameProps<TData = unknown> {\n dockPlacement?: WorkbenchDockPlacement;\n genie: WorkbenchGenieController<TData>;\n interactive?: boolean;\n renderDock?: (context: WorkbenchDockContext<TData>) => ReactNode;\n}\n\nexport function WorkbenchDockFrame<TData>({\n dockPlacement = \"bottom\",\n genie,\n interactive = true,\n renderDock\n}: WorkbenchDockFrameProps<TData>) {\n const controller = useWorkbenchController<TData>();\n const selectDockNodes = useMemo(\n () => createWorkbenchDockNodesSelector<TData>(),\n []\n );\n const hasFullscreenNode = useWorkbenchSelector((state) =>\n state.nodes.some(\n (node) => node.displayMode === \"fullscreen\" && !node.isMinimized\n )\n );\n const nodes = useWorkbenchSelector<TData, readonly WorkbenchNode<TData>[]>(\n selectDockNodes\n );\n const minimizedNodesWithPending = useMemo(\n () =>\n mergePendingMinimizedDockNode(\n nodes.filter((node) => node.isMinimized),\n genie.pendingMinimizedNode\n ),\n [genie.pendingMinimizedNode, nodes]\n );\n const minimizedNodes = useMemo(\n () => minimizedNodesWithPending.filter((node) => node.isMinimized),\n [minimizedNodesWithPending]\n );\n const focusedNodeId = useWorkbenchSelector(\n (state) => selectFocusedWorkbenchNode(state)?.id ?? null\n );\n\n if (!renderDock && minimizedNodes.length === 0) {\n return null;\n }\n\n return (\n <>\n {hasFullscreenNode ? (\n <div\n className=\"workbench-dock-frame__immersive-hover-zone\"\n data-dock-placement={dockPlacement}\n aria-hidden\n />\n ) : null}\n <div\n className=\"workbench-dock-frame\"\n data-dock-placement={dockPlacement}\n data-immersive-state={hasFullscreenNode ? \"hidden\" : \"disabled\"}\n >\n {renderDock\n ? renderDock({\n controller,\n focusedNodeId,\n genie: {\n launchNodeFromAnchor: (anchorKey, nodeID, launch) => {\n const fullscreenNode = interactive\n ? selectFullscreenNodeToExitBeforeDockLaunch(\n controller.getSnapshot(),\n nodeID\n )\n : null;\n if (fullscreenNode) {\n controller.commands.exitFullscreen(fullscreenNode.id);\n }\n genie.launchNodeFromAnchor(anchorKey, nodeID, launch);\n },\n registerDockAnchor: (anchorKey, element) => {\n genie.registerDockAnchor(anchorKey, element);\n },\n shouldAnimateMinimizedDockEnter: (nodeID) => {\n return genie.shouldAnimateMinimizedDockEnter(nodeID);\n },\n isPendingMinimizedDockNode: (nodeID) => {\n return genie.isPendingMinimizedDockNode(nodeID);\n }\n },\n minimizedNodes,\n nodes\n })\n : null}\n </div>\n </>\n );\n}\n\nfunction mergePendingMinimizedDockNode<TData>(\n nodes: readonly WorkbenchNode<TData>[],\n pendingNode: WorkbenchNode<TData> | null\n): readonly WorkbenchNode<TData>[] {\n if (!pendingNode) {\n return nodes;\n }\n\n const existingNode = nodes.find((node) => node.id === pendingNode.id);\n if (existingNode?.isMinimized) {\n return nodes;\n }\n\n return [...nodes.filter((node) => node.id !== pendingNode.id), pendingNode];\n}\n","import { getWorkbenchSnapRect } from \"./geometry.ts\";\nimport { orderWorkbenchNodesForRender } from \"./stack.ts\";\nimport type { WorkbenchFrame, WorkbenchNode, WorkbenchState } from \"./types.ts\";\n\nexport function selectVisibleWorkbenchNodes<TData>(\n state: WorkbenchState<TData>\n): WorkbenchNode<TData>[] {\n return state.nodes.filter((node) => !node.isMinimized);\n}\n\nexport function selectFocusedWorkbenchNode<TData>(\n state: WorkbenchState<TData>\n): WorkbenchNode<TData> | null {\n const focusedID = state.nodeStack.at(-1);\n return state.nodes.find((node) => node.id === focusedID) ?? null;\n}\n\nexport function selectFullscreenNodeToExitBeforeDockLaunch<TData>(\n state: WorkbenchState<TData>,\n targetNodeID?: string\n): WorkbenchNode<TData> | null {\n const nodeByID = new Map(state.nodes.map((node) => [node.id, node]));\n const isVisibleFullscreenNode = (\n node: WorkbenchNode<TData> | undefined\n ): node is WorkbenchNode<TData> => {\n return (\n node !== undefined &&\n node.displayMode === \"fullscreen\" &&\n !node.isMinimized\n );\n };\n\n let target: WorkbenchNode<TData> | undefined;\n for (let index = state.nodeStack.length - 1; index >= 0; index -= 1) {\n const stackedNode = nodeByID.get(state.nodeStack[index] ?? \"\");\n if (isVisibleFullscreenNode(stackedNode)) {\n target = stackedNode;\n break;\n }\n }\n target ??= state.nodes.find(isVisibleFullscreenNode);\n\n if (!target || target.id === targetNodeID) {\n return null;\n }\n return target;\n}\n\nexport function selectOrderedWorkbenchNodes<TData>(\n state: WorkbenchState<TData>\n): WorkbenchNode<TData>[] {\n return orderWorkbenchNodesForRender(\n selectVisibleWorkbenchNodes(state),\n state.nodeStack\n );\n}\n\nexport function selectWorkbenchNodeZIndex(\n state: WorkbenchState,\n nodeID: string\n): number {\n const index = state.nodeStack.indexOf(nodeID);\n return index < 0 ? 1 : index + 1;\n}\n\nexport function selectWorkbenchSnapPreviewRect(\n state: WorkbenchState\n): WorkbenchFrame | null {\n return getWorkbenchSnapRect(\n state.activeSnapTarget,\n state.surfaceSize,\n state.layoutConstraints\n );\n}\n","import { createContext, useContext, type PropsWithChildren } from \"react\";\nimport type { WorkbenchController } from \"../store/types.ts\";\n\nconst WorkbenchContext = createContext<WorkbenchController | null>(null);\n\nexport interface WorkbenchProviderProps<\n TData = unknown\n> extends PropsWithChildren {\n controller: WorkbenchController<TData>;\n}\n\nexport function WorkbenchProvider<TData>({\n children,\n controller\n}: WorkbenchProviderProps<TData>) {\n return (\n <WorkbenchContext.Provider value={controller}>\n {children}\n </WorkbenchContext.Provider>\n );\n}\n\nexport function useWorkbenchController<\n TData = unknown\n>(): WorkbenchController<TData> {\n const controller = useContext(WorkbenchContext);\n if (!controller) {\n throw new Error(\"WorkbenchProvider is missing.\");\n }\n return controller as WorkbenchController<TData>;\n}\n","import type { WorkbenchNode, WorkbenchState } from \"../core/types.ts\";\n\nexport function createWorkbenchDockNodesSelector<TData>(): (\n state: WorkbenchState<TData>\n) => readonly WorkbenchNode<TData>[] {\n let previousNodes: readonly WorkbenchNode<TData>[] | null = null;\n\n return (state) => {\n if (\n previousNodes &&\n areWorkbenchDockNodesEqual(previousNodes, state.nodes)\n ) {\n return previousNodes;\n }\n\n previousNodes = state.nodes;\n return state.nodes;\n };\n}\n\nfunction areWorkbenchDockNodesEqual<TData>(\n previousNodes: readonly WorkbenchNode<TData>[],\n nextNodes: readonly WorkbenchNode<TData>[]\n): boolean {\n if (previousNodes.length !== nextNodes.length) {\n return false;\n }\n\n return previousNodes.every((previousNode, index) => {\n const nextNode = nextNodes[index];\n return (\n nextNode !== undefined &&\n previousNode.id === nextNode.id &&\n previousNode.kind === nextNode.kind &&\n previousNode.title === nextNode.title &&\n previousNode.displayMode === nextNode.displayMode &&\n previousNode.isMinimized === nextNode.isMinimized &&\n previousNode.minimizedAtUnixMs === nextNode.minimizedAtUnixMs &&\n previousNode.frame.width === nextNode.frame.width &&\n previousNode.frame.height === nextNode.frame.height &&\n previousNode.data === nextNode.data\n );\n });\n}\n","import { useExternalStoreSelector } from \"@tutti-os/ui-react-hooks\";\nimport type { WorkbenchState } from \"../../core/types.ts\";\nimport { useWorkbenchController } from \"../WorkbenchProvider.tsx\";\n\nexport function useWorkbenchSelector<TData, TResult>(\n selector: (state: WorkbenchState<TData>) => TResult\n): TResult {\n const controller = useWorkbenchController<TData>();\n return useExternalStoreSelector(controller, selector);\n}\n","import { memo, useMemo } from \"react\";\nimport {\n selectFocusedWorkbenchNode,\n selectWorkbenchNodeZIndex,\n selectWorkbenchSnapPreviewRect\n} from \"../core/selectors.ts\";\nimport type { WorkbenchNode } from \"../core/types.ts\";\nimport type {\n WorkbenchKeepMinimizedNodeMounted,\n WorkbenchRenderNode,\n WorkbenchSurfacePresentation,\n WorkbenchRenderWindowActions,\n WorkbenchRenderWindowHeader,\n WorkbenchResolveFullscreenHeaderMode,\n WorkbenchResolveWindowChromeMode,\n WorkbenchWindowChromeMode\n} from \"./types.ts\";\nimport type { WorkbenchGenieController } from \"./useWorkbenchGenieAnimation.tsx\";\nimport { useWorkbenchController } from \"./WorkbenchProvider.tsx\";\nimport { WorkbenchWindowFrame } from \"./WorkbenchWindowFrame.tsx\";\nimport { useWorkbenchSelector } from \"./hooks/useWorkbenchSelector.ts\";\nimport { createRenderedWorkbenchNodeIDsSelector } from \"./renderedNodeIds.ts\";\nimport type { WorkbenchWindowChromeI18nRuntime } from \"./workbenchWindowI18n.ts\";\nimport { resolveWorkbenchWindowChromeMode } from \"./windowHeader.ts\";\n\nexport interface WorkbenchNodeLayerProps<TData = unknown> {\n genie: WorkbenchGenieController<TData>;\n interactive?: boolean;\n presentation?: WorkbenchSurfacePresentation | null;\n renderNode: WorkbenchRenderNode<TData>;\n shouldKeepMinimizedNodeMounted?: WorkbenchKeepMinimizedNodeMounted<TData>;\n renderWindowActions?: WorkbenchRenderWindowActions<TData>;\n renderWindowHeader?: WorkbenchRenderWindowHeader<TData>;\n resolveFullscreenHeaderMode?: WorkbenchResolveFullscreenHeaderMode<TData>;\n windowChromeMode?:\n | WorkbenchWindowChromeMode\n | WorkbenchResolveWindowChromeMode<TData>;\n windowChromeI18n?: WorkbenchWindowChromeI18nRuntime;\n}\n\nexport function WorkbenchNodeLayer<TData>({\n genie,\n interactive = true,\n presentation,\n renderNode,\n shouldKeepMinimizedNodeMounted,\n renderWindowActions,\n renderWindowHeader,\n resolveFullscreenHeaderMode,\n windowChromeMode,\n windowChromeI18n\n}: WorkbenchNodeLayerProps<TData>) {\n const selectRenderedNodeIDs = useMemo(\n () =>\n createRenderedWorkbenchNodeIDsSelector(shouldKeepMinimizedNodeMounted),\n [shouldKeepMinimizedNodeMounted]\n );\n const nodeIDs = useWorkbenchSelector<TData, readonly string[]>(\n selectRenderedNodeIDs\n );\n const snapPreviewRect = useWorkbenchSelector(selectWorkbenchSnapPreviewRect);\n const presentationInteraction =\n interactive && presentation?.mode === \"mission-control\"\n ? (presentation.interaction ?? null)\n : null;\n\n return (\n <div\n className=\"workbench-node-layer\"\n onClick={\n presentationInteraction\n ? (event) => {\n if (event.target !== event.currentTarget) {\n return;\n }\n presentationInteraction.onBackdropPress();\n }\n : undefined\n }\n >\n {snapPreviewRect ? (\n <div\n className=\"workbench-snap-preview\"\n style={{\n height: snapPreviewRect.height,\n left: snapPreviewRect.x,\n top: snapPreviewRect.y,\n width: snapPreviewRect.width\n }}\n />\n ) : null}\n {nodeIDs.map((nodeID) => (\n <MemoizedWorkbenchNodeLayerItem\n key={nodeID}\n fullscreenHeaderMode={resolveFullscreenHeaderMode}\n genie={genie}\n interactive={interactive}\n nodeID={nodeID}\n presentation={presentation}\n renderNode={renderNode}\n renderWindowActions={renderWindowActions}\n renderWindowHeader={renderWindowHeader}\n windowChromeI18n={windowChromeI18n}\n windowChromeMode={windowChromeMode}\n />\n ))}\n </div>\n );\n}\n\ninterface WorkbenchNodeLayerItemProps<TData = unknown> {\n fullscreenHeaderMode?: WorkbenchResolveFullscreenHeaderMode<TData>;\n genie: WorkbenchGenieController<TData>;\n interactive: boolean;\n nodeID: string;\n presentation?: WorkbenchSurfacePresentation | null;\n renderNode: WorkbenchRenderNode<TData>;\n renderWindowActions?: WorkbenchRenderWindowActions<TData>;\n renderWindowHeader?: WorkbenchRenderWindowHeader<TData>;\n windowChromeMode?:\n | WorkbenchWindowChromeMode\n | WorkbenchResolveWindowChromeMode<TData>;\n windowChromeI18n?: WorkbenchWindowChromeI18nRuntime;\n}\n\nfunction WorkbenchNodeLayerItem<TData>({\n fullscreenHeaderMode,\n genie,\n interactive,\n nodeID,\n presentation,\n renderNode,\n renderWindowActions,\n renderWindowHeader,\n windowChromeI18n,\n windowChromeMode\n}: WorkbenchNodeLayerItemProps<TData>) {\n const controller = useWorkbenchController<TData>();\n const node = useWorkbenchSelector<TData, WorkbenchNode<TData> | null>(\n (state) => state.nodes.find((candidate) => candidate.id === nodeID) ?? null\n );\n const isFocused = useWorkbenchSelector(\n (state) => selectFocusedWorkbenchNode(state)?.id === nodeID\n );\n const zIndex = useWorkbenchSelector((state) =>\n selectWorkbenchNodeZIndex(state, nodeID)\n );\n\n if (!node) {\n return null;\n }\n\n return (\n <WorkbenchWindowFrame\n hiddenMounted={node.isMinimized}\n interactive={interactive}\n presentation={presentation}\n node={node}\n genie={genie}\n fullscreenHeaderMode={fullscreenHeaderMode?.({\n controller,\n node\n })}\n renderActions={renderWindowActions}\n renderHeader={renderWindowHeader}\n windowChromeI18n={windowChromeI18n}\n windowChromeMode={resolveWorkbenchWindowChromeMode({\n controller,\n node,\n windowChromeMode\n })}\n >\n {renderNode({\n node,\n layout: {\n frame: node.frame,\n presentation,\n zIndex,\n isFocused\n },\n controller\n })}\n </WorkbenchWindowFrame>\n );\n}\n\nconst MemoizedWorkbenchNodeLayerItem = memo(\n WorkbenchNodeLayerItem\n) as typeof WorkbenchNodeLayerItem;\n","import { type ReactNode } from \"react\";\nimport { createI18nRuntime } from \"@tutti-os/ui-i18n-runtime\";\nimport { Checkbox } from \"@tutti-os/ui-system\";\nimport {\n selectFocusedWorkbenchNode,\n selectWorkbenchNodeZIndex\n} from \"../core/selectors.ts\";\nimport type { WorkbenchNode, WorkbenchResizeHandle } from \"../core/types.ts\";\nimport { useWorkbenchController } from \"./WorkbenchProvider.tsx\";\nimport { WorkbenchWindowFullscreenToggle } from \"./WorkbenchWindowFullscreenToggle.tsx\";\nimport { useWorkbenchDrag } from \"./hooks/useWorkbenchDrag.ts\";\nimport { useWorkbenchResize } from \"./hooks/useWorkbenchResize.ts\";\nimport { useWorkbenchSelector } from \"./hooks/useWorkbenchSelector.ts\";\nimport {\n createWorkbenchWindowChromeI18nRuntime,\n workbenchWindowChromeI18nResources,\n type WorkbenchWindowChromeI18nRuntime\n} from \"./workbenchWindowI18n.ts\";\nimport type {\n WorkbenchFullscreenHeaderMode,\n WorkbenchRenderWindowActions,\n WorkbenchRenderWindowHeader,\n WorkbenchSurfacePresentation,\n WorkbenchWindowChromeMode\n} from \"./types.ts\";\nimport type { WorkbenchGenieController } from \"./useWorkbenchGenieAnimation.tsx\";\nimport { resolveWorkbenchWindowHeader } from \"./windowHeader.ts\";\n\nexport interface WorkbenchWindowFrameProps<TData = unknown> {\n children: ReactNode;\n genie: WorkbenchGenieController;\n hiddenMounted?: boolean;\n interactive?: boolean;\n node: WorkbenchNode<TData>;\n presentation?: WorkbenchSurfacePresentation | null;\n renderActions?: WorkbenchRenderWindowActions<TData>;\n renderHeader?: WorkbenchRenderWindowHeader<TData>;\n fullscreenHeaderMode?: WorkbenchFullscreenHeaderMode;\n windowChromeMode?: WorkbenchWindowChromeMode;\n windowChromeI18n?: WorkbenchWindowChromeI18nRuntime;\n}\n\nconst resizeHandles: WorkbenchResizeHandle[] = [\n \"north\",\n \"east\",\n \"south\",\n \"west\",\n \"north-east\",\n \"north-west\",\n \"south-east\",\n \"south-west\"\n];\n\nconst defaultWindowChromeI18n = createWorkbenchWindowChromeI18nRuntime(\n createI18nRuntime({\n dictionaries: [workbenchWindowChromeI18nResources.en]\n })\n);\n\nfunction resolveWorkbenchNodeLaunchSource(data: unknown): string | undefined {\n if (\n data &&\n typeof data === \"object\" &&\n \"launchSource\" in data &&\n typeof data.launchSource === \"string\" &&\n data.launchSource.length > 0\n ) {\n return data.launchSource;\n }\n return undefined;\n}\n\nfunction resolveWorkbenchNodeTypeId(data: unknown): string | undefined {\n if (\n data &&\n typeof data === \"object\" &&\n \"typeId\" in data &&\n typeof data.typeId === \"string\"\n ) {\n return data.typeId;\n }\n\n return undefined;\n}\n\nexport function WorkbenchWindowFrame<TData>({\n children,\n fullscreenHeaderMode,\n genie,\n hiddenMounted = false,\n interactive = true,\n node,\n presentation = null,\n renderActions,\n renderHeader,\n windowChromeMode = \"system\",\n windowChromeI18n\n}: WorkbenchWindowFrameProps<TData>) {\n const controller = useWorkbenchController<TData>();\n const zIndex = useWorkbenchSelector((state) =>\n selectWorkbenchNodeZIndex(state, node.id)\n );\n const isFocused = useWorkbenchSelector(\n (state) => selectFocusedWorkbenchNode(state)?.id === node.id\n );\n const isDragging = useWorkbenchSelector(\n (state) => state.activeDragNodeId === node.id\n );\n const isResizing = useWorkbenchSelector(\n (state) => state.activeResizeNodeId === node.id\n );\n const onDragStart = useWorkbenchDrag(node);\n const onHeaderDoubleClick = () => {\n if (!interactive) {\n return;\n }\n controller.commands.focusNode(node.id);\n controller.commands.applySnapTarget(node.id, \"top\");\n };\n const genieControls = {\n minimizeNodeToAnchor: (nodeID: string, minimize?: () => void) => {\n genie.minimizeNodeToAnchor(nodeID, minimize);\n }\n } as const;\n const defaultActions = interactive ? (\n <div\n className=\"flex flex-none items-center gap-1\"\n onDoubleClick={(event) => {\n event.stopPropagation();\n }}\n onPointerDown={(event) => {\n event.stopPropagation();\n }}\n >\n <WorkbenchWindowFullscreenToggle\n controller={controller}\n i18n={windowChromeI18n ?? defaultWindowChromeI18n}\n node={node}\n />\n {renderActions\n ? renderActions({\n controller,\n genie: genieControls,\n node\n })\n : null}\n </div>\n ) : null;\n const resolvedHeader = resolveWorkbenchWindowHeader({\n controller,\n defaultActions,\n genie: genieControls,\n node,\n onDoubleClick: onHeaderDoubleClick,\n onDragStart,\n renderHeader: interactive ? renderHeader : undefined,\n windowChromeMode\n });\n const shouldRenderCustomHeader =\n resolvedHeader.windowChromeMode === \"custom-header\";\n const resolvedFullscreenHeaderMode = fullscreenHeaderMode ?? \"reveal\";\n const presentationMode = presentation?.mode ?? null;\n const presentationFrame = presentation?.frameByNodeId.get(node.id) ?? null;\n const isPresentationHidden =\n presentationMode === \"mission-control\" &&\n !presentation?.visibleNodeIds.has(node.id);\n const presentationInteraction =\n interactive &&\n presentationMode === \"mission-control\" &&\n !isPresentationHidden\n ? (presentation?.interaction ?? null)\n : null;\n const isMissionControlSelected =\n presentationInteraction?.selectedNodeIds.has(node.id) ?? false;\n const presentationScale =\n presentationMode === \"mission-control\" && presentationFrame\n ? Math.min(\n presentationFrame.width / Math.max(1, node.frame.width),\n presentationFrame.height / Math.max(1, node.frame.height)\n )\n : 1;\n const presentationOffsetX =\n presentationMode === \"mission-control\" && presentationFrame\n ? presentationFrame.x +\n Math.max(\n 0,\n (presentationFrame.width - node.frame.width * presentationScale) / 2\n ) -\n node.frame.x\n : 0;\n const presentationOffsetY =\n presentationMode === \"mission-control\" && presentationFrame\n ? presentationFrame.y +\n Math.max(\n 0,\n (presentationFrame.height - node.frame.height * presentationScale) / 2\n ) -\n node.frame.y\n : 0;\n const shellTransform =\n presentationMode === \"mission-control\" && presentationFrame\n ? `matrix(${presentationScale}, 0, 0, ${presentationScale}, ${presentationOffsetX}, ${presentationOffsetY})`\n : undefined;\n\n return (\n <section\n aria-hidden={hiddenMounted || isPresentationHidden ? true : undefined}\n className=\"workbench-window-shell\"\n data-focused={isFocused ? \"true\" : \"false\"}\n data-display-mode={node.displayMode}\n data-genie-state={genie.isNodeGenieHidden(node.id) ? \"hidden\" : \"visible\"}\n data-launch-source={resolveWorkbenchNodeLaunchSource(node.data)}\n data-minimized-mount={hiddenMounted ? \"hidden\" : \"visible\"}\n data-presentation-mode={presentationMode ?? \"default\"}\n data-presentation-visibility={isPresentationHidden ? \"hidden\" : \"visible\"}\n data-slot=\"viewport-menu-boundary\"\n data-workbench-node-type-id={resolveWorkbenchNodeTypeId(node.data)}\n data-workbench-window-id={node.id}\n data-window-drag-state={isDragging ? \"dragging\" : \"idle\"}\n data-window-resize-state={isResizing ? \"resizing\" : \"idle\"}\n style={{\n height: node.frame.height,\n left: node.frame.x,\n top: node.frame.y,\n transform: shellTransform,\n transformOrigin: \"top left\",\n width: node.frame.width,\n zIndex\n }}\n onPointerDown={\n hiddenMounted ||\n isPresentationHidden ||\n !interactive ||\n presentationMode === \"mission-control\"\n ? undefined\n : () => controller.commands.focusNode(node.id)\n }\n >\n <div className=\"workbench-window-shell__content\">\n <div\n className=\"workbench-window\"\n data-focused={isFocused ? \"true\" : \"false\"}\n data-display-mode={node.displayMode}\n data-fullscreen-header-mode={resolvedFullscreenHeaderMode}\n data-window-chrome-mode={resolvedHeader.windowChromeMode}\n data-workbench-window-capture=\"true\"\n data-window-drag-state={isDragging ? \"dragging\" : \"idle\"}\n data-window-resize-state={isResizing ? \"resizing\" : \"idle\"}\n >\n {node.displayMode === \"fullscreen\" &&\n resolvedFullscreenHeaderMode === \"reveal\" ? (\n <div className=\"workbench-window__header-reveal-zone\" aria-hidden />\n ) : null}\n <div\n className={[\n \"workbench-window__header\",\n shouldRenderCustomHeader\n ? \"workbench-window__header--custom\"\n : null\n ]\n .filter(Boolean)\n .join(\" \")}\n onDoubleClick={\n shouldRenderCustomHeader || !interactive\n ? undefined\n : onHeaderDoubleClick\n }\n onPointerDown={\n shouldRenderCustomHeader || !interactive ? undefined : onDragStart\n }\n >\n {shouldRenderCustomHeader ? (\n resolvedHeader.customHeader\n ) : (\n <>\n <div className=\"min-w-0 truncate text-[13px] font-semibold\">\n {node.title}\n </div>\n {defaultActions}\n </>\n )}\n </div>\n <div className=\"workbench-window__body\">{children}</div>\n {node.displayMode === \"floating\" &&\n !hiddenMounted &&\n presentationMode !== \"mission-control\" &&\n interactive\n ? resizeHandles.map((handle) => (\n <ResizeHandle key={handle} handle={handle} node={node} />\n ))\n : null}\n </div>\n </div>\n {presentationInteraction ? (\n <button\n aria-label={node.title}\n aria-pressed={\n presentationInteraction.mode === \"layout\"\n ? isMissionControlSelected\n : undefined\n }\n className=\"absolute inset-0 z-10 block appearance-none rounded-lg border-0 bg-transparent p-0 text-left outline-none focus-visible:ring-2 focus-visible:ring-ring/60\"\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n presentationInteraction.onNodePress(node.id);\n }}\n >\n {presentationInteraction.mode === \"layout\" &&\n isMissionControlSelected ? (\n <div className=\"pointer-events-none absolute inset-0 rounded-lg border-2 border-[var(--accent)] transition-[border-color,transform] duration-150 ease-out\" />\n ) : null}\n </button>\n ) : null}\n {presentationInteraction?.mode === \"layout\" &&\n isMissionControlSelected ? (\n <Checkbox\n aria-hidden=\"true\"\n checked\n className=\"pointer-events-none absolute right-3 bottom-3 z-20 size-6 rounded-md text-[var(--white-stationary)] shadow-[0_2px_8px_rgb(0_0_0_/_0.18)] data-[state=checked]:border-[var(--accent)] data-[state=checked]:bg-[var(--accent)] [&_[data-slot=checkbox-indicator]>svg]:size-4\"\n tabIndex={-1}\n />\n ) : null}\n </section>\n );\n}\n\nfunction ResizeHandle<TData>({\n handle,\n node\n}: {\n handle: WorkbenchResizeHandle;\n node: WorkbenchNode<TData>;\n}) {\n const onPointerDown = useWorkbenchResize(node, handle);\n return (\n <div\n className=\"workbench-window__resize-handle\"\n data-handle={handle}\n onPointerDown={onPointerDown}\n />\n );\n}\n","import type { WorkbenchNode } from \"../core/types.ts\";\nimport type { WorkbenchController } from \"../store/types.ts\";\nimport { Button, MaximizeIcon, RestoreIcon } from \"@tutti-os/ui-system\";\nimport type { WorkbenchWindowChromeI18nRuntime } from \"./workbenchWindowI18n.ts\";\n\nexport function WorkbenchWindowFullscreenToggle<TData>({\n controller,\n disabled = false,\n i18n,\n node\n}: {\n controller: WorkbenchController<TData>;\n disabled?: boolean;\n i18n: WorkbenchWindowChromeI18nRuntime;\n node: WorkbenchNode<TData>;\n}) {\n const isFullscreen = node.displayMode === \"fullscreen\";\n const label = i18n.t(isFullscreen ? \"exitFullscreen\" : \"enterFullscreen\");\n const Icon = isFullscreen ? RestoreIcon : MaximizeIcon;\n\n return (\n <Button\n aria-label={label}\n aria-pressed={isFullscreen}\n className=\"order-2 rounded-md\"\n data-workbench-action=\"fullscreen\"\n disabled={disabled}\n size=\"icon-sm\"\n title={label}\n type=\"button\"\n variant=\"chrome\"\n onClick={(event) => {\n if (disabled) {\n return;\n }\n\n controller.commands.focusNode(node.id);\n\n if (isFullscreen) {\n controller.commands.exitFullscreen(node.id);\n return;\n }\n\n event.currentTarget.blur();\n controller.commands.enterFullscreen(node.id);\n }}\n >\n <Icon aria-hidden className=\"size-[15px]\" />\n </Button>\n );\n}\n","import { useCallback } from \"react\";\nimport type { PointerEvent as ReactPointerEvent } from \"react\";\nimport type { WorkbenchNode } from \"../../core/types.ts\";\nimport { useWorkbenchController } from \"../WorkbenchProvider.tsx\";\nimport { useWorkbenchSnap } from \"./useWorkbenchSnap.ts\";\n\nexport function useWorkbenchDrag<TData>(node: WorkbenchNode<TData>) {\n const controller = useWorkbenchController<TData>();\n const updateSnap = useWorkbenchSnap<TData>();\n\n return useCallback(\n (event: ReactPointerEvent<HTMLElement>) => {\n if (event.button !== 0) {\n return;\n }\n\n event.preventDefault();\n controller.commands.focusNode(node.id);\n\n event.currentTarget.setPointerCapture(event.pointerId);\n controller.commands.setActiveDragNode(node.id);\n\n const origin = { x: event.clientX, y: event.clientY };\n const initialFrame = node.frame;\n\n const onPointerMove = (moveEvent: PointerEvent) => {\n const nextFrame = {\n ...initialFrame,\n x: initialFrame.x + moveEvent.clientX - origin.x,\n y: initialFrame.y + moveEvent.clientY - origin.y\n };\n updateSnap(moveEvent.clientY);\n controller.commands.dragNode(node.id, nextFrame);\n };\n\n const clearListeners = () => {\n controller.commands.setActiveDragNode(null);\n controller.commands.setActiveSnapTarget(null);\n window.removeEventListener(\"pointermove\", onPointerMove);\n window.removeEventListener(\"pointerup\", finishDrag);\n window.removeEventListener(\"pointercancel\", cancelDrag);\n };\n\n const finishDrag = (upEvent: PointerEvent) => {\n if (updateSnap(upEvent.clientY) !== null) {\n controller.commands.applyActiveSnapTarget(node.id);\n }\n clearListeners();\n };\n\n const cancelDrag = () => {\n clearListeners();\n };\n\n window.addEventListener(\"pointermove\", onPointerMove);\n window.addEventListener(\"pointerup\", finishDrag);\n window.addEventListener(\"pointercancel\", cancelDrag);\n },\n [controller, node.frame, node.id, updateSnap]\n );\n}\n","import { useCallback } from \"react\";\nimport { inferWorkbenchSnapTarget } from \"../../core/geometry.ts\";\nimport type { WorkbenchSnapTarget } from \"../../core/types.ts\";\nimport { useWorkbenchController } from \"../WorkbenchProvider.tsx\";\n\nexport function useWorkbenchSnap<TData = unknown>() {\n const controller = useWorkbenchController<TData>();\n\n return useCallback(\n (pointerClientY: number): WorkbenchSnapTarget => {\n const target = inferWorkbenchSnapTarget(\n { y: pointerClientY },\n controller.getSnapshot().surfaceSize,\n undefined,\n controller.getSnapshot().layoutConstraints\n );\n controller.commands.setActiveSnapTarget(target);\n return target;\n },\n [controller]\n );\n}\n","import { useCallback } from \"react\";\nimport type { PointerEvent as ReactPointerEvent } from \"react\";\nimport type { WorkbenchNode, WorkbenchResizeHandle } from \"../../core/types.ts\";\nimport { useWorkbenchController } from \"../WorkbenchProvider.tsx\";\n\nexport function useWorkbenchResize<TData>(\n node: WorkbenchNode<TData>,\n handle: WorkbenchResizeHandle\n) {\n const controller = useWorkbenchController<TData>();\n\n return useCallback(\n (event: ReactPointerEvent<HTMLElement>) => {\n if (event.button !== 0) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n event.currentTarget.setPointerCapture(event.pointerId);\n controller.commands.focusNode(node.id);\n controller.commands.setActiveResizeNode(node.id);\n\n const origin = { x: event.clientX, y: event.clientY };\n const initialFrame = node.frame;\n\n const onPointerMove = (moveEvent: PointerEvent) => {\n const deltaX = moveEvent.clientX - origin.x;\n const deltaY = moveEvent.clientY - origin.y;\n controller.commands.resizeNode(\n node.id,\n resizeFrame(initialFrame, handle, deltaX, deltaY)\n );\n };\n\n const cleanup = () => {\n controller.commands.setActiveResizeNode(null);\n window.removeEventListener(\"pointermove\", onPointerMove);\n window.removeEventListener(\"pointerup\", cleanup);\n window.removeEventListener(\"pointercancel\", cleanup);\n };\n\n window.addEventListener(\"pointermove\", onPointerMove);\n window.addEventListener(\"pointerup\", cleanup);\n window.addEventListener(\"pointercancel\", cleanup);\n },\n [controller, handle, node.frame, node.id]\n );\n}\n\nfunction resizeFrame(\n frame: WorkbenchNode[\"frame\"],\n handle: WorkbenchResizeHandle,\n deltaX: number,\n deltaY: number\n): WorkbenchNode[\"frame\"] {\n const next = { ...frame };\n if (handle.includes(\"east\")) {\n next.width += deltaX;\n }\n if (handle.includes(\"south\")) {\n next.height += deltaY;\n }\n if (handle.includes(\"west\")) {\n next.x += deltaX;\n next.width -= deltaX;\n }\n if (handle.includes(\"north\")) {\n next.y += deltaY;\n next.height -= deltaY;\n }\n return next;\n}\n","import type { ReactNode } from \"react\";\nimport type { WorkbenchNode } from \"../core/types.ts\";\nimport type { WorkbenchController } from \"../store/types.ts\";\nimport type {\n WorkbenchRenderWindowHeader,\n WorkbenchResolveWindowChromeMode,\n WorkbenchWindowChromeMode,\n WorkbenchWindowHeaderContext,\n WorkbenchWindowHeaderDragHandleProps\n} from \"./types.ts\";\n\ntype WorkbenchHeaderGenieControls = {\n minimizeNodeToAnchor(nodeID: string, minimize?: () => void): void;\n};\n\nexport interface ResolveWorkbenchWindowHeaderInput<TData = unknown> {\n controller: WorkbenchController<TData>;\n defaultActions: ReactNode;\n genie: WorkbenchHeaderGenieControls;\n node: WorkbenchNode<TData>;\n onDoubleClick: WorkbenchWindowHeaderDragHandleProps[\"onDoubleClick\"];\n onDragStart: WorkbenchWindowHeaderDragHandleProps[\"onPointerDown\"];\n renderHeader?: WorkbenchRenderWindowHeader<TData>;\n windowChromeMode?: WorkbenchWindowChromeMode;\n}\n\nexport interface ResolvedWorkbenchWindowHeader<TData = unknown> {\n context: WorkbenchWindowHeaderContext<TData>;\n customHeader: ReactNode | null;\n windowChromeMode: WorkbenchWindowChromeMode;\n}\n\nexport function resolveWorkbenchWindowChromeMode<TData>({\n controller,\n node,\n windowChromeMode\n}: {\n controller: WorkbenchController<TData>;\n node: WorkbenchNode<TData>;\n windowChromeMode?:\n | WorkbenchWindowChromeMode\n | WorkbenchResolveWindowChromeMode<TData>;\n}): WorkbenchWindowChromeMode {\n if (typeof windowChromeMode === \"function\") {\n return windowChromeMode({ controller, node });\n }\n\n return windowChromeMode ?? \"system\";\n}\n\nexport function resolveWorkbenchWindowHeader<TData>({\n controller,\n defaultActions,\n genie,\n node,\n onDoubleClick,\n onDragStart,\n renderHeader,\n windowChromeMode = \"system\"\n}: ResolveWorkbenchWindowHeaderInput<TData>): ResolvedWorkbenchWindowHeader<TData> {\n const context: WorkbenchWindowHeaderContext<TData> = {\n controller,\n defaultActions,\n dragHandleProps: {\n \"data-workbench-drag-handle\": \"true\",\n onDoubleClick,\n onPointerDown: onDragStart\n },\n genie,\n node,\n surfaceSize: controller.getSnapshot().surfaceSize\n };\n\n const customHeader =\n windowChromeMode === \"custom-header\" && renderHeader\n ? renderHeader(context)\n : null;\n\n return {\n context,\n customHeader,\n windowChromeMode: customHeader === null ? \"system\" : \"custom-header\"\n };\n}\n","import type { WorkbenchNode, WorkbenchState } from \"../core/types.ts\";\nimport type { WorkbenchKeepMinimizedNodeMounted } from \"./types.ts\";\n\nexport function createRenderedWorkbenchNodeIDsSelector<TData>(\n shouldKeepMinimizedNodeMounted:\n | WorkbenchKeepMinimizedNodeMounted<TData>\n | undefined = undefined\n): (state: WorkbenchState<TData>) => readonly string[] {\n let previousIDs: readonly string[] | null = null;\n\n return (state) => {\n const nextIDs = state.nodes\n .filter((node) =>\n shouldRenderWorkbenchNode(node, shouldKeepMinimizedNodeMounted)\n )\n .map((node) => node.id);\n\n if (previousIDs && stringArraysEqual(previousIDs, nextIDs)) {\n return previousIDs;\n }\n\n previousIDs = nextIDs;\n return nextIDs;\n };\n}\n\nfunction shouldRenderWorkbenchNode<TData>(\n node: WorkbenchNode<TData>,\n shouldKeepMinimizedNodeMounted:\n | WorkbenchKeepMinimizedNodeMounted<TData>\n | undefined\n): boolean {\n return !node.isMinimized || shouldKeepMinimizedNodeMounted?.(node) === true;\n}\n\nfunction stringArraysEqual(left: readonly string[], right: readonly string[]) {\n if (left.length !== right.length) {\n return false;\n }\n\n return left.every((value, index) => value === right[index]);\n}\n","import { useEffect } from \"react\";\nimport { selectFocusedWorkbenchNode } from \"../../core/selectors.ts\";\nimport { useWorkbenchController } from \"../WorkbenchProvider.tsx\";\n\nexport function useWorkbenchShortcuts<TData = unknown>(enabled = true): void {\n const controller = useWorkbenchController<TData>();\n\n useEffect(() => {\n if (!enabled) {\n return undefined;\n }\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\") {\n return;\n }\n\n const focusedNode = selectFocusedWorkbenchNode(controller.getSnapshot());\n if (focusedNode?.displayMode === \"fullscreen\") {\n controller.commands.exitFullscreen(focusedNode.id);\n }\n };\n\n window.addEventListener(\"keydown\", onKeyDown);\n return () => {\n window.removeEventListener(\"keydown\", onKeyDown);\n };\n }, [controller, enabled]);\n}\n","import { useLayoutEffect, useRef, type RefObject } from \"react\";\nimport type { WorkbenchSize } from \"../../core/types.ts\";\n\nexport function useWorkbenchSurfaceSize<TElement extends HTMLElement>(\n onSizeChange: (size: WorkbenchSize) => void\n): RefObject<TElement | null> {\n const ref = useRef<TElement | null>(null);\n\n useLayoutEffect(() => {\n const element = ref.current;\n if (!element) {\n return;\n }\n\n const publish = () => {\n const rect = element.getBoundingClientRect();\n onSizeChange({\n width: Math.max(0, Math.round(rect.width)),\n height: Math.max(0, Math.round(rect.height))\n });\n };\n\n publish();\n\n if (typeof ResizeObserver === \"undefined\") {\n window.addEventListener(\"resize\", publish);\n return () => {\n window.removeEventListener(\"resize\", publish);\n };\n }\n\n const observer = new ResizeObserver(publish);\n observer.observe(element);\n return () => {\n observer.disconnect();\n };\n }, [onSizeChange]);\n\n return ref;\n}\n","import {\n useCallback,\n useEffect,\n useRef,\n useState,\n type ReactNode\n} from \"react\";\nimport { createPortal, flushSync } from \"react-dom\";\nimport type { WorkbenchController } from \"../store/types.ts\";\nimport type { WorkbenchNode } from \"../core/types.ts\";\nimport type { WorkbenchMinimizeAnimation } from \"./types.ts\";\nimport type {\n WorkbenchDockPreviewCache,\n WorkbenchDockPreviewCacheKeyResolver\n} from \"./dockPreviewCache.ts\";\nimport {\n centerPointFromRect,\n cloneMeaningfulGenieElement,\n easeInQuadratic,\n isUsableGenieRect,\n renderGenieScanlines,\n viewportRectFromElement,\n type WorkbenchGenieDirection,\n type WorkbenchGenieMeaningfulImageClone,\n type WorkbenchGenieViewportRect\n} from \"./genieAnimation.ts\";\n\nconst genieDurationMs = 400;\nconst scaleMinimizeDurationMs = 220;\nconst genieMaxDevicePixelRatio = 2;\nconst genieSnapshotScale = 1;\nconst minimizedDockSlotEnterAnimationMs = 720;\nconst dockPreviewMaxWidth = 260;\nconst dockPreviewMaxHeight = 170;\nconst dockPreviewImageCacheMaxEntries = 96;\nconst inlineImageResourceCacheMaxEntries = 160;\nconst dockAnchorFallbackSizePx = 43.2;\nconst genieInlineImageMaxDevicePixelRatio = 2;\nconst dockPreviewImageByNodeID = new Map<string, string>();\nconst inlineImageResourceByUrl = new Map<string, Promise<string | null>>();\n\ninterface CapturedGenieTexture {\n canvas: HTMLCanvasElement;\n rect: WorkbenchGenieViewportRect;\n}\n\ninterface PreparedGenieTextureCapture {\n clone: HTMLElement;\n images: WorkbenchGenieMeaningfulImageClone[];\n rect: WorkbenchGenieViewportRect;\n}\n\nfunction resolveWorkbenchCaptureElement(\n windowElement: HTMLElement\n): HTMLElement {\n return (\n windowElement.querySelector<HTMLElement>(\n '[data-workbench-window-capture=\"true\"]'\n ) ??\n windowElement.querySelector<HTMLElement>(\".workbench-window\") ??\n windowElement\n );\n}\n\nfunction waitForNextAnimationFrame(): Promise<void> {\n return new Promise((resolve) => {\n window.requestAnimationFrame(() => resolve());\n });\n}\n\nfunction isFocusedWorkbenchNode<TData>(\n controller: WorkbenchController<TData>,\n nodeID: string\n): boolean {\n return controller.getSnapshot().nodeStack.at(-1) === nodeID;\n}\n\nexport interface WorkbenchGenieController<TData = unknown> {\n genieLayer: ReactNode;\n isNodeGenieHidden: (nodeID: string) => boolean;\n isPendingMinimizedDockNode: (nodeID: string) => boolean;\n launchNodeFromAnchor: (\n anchorKey: string,\n nodeID: string,\n launch: () => Promise<string | null | void> | string | null | void\n ) => void;\n minimizeNodeToAnchor: (nodeID: string, minimize?: () => void) => void;\n pendingMinimizedNode: WorkbenchNode<TData> | null;\n registerDockAnchor: (anchorKey: string, element: HTMLElement | null) => void;\n shouldAnimateMinimizedDockEnter: (nodeID: string) => boolean;\n}\n\nexport type WorkbenchNodePreviewImageCapture<TData = unknown> = (\n node: WorkbenchNode<TData>\n) => Promise<string | null> | string | null;\n\nfunction shouldReduceMotion(): boolean {\n return (\n window.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches === true\n );\n}\n\nfunction clampProgress(value: number): number {\n return Math.max(0, Math.min(1, value));\n}\n\nfunction resolveGenieAnimationProgress(\n direction: WorkbenchGenieDirection,\n progress: number\n): number {\n return direction === \"open\" ? easeInQuadratic(progress) : progress;\n}\n\nfunction blobToDataUrl(blob: Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.addEventListener(\"load\", () => {\n if (typeof reader.result === \"string\") {\n resolve(reader.result);\n return;\n }\n reject(new Error(\"image blob reader produced a non-string result\"));\n });\n reader.addEventListener(\"error\", () => {\n reject(reader.error ?? new Error(\"image blob reader failed\"));\n });\n reader.readAsDataURL(blob);\n });\n}\n\nasync function fetchInlineImageResource(\n imageUrl: string\n): Promise<string | null> {\n try {\n const response = await fetch(imageUrl);\n if (!response.ok) {\n throw new Error(`image fetch failed with status ${response.status}`);\n }\n const blob = await response.blob();\n return await blobToDataUrl(blob);\n } catch {\n return null;\n }\n}\n\nfunction readInlineImageResource(imageUrl: string): Promise<string | null> {\n if (imageUrl.startsWith(\"data:\")) {\n return Promise.resolve(imageUrl);\n }\n\n const cached = inlineImageResourceByUrl.get(imageUrl);\n if (cached) {\n inlineImageResourceByUrl.delete(imageUrl);\n inlineImageResourceByUrl.set(imageUrl, cached);\n return cached;\n }\n\n const promise = fetchInlineImageResource(imageUrl);\n inlineImageResourceByUrl.set(imageUrl, promise);\n while (inlineImageResourceByUrl.size > inlineImageResourceCacheMaxEntries) {\n const oldestImageUrl = inlineImageResourceByUrl.keys().next().value;\n if (typeof oldestImageUrl !== \"string\") {\n break;\n }\n inlineImageResourceByUrl.delete(oldestImageUrl);\n }\n return promise;\n}\n\nasync function inlineCloneImageResources({\n cloneRoot,\n images\n}: {\n cloneRoot: HTMLElement;\n images: WorkbenchGenieMeaningfulImageClone[];\n}): Promise<void> {\n const cloneImages = Array.from(cloneRoot.querySelectorAll(\"img\"));\n\n await Promise.all(\n images.map(async (imageInfo, index) => {\n const cloneImage = cloneImages[index];\n if (!cloneImage) {\n return;\n }\n\n cloneImage.removeAttribute(\"srcset\");\n cloneImage.removeAttribute(\"sizes\");\n const imageUrl = imageInfo.url;\n if (!imageUrl) {\n return;\n }\n const inlineImageUrl =\n (await readInlineImageResource(imageUrl)) ?? imageUrl;\n const resizedImageUrl = await resizeInlineImageResourceForGenieTexture(\n inlineImageUrl,\n imageInfo\n );\n if (resizedImageUrl && resizedImageUrl !== inlineImageUrl) {\n cloneImage.src = resizedImageUrl;\n return;\n }\n cloneImage.src = inlineImageUrl;\n })\n );\n}\n\nasync function loadImageFromSvg(svg: string): Promise<HTMLImageElement> {\n const image = new Image();\n image.src = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`;\n await image.decode();\n return image;\n}\n\nfunction resolveGenieInlineImageTargetSize({\n displayHeight,\n displayWidth\n}: WorkbenchGenieMeaningfulImageClone): {\n height: number;\n width: number;\n} | null {\n if (displayWidth <= 0 || displayHeight <= 0) {\n return null;\n }\n const scale = Math.min(\n window.devicePixelRatio || 1,\n genieInlineImageMaxDevicePixelRatio\n );\n return {\n height: Math.max(1, Math.ceil(displayHeight * scale)),\n width: Math.max(1, Math.ceil(displayWidth * scale))\n };\n}\n\nasync function resizeInlineImageResourceForGenieTexture(\n imageUrl: string,\n imageInfo: WorkbenchGenieMeaningfulImageClone\n): Promise<string | null> {\n const targetSize = resolveGenieInlineImageTargetSize(imageInfo);\n if (!targetSize) {\n return null;\n }\n\n const image = new Image();\n image.src = imageUrl;\n try {\n await image.decode();\n } catch {\n return null;\n }\n if (\n image.naturalWidth <= targetSize.width &&\n image.naturalHeight <= targetSize.height\n ) {\n return null;\n }\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = targetSize.width;\n canvas.height = targetSize.height;\n const context = canvas.getContext(\"2d\");\n if (!context) {\n return null;\n }\n try {\n context.drawImage(image, 0, 0, targetSize.width, targetSize.height);\n return canvas.toDataURL(\"image/png\");\n } catch {\n return null;\n }\n}\n\nfunction prepareElementTextureCapture(\n element: HTMLElement\n): PreparedGenieTextureCapture | null {\n const windowRect = viewportRectFromElement(element);\n if (!isUsableGenieRect(windowRect)) {\n return null;\n }\n\n const clonedElement = cloneMeaningfulGenieElement(element, windowRect);\n if (!clonedElement) {\n return null;\n }\n const { clone, images } = clonedElement;\n clone.setAttribute(\"xmlns\", \"http://www.w3.org/1999/xhtml\");\n clone.style.position = \"relative\";\n clone.style.left = \"0\";\n clone.style.top = \"0\";\n clone.style.width = `${windowRect.width}px`;\n clone.style.height = `${windowRect.height}px`;\n clone.style.transform = \"none\";\n clone.style.opacity = \"1\";\n clone.style.visibility = \"visible\";\n clone.style.pointerEvents = \"none\";\n return {\n clone,\n images,\n rect: windowRect\n };\n}\n\nasync function renderPreparedElementTexture({\n clone,\n images,\n rect\n}: PreparedGenieTextureCapture): Promise<CapturedGenieTexture | null> {\n await inlineCloneImageResources({\n cloneRoot: clone,\n images\n });\n\n const svgTexture = createGenieSvgTexture(clone, rect);\n const image = await loadImageFromSvg(svgTexture);\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = Math.max(1, Math.round(rect.width * genieSnapshotScale));\n canvas.height = Math.max(1, Math.round(rect.height * genieSnapshotScale));\n const context = canvas.getContext(\"2d\");\n if (!context) {\n return null;\n }\n context.drawImage(image, 0, 0, canvas.width, canvas.height);\n return { canvas, rect };\n}\n\nasync function captureElementTexture(\n element: HTMLElement\n): Promise<CapturedGenieTexture | null> {\n const preparedCapture = prepareElementTextureCapture(element);\n return preparedCapture ? renderPreparedElementTexture(preparedCapture) : null;\n}\n\nfunction createDockPreviewDataUrl(canvas: HTMLCanvasElement): string | null {\n if (canvas.width <= 0 || canvas.height <= 0) {\n return null;\n }\n\n const scale = Math.min(\n 1,\n dockPreviewMaxWidth / canvas.width,\n dockPreviewMaxHeight / canvas.height\n );\n const output = document.createElement(\"canvas\");\n output.width = Math.max(1, Math.round(canvas.width * scale));\n output.height = Math.max(1, Math.round(canvas.height * scale));\n const context = output.getContext(\"2d\");\n if (!context) {\n return null;\n }\n context.drawImage(canvas, 0, 0, output.width, output.height);\n return output.toDataURL(\"image/png\");\n}\n\nfunction readDockAnchorFallbackSize(element: HTMLElement): number {\n const cssValue = window\n .getComputedStyle(element)\n .getPropertyValue(\"--desktop-dock-size\");\n const parsed = Number.parseFloat(cssValue);\n return Number.isFinite(parsed) && parsed > 0\n ? parsed\n : dockAnchorFallbackSizePx;\n}\n\nfunction resolveDockAnchorViewportRect(\n element: HTMLElement\n): WorkbenchGenieViewportRect {\n const rect = viewportRectFromElement(element);\n if (\n element.dataset.desktopDockSlot !== \"true\" ||\n element.dataset.nodeState !== \"minimized\"\n ) {\n return rect;\n }\n\n const isLayoutAnimating =\n element.dataset.presence === \"entering\" ||\n element.dataset.collapsing === \"true\";\n if (!isLayoutAnimating) {\n return rect;\n }\n\n const fallbackSize = readDockAnchorFallbackSize(element);\n const minimumUsableSize = fallbackSize * 0.5;\n return {\n ...rect,\n height: rect.height >= minimumUsableSize ? rect.height : fallbackSize,\n width: rect.width >= minimumUsableSize ? rect.width : fallbackSize\n };\n}\n\nexport function writeCachedWorkbenchNodePreviewImage(\n nodeID: string,\n previewImageUrl: string | null | undefined\n): void {\n if (previewImageUrl) {\n dockPreviewImageByNodeID.delete(nodeID);\n dockPreviewImageByNodeID.set(nodeID, previewImageUrl);\n while (dockPreviewImageByNodeID.size > dockPreviewImageCacheMaxEntries) {\n const oldestNodeID = dockPreviewImageByNodeID.keys().next().value;\n if (typeof oldestNodeID !== \"string\") {\n break;\n }\n dockPreviewImageByNodeID.delete(oldestNodeID);\n }\n }\n}\n\nexport function readCachedWorkbenchNodePreviewImage(\n nodeID: string\n): string | null {\n return dockPreviewImageByNodeID.get(nodeID) ?? null;\n}\n\nexport async function captureWorkbenchNodePreviewImage(\n nodeID: string,\n options: { bypassCache?: boolean } = {}\n): Promise<string | null> {\n if (!options.bypassCache) {\n const cachedPreviewImageUrl = readCachedWorkbenchNodePreviewImage(nodeID);\n if (cachedPreviewImageUrl) {\n return cachedPreviewImageUrl;\n }\n }\n\n const windowElement =\n Array.from(\n document.querySelectorAll<HTMLElement>(\"[data-workbench-window-id]\")\n ).find((candidate) => candidate.dataset.workbenchWindowId === nodeID) ??\n null;\n const captureTarget = windowElement\n ? resolveWorkbenchCaptureElement(windowElement)\n : null;\n if (!captureTarget) {\n return null;\n }\n\n const texture = await captureElementTexture(captureTarget).catch(() => null);\n const previewImageUrl = texture\n ? createDockPreviewDataUrl(texture.canvas)\n : null;\n writeCachedWorkbenchNodePreviewImage(nodeID, previewImageUrl);\n return previewImageUrl;\n}\n\nasync function captureProvidedWorkbenchNodePreviewImageForNode<TData>(\n node: WorkbenchNode<TData>,\n input: {\n captureNodePreviewImage?: WorkbenchNodePreviewImageCapture<TData>;\n dockPreviewCache?: WorkbenchDockPreviewCache;\n resolveDockPreviewCacheKey?: WorkbenchDockPreviewCacheKeyResolver<TData>;\n } = {}\n): Promise<string | null> {\n const previewImageUrl = await Promise.resolve(\n input.captureNodePreviewImage?.(node) ?? null\n ).catch(() => null);\n if (!previewImageUrl) {\n return null;\n }\n writeCachedWorkbenchNodePreviewImage(node.id, previewImageUrl);\n persistWorkbenchNodePreviewImage(node, previewImageUrl, input);\n return previewImageUrl;\n}\n\nfunction persistWorkbenchNodePreviewImage<TData>(\n node: WorkbenchNode<TData>,\n previewImageUrl: string | null | undefined,\n input: {\n dockPreviewCache?: WorkbenchDockPreviewCache;\n resolveDockPreviewCacheKey?: WorkbenchDockPreviewCacheKeyResolver<TData>;\n }\n): void {\n if (!previewImageUrl || !input.dockPreviewCache) {\n return;\n }\n const key = input.resolveDockPreviewCacheKey?.(node) ?? null;\n if (!key) {\n return;\n }\n input.dockPreviewCache.write({ key, previewImageUrl });\n}\n\nfunction createGenieSvgTexture(\n element: HTMLElement,\n rect: WorkbenchGenieViewportRect\n): string {\n const svgNamespace = \"http://www.w3.org/2000/svg\";\n const svgDocument = document.implementation.createDocument(\n svgNamespace,\n \"svg\",\n null\n );\n const svg = svgDocument.documentElement;\n svg.setAttribute(\"xmlns\", svgNamespace);\n svg.setAttribute(\"width\", String(rect.width));\n svg.setAttribute(\"height\", String(rect.height));\n svg.setAttribute(\"viewBox\", `0 0 ${rect.width} ${rect.height}`);\n\n const foreignObject = svgDocument.createElementNS(\n svgNamespace,\n \"foreignObject\"\n );\n foreignObject.setAttribute(\"width\", \"100%\");\n foreignObject.setAttribute(\"height\", \"100%\");\n foreignObject.setAttribute(\"x\", \"0\");\n foreignObject.setAttribute(\"y\", \"0\");\n foreignObject.appendChild(svgDocument.importNode(element, true));\n svg.appendChild(foreignObject);\n\n return new XMLSerializer().serializeToString(svgDocument);\n}\n\nexport function useWorkbenchGenieAnimation<TData>({\n captureNodePreviewImage,\n controller,\n dockPreviewCache,\n minimizeAnimation = \"genie\",\n resolveDockAnchorKey,\n resolveDockPreviewCacheKey,\n shouldCaptureNodePreviewImage\n}: {\n captureNodePreviewImage?: WorkbenchNodePreviewImageCapture<TData>;\n controller: WorkbenchController<TData>;\n dockPreviewCache?: WorkbenchDockPreviewCache;\n minimizeAnimation?: WorkbenchMinimizeAnimation;\n resolveDockAnchorKey?: (node: WorkbenchNode<TData>) => string;\n resolveDockPreviewCacheKey?: WorkbenchDockPreviewCacheKeyResolver<TData>;\n shouldCaptureNodePreviewImage?: (node: WorkbenchNode<TData>) => boolean;\n}): WorkbenchGenieController<TData> {\n const dockAnchorElementsRef = useRef(new Map<string, HTMLElement>());\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n const rafRef = useRef<number | null>(null);\n const animationGenerationRef = useRef(0);\n const animationCleanupRef = useRef<(() => void) | null>(null);\n const minimizedDockEnterAnimationNodeIdsRef = useRef(new Set<string>());\n const minimizedDockEnterAnimationTimersRef = useRef(\n new Map<string, ReturnType<typeof setTimeout>>()\n );\n const [isCanvasActive, setIsCanvasActive] = useState(false);\n const [genieHiddenNodeIDs, setGenieHiddenNodeIDs] = useState(\n () => new Set<string>()\n );\n const [pendingMinimizedNode, setPendingMinimizedNode] =\n useState<WorkbenchNode<TData> | null>(null);\n\n const registerDockAnchor = useCallback(\n (anchorKey: string, element: HTMLElement | null) => {\n if (element) {\n dockAnchorElementsRef.current.set(anchorKey, element);\n return;\n }\n dockAnchorElementsRef.current.delete(anchorKey);\n },\n []\n );\n\n const resolveDockAnchorRect = useCallback((anchorKey: string) => {\n const element = dockAnchorElementsRef.current.get(anchorKey) ?? null;\n return element ? resolveDockAnchorViewportRect(element) : null;\n }, []);\n\n const resolveNodeElement = useCallback((nodeID: string) => {\n return (\n Array.from(\n document.querySelectorAll<HTMLElement>(\"[data-workbench-window-id]\")\n ).find((candidate) => candidate.dataset.workbenchWindowId === nodeID) ??\n null\n );\n }, []);\n\n const resolveAnchorKeyForNode = useCallback(\n (node: WorkbenchNode<TData>) => resolveDockAnchorKey?.(node) ?? node.id,\n [resolveDockAnchorKey]\n );\n\n const releaseMinimizedDockEnterAnimation = useCallback((nodeID: string) => {\n const timer = minimizedDockEnterAnimationTimersRef.current.get(nodeID);\n if (timer) {\n clearTimeout(timer);\n minimizedDockEnterAnimationTimersRef.current.delete(nodeID);\n }\n minimizedDockEnterAnimationNodeIdsRef.current.delete(nodeID);\n }, []);\n\n const registerMinimizedDockEnterAnimation = useCallback(\n (nodeID: string) => {\n releaseMinimizedDockEnterAnimation(nodeID);\n minimizedDockEnterAnimationNodeIdsRef.current.add(nodeID);\n },\n [releaseMinimizedDockEnterAnimation]\n );\n\n const scheduleReleaseMinimizedDockEnterAnimation = useCallback(\n (nodeID: string, delayMs = minimizedDockSlotEnterAnimationMs) => {\n const existing = minimizedDockEnterAnimationTimersRef.current.get(nodeID);\n if (existing) {\n clearTimeout(existing);\n }\n minimizedDockEnterAnimationTimersRef.current.set(\n nodeID,\n setTimeout(() => {\n minimizedDockEnterAnimationTimersRef.current.delete(nodeID);\n minimizedDockEnterAnimationNodeIdsRef.current.delete(nodeID);\n }, delayMs)\n );\n },\n []\n );\n\n const shouldAnimateMinimizedDockEnter = useCallback((nodeID: string) => {\n return minimizedDockEnterAnimationNodeIdsRef.current.has(nodeID);\n }, []);\n\n const hideNodeForGenie = useCallback((nodeID: string) => {\n setGenieHiddenNodeIDs((current) => {\n if (current.has(nodeID)) {\n return current;\n }\n return new Set([...current, nodeID]);\n });\n }, []);\n\n const showNodeForGenie = useCallback((nodeID: string) => {\n setGenieHiddenNodeIDs((current) => {\n if (!current.has(nodeID)) {\n return current;\n }\n const next = new Set(current);\n next.delete(nodeID);\n return next;\n });\n }, []);\n\n const clearPendingMinimizedNode = useCallback((nodeID: string) => {\n setPendingMinimizedNode((current) =>\n current?.id === nodeID ? null : current\n );\n }, []);\n\n const setupCanvas = useCallback(() => {\n const canvas = canvasRef.current;\n if (!canvas) {\n return null;\n }\n const devicePixelRatio = Math.min(\n window.devicePixelRatio || 1,\n genieMaxDevicePixelRatio\n );\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n canvas.width = Math.max(1, Math.round(viewportWidth * devicePixelRatio));\n canvas.height = Math.max(1, Math.round(viewportHeight * devicePixelRatio));\n canvas.style.width = `${viewportWidth}px`;\n canvas.style.height = `${viewportHeight}px`;\n const context = canvas.getContext(\"2d\");\n if (!context) {\n return null;\n }\n context.setTransform(devicePixelRatio, 0, 0, devicePixelRatio, 0, 0);\n return { context, viewportHeight, viewportWidth };\n }, []);\n\n const clearCanvas = useCallback(() => {\n const canvas = canvasRef.current;\n const context = canvas?.getContext(\"2d\") ?? null;\n if (canvas && context) {\n context.clearRect(0, 0, canvas.width, canvas.height);\n }\n setIsCanvasActive(false);\n }, []);\n\n const stopAnimation = useCallback((runCleanup = true) => {\n animationGenerationRef.current += 1;\n if (rafRef.current !== null) {\n window.cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n const cleanup = animationCleanupRef.current;\n animationCleanupRef.current = null;\n if (runCleanup) {\n cleanup?.();\n }\n }, []);\n\n const runGenieAnimation = useCallback(\n ({\n direction,\n dockRect,\n onComplete,\n onCancel,\n skipStop,\n texture\n }: {\n direction: WorkbenchGenieDirection;\n dockRect: WorkbenchGenieViewportRect;\n onCancel?: () => void;\n onComplete: () => void;\n skipStop?: boolean;\n texture: CapturedGenieTexture;\n }) => {\n if (!skipStop) {\n stopAnimation();\n }\n const setup = setupCanvas();\n if (!setup) {\n onComplete();\n return;\n }\n\n const generation = animationGenerationRef.current;\n const dockPoint = centerPointFromRect(dockRect);\n let startTime: number | null = null;\n animationCleanupRef.current = onCancel ?? null;\n setIsCanvasActive(true);\n renderGenieScanlines(\n setup.context,\n setup.viewportWidth,\n setup.viewportHeight,\n {\n direction,\n dockPoint,\n progress: 0,\n texture: texture.canvas,\n textureRect: texture.rect\n }\n );\n\n const drawFrame = (timestamp: number) => {\n if (generation !== animationGenerationRef.current) {\n return;\n }\n startTime ??= timestamp;\n const progress = clampProgress(\n (timestamp - startTime) / genieDurationMs\n );\n const animationProgress = resolveGenieAnimationProgress(\n direction,\n progress\n );\n renderGenieScanlines(\n setup.context,\n setup.viewportWidth,\n setup.viewportHeight,\n {\n direction,\n dockPoint,\n progress: animationProgress,\n texture: texture.canvas,\n textureRect: texture.rect\n }\n );\n\n if (progress < 1) {\n rafRef.current = window.requestAnimationFrame(drawFrame);\n return;\n }\n\n rafRef.current = null;\n animationCleanupRef.current = null;\n onComplete();\n };\n\n rafRef.current = window.requestAnimationFrame(drawFrame);\n },\n [setupCanvas, stopAnimation]\n );\n\n const runScaleWindowAnimation = useCallback(\n ({\n direction,\n dockRect,\n nodeElement,\n onCancel,\n onComplete,\n skipStop\n }: {\n direction: WorkbenchGenieDirection;\n dockRect: WorkbenchGenieViewportRect;\n nodeElement: HTMLElement;\n onCancel: () => void;\n onComplete: () => void;\n skipStop?: boolean;\n }) => {\n if (!skipStop) {\n stopAnimation();\n }\n const windowRect = viewportRectFromElement(nodeElement);\n if (!isUsableGenieRect(windowRect) || !isUsableGenieRect(dockRect)) {\n onComplete();\n return;\n }\n\n const generation = animationGenerationRef.current;\n const fromCenter = centerPointFromRect(windowRect);\n const toCenter = centerPointFromRect(dockRect);\n const targetScale = Math.max(\n 0.04,\n Math.min(\n 0.32,\n dockRect.width / Math.max(1, windowRect.width),\n dockRect.height / Math.max(1, windowRect.height)\n )\n );\n const previousPointerEvents = nodeElement.style.pointerEvents;\n const previousTransformOrigin = nodeElement.style.transformOrigin;\n const previousVisibility = nodeElement.style.visibility;\n const previousZIndex = nodeElement.style.zIndex;\n nodeElement.style.pointerEvents = \"none\";\n nodeElement.style.transformOrigin = \"center center\";\n nodeElement.style.visibility = \"visible\";\n nodeElement.style.zIndex = \"var(--z-workbench-genie)\";\n\n const dockTransform = `translate3d(${toCenter.x - fromCenter.x}px, ${\n toCenter.y - fromCenter.y\n }px, 0) scale(${targetScale})`;\n const windowTransform = \"translate3d(0, 0, 0) scale(1)\";\n const keyframes =\n direction === \"open\"\n ? [\n {\n opacity: 0,\n transform: dockTransform\n },\n {\n opacity: 1,\n transform: windowTransform\n }\n ]\n : [\n {\n opacity: 1,\n transform: windowTransform\n },\n {\n opacity: 0,\n transform: dockTransform\n }\n ];\n const animation = nodeElement.animate(keyframes, {\n duration: scaleMinimizeDurationMs,\n easing: \"cubic-bezier(0.4, 0, 0.2, 1)\",\n fill: \"forwards\"\n });\n\n const restoreElement = () => {\n animation.cancel();\n nodeElement.style.pointerEvents = previousPointerEvents;\n nodeElement.style.transformOrigin = previousTransformOrigin;\n nodeElement.style.visibility = previousVisibility;\n nodeElement.style.zIndex = previousZIndex;\n };\n\n animationCleanupRef.current = () => {\n restoreElement();\n onCancel();\n };\n animation.finished\n .then(() => {\n if (generation !== animationGenerationRef.current) {\n return;\n }\n animationCleanupRef.current = null;\n restoreElement();\n onComplete();\n })\n .catch(() => {\n if (generation !== animationGenerationRef.current) {\n return;\n }\n animationCleanupRef.current = null;\n restoreElement();\n onComplete();\n });\n },\n [stopAnimation]\n );\n\n useEffect(() => () => stopAnimation(false), [stopAnimation]);\n\n const startOpenOrRestoreAnimation = useCallback(\n async (\n nodeID: string,\n anchorKey: string,\n generation: number,\n dockRectFallback: WorkbenchGenieViewportRect | null\n ) => {\n const effectiveMinimizeAnimation = shouldReduceMotion()\n ? \"off\"\n : minimizeAnimation;\n if (effectiveMinimizeAnimation === \"off\") {\n animationCleanupRef.current = null;\n showNodeForGenie(nodeID);\n return;\n }\n\n await waitForNextAnimationFrame();\n if (generation !== animationGenerationRef.current) {\n return;\n }\n const resolvedDockRect = resolveDockAnchorRect(anchorKey);\n const dockRect =\n resolvedDockRect && isUsableGenieRect(resolvedDockRect)\n ? resolvedDockRect\n : dockRectFallback;\n const nodeElement = resolveNodeElement(nodeID);\n if (effectiveMinimizeAnimation === \"scale\") {\n if (!dockRect || !nodeElement || !isUsableGenieRect(dockRect)) {\n animationCleanupRef.current = null;\n showNodeForGenie(nodeID);\n return;\n }\n flushSync(() => {\n showNodeForGenie(nodeID);\n });\n runScaleWindowAnimation({\n direction: \"open\",\n dockRect,\n nodeElement,\n onCancel: () => {\n flushSync(() => {\n showNodeForGenie(nodeID);\n });\n },\n onComplete: () => {\n flushSync(() => {\n showNodeForGenie(nodeID);\n });\n }\n });\n return;\n }\n\n const captureTarget = nodeElement\n ? resolveWorkbenchCaptureElement(nodeElement)\n : null;\n if (\n !dockRect ||\n !nodeElement ||\n !captureTarget ||\n !isUsableGenieRect(dockRect)\n ) {\n animationCleanupRef.current = null;\n showNodeForGenie(nodeID);\n return;\n }\n\n const texture = await captureElementTexture(captureTarget).catch(\n () => null\n );\n if (generation !== animationGenerationRef.current) {\n return;\n }\n if (!texture) {\n animationCleanupRef.current = null;\n showNodeForGenie(nodeID);\n return;\n }\n\n runGenieAnimation({\n direction: \"open\",\n dockRect,\n onCancel: () => {\n flushSync(() => {\n showNodeForGenie(nodeID);\n });\n clearCanvas();\n },\n onComplete: () => {\n flushSync(() => {\n showNodeForGenie(nodeID);\n });\n clearCanvas();\n },\n skipStop: true,\n texture\n });\n },\n [\n clearCanvas,\n minimizeAnimation,\n resolveDockAnchorRect,\n resolveNodeElement,\n runGenieAnimation,\n runScaleWindowAnimation,\n showNodeForGenie\n ]\n );\n\n const launchNodeFromAnchor = useCallback(\n (\n anchorKey: string,\n nodeID: string,\n launch: () => Promise<string | null | void> | string | null | void\n ) => {\n const target = controller\n .getSnapshot()\n .nodes.find((node) => node.id === nodeID);\n if (!target) {\n void Promise.resolve(launch()).catch(() => {});\n return;\n }\n\n if (target.isMinimized !== true) {\n void Promise.resolve(launch()).catch(() => {});\n return;\n }\n\n const effectiveMinimizeAnimation = shouldReduceMotion()\n ? \"off\"\n : minimizeAnimation;\n if (effectiveMinimizeAnimation === \"off\") {\n stopAnimation();\n flushSync(() => {\n showNodeForGenie(nodeID);\n });\n void Promise.resolve(launch()).catch(() => {});\n return;\n }\n\n stopAnimation();\n const dockRectFallback = resolveDockAnchorRect(anchorKey);\n hideNodeForGenie(nodeID);\n animationCleanupRef.current = () => {\n flushSync(() => {\n showNodeForGenie(nodeID);\n });\n clearCanvas();\n };\n const generation = animationGenerationRef.current;\n flushSync(() => {\n void launch();\n });\n void startOpenOrRestoreAnimation(\n nodeID,\n anchorKey,\n generation,\n dockRectFallback\n );\n },\n [\n clearCanvas,\n controller,\n hideNodeForGenie,\n minimizeAnimation,\n resolveDockAnchorRect,\n showNodeForGenie,\n startOpenOrRestoreAnimation,\n stopAnimation\n ]\n );\n\n const minimizeNodeToAnchor = useCallback(\n (nodeID: string, minimize?: () => void) => {\n void (async () => {\n const target = controller\n .getSnapshot()\n .nodes.find((node) => node.id === nodeID);\n if (!target) {\n return;\n }\n const runMinimize =\n minimize ?? (() => controller.commands.minimizeNode(nodeID));\n const effectiveMinimizeAnimation = shouldReduceMotion()\n ? \"off\"\n : minimizeAnimation;\n const shouldCapturePreview =\n shouldCaptureNodePreviewImage?.(target) ?? true;\n if (effectiveMinimizeAnimation === \"off\") {\n stopAnimation();\n let frameID: number | null = null;\n let timerID: ReturnType<typeof setTimeout> | null = null;\n let minimizeCommitted = false;\n const commitMinimize = () => {\n if (minimizeCommitted) {\n return;\n }\n minimizeCommitted = true;\n if (frameID !== null) {\n window.cancelAnimationFrame(frameID);\n frameID = null;\n }\n if (timerID !== null) {\n clearTimeout(timerID);\n timerID = null;\n }\n animationCleanupRef.current = null;\n flushSync(() => {\n clearPendingMinimizedNode(nodeID);\n showNodeForGenie(nodeID);\n runMinimize();\n });\n scheduleReleaseMinimizedDockEnterAnimation(nodeID);\n };\n animationCleanupRef.current = () => {\n releaseMinimizedDockEnterAnimation(nodeID);\n commitMinimize();\n };\n registerMinimizedDockEnterAnimation(nodeID);\n flushSync(() => {\n hideNodeForGenie(nodeID);\n setPendingMinimizedNode({\n ...target,\n isMinimized: true,\n minimizedAtUnixMs: Date.now()\n });\n });\n if (shouldCapturePreview) {\n void captureProvidedWorkbenchNodePreviewImageForNode(target, {\n captureNodePreviewImage,\n dockPreviewCache,\n resolveDockPreviewCacheKey\n });\n }\n frameID = window.requestAnimationFrame(() => {\n frameID = null;\n timerID = setTimeout(commitMinimize, 0);\n });\n return;\n }\n\n if (effectiveMinimizeAnimation === \"scale\") {\n stopAnimation();\n const generation = animationGenerationRef.current;\n const nodeElement = resolveNodeElement(nodeID);\n if (!nodeElement) {\n runMinimize();\n return;\n }\n const wasFocusedForCapture =\n shouldCapturePreview && isFocusedWorkbenchNode(controller, nodeID);\n if (shouldCapturePreview && !wasFocusedForCapture) {\n flushSync(() => {\n controller.commands.focusNode(nodeID);\n });\n await waitForNextAnimationFrame();\n if (generation !== animationGenerationRef.current) {\n return;\n }\n }\n\n if (shouldCapturePreview) {\n void captureProvidedWorkbenchNodePreviewImageForNode(target, {\n captureNodePreviewImage,\n dockPreviewCache,\n resolveDockPreviewCacheKey\n });\n }\n\n let minimizeCommitted = false;\n const commitMinimize = () => {\n if (minimizeCommitted) {\n return;\n }\n minimizeCommitted = true;\n runMinimize();\n };\n const cleanupPendingMinimize = () => {\n releaseMinimizedDockEnterAnimation(nodeID);\n flushSync(() => {\n clearPendingMinimizedNode(nodeID);\n commitMinimize();\n });\n };\n const pendingMinimizedNode: WorkbenchNode<TData> = {\n ...target,\n isMinimized: true,\n minimizedAtUnixMs: Date.now()\n };\n registerMinimizedDockEnterAnimation(nodeID);\n\n flushSync(() => {\n setPendingMinimizedNode(pendingMinimizedNode);\n });\n animationCleanupRef.current = cleanupPendingMinimize;\n\n await waitForNextAnimationFrame();\n if (generation !== animationGenerationRef.current) {\n return;\n }\n\n const anchorKey = resolveAnchorKeyForNode(pendingMinimizedNode);\n const dockRect = resolveDockAnchorRect(anchorKey);\n if (\n !nodeElement.isConnected ||\n !dockRect ||\n !isUsableGenieRect(dockRect)\n ) {\n cleanupPendingMinimize();\n return;\n }\n\n runScaleWindowAnimation({\n direction: \"minimize\",\n dockRect,\n nodeElement,\n onCancel: () => {\n cleanupPendingMinimize();\n },\n onComplete: () => {\n animationCleanupRef.current = null;\n flushSync(() => {\n clearPendingMinimizedNode(nodeID);\n commitMinimize();\n });\n scheduleReleaseMinimizedDockEnterAnimation(nodeID);\n },\n skipStop: true\n });\n return;\n }\n\n stopAnimation();\n const generation = animationGenerationRef.current;\n const nodeElement = resolveNodeElement(nodeID);\n const captureTarget = nodeElement\n ? resolveWorkbenchCaptureElement(nodeElement)\n : null;\n if (!nodeElement || !captureTarget) {\n runMinimize();\n return;\n }\n\n const preparedTexture = prepareElementTextureCapture(captureTarget);\n if (!preparedTexture) {\n runMinimize();\n return;\n }\n const wasFocusedForCapture = isFocusedWorkbenchNode(controller, nodeID);\n if (!wasFocusedForCapture) {\n flushSync(() => {\n controller.commands.focusNode(nodeID);\n });\n await waitForNextAnimationFrame();\n if (generation !== animationGenerationRef.current) {\n return;\n }\n }\n const previewImageUrlPromise = Promise.resolve(\n captureNodePreviewImage?.(target) ?? null\n ).catch(() => null);\n const texture = await renderPreparedElementTexture(\n preparedTexture\n ).catch(() => null);\n const previewImageUrl = await previewImageUrlPromise;\n if (generation !== animationGenerationRef.current) {\n return;\n }\n if (!texture) {\n if (previewImageUrl) {\n writeCachedWorkbenchNodePreviewImage(nodeID, previewImageUrl);\n persistWorkbenchNodePreviewImage(target, previewImageUrl, {\n dockPreviewCache,\n resolveDockPreviewCacheKey\n });\n }\n runMinimize();\n return;\n }\n if (previewImageUrl) {\n writeCachedWorkbenchNodePreviewImage(nodeID, previewImageUrl);\n persistWorkbenchNodePreviewImage(target, previewImageUrl, {\n dockPreviewCache,\n resolveDockPreviewCacheKey\n });\n } else {\n const capturedPreviewImageUrl = createDockPreviewDataUrl(\n texture.canvas\n );\n writeCachedWorkbenchNodePreviewImage(nodeID, capturedPreviewImageUrl);\n persistWorkbenchNodePreviewImage(target, capturedPreviewImageUrl, {\n dockPreviewCache,\n resolveDockPreviewCacheKey\n });\n }\n\n let minimizeCommitted = false;\n const commitMinimize = () => {\n if (minimizeCommitted) {\n return;\n }\n minimizeCommitted = true;\n runMinimize();\n };\n const pendingMinimizedNode: WorkbenchNode<TData> = {\n ...target,\n isMinimized: true,\n minimizedAtUnixMs: Date.now()\n };\n const cleanupPendingGenieMinimize = () => {\n releaseMinimizedDockEnterAnimation(nodeID);\n flushSync(() => {\n clearPendingMinimizedNode(nodeID);\n showNodeForGenie(nodeID);\n commitMinimize();\n });\n clearCanvas();\n };\n animationCleanupRef.current = cleanupPendingGenieMinimize;\n\n registerMinimizedDockEnterAnimation(nodeID);\n\n flushSync(() => {\n setPendingMinimizedNode(pendingMinimizedNode);\n hideNodeForGenie(nodeID);\n });\n\n await waitForNextAnimationFrame();\n if (generation !== animationGenerationRef.current) {\n return;\n }\n\n const anchorKey = resolveAnchorKeyForNode(pendingMinimizedNode);\n const dockRect = resolveDockAnchorRect(anchorKey);\n if (!dockRect || !isUsableGenieRect(dockRect)) {\n animationCleanupRef.current = null;\n cleanupPendingGenieMinimize();\n return;\n }\n\n runGenieAnimation({\n direction: \"minimize\",\n dockRect,\n onCancel: () => {\n cleanupPendingGenieMinimize();\n },\n onComplete: () => {\n scheduleReleaseMinimizedDockEnterAnimation(nodeID);\n flushSync(() => {\n clearPendingMinimizedNode(nodeID);\n showNodeForGenie(nodeID);\n commitMinimize();\n });\n clearCanvas();\n },\n skipStop: true,\n texture\n });\n })();\n },\n [\n clearCanvas,\n controller,\n captureNodePreviewImage,\n clearPendingMinimizedNode,\n dockPreviewCache,\n hideNodeForGenie,\n minimizeAnimation,\n registerMinimizedDockEnterAnimation,\n releaseMinimizedDockEnterAnimation,\n resolveAnchorKeyForNode,\n resolveDockPreviewCacheKey,\n resolveDockAnchorRect,\n resolveNodeElement,\n runGenieAnimation,\n runScaleWindowAnimation,\n scheduleReleaseMinimizedDockEnterAnimation,\n shouldCaptureNodePreviewImage,\n setupCanvas,\n showNodeForGenie,\n stopAnimation\n ]\n );\n\n useEffect(\n () => () => {\n for (const timer of minimizedDockEnterAnimationTimersRef.current.values()) {\n clearTimeout(timer);\n }\n minimizedDockEnterAnimationTimersRef.current.clear();\n minimizedDockEnterAnimationNodeIdsRef.current.clear();\n },\n []\n );\n\n return {\n genieLayer:\n typeof document === \"undefined\"\n ? null\n : createPortal(\n <canvas\n ref={canvasRef}\n className=\"workbench-genie-layer\"\n data-workbench-genie-layer-state={\n isCanvasActive ? \"active\" : \"idle\"\n }\n aria-hidden\n />,\n document.body\n ),\n isNodeGenieHidden: useCallback(\n (nodeID: string) => genieHiddenNodeIDs.has(nodeID),\n [genieHiddenNodeIDs]\n ),\n isPendingMinimizedDockNode: useCallback(\n (nodeID: string) => pendingMinimizedNode?.id === nodeID,\n [pendingMinimizedNode]\n ),\n launchNodeFromAnchor,\n minimizeNodeToAnchor,\n pendingMinimizedNode,\n registerDockAnchor,\n shouldAnimateMinimizedDockEnter\n };\n}\n","export interface WorkbenchGenieViewportRect {\n height: number;\n left: number;\n top: number;\n width: number;\n}\n\nexport type WorkbenchGenieDirection = \"open\" | \"minimize\";\n\nexport interface WorkbenchGeniePoint {\n x: number;\n y: number;\n}\n\nexport interface WorkbenchGenieScanlineFrame {\n direction: WorkbenchGenieDirection;\n dockPoint: WorkbenchGeniePoint;\n progress: number;\n texture: HTMLCanvasElement;\n textureRect: WorkbenchGenieViewportRect;\n}\n\nexport interface WorkbenchGenieMeaningfulElementClone {\n clone: HTMLElement;\n images: WorkbenchGenieMeaningfulImageClone[];\n}\n\nexport interface WorkbenchGenieMeaningfulImageClone {\n displayHeight: number;\n displayWidth: number;\n url: string | null;\n}\n\nconst genieHorizontalRowStagger = 0.65;\nconst genieVerticalRowStagger = 0.2;\nconst genieDockGlowRadius = 55;\nconst genieScanlineStrideThresholdPx = 640;\nconst genieMaxScanlineStride = 3;\n\nexport function clampGenieProgress(value: number): number {\n return Math.max(0, Math.min(1, value));\n}\n\nexport function easeInOutCubic(value: number): number {\n const progress = clampGenieProgress(value);\n return progress < 0.5\n ? 4 * progress * progress * progress\n : 1 - Math.pow(-2 * progress + 2, 3) / 2;\n}\n\nexport function easeInQuadratic(value: number): number {\n const progress = clampGenieProgress(value);\n return progress * progress;\n}\n\nexport function easeOutQuadratic(value: number): number {\n const progress = clampGenieProgress(value);\n return 1 - (1 - progress) * (1 - progress);\n}\n\nexport function lerpGenieValue(\n from: number,\n to: number,\n progress: number\n): number {\n return from + (to - from) * progress;\n}\n\nexport function viewportRectFromElement(\n element: HTMLElement\n): WorkbenchGenieViewportRect {\n const rect = element.getBoundingClientRect();\n return {\n height: rect.height,\n left: rect.left,\n top: rect.top,\n width: rect.width\n };\n}\n\nexport function isUsableGenieRect(rect: WorkbenchGenieViewportRect): boolean {\n return rect.width > 0 && rect.height > 0;\n}\n\nexport function centerPointFromRect(\n rect: WorkbenchGenieViewportRect\n): WorkbenchGeniePoint {\n return {\n x: rect.left + rect.width / 2,\n y: rect.top + rect.height / 2\n };\n}\n\nfunction resolveGenieScanlineStride(textureHeight: number): number {\n return Math.max(\n 1,\n Math.min(\n genieMaxScanlineStride,\n Math.ceil(textureHeight / genieScanlineStrideThresholdPx)\n )\n );\n}\n\nfunction resolveGenieDirtyRect({\n dockPoint,\n textureRect,\n viewportHeight,\n viewportWidth\n}: {\n dockPoint: WorkbenchGeniePoint;\n textureRect: WorkbenchGenieViewportRect;\n viewportHeight: number;\n viewportWidth: number;\n}): WorkbenchGenieViewportRect {\n const padding = genieDockGlowRadius + 4;\n const left = Math.max(\n 0,\n Math.floor(Math.min(textureRect.left, dockPoint.x) - padding)\n );\n const top = Math.max(\n 0,\n Math.floor(Math.min(textureRect.top, dockPoint.y) - padding)\n );\n const right = Math.min(\n viewportWidth,\n Math.ceil(\n Math.max(textureRect.left + textureRect.width, dockPoint.x) + padding\n )\n );\n const bottom = Math.min(\n viewportHeight,\n Math.ceil(\n Math.max(textureRect.top + textureRect.height, dockPoint.y) + padding\n )\n );\n\n return {\n height: Math.max(0, bottom - top),\n left,\n top,\n width: Math.max(0, right - left)\n };\n}\n\nfunction resolveGenieRowProgress({\n direction,\n progress,\n rowProgress,\n stagger\n}: {\n direction: WorkbenchGenieDirection;\n progress: number;\n rowProgress: number;\n stagger: number;\n}): number {\n const start =\n direction === \"minimize\"\n ? (1 - rowProgress) * stagger\n : rowProgress * stagger;\n return clampGenieProgress((progress - start) / (1 - start));\n}\n\nfunction resolveGenieRowTargetY({\n direction,\n dockPoint,\n progress,\n sourceY,\n textureHeight,\n textureRect\n}: {\n direction: WorkbenchGenieDirection;\n dockPoint: WorkbenchGeniePoint;\n progress: number;\n sourceY: number;\n textureHeight: number;\n textureRect: WorkbenchGenieViewportRect;\n}): number {\n const rowProgress = clampGenieProgress(sourceY / textureHeight);\n const verticalProgress = resolveGenieRowProgress({\n direction,\n progress,\n rowProgress,\n stagger: genieVerticalRowStagger\n });\n const verticalEase = easeInQuadratic(verticalProgress);\n return direction === \"minimize\"\n ? lerpGenieValue(textureRect.top + sourceY, dockPoint.y, verticalEase)\n : lerpGenieValue(dockPoint.y, textureRect.top + sourceY, verticalEase);\n}\n\nfunction canInlineComputedStyle(\n element: Element\n): element is HTMLElement | SVGElement {\n return (\n element instanceof HTMLElement ||\n (typeof SVGElement !== \"undefined\" && element instanceof SVGElement)\n );\n}\n\nfunction isHiddenForGenieTexture(computed: CSSStyleDeclaration): boolean {\n return (\n computed.display === \"none\" ||\n computed.visibility === \"hidden\" ||\n computed.visibility === \"collapse\" ||\n Number.parseFloat(computed.opacity || \"1\") <= 0\n );\n}\n\nfunction rectsIntersect(\n a: WorkbenchGenieViewportRect,\n b: WorkbenchGenieViewportRect\n): boolean {\n return (\n a.left < b.left + b.width &&\n a.left + a.width > b.left &&\n a.top < b.top + b.height &&\n a.top + a.height > b.top\n );\n}\n\ntype WorkbenchGenieElementSkipReason =\n | \"hidden\"\n | \"offscreen\"\n | \"unsupported\"\n | \"zero-size\";\n\nfunction resolveElementSkipReasonForGenieTexture(\n element: Element,\n rootRect: WorkbenchGenieViewportRect,\n computed: CSSStyleDeclaration\n): WorkbenchGenieElementSkipReason | null {\n if (isHiddenForGenieTexture(computed)) {\n return \"hidden\";\n }\n const tagName = element.tagName.toLowerCase();\n if (tagName === \"script\" || tagName === \"style\" || tagName === \"template\") {\n return \"unsupported\";\n }\n const rect = element.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) {\n return \"zero-size\";\n }\n return rectsIntersect(\n {\n height: rect.height,\n left: rect.left,\n top: rect.top,\n width: rect.width\n },\n rootRect\n )\n ? null\n : \"offscreen\";\n}\n\nfunction hasMeaningfulTextNode(node: Node): boolean {\n return node.textContent?.trim() ? true : false;\n}\n\nfunction cloneMeaningfulGenieNode(\n source: Node,\n rootRect: WorkbenchGenieViewportRect,\n images: WorkbenchGenieMeaningfulImageClone[],\n forceInclude = false\n): Node | null {\n if (source.nodeType === Node.TEXT_NODE) {\n if (!hasMeaningfulTextNode(source)) {\n return null;\n }\n return source.cloneNode(false);\n }\n if (source.nodeType !== Node.ELEMENT_NODE) {\n return null;\n }\n\n const sourceElement = source as Element;\n if (!canInlineComputedStyle(sourceElement)) {\n return null;\n }\n const computed = window.getComputedStyle(sourceElement);\n const skipReason = resolveElementSkipReasonForGenieTexture(\n sourceElement,\n rootRect,\n computed\n );\n const includeSelf = forceInclude || skipReason === null;\n if (!includeSelf && skipReason === \"hidden\") {\n return null;\n }\n\n const clone = sourceElement.cloneNode(false) as Element;\n copyGenieComputedStyle(sourceElement, clone, computed);\n\n for (const child of Array.from(source.childNodes)) {\n const childClone = cloneMeaningfulGenieNode(child, rootRect, images);\n if (childClone) {\n clone.appendChild(childClone);\n }\n }\n\n if (!includeSelf && clone.childNodes.length === 0) {\n return null;\n }\n\n if (sourceElement instanceof HTMLImageElement) {\n const rect = sourceElement.getBoundingClientRect();\n images.push({\n displayHeight: rect.height,\n displayWidth: rect.width,\n url:\n sourceElement.currentSrc ||\n sourceElement.src ||\n sourceElement.getAttribute(\"src\") ||\n null\n });\n }\n return clone;\n}\n\nfunction copyGenieComputedStyle(\n source: Element,\n clone: Element,\n computed = window.getComputedStyle(source)\n): void {\n if (!canInlineComputedStyle(source) || !canInlineComputedStyle(clone)) {\n return;\n }\n if (computed.cssText) {\n clone.style.cssText = computed.cssText;\n } else {\n for (let index = 0; index < computed.length; index += 1) {\n const propertyName = computed.item(index);\n if (!propertyName) {\n continue;\n }\n clone.style.setProperty(\n propertyName,\n computed.getPropertyValue(propertyName),\n computed.getPropertyPriority(propertyName)\n );\n }\n }\n clone.style.animation = \"none\";\n clone.style.opacity = \"1\";\n clone.style.transition = \"none\";\n clone.style.visibility = \"visible\";\n}\n\nexport function cloneMeaningfulGenieElement(\n source: HTMLElement,\n rootRect: WorkbenchGenieViewportRect\n): WorkbenchGenieMeaningfulElementClone | null {\n const images: WorkbenchGenieMeaningfulImageClone[] = [];\n const clone = cloneMeaningfulGenieNode(source, rootRect, images, true);\n if (!(clone instanceof HTMLElement)) {\n return null;\n }\n return { clone, images };\n}\n\nexport function renderGenieScanlines(\n context: CanvasRenderingContext2D,\n viewportWidth: number,\n viewportHeight: number,\n frame: WorkbenchGenieScanlineFrame\n): void {\n const { direction, dockPoint, texture, textureRect } = frame;\n const progress = clampGenieProgress(frame.progress);\n const textureWidth = Math.max(1, Math.round(textureRect.width));\n const textureHeight = Math.max(1, Math.round(textureRect.height));\n const scanlineStride = resolveGenieScanlineStride(textureHeight);\n const dirtyRect = resolveGenieDirtyRect({\n dockPoint,\n textureRect,\n viewportHeight,\n viewportWidth\n });\n\n context.clearRect(\n dirtyRect.left,\n dirtyRect.top,\n dirtyRect.width,\n dirtyRect.height\n );\n\n for (let y = 0; y < textureHeight; y += scanlineStride) {\n const sourceHeight = Math.min(scanlineStride, textureHeight - y);\n const sourceMidY = y + sourceHeight / 2;\n const rowProgress = sourceMidY / textureHeight;\n const horizontalProgress = resolveGenieRowProgress({\n direction,\n progress,\n rowProgress,\n stagger: genieHorizontalRowStagger\n });\n const horizontalEase = easeInOutCubic(horizontalProgress);\n\n const left =\n direction === \"minimize\"\n ? lerpGenieValue(textureRect.left, dockPoint.x, horizontalEase)\n : lerpGenieValue(dockPoint.x, textureRect.left, horizontalEase);\n const right =\n direction === \"minimize\"\n ? lerpGenieValue(\n textureRect.left + textureWidth,\n dockPoint.x,\n horizontalEase\n )\n : lerpGenieValue(\n dockPoint.x,\n textureRect.left + textureWidth,\n horizontalEase\n );\n const targetTop = resolveGenieRowTargetY({\n direction,\n dockPoint,\n progress,\n sourceY: y,\n textureHeight,\n textureRect\n });\n const targetBottom = resolveGenieRowTargetY({\n direction,\n dockPoint,\n progress,\n sourceY: y + sourceHeight,\n textureHeight,\n textureRect\n });\n const targetY = Math.min(targetTop, targetBottom) - 0.5;\n const targetHeight = Math.max(1, Math.abs(targetBottom - targetTop) + 1);\n const rowWidth = right - left;\n\n if (rowWidth < 0.8) {\n continue;\n }\n\n context.drawImage(\n texture,\n 0,\n y,\n textureWidth,\n sourceHeight,\n left,\n targetY,\n rowWidth,\n targetHeight\n );\n }\n\n const glowProgress = direction === \"minimize\" ? progress : 1 - progress;\n if (glowProgress <= 0.75) {\n return;\n }\n\n const glowAlpha = easeOutQuadratic((glowProgress - 0.75) / 0.25) * 0.3;\n const dockGlow = context.createRadialGradient(\n dockPoint.x,\n dockPoint.y,\n 0,\n dockPoint.x,\n dockPoint.y,\n genieDockGlowRadius\n );\n dockGlow.addColorStop(0, `rgba(255, 255, 255, ${glowAlpha})`);\n dockGlow.addColorStop(1, \"rgba(255, 255, 255, 0)\");\n context.fillStyle = dockGlow;\n context.fillRect(\n dirtyRect.left,\n dirtyRect.top,\n dirtyRect.width,\n dirtyRect.height\n );\n}\n","import type {\n WorkbenchContribution,\n WorkbenchHostDockEntry,\n WorkbenchHostExternalStateSource,\n WorkbenchHostClosePreparer,\n WorkbenchHostLaunchRequest,\n WorkbenchHostNodeCloseRequest,\n WorkbenchHostNodeDefinition,\n WorkbenchHostProps\n} from \"./types.ts\";\n\nexport interface ResolvedWorkbenchHostConfig {\n dockEntries: readonly WorkbenchHostDockEntry[];\n externalStateSource?: WorkbenchHostExternalStateSource;\n nodes: readonly WorkbenchHostNodeDefinition[];\n onLaunchRequest?: WorkbenchHostProps[\"onLaunchRequest\"];\n onNodeCloseRequest?: WorkbenchHostProps[\"onNodeCloseRequest\"];\n prepareHostClose?: WorkbenchHostClosePreparer;\n}\n\nexport interface ResolvedWorkbenchHostRuntimeConfig {\n externalStateSource?: WorkbenchHostExternalStateSource;\n nodes: readonly WorkbenchHostNodeDefinition[];\n onLaunchRequest?: WorkbenchHostProps[\"onLaunchRequest\"];\n onNodeCloseRequest?: WorkbenchHostProps[\"onNodeCloseRequest\"];\n}\n\nexport function resolveWorkbenchHostConfig(\n props: Pick<\n WorkbenchHostProps,\n | \"contributions\"\n | \"dockEntries\"\n | \"externalStateSource\"\n | \"nodes\"\n | \"onLaunchRequest\"\n | \"onNodeCloseRequest\"\n >\n): ResolvedWorkbenchHostConfig {\n const contributions = props.contributions ?? [];\n\n return {\n dockEntries: resolveWorkbenchHostDockEntries(props),\n ...resolveWorkbenchHostRuntimeConfig(props),\n prepareHostClose: resolveHostClosePreparer(contributions)\n };\n}\n\nexport function resolveWorkbenchHostDockEntries(\n props: Pick<WorkbenchHostProps, \"contributions\" | \"dockEntries\">\n): readonly WorkbenchHostDockEntry[] {\n const contributions = props.contributions ?? [];\n return mergeByKey(\n contributions.flatMap((contribution) => contribution.dockEntries ?? []),\n props.dockEntries ?? [],\n (entry) => entry.id\n );\n}\n\nexport function resolveWorkbenchHostRuntimeConfig(\n props: Pick<\n WorkbenchHostProps,\n | \"contributions\"\n | \"externalStateSource\"\n | \"nodes\"\n | \"onLaunchRequest\"\n | \"onNodeCloseRequest\"\n >\n): ResolvedWorkbenchHostRuntimeConfig {\n const contributions = props.contributions ?? [];\n\n return {\n externalStateSource:\n props.externalStateSource ??\n combineContributionExternalStateSources(contributions),\n nodes: mergeByKey(\n contributions.flatMap((contribution) => contribution.nodes ?? []),\n props.nodes ?? [],\n (definition) => definition.typeId\n ),\n onLaunchRequest: resolveLaunchRequestHandler({\n contributions,\n explicitHandler: props.onLaunchRequest\n }),\n onNodeCloseRequest: resolveNodeCloseRequestHandler({\n contributions,\n explicitHandler: props.onNodeCloseRequest\n })\n };\n}\n\nfunction mergeByKey<T>(\n contributionItems: readonly T[],\n explicitItems: readonly T[],\n getKey: (item: T) => string\n): readonly T[] {\n const merged = new Map<string, T>();\n for (const item of [...contributionItems, ...explicitItems]) {\n const key = getKey(item);\n merged.delete(key);\n merged.set(key, item);\n }\n return [...merged.values()];\n}\n\nfunction combineContributionExternalStateSources(\n contributions: readonly WorkbenchContribution[]\n): WorkbenchHostExternalStateSource | undefined {\n const sources = contributions\n .map((contribution) => contribution.externalStateSource)\n .filter((source): source is WorkbenchHostExternalStateSource =>\n Boolean(source)\n );\n\n if (sources.length === 0) {\n return undefined;\n }\n\n return {\n getNodeState(input) {\n for (const source of sources) {\n const state = source.getNodeState(input);\n if (state !== null && state !== undefined) {\n return state;\n }\n }\n return null;\n },\n getSnapshotNodeState(input) {\n for (const source of sources) {\n const state = source.getSnapshotNodeState?.(input);\n if (state !== null && state !== undefined) {\n return state;\n }\n }\n return null;\n },\n getWorkspaceState(input) {\n for (const source of sources) {\n const state = source.getWorkspaceState(input);\n if (state !== null && state !== undefined) {\n return state;\n }\n }\n return null;\n },\n subscribe(listener) {\n const disposers = sources\n .map((source) => source.subscribe?.(listener))\n .filter((dispose): dispose is () => void => Boolean(dispose));\n return () => {\n for (const dispose of disposers) {\n dispose();\n }\n };\n }\n };\n}\n\nfunction resolveLaunchRequestHandler(input: {\n contributions: readonly WorkbenchContribution[];\n explicitHandler?: WorkbenchHostProps[\"onLaunchRequest\"];\n}): WorkbenchHostProps[\"onLaunchRequest\"] {\n const contributionHandlers = input.contributions\n .map((contribution) => contribution.onLaunchRequest)\n .filter(\n (\n handler\n ): handler is NonNullable<WorkbenchContribution[\"onLaunchRequest\"]> =>\n Boolean(handler)\n );\n\n if (!input.explicitHandler && contributionHandlers.length === 0) {\n return undefined;\n }\n\n return async (request: WorkbenchHostLaunchRequest) => {\n const explicitResult = await input.explicitHandler?.(request);\n if (explicitResult !== null && explicitResult !== undefined) {\n return explicitResult;\n }\n\n for (const handler of contributionHandlers) {\n const result = await handler(request);\n if (result !== null && result !== undefined) {\n return result;\n }\n }\n\n return null;\n };\n}\n\nfunction resolveNodeCloseRequestHandler(input: {\n contributions: readonly WorkbenchContribution[];\n explicitHandler?: WorkbenchHostProps[\"onNodeCloseRequest\"];\n}): WorkbenchHostProps[\"onNodeCloseRequest\"] {\n const contributionHandlers = input.contributions\n .map((contribution) => contribution.onNodeCloseRequest)\n .filter(\n (\n handler\n ): handler is NonNullable<WorkbenchContribution[\"onNodeCloseRequest\"]> =>\n Boolean(handler)\n );\n\n if (!input.explicitHandler && contributionHandlers.length === 0) {\n return undefined;\n }\n\n return async (request: WorkbenchHostNodeCloseRequest) => {\n const explicitResult = await input.explicitHandler?.(request);\n if (explicitResult !== undefined) {\n return explicitResult;\n }\n\n for (const handler of contributionHandlers) {\n const result = await handler(request);\n if (result !== undefined) {\n return result;\n }\n }\n\n return undefined;\n };\n}\n\nexport function resolveWorkbenchHostPrepareClose(\n contributions: readonly WorkbenchContribution[]\n): WorkbenchHostClosePreparer | undefined {\n return resolveHostClosePreparer(contributions);\n}\n\nfunction resolveHostClosePreparer(\n contributions: readonly WorkbenchContribution[]\n): WorkbenchHostClosePreparer | undefined {\n const preparers = contributions\n .map((contribution) => contribution.prepareHostClose)\n .filter(\n (\n prepare\n ): prepare is NonNullable<WorkbenchContribution[\"prepareHostClose\"]> =>\n Boolean(prepare)\n );\n\n if (preparers.length === 0) {\n return undefined;\n }\n\n return async (context) => {\n for (const prepare of preparers) {\n if (!(await prepare(context))) {\n return false;\n }\n }\n\n return true;\n };\n}\n","import { useEffect, useMemo, useState } from \"react\";\nimport { createWorkbenchMissionControlI18nRuntime } from \"../mission-control/workbenchMissionControlI18n.ts\";\nimport { createWorkbenchWindowChromeI18nRuntime } from \"../react/workbenchWindowI18n.ts\";\nimport type { WorkbenchController } from \"../store/types.ts\";\nimport { createWorkbenchHostMissionControlAdapter } from \"./missionControlAdapter.ts\";\nimport type { ResolvedWorkbenchHostConfig } from \"./hostConfig.ts\";\nimport { createWorkbenchHostSession } from \"./session.ts\";\nimport type {\n WorkbenchHostChromeRenderContext,\n WorkbenchHostNodeData,\n WorkbenchHostProps\n} from \"./types.ts\";\nimport { createWorkbenchHostI18nRuntime } from \"./workbenchHostI18n.ts\";\n\nexport function useWorkbenchHostRuntime({\n debugDiagnostics,\n externalStateSource,\n i18n,\n missionControlEnabled,\n nodes,\n onHandleReady,\n onLaunchRequest,\n onMissionControlAdapterReady,\n onNodeCloseRequest,\n projectedNodes,\n snapshotRepository,\n workspaceId\n}: Pick<\n WorkbenchHostProps,\n | \"debugDiagnostics\"\n | \"i18n\"\n | \"onHandleReady\"\n | \"onMissionControlAdapterReady\"\n | \"projectedNodes\"\n | \"snapshotRepository\"\n | \"workspaceId\"\n> &\n Pick<\n ResolvedWorkbenchHostConfig,\n \"externalStateSource\" | \"nodes\" | \"onLaunchRequest\" | \"onNodeCloseRequest\"\n > & {\n missionControlEnabled: boolean;\n }) {\n const [externalStateRevision, bumpExternalStateRevision] = useState(0);\n const [, bumpHydrationRevision] = useState(0);\n const hostSession = useMemo(() => {\n logWorkbenchHostDebug(\"create-session\", debugDiagnostics, {\n nodeTypeIDs: nodes.map((node) => node.typeId),\n projectedNodeCount: projectedNodes?.length ?? 0,\n workspaceId\n });\n return createWorkbenchHostSession({\n debugDiagnostics,\n externalStateSource,\n nodes,\n onLaunchRequest,\n onNodeCloseRequest,\n projectedNodes: projectedNodes ?? [],\n snapshotRepository,\n workspaceId\n });\n }, [\n debugDiagnostics,\n externalStateSource,\n nodes,\n onLaunchRequest,\n onNodeCloseRequest,\n snapshotRepository,\n workspaceId\n ]);\n const hostI18n = useMemo(() => createWorkbenchHostI18nRuntime(i18n), [i18n]);\n const missionControlI18n = useMemo(\n () => createWorkbenchMissionControlI18nRuntime(i18n),\n [i18n]\n );\n const windowChromeI18n = useMemo(\n () => createWorkbenchWindowChromeI18nRuntime(i18n),\n [i18n]\n );\n const nodeDefinitionByType = useMemo(\n () => new Map(nodes.map((definition) => [definition.typeId, definition])),\n [nodes]\n );\n const isHydrating = hostSession.isHydrating?.() ?? false;\n const missionControlAdapter = useMemo(\n () =>\n missionControlEnabled && !isHydrating\n ? createWorkbenchHostMissionControlAdapter({\n activateNode: hostSession.activateNode.bind(hostSession),\n controller: hostSession.controller\n })\n : null,\n [hostSession.controller, isHydrating, missionControlEnabled]\n );\n const chromeController = useMemo(\n () =>\n isHydrating\n ? createReadOnlyWorkbenchController(hostSession.controller)\n : hostSession.controller,\n [hostSession.controller, isHydrating]\n );\n const chromeContext = useMemo<WorkbenchHostChromeRenderContext>(\n () => ({\n activateNode: hostSession.activateNode.bind(hostSession),\n controller: chromeController,\n focusNode: hostSession.focusNode.bind(hostSession),\n launchNode: hostSession.launchNode.bind(hostSession)\n }),\n [chromeController, hostSession]\n );\n\n useEffect(() => {\n let isCurrent = true;\n void hostSession.load().finally(() => {\n if (isCurrent) {\n bumpHydrationRevision((revision) => revision + 1);\n }\n });\n\n return () => {\n isCurrent = false;\n logWorkbenchHostDebug(\"dispose-session\", debugDiagnostics, {\n workspaceId\n });\n hostSession.dispose();\n };\n }, [debugDiagnostics, hostSession, workspaceId]);\n\n useEffect(() => {\n onHandleReady?.(hostSession);\n return () => {\n onHandleReady?.(null);\n };\n }, [hostSession, onHandleReady]);\n\n useEffect(() => {\n if (!onMissionControlAdapterReady) {\n return undefined;\n }\n\n onMissionControlAdapterReady(missionControlAdapter);\n return () => {\n onMissionControlAdapterReady(null);\n };\n }, [missionControlAdapter, onMissionControlAdapterReady]);\n\n useEffect(() => {\n hostSession.reconcileProjectedNodes(projectedNodes ?? []);\n }, [hostSession, projectedNodes]);\n\n useEffect(() => {\n if (!externalStateSource?.subscribe) {\n return undefined;\n }\n\n return externalStateSource.subscribe(() => {\n bumpExternalStateRevision((revision) => revision + 1);\n });\n }, [externalStateSource, workspaceId]);\n\n return {\n chromeContext,\n externalStateRevision,\n hostI18n,\n isHydrating,\n hostSession,\n missionControlI18n,\n missionControlAdapter,\n nodeDefinitionByType,\n windowChromeI18n\n };\n}\n\nconst noop = () => {};\n\nconst readOnlyWorkbenchCommands = new Proxy(\n {},\n {\n get: () => noop\n }\n) as WorkbenchController<WorkbenchHostNodeData>[\"commands\"];\n\nfunction createReadOnlyWorkbenchController(\n controller: WorkbenchController<WorkbenchHostNodeData>\n): WorkbenchController<WorkbenchHostNodeData> {\n return {\n commands: readOnlyWorkbenchCommands,\n dispatch: noop,\n getSnapshot: controller.getSnapshot.bind(controller),\n subscribe: controller.subscribe.bind(controller)\n };\n}\n\nfunction logWorkbenchHostDebug(\n event: string,\n debugDiagnostics: WorkbenchHostProps[\"debugDiagnostics\"],\n payload: Record<string, unknown>\n): void {\n if (!debugDiagnostics?.isEnabled()) {\n return;\n }\n\n console.info(\"[workbench:host]\", {\n event,\n ...payload\n });\n void Promise.resolve(\n debugDiagnostics.log?.({\n details: payload,\n event,\n level: \"info\",\n source: \"workbench-host\",\n workspaceId:\n typeof payload.workspaceId === \"string\" ? payload.workspaceId : null\n })\n ).catch(() => undefined);\n}\n","export function createDerivedSnapshotGetter<TSourceSnapshot, TSnapshot>(input: {\n deriveSnapshot: (sourceSnapshot: TSourceSnapshot) => TSnapshot;\n getSourceSnapshot: () => TSourceSnapshot;\n}): () => TSnapshot {\n let cachedSourceSnapshot: TSourceSnapshot | null = null;\n let cachedSnapshot: TSnapshot | null = null;\n let hasCachedSnapshot = false;\n\n return () => {\n const sourceSnapshot = input.getSourceSnapshot();\n if (hasCachedSnapshot && cachedSourceSnapshot === sourceSnapshot) {\n return cachedSnapshot as TSnapshot;\n }\n\n const snapshot = input.deriveSnapshot(sourceSnapshot);\n cachedSourceSnapshot = sourceSnapshot;\n cachedSnapshot = snapshot;\n hasCachedSnapshot = true;\n return snapshot;\n };\n}\n","export const workbenchFocusInputActivationType = \"focus-input\";\n","import { selectVisibleWorkbenchNodes } from \"../core/selectors.ts\";\nimport { createDerivedSnapshotGetter } from \"../store/createDerivedSnapshotGetter.ts\";\nimport type { WorkbenchController } from \"../store/types.ts\";\nimport type { WorkbenchMissionControlAdapter } from \"../mission-control/types.ts\";\nimport { workbenchFocusInputActivationType } from \"./activations.ts\";\nimport type {\n WorkbenchHostActivationTarget,\n WorkbenchHostNodeData\n} from \"./types.ts\";\n\nexport function createWorkbenchHostMissionControlAdapter(input: {\n activateNode?: (\n target: WorkbenchHostActivationTarget,\n activation: {\n payload?: unknown;\n type: string;\n }\n ) => void;\n controller: WorkbenchController<WorkbenchHostNodeData>;\n}): WorkbenchMissionControlAdapter<WorkbenchHostNodeData> {\n const getSnapshot = createDerivedSnapshotGetter<\n ReturnType<WorkbenchController<WorkbenchHostNodeData>[\"getSnapshot\"]>,\n ReturnType<\n WorkbenchMissionControlAdapter<WorkbenchHostNodeData>[\"getSnapshot\"]\n >\n >({\n deriveSnapshot(controllerSnapshot) {\n return {\n layoutConstraints: controllerSnapshot.layoutConstraints,\n surfaceSize: controllerSnapshot.surfaceSize,\n visibleNodes: selectVisibleWorkbenchNodes(controllerSnapshot)\n };\n },\n getSourceSnapshot() {\n return input.controller.getSnapshot();\n }\n });\n\n return {\n applyLayoutPreset(nodeIds, preset) {\n input.controller.commands.applyLayoutPreset(nodeIds, preset);\n },\n focusNode(nodeId) {\n if (input.activateNode) {\n input.activateNode(\n { nodeId },\n { type: workbenchFocusInputActivationType }\n );\n return;\n }\n input.controller.commands.focusNode(nodeId);\n },\n getSnapshot,\n subscribe(listener) {\n return input.controller.subscribe(listener);\n }\n };\n}\n","import {\n normalizeWorkbenchSnapshot,\n workbenchSnapshotSchemaVersion,\n type WorkbenchSnapshot,\n type WorkbenchSnapshotNode\n} from \"@tutti-os/workbench-snapshot\";\nimport type { WorkbenchNode, WorkbenchState } from \"./types.ts\";\n\nexport interface CreateWorkbenchNodeInput<TData = unknown> {\n data: TData;\n displayMode?: WorkbenchNode<TData>[\"displayMode\"];\n frame: WorkbenchNode<TData>[\"frame\"];\n id: string;\n isMinimized?: boolean;\n kind: string;\n minimizedAtUnixMs?: WorkbenchNode<TData>[\"minimizedAtUnixMs\"];\n restoreFrame?: WorkbenchNode<TData>[\"restoreFrame\"];\n sizeConstraints?: WorkbenchNode<TData>[\"sizeConstraints\"];\n title: string;\n}\n\nexport interface CreateWorkbenchSnapshotFromStateOptions {\n activeSpaceId?: WorkbenchSnapshot[\"activeSpaceId\"];\n metadata?: WorkbenchSnapshot[\"metadata\"];\n spaces?: WorkbenchSnapshot[\"spaces\"];\n}\n\nexport function createWorkbenchNode<TData = unknown>(\n input: CreateWorkbenchNodeInput<TData>\n): WorkbenchNode<TData> {\n return {\n id: input.id,\n kind: input.kind,\n title: input.title,\n frame: input.frame,\n displayMode: input.displayMode ?? \"floating\",\n restoreFrame: input.restoreFrame ?? null,\n isMinimized: input.isMinimized ?? false,\n minimizedAtUnixMs:\n input.isMinimized === true ? (input.minimizedAtUnixMs ?? null) : null,\n sizeConstraints: input.sizeConstraints ?? null,\n data: input.data\n };\n}\n\nexport function createWorkbenchNodeFromSnapshot<TData = unknown>(\n snapshotNode: WorkbenchSnapshotNode\n): WorkbenchNode<TData> {\n return createWorkbenchNode<TData>({\n id: snapshotNode.id,\n kind: snapshotNode.kind,\n title: snapshotNode.title,\n frame: snapshotNode.frame,\n displayMode: snapshotNode.displayMode,\n restoreFrame: snapshotNode.restoreFrame ?? null,\n isMinimized: snapshotNode.isMinimized,\n minimizedAtUnixMs: snapshotNode.minimizedAtUnixMs ?? null,\n data: snapshotNode.data as TData\n });\n}\n\nexport function createWorkbenchStateFromSnapshot<TData = unknown>(\n snapshot: WorkbenchSnapshot\n): Pick<WorkbenchState<TData>, \"nodeStack\" | \"nodes\"> {\n const normalized = normalizeWorkbenchSnapshot(snapshot);\n const nodes = normalized.nodes.map((node) =>\n createWorkbenchNodeFromSnapshot<TData>(node)\n );\n\n return {\n nodes,\n nodeStack: normalized.nodeStack ?? nodes.map((node) => node.id)\n };\n}\n\nexport function createWorkbenchSnapshotFromState<TData = unknown>(\n state: Pick<WorkbenchState<TData>, \"nodeStack\" | \"nodes\">,\n options: CreateWorkbenchSnapshotFromStateOptions = {}\n): WorkbenchSnapshot {\n return normalizeWorkbenchSnapshot({\n schemaVersion: workbenchSnapshotSchemaVersion,\n nodes: state.nodes.map((node) => ({\n id: node.id,\n kind: node.kind,\n title: node.title,\n frame: node.frame,\n displayMode: node.displayMode,\n restoreFrame: node.restoreFrame,\n isMinimized: node.isMinimized,\n minimizedAtUnixMs: node.minimizedAtUnixMs,\n data: node.data\n })),\n nodeStack: state.nodeStack,\n activeNodeId: state.nodeStack.at(-1) ?? null,\n spaces: options.spaces,\n activeSpaceId: options.activeSpaceId,\n metadata: options.metadata\n });\n}\n","import { clampWorkbenchRect } from \"./geometry.ts\";\nimport {\n defaultWorkbenchLayoutConstraints,\n type WorkbenchLayoutConstraints,\n type WorkbenchFrame,\n type WorkbenchNode,\n type WorkbenchNodeSizeConstraints,\n type WorkbenchSize\n} from \"./types.ts\";\n\nexport const WORKBENCH_WINDOW_CASCADE_OFFSET = 28;\n\nexport function createWorkbenchInitialRect(\n index: number,\n surfaceSize: WorkbenchSize,\n constraints: WorkbenchLayoutConstraints = defaultWorkbenchLayoutConstraints,\n sizeConstraints?: WorkbenchNodeSizeConstraints | null\n): WorkbenchFrame {\n const frameOrigin = {\n x: constraints.safeArea.left + constraints.surfacePadding,\n y: constraints.safeArea.top + constraints.surfacePadding\n };\n const baseWidth = Math.min(760, Math.max(360, surfaceSize.width * 0.62));\n const baseHeight = Math.min(520, Math.max(260, surfaceSize.height * 0.62));\n const offset = (index % 8) * WORKBENCH_WINDOW_CASCADE_OFFSET;\n\n return clampWorkbenchRect(\n {\n x: frameOrigin.x + offset,\n y: frameOrigin.y + offset,\n width: baseWidth,\n height: baseHeight\n },\n surfaceSize,\n constraints,\n sizeConstraints\n );\n}\n\nexport function resolveWorkbenchCascadedRect<TData>(input: {\n constraints?: WorkbenchLayoutConstraints;\n currentNodeStack: readonly string[];\n existingNodes: readonly WorkbenchNode<TData>[];\n preferredFrame: WorkbenchFrame;\n sizeConstraints?: WorkbenchNodeSizeConstraints | null;\n surfaceSize: WorkbenchSize;\n}): WorkbenchFrame {\n const activeNode =\n input.existingNodes.find(\n (node) => node.id === input.currentNodeStack.at(-1)\n ) ?? input.existingNodes.at(-1);\n\n if (!activeNode) {\n return clampWorkbenchRect(\n input.preferredFrame,\n input.surfaceSize,\n input.constraints,\n input.sizeConstraints\n );\n }\n\n return clampWorkbenchRect(\n {\n x: activeNode.frame.x + WORKBENCH_WINDOW_CASCADE_OFFSET,\n y: activeNode.frame.y + WORKBENCH_WINDOW_CASCADE_OFFSET,\n width: input.preferredFrame.width,\n height: input.preferredFrame.height\n },\n input.surfaceSize,\n input.constraints,\n input.sizeConstraints\n );\n}\n\nexport function placeWorkbenchNode<TData>(\n node: Omit<WorkbenchNode<TData>, \"frame\"> & { frame?: WorkbenchFrame },\n index: number,\n surfaceSize: WorkbenchSize\n): WorkbenchNode<TData> {\n return {\n ...node,\n frame: node.frame ?? createWorkbenchInitialRect(index, surfaceSize)\n };\n}\n","export interface WorkbenchHostNodeIdentityInput {\n instanceId: string;\n typeId: string;\n}\n\nexport function createWorkbenchHostProjectedNodeId(\n input: WorkbenchHostNodeIdentityInput\n): string {\n return `${input.typeId}:${input.instanceId}`;\n}\n\nexport function createWorkbenchHostLaunchedNodeId(\n input: WorkbenchHostNodeIdentityInput\n): string {\n return input.instanceId === input.typeId\n ? input.typeId\n : createWorkbenchHostProjectedNodeId(input);\n}\n","import type { WorkbenchSnapshot } from \"@tutti-os/workbench-snapshot\";\nimport {\n clampWorkbenchRect,\n getWorkbenchFullscreenRect,\n getWorkbenchLayoutFrame,\n rectsEqual\n} from \"../core/geometry.ts\";\nimport { resolveWorkbenchCascadedRect } from \"../core/placement.ts\";\nimport {\n createWorkbenchNode,\n createWorkbenchStateFromSnapshot\n} from \"../core/snapshot.ts\";\nimport type {\n WorkbenchFrame,\n WorkbenchNode,\n WorkbenchNodeSizeConstraints,\n WorkbenchState\n} from \"../core/types.ts\";\nimport {\n createWorkbenchHostLaunchedNodeId,\n createWorkbenchHostProjectedNodeId\n} from \"./nodeIdentity.ts\";\nimport type {\n WorkbenchHostActivation,\n WorkbenchHostLaunchFramePolicy,\n WorkbenchHostLaunchResult,\n WorkbenchHostNodeData,\n WorkbenchHostNodeDefinition,\n WorkbenchHostProjectedNode\n} from \"./types.ts\";\n\nconst initializedMetadataKeys = [\n \"tuttiWorkbenchInitialized\",\n \"workbenchHostInitialized\"\n] as const;\nexport const COMPACT_LAUNCH_WIDTH_THRESHOLD = 1440;\nexport const COMPACT_LAUNCH_FRAME_SCALE = 0.85;\nexport const closedDockWindowFramesMetadataKey =\n \"workbenchHostClosedDockWindowFrames\";\nconst maxClosedDockWindowFrameEntries = 128;\n\nexport interface ClosedDockWindowFrameEntry {\n dockEntryId: string;\n frame: WorkbenchFrame;\n typeId: string;\n}\n\nexport function createDefaultLaunchResult(\n definition: WorkbenchHostNodeDefinition,\n input?: Pick<WorkbenchHostLaunchResult, \"dockEntryId\" | \"launchSource\">\n): WorkbenchHostLaunchResult {\n return {\n defaultFrame: definition.frame,\n dockEntryId: input?.dockEntryId,\n instanceId: definition.typeId,\n framePolicy: \"cascade\",\n launchSource: input?.launchSource ?? null,\n sizeConstraints: definition.sizeConstraints ?? null,\n title: definition.title,\n typeId: definition.typeId\n };\n}\n\nexport function createWorkbenchProjectedHostNode(input: {\n definition: WorkbenchHostNodeDefinition;\n projectedNode: WorkbenchHostProjectedNode;\n restoredNode: WorkbenchNode<WorkbenchHostNodeData> | null;\n}): WorkbenchNode<WorkbenchHostNodeData> {\n return createWorkbenchNode<WorkbenchHostNodeData>({\n data: {\n activation: null,\n dockEntryId: input.projectedNode.dockEntryId ?? null,\n ...(input.restoredNode?.data.snapshotNodeState === undefined\n ? {}\n : { snapshotNodeState: input.restoredNode.data.snapshotNodeState }),\n instanceId: input.projectedNode.instanceId,\n instanceKey: input.projectedNode.instanceKey ?? null,\n isProjected: true,\n projectionSubject: input.projectedNode.subject ?? null,\n typeId: input.definition.typeId\n },\n displayMode: input.restoredNode?.displayMode,\n frame:\n input.restoredNode?.frame ??\n input.projectedNode.defaultFrame ??\n input.definition.frame,\n id: createProjectedNodeID(\n input.definition.typeId,\n input.projectedNode.instanceId\n ),\n isMinimized: input.restoredNode?.isMinimized,\n kind: input.definition.typeId,\n restoreFrame: input.restoredNode?.restoreFrame,\n sizeConstraints:\n input.projectedNode.sizeConstraints ??\n input.restoredNode?.sizeConstraints ??\n input.definition.sizeConstraints ??\n null,\n title: input.projectedNode.title\n });\n}\n\nexport function createWorkbenchLaunchedHostNode(input: {\n activation: WorkbenchHostActivation | null;\n definition: WorkbenchHostNodeDefinition;\n resolvedFrame: WorkbenchNode<WorkbenchHostNodeData>[\"frame\"];\n result: WorkbenchHostLaunchResult;\n}): WorkbenchNode<WorkbenchHostNodeData> {\n const preferredFrame = input.result.defaultFrame ?? input.definition.frame;\n return createWorkbenchNode<WorkbenchHostNodeData>({\n data: {\n activation: input.activation,\n dockEntryId: input.result.dockEntryId ?? null,\n instanceId: input.result.instanceId,\n instanceKey: input.result.instanceKey ?? null,\n isProjected: false,\n launchSource: input.result.launchSource ?? null,\n projectionSubject: null,\n typeId: input.definition.typeId\n },\n displayMode: input.result.displayMode,\n frame: input.resolvedFrame,\n id: createLaunchedNodeID(input.definition.typeId, input.result.instanceId),\n kind: input.definition.typeId,\n restoreFrame:\n input.result.displayMode === \"fullscreen\" ? preferredFrame : null,\n sizeConstraints: resolveWorkbenchHostNodeSizeConstraints(\n input.result,\n input.definition\n ),\n title: input.result.title ?? input.definition.title\n });\n}\n\nexport function resolveWorkbenchLaunchedHostNodeFrame(input: {\n currentState: Pick<\n WorkbenchState<WorkbenchHostNodeData>,\n \"layoutConstraints\" | \"nodeStack\" | \"nodes\" | \"surfaceSize\"\n >;\n definition: WorkbenchHostNodeDefinition;\n result: WorkbenchHostLaunchResult;\n}): WorkbenchNode<WorkbenchHostNodeData>[\"frame\"] {\n const preferredFrame = input.result.defaultFrame ?? input.definition.frame;\n const sizeConstraints = resolveWorkbenchHostNodeSizeConstraints(\n input.result,\n input.definition\n );\n\n if (input.result.displayMode === \"fullscreen\") {\n return getWorkbenchFullscreenRect(\n input.currentState.surfaceSize,\n input.currentState.layoutConstraints,\n sizeConstraints\n );\n }\n\n const framePolicy = resolveLaunchFramePolicy(input.result);\n\n if (framePolicy === \"absolute\") {\n return preferredFrame;\n }\n\n const responsivePreferredFrame = resolveCompactWorkbenchPreferredFrame({\n constraints: input.currentState.layoutConstraints,\n preferredFrame,\n sizeConstraints,\n surfaceSize: input.currentState.surfaceSize\n });\n\n if (framePolicy === \"cascade-same-type-centered\") {\n const existingSameTypeNodes = input.currentState.nodes.filter(\n (node) => node.data.typeId === input.result.typeId\n );\n const existingSameTypeNodeIds = new Set(\n existingSameTypeNodes.map((node) => node.id)\n );\n\n return resolveWorkbenchCascadedRect({\n currentNodeStack: input.currentState.nodeStack.filter((nodeId) =>\n existingSameTypeNodeIds.has(nodeId)\n ),\n existingNodes: existingSameTypeNodes,\n preferredFrame: resolveWorkbenchCenteredPreferredFrame({\n constraints: input.currentState.layoutConstraints,\n preferredFrame: responsivePreferredFrame,\n sizeConstraints,\n surfaceSize: input.currentState.surfaceSize\n }),\n sizeConstraints,\n surfaceSize: input.currentState.surfaceSize,\n constraints: input.currentState.layoutConstraints\n });\n }\n\n return resolveWorkbenchCascadedRect({\n currentNodeStack: input.currentState.nodeStack,\n existingNodes: input.currentState.nodes,\n preferredFrame: responsivePreferredFrame,\n sizeConstraints,\n surfaceSize: input.currentState.surfaceSize,\n constraints: input.currentState.layoutConstraints\n });\n}\n\nexport function closedDockWindowFrameEntryKey(input: {\n dockEntryId: string;\n typeId: string;\n}): string {\n return JSON.stringify([input.typeId, input.dockEntryId]);\n}\n\nexport function readClosedDockWindowFrameEntries(\n metadata: WorkbenchSnapshot[\"metadata\"]\n): Map<string, ClosedDockWindowFrameEntry> {\n const value = metadata?.[closedDockWindowFramesMetadataKey];\n if (\n !isRecord(value) ||\n value.version !== 1 ||\n !Array.isArray(value.entries)\n ) {\n return new Map();\n }\n\n const entries = new Map<string, ClosedDockWindowFrameEntry>();\n for (const entry of value.entries.slice(0, maxClosedDockWindowFrameEntries)) {\n const normalized = normalizeClosedDockWindowFrameEntry(entry);\n if (!normalized) {\n continue;\n }\n entries.set(closedDockWindowFrameEntryKey(normalized), normalized);\n }\n return entries;\n}\n\nexport function writeClosedDockWindowFrameEntries(\n metadata: WorkbenchSnapshot[\"metadata\"],\n entries: Iterable<ClosedDockWindowFrameEntry>\n): WorkbenchSnapshot[\"metadata\"] {\n const normalizedEntries = Array.from(entries)\n .map(normalizeClosedDockWindowFrameEntry)\n .filter((entry): entry is ClosedDockWindowFrameEntry => entry !== null)\n .slice(-maxClosedDockWindowFrameEntries);\n const nextMetadata = { ...(metadata ?? {}) };\n if (normalizedEntries.length === 0) {\n delete nextMetadata[closedDockWindowFramesMetadataKey];\n } else {\n nextMetadata[closedDockWindowFramesMetadataKey] = {\n version: 1,\n entries: normalizedEntries\n };\n }\n return Object.keys(nextMetadata).length > 0 ? nextMetadata : undefined;\n}\n\nfunction normalizeClosedDockWindowFrameEntry(\n value: unknown\n): ClosedDockWindowFrameEntry | null {\n if (!isRecord(value)) {\n return null;\n }\n const typeId = normalizeNonEmptyString(value.typeId);\n const dockEntryId = normalizeNonEmptyString(value.dockEntryId);\n const frame = normalizeWorkbenchFrame(value.frame);\n if (!typeId || !dockEntryId || !frame) {\n return null;\n }\n\n return {\n dockEntryId,\n frame,\n typeId\n };\n}\n\nfunction normalizeWorkbenchFrame(value: unknown): WorkbenchFrame | null {\n if (!isRecord(value)) {\n return null;\n }\n const x = normalizeFiniteNumber(value.x);\n const y = normalizeFiniteNumber(value.y);\n const width = normalizeFiniteNumber(value.width);\n const height = normalizeFiniteNumber(value.height);\n if (x === null || y === null || width === null || height === null) {\n return null;\n }\n if (width < 160 || height < 120) {\n return null;\n }\n\n return { height, width, x, y };\n}\n\nfunction normalizeFiniteNumber(value: unknown): number | null {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n return null;\n }\n return Math.round(value);\n}\n\nfunction normalizeNonEmptyString(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction resolveLaunchFramePolicy(\n result: WorkbenchHostLaunchResult\n): WorkbenchHostLaunchFramePolicy {\n return result.framePolicy;\n}\n\nfunction resolveWorkbenchCenteredPreferredFrame(input: {\n constraints: WorkbenchState<WorkbenchHostNodeData>[\"layoutConstraints\"];\n preferredFrame: WorkbenchFrame;\n sizeConstraints?: WorkbenchNodeSizeConstraints | null;\n surfaceSize: WorkbenchState<WorkbenchHostNodeData>[\"surfaceSize\"];\n}): WorkbenchFrame {\n const layoutFrame = getWorkbenchLayoutFrame(\n input.surfaceSize,\n input.constraints\n );\n\n return clampWorkbenchRect(\n {\n height: input.preferredFrame.height,\n width: input.preferredFrame.width,\n x: Math.round(\n layoutFrame.x + (layoutFrame.width - input.preferredFrame.width) / 2\n ),\n y: Math.round(\n layoutFrame.y + (layoutFrame.height - input.preferredFrame.height) / 2\n )\n },\n input.surfaceSize,\n input.constraints,\n input.sizeConstraints\n );\n}\n\nexport function resolveCompactWorkbenchPreferredFrame(input: {\n constraints: WorkbenchState<WorkbenchHostNodeData>[\"layoutConstraints\"];\n preferredFrame: WorkbenchFrame;\n sizeConstraints?: WorkbenchNodeSizeConstraints | null;\n surfaceSize: WorkbenchState<WorkbenchHostNodeData>[\"surfaceSize\"];\n}): WorkbenchFrame {\n if (!shouldUseCompactWorkbenchFrame(input.surfaceSize)) {\n return input.preferredFrame;\n }\n\n const layoutFrame = getWorkbenchLayoutFrame(\n input.surfaceSize,\n input.constraints\n );\n const width = Math.round(\n input.preferredFrame.width * COMPACT_LAUNCH_FRAME_SCALE\n );\n const height = Math.round(\n input.preferredFrame.height * COMPACT_LAUNCH_FRAME_SCALE\n );\n\n return clampWorkbenchRect(\n {\n height,\n width,\n x: Math.round(layoutFrame.x + (layoutFrame.width - width) / 2),\n y: Math.round(layoutFrame.y + (layoutFrame.height - height) / 2)\n },\n input.surfaceSize,\n input.constraints,\n input.sizeConstraints\n );\n}\n\nexport function compactRestoredWorkbenchHostNodes(input: {\n constraints: WorkbenchState<WorkbenchHostNodeData>[\"layoutConstraints\"];\n nodeDefinitionByType: Map<string, WorkbenchHostNodeDefinition>;\n nodes: readonly WorkbenchNode<WorkbenchHostNodeData>[];\n surfaceSize: WorkbenchState<WorkbenchHostNodeData>[\"surfaceSize\"];\n}): WorkbenchNode<WorkbenchHostNodeData>[] {\n if (!shouldUseCompactWorkbenchFrame(input.surfaceSize)) {\n return [...input.nodes];\n }\n\n return input.nodes.map((node) => {\n const sizeConstraints =\n node.sizeConstraints ??\n input.nodeDefinitionByType.get(node.data.typeId)?.sizeConstraints ??\n null;\n if (node.displayMode === \"fullscreen\") {\n return {\n ...node,\n frame: getWorkbenchFullscreenRect(\n input.surfaceSize,\n input.constraints,\n sizeConstraints\n )\n };\n }\n\n const defaultFrame =\n input.nodeDefinitionByType.get(node.data.typeId)?.frame ?? node.frame;\n const compactWidth = Math.round(\n defaultFrame.width * COMPACT_LAUNCH_FRAME_SCALE\n );\n const compactHeight = Math.round(\n defaultFrame.height * COMPACT_LAUNCH_FRAME_SCALE\n );\n const width = Math.min(node.frame.width, compactWidth);\n const height = Math.min(node.frame.height, compactHeight);\n const sizeChanged =\n width !== node.frame.width || height !== node.frame.height;\n const layoutFrame = getWorkbenchLayoutFrame(\n input.surfaceSize,\n input.constraints\n );\n const frame = clampWorkbenchRect(\n sizeChanged\n ? {\n height,\n width,\n x: Math.round(layoutFrame.x + (layoutFrame.width - width) / 2),\n y: Math.round(layoutFrame.y + (layoutFrame.height - height) / 2)\n }\n : node.frame,\n input.surfaceSize,\n input.constraints,\n sizeConstraints\n );\n\n return rectsEqual(node.frame, frame) ? node : { ...node, frame };\n });\n}\n\nfunction shouldUseCompactWorkbenchFrame(\n surfaceSize: WorkbenchState<WorkbenchHostNodeData>[\"surfaceSize\"]\n): boolean {\n return surfaceSize.width < COMPACT_LAUNCH_WIDTH_THRESHOLD;\n}\n\nexport function createProjectedNodeID(\n typeId: string,\n instanceId: string\n): string {\n return createWorkbenchHostProjectedNodeId({ instanceId, typeId });\n}\n\nexport function persistedWorkbenchState(\n state: Pick<WorkbenchState<WorkbenchHostNodeData>, \"nodeStack\" | \"nodes\">,\n nodeDefinitionByType: Map<string, WorkbenchHostNodeDefinition>\n): Pick<WorkbenchState<WorkbenchHostNodeData>, \"nodeStack\" | \"nodes\"> {\n return {\n nodeStack: state.nodeStack,\n nodes: state.nodes\n .filter((node) => {\n return (\n nodeDefinitionByType.get(node.data.typeId)?.window?.persists !== false\n );\n })\n .map((node) => ({\n ...node,\n data: {\n dockEntryId: node.data.dockEntryId ?? null,\n ...(node.data.snapshotNodeState === undefined\n ? {}\n : { snapshotNodeState: node.data.snapshotNodeState }),\n instanceId: node.data.instanceId,\n instanceKey: node.data.instanceKey ?? null,\n ...(node.data.isProjected === true ? { isProjected: true } : {}),\n typeId: node.data.typeId\n }\n }))\n };\n}\n\nexport function stateFromSnapshotOrDefinitions(\n snapshot: WorkbenchSnapshot | null,\n nodeDefinitions: readonly WorkbenchHostNodeDefinition[],\n projectedNodes: readonly WorkbenchHostProjectedNode[] = []\n): Partial<WorkbenchState<WorkbenchHostNodeData>> {\n if (!snapshot) {\n return mergeProjectedNodesIntoState(\n createDefaultWorkbenchState(nodeDefinitions),\n {\n nodeDefinitions,\n projectedNodes,\n snapshot\n }\n );\n }\n\n const snapshotState = createWorkbenchStateFromSnapshot<unknown>(snapshot);\n const nodes = snapshotState.nodes\n .map((node) => {\n const definition = resolveDefinitionForRestoredNode(\n node,\n nodeDefinitions\n );\n if (!definition) {\n return null;\n }\n if (readWorkbenchHostNodeData(node.data)?.isProjected === true) {\n return null;\n }\n return createRestoredNode(definition, node);\n })\n .filter(\n (node): node is WorkbenchNode<WorkbenchHostNodeData> => node !== null\n )\n .filter((node) => {\n const definition = nodeDefinitions.find(\n (candidate) => candidate.typeId === node.data.typeId\n );\n return (\n definition?.window?.persists !== false &&\n definition?.window?.restoreOnLoad !== false\n );\n });\n\n if (nodes.length === 0 && !isSnapshotInitialized(snapshot)) {\n return mergeProjectedNodesIntoState(\n createDefaultWorkbenchState(nodeDefinitions),\n {\n nodeDefinitions,\n projectedNodes,\n snapshot\n }\n );\n }\n\n const nodeIDs = new Set(nodes.map((node) => node.id));\n const nodeStack = snapshotState.nodeStack.filter((nodeID) =>\n nodeIDs.has(nodeID)\n );\n for (const node of nodes) {\n if (!nodeStack.includes(node.id)) {\n nodeStack.push(node.id);\n }\n }\n\n return mergeProjectedNodesIntoState(\n {\n nodeStack,\n nodes\n },\n {\n nodeDefinitions,\n projectedNodes,\n snapshot\n }\n );\n}\n\nexport function restoredSnapshotNodesByID(\n snapshot: WorkbenchSnapshot | null,\n nodeDefinitions: readonly WorkbenchHostNodeDefinition[]\n): Map<string, WorkbenchNode<WorkbenchHostNodeData>> {\n if (!snapshot) {\n return new Map();\n }\n\n const nodes = createWorkbenchStateFromSnapshot<unknown>(snapshot)\n .nodes.map((node) => {\n const definition = resolveDefinitionForRestoredNode(\n node,\n nodeDefinitions\n );\n if (!definition) {\n return null;\n }\n return createRestoredNode(definition, node);\n })\n .filter(\n (node): node is WorkbenchNode<WorkbenchHostNodeData> => node !== null\n );\n\n return new Map(nodes.map((node) => [node.id, node]));\n}\n\nexport function updateProjectedNodeFromInput(\n node: WorkbenchNode<WorkbenchHostNodeData>,\n projectedNode: WorkbenchHostProjectedNode,\n definition?: WorkbenchHostNodeDefinition\n): WorkbenchNode<WorkbenchHostNodeData> {\n const nextInstanceKey = projectedNode.instanceKey ?? null;\n const nextSubject = projectedNode.subject ?? null;\n const nextDockEntryId = projectedNode.dockEntryId ?? null;\n const nextSizeConstraints =\n projectedNode.sizeConstraints ?? definition?.sizeConstraints ?? null;\n if (\n node.title === projectedNode.title &&\n node.data.dockEntryId === nextDockEntryId &&\n node.data.instanceId === projectedNode.instanceId &&\n node.data.instanceKey === nextInstanceKey &&\n node.data.isProjected === true &&\n projectedSubjectsEqual(node.data.projectionSubject ?? null, nextSubject) &&\n node.sizeConstraints?.minWidth === nextSizeConstraints?.minWidth &&\n node.sizeConstraints?.minHeight === nextSizeConstraints?.minHeight &&\n node.data.typeId === projectedNode.typeId\n ) {\n return node;\n }\n\n return {\n ...node,\n data: {\n dockEntryId: nextDockEntryId,\n ...(node.data.snapshotNodeState === undefined\n ? {}\n : { snapshotNodeState: node.data.snapshotNodeState }),\n instanceId: projectedNode.instanceId,\n instanceKey: nextInstanceKey,\n activation: node.data.activation ?? null,\n isProjected: true,\n projectionSubject: nextSubject,\n ...(node.data.runtimeNodeState === undefined\n ? {}\n : { runtimeNodeState: node.data.runtimeNodeState }),\n typeId: projectedNode.typeId\n },\n sizeConstraints: nextSizeConstraints,\n title: projectedNode.title\n };\n}\n\nexport function projectedWorkbenchNodeStack(input: {\n currentNodeStack: readonly string[];\n nextNodes: readonly WorkbenchNode<WorkbenchHostNodeData>[];\n snapshot: WorkbenchSnapshot | null;\n}): string[] {\n const nodeIDs = new Set(input.nextNodes.map((node) => node.id));\n const nodeStack = input.currentNodeStack.filter((nodeID) =>\n nodeIDs.has(nodeID)\n );\n const snapshotState = input.snapshot\n ? createWorkbenchStateFromSnapshot<unknown>(input.snapshot)\n : null;\n for (const nodeID of snapshotState?.nodeStack ?? []) {\n if (nodeIDs.has(nodeID) && !nodeStack.includes(nodeID)) {\n nodeStack.push(nodeID);\n }\n }\n for (const node of input.nextNodes) {\n if (!nodeStack.includes(node.id)) {\n nodeStack.push(node.id);\n }\n }\n return nodeStack;\n}\n\nexport function shallowArrayEqual<T>(\n left: readonly T[],\n right: readonly T[]\n): boolean {\n return (\n left.length === right.length &&\n left.every((entry, index) => entry === right[index])\n );\n}\n\nexport function stringArrayEqual(\n left: readonly string[],\n right: readonly string[]\n): boolean {\n return (\n left.length === right.length &&\n left.every((entry, index) => entry === right[index])\n );\n}\n\nfunction createWorkbenchHostNode(input: {\n definition: WorkbenchHostNodeDefinition;\n descriptor: {\n frame?: WorkbenchNode<WorkbenchHostNodeData>[\"frame\"];\n instanceId?: string;\n instanceKey?: string | null;\n title?: string;\n };\n}): WorkbenchNode<WorkbenchHostNodeData> {\n const strategy = input.definition.instance;\n const instanceId =\n input.descriptor.instanceId ??\n (strategy?.mode === \"multi\"\n ? `${input.definition.typeId}-instance`\n : input.definition.typeId);\n const nodeId =\n strategy?.mode === \"multi\"\n ? `${input.definition.typeId}:${instanceId}`\n : input.definition.typeId;\n\n return createWorkbenchNode<WorkbenchHostNodeData>({\n data: {\n activation: null,\n dockEntryId: null,\n instanceId,\n instanceKey: input.descriptor.instanceKey ?? null,\n isProjected: false,\n projectionSubject: null,\n typeId: input.definition.typeId\n },\n frame: input.descriptor.frame ?? input.definition.frame,\n id: nodeId,\n kind: input.definition.typeId,\n sizeConstraints: input.definition.sizeConstraints ?? null,\n title: input.descriptor.title ?? input.definition.title\n });\n}\n\nfunction createLaunchedNodeID(typeId: string, instanceId: string): string {\n return createWorkbenchHostLaunchedNodeId({ instanceId, typeId });\n}\n\nfunction createDefaultWorkbenchState(\n nodeDefinitions: readonly WorkbenchHostNodeDefinition[]\n): Partial<WorkbenchState<WorkbenchHostNodeData>> {\n const nodes = nodeDefinitions\n .filter((definition) => definition.window?.defaultOpen !== false)\n .filter((definition) => definition.instance?.mode !== \"multi\")\n .map((definition) =>\n createWorkbenchHostNode({\n definition,\n descriptor: {\n frame: definition.frame,\n instanceId: definition.typeId,\n title: definition.title\n }\n })\n );\n return {\n nodeStack: nodes.map((node) => node.id),\n nodes\n };\n}\n\nfunction createRestoredNode(\n definition: WorkbenchHostNodeDefinition,\n node: WorkbenchNode<unknown>\n): WorkbenchNode<WorkbenchHostNodeData> {\n const restoredData = readWorkbenchHostNodeData(node.data);\n return {\n ...node,\n data: {\n dockEntryId: restoredData?.dockEntryId ?? null,\n ...(restoredData?.snapshotNodeState === undefined\n ? {}\n : { snapshotNodeState: restoredData.snapshotNodeState }),\n instanceId:\n restoredData?.instanceId ??\n (definition.instance?.mode === \"multi\"\n ? deriveInstanceIdFromNodeID(definition.typeId, node.id)\n : definition.typeId),\n instanceKey: restoredData?.instanceKey ?? null,\n activation: null,\n isProjected: false,\n projectionSubject: null,\n typeId: definition.typeId\n },\n kind: definition.typeId,\n sizeConstraints: definition.sizeConstraints ?? null,\n title: definition.instance?.mode === \"multi\" ? node.title : definition.title\n };\n}\n\nexport function resolveWorkbenchHostNodeSizeConstraints(\n result: Pick<WorkbenchHostLaunchResult, \"sizeConstraints\">,\n definition: Pick<WorkbenchHostNodeDefinition, \"sizeConstraints\">\n): WorkbenchNodeSizeConstraints | null {\n return result.sizeConstraints ?? definition.sizeConstraints ?? null;\n}\n\nfunction deriveInstanceIdFromNodeID(typeId: string, nodeId: string): string {\n const prefix = `${typeId}:`;\n return nodeId.startsWith(prefix) ? nodeId.slice(prefix.length) : nodeId;\n}\n\nfunction isSnapshotInitialized(snapshot: WorkbenchSnapshot | null): boolean {\n if (!snapshot) {\n return false;\n }\n\n for (const key of initializedMetadataKeys) {\n if (snapshot.metadata?.[key] === true) {\n return true;\n }\n }\n return false;\n}\n\nfunction readWorkbenchHostNodeData(\n value: unknown\n): WorkbenchHostNodeData | null {\n if (!value || typeof value !== \"object\") {\n return null;\n }\n\n const typed = value as Partial<WorkbenchHostNodeData>;\n if (\n typeof typed.typeId !== \"string\" ||\n typeof typed.instanceId !== \"string\"\n ) {\n return null;\n }\n\n return {\n dockEntryId:\n typeof typed.dockEntryId === \"string\" || typed.dockEntryId === null\n ? typed.dockEntryId\n : null,\n ...(typed.snapshotNodeState === undefined\n ? {}\n : { snapshotNodeState: typed.snapshotNodeState }),\n instanceId: typed.instanceId,\n instanceKey:\n typeof typed.instanceKey === \"string\" || typed.instanceKey === null\n ? typed.instanceKey\n : null,\n activation: null,\n isProjected: typed.isProjected === true,\n launchSource: null,\n projectionSubject: null,\n typeId: typed.typeId\n };\n}\n\nfunction resolveDefinitionForRestoredNode(\n node: WorkbenchNode<unknown>,\n nodeDefinitions: readonly WorkbenchHostNodeDefinition[]\n): WorkbenchHostNodeDefinition | null {\n const data = readWorkbenchHostNodeData(node.data);\n if (data) {\n return (\n nodeDefinitions.find((definition) => definition.typeId === data.typeId) ??\n null\n );\n }\n\n return (\n nodeDefinitions.find((definition) => {\n if (definition.instance?.mode === \"multi\") {\n return node.id.startsWith(`${definition.typeId}:`);\n }\n return node.id === definition.typeId;\n }) ?? null\n );\n}\n\nfunction mergeProjectedNodesIntoState(\n state: Partial<WorkbenchState<WorkbenchHostNodeData>>,\n input: {\n nodeDefinitions: readonly WorkbenchHostNodeDefinition[];\n projectedNodes: readonly WorkbenchHostProjectedNode[];\n snapshot: WorkbenchSnapshot | null;\n }\n): Partial<WorkbenchState<WorkbenchHostNodeData>> {\n if (input.projectedNodes.length === 0) {\n return state;\n }\n\n const nodeDefinitionByType = new Map(\n input.nodeDefinitions.map((definition) => [definition.typeId, definition])\n );\n const nodes = state.nodes ? [...state.nodes] : [];\n const nodeIDs = new Set(nodes.map((node) => node.id));\n const restoredNodesByID = restoredSnapshotNodesByID(\n input.snapshot,\n input.nodeDefinitions\n );\n\n for (const projectedNode of input.projectedNodes) {\n const definition = nodeDefinitionByType.get(projectedNode.typeId);\n if (!definition) {\n continue;\n }\n const nodeID = createProjectedNodeID(\n projectedNode.typeId,\n projectedNode.instanceId\n );\n if (nodeIDs.has(nodeID)) {\n continue;\n }\n\n const nextNode = createWorkbenchProjectedHostNode({\n definition,\n projectedNode,\n restoredNode: restoredNodesByID.get(nodeID) ?? null\n });\n nodes.push(nextNode);\n nodeIDs.add(nextNode.id);\n }\n\n return {\n ...state,\n nodeStack: projectedWorkbenchNodeStack({\n currentNodeStack: state.nodeStack ?? [],\n nextNodes: nodes,\n snapshot: input.snapshot\n }),\n nodes\n };\n}\n\nfunction projectedSubjectsEqual(\n left: WorkbenchHostNodeData[\"projectionSubject\"],\n right: WorkbenchHostNodeData[\"projectionSubject\"]\n): boolean {\n return left?.id === right?.id && left?.type === right?.type;\n}\n","import type { WorkbenchNode } from \"../core/types.ts\";\nimport type {\n WorkbenchHostExternalStateSource,\n WorkbenchHostNodeData\n} from \"./types.ts\";\n\nexport interface WorkbenchHostExternalState {\n externalNodeState: unknown;\n externalWorkspaceState: unknown;\n}\n\nexport function readWorkbenchHostExternalState(input: {\n externalStateSource?: WorkbenchHostExternalStateSource;\n node: WorkbenchNode<WorkbenchHostNodeData>;\n workspaceId: string;\n}): WorkbenchHostExternalState {\n if (!input.externalStateSource) {\n return {\n externalNodeState: null,\n externalWorkspaceState: null\n };\n }\n\n const nodeStateInput = {\n instanceId: input.node.data.instanceId,\n instanceKey: input.node.data.instanceKey ?? null,\n nodeId: input.node.id,\n typeId: input.node.data.typeId,\n workspaceId: input.workspaceId,\n ...(input.node.data.projectionSubject\n ? { subject: input.node.data.projectionSubject }\n : {})\n };\n\n const sourceNodeState =\n input.externalStateSource.getNodeState(nodeStateInput);\n\n return {\n externalNodeState:\n sourceNodeState ?? input.node.data.snapshotNodeState ?? null,\n externalWorkspaceState: input.externalStateSource.getWorkspaceState({\n workspaceId: input.workspaceId\n })\n };\n}\n","import {\n normalizeWorkbenchSnapshot,\n type WorkbenchSnapshot,\n type WorkbenchSnapshotNode,\n type WorkbenchSnapshotSpaceV1\n} from \"@tutti-os/workbench-snapshot\";\nimport {\n closedDockWindowFramesMetadataKey,\n readClosedDockWindowFrameEntries,\n writeClosedDockWindowFrameEntries\n} from \"./sessionState.ts\";\n\nexport interface WorkbenchHostSnapshotNodeData {\n dockEntryId?: string | null;\n instanceId: string;\n instanceKey?: string | null;\n isProjected?: true;\n snapshotNodeState?: unknown;\n typeId: string;\n}\n\nconst allowedMetadataKeys = [\n \"tuttiWorkbenchInitialized\",\n \"workbenchHostInitialized\"\n] as const;\n\nexport function sanitizeWorkbenchHostSnapshot(\n snapshot: WorkbenchSnapshot\n): WorkbenchSnapshot {\n const normalized = normalizeWorkbenchSnapshot(snapshot);\n return normalizeWorkbenchSnapshot({\n schemaVersion: normalized.schemaVersion,\n nodes: normalized.nodes.map(sanitizeNode),\n nodeStack: normalized.nodeStack,\n activeNodeId: normalized.activeNodeId,\n spaces: normalized.spaces?.map(sanitizeSpace),\n activeSpaceId: normalized.activeSpaceId,\n metadata: sanitizeMetadata(normalized.metadata)\n });\n}\n\nfunction sanitizeNode(node: WorkbenchSnapshotNode): WorkbenchSnapshotNode {\n return {\n id: node.id,\n kind: node.kind,\n title: node.title,\n frame: node.frame,\n displayMode: node.displayMode,\n restoreFrame: node.restoreFrame,\n isMinimized: node.isMinimized,\n data: sanitizeNodeData(node.data)\n };\n}\n\nfunction sanitizeNodeData(\n value: unknown\n): WorkbenchHostSnapshotNodeData | undefined {\n if (!value || typeof value !== \"object\") {\n return undefined;\n }\n\n const typed = value as Partial<WorkbenchHostSnapshotNodeData>;\n if (\n typeof typed.typeId !== \"string\" ||\n typeof typed.instanceId !== \"string\"\n ) {\n return undefined;\n }\n\n return {\n dockEntryId:\n typeof typed.dockEntryId === \"string\" || typed.dockEntryId === null\n ? typed.dockEntryId\n : null,\n instanceId: typed.instanceId,\n instanceKey:\n typeof typed.instanceKey === \"string\" || typed.instanceKey === null\n ? typed.instanceKey\n : null,\n ...(typed.isProjected === true ? { isProjected: true } : {}),\n ...(typed.snapshotNodeState === undefined\n ? {}\n : { snapshotNodeState: typed.snapshotNodeState }),\n typeId: typed.typeId\n };\n}\n\nfunction sanitizeSpace(\n space: WorkbenchSnapshotSpaceV1\n): WorkbenchSnapshotSpaceV1 {\n return {\n id: space.id,\n name: space.name,\n nodeIds: space.nodeIds,\n frame: space.frame\n };\n}\n\nfunction sanitizeMetadata(\n metadata: WorkbenchSnapshot[\"metadata\"]\n): WorkbenchSnapshot[\"metadata\"] {\n const sanitized: Record<string, unknown> = {};\n for (const key of allowedMetadataKeys) {\n if (metadata?.[key] === true) {\n sanitized[key] = true;\n }\n }\n if (metadata?.[closedDockWindowFramesMetadataKey] !== undefined) {\n return writeClosedDockWindowFrameEntries(\n sanitized,\n readClosedDockWindowFrameEntries(metadata).values()\n );\n }\n\n return Object.keys(sanitized).length > 0 ? sanitized : undefined;\n}\n","import type { WorkbenchSnapshot } from \"@tutti-os/workbench-snapshot\";\nimport { createWorkbenchSnapshotFromState } from \"../core/snapshot.ts\";\nimport type { WorkbenchNode, WorkbenchState } from \"../core/types.ts\";\nimport { createWorkbenchController } from \"../store/createWorkbenchController.ts\";\nimport type {\n WorkbenchController,\n WorkbenchDebugDiagnostics\n} from \"../store/types.ts\";\nimport {\n type ClosedDockWindowFrameEntry,\n compactRestoredWorkbenchHostNodes,\n createDefaultLaunchResult,\n createProjectedNodeID,\n createWorkbenchLaunchedHostNode,\n createWorkbenchProjectedHostNode,\n closedDockWindowFrameEntryKey,\n persistedWorkbenchState,\n projectedWorkbenchNodeStack,\n readClosedDockWindowFrameEntries,\n resolveWorkbenchLaunchedHostNodeFrame,\n restoredSnapshotNodesByID,\n shallowArrayEqual,\n stateFromSnapshotOrDefinitions,\n stringArrayEqual,\n updateProjectedNodeFromInput,\n writeClosedDockWindowFrameEntries\n} from \"./sessionState.ts\";\nimport { readWorkbenchHostExternalState } from \"./externalState.ts\";\nimport { sanitizeWorkbenchHostSnapshot } from \"./snapshotSanitizer.ts\";\nimport type { WorkbenchHostNodeData } from \"./types.ts\";\nimport type {\n WorkbenchHostActivation,\n WorkbenchHostActivationTarget,\n WorkbenchHostCloseEffect,\n WorkbenchHostExternalStateSource,\n WorkbenchHostLaunchInput,\n WorkbenchHostLaunchRequest,\n WorkbenchHostLaunchResult,\n WorkbenchHostNodeLeaseHandle,\n WorkbenchHostNodeCloseDecision,\n WorkbenchHostNodeCloseRequest,\n WorkbenchHostNodeDefinition,\n WorkbenchHostProjectedNode,\n WorkbenchHostRuntimeHandle,\n WorkbenchHostSnapshotRepository\n} from \"./types.ts\";\n\nconst initializedMetadataKey = \"workbenchHostInitialized\";\nconst snapshotSaveDelayMs = 400;\nconst launchDiagnosticTextMaxLength = 800;\n\nexport function createWorkbenchHostSession(input: {\n debugDiagnostics?: WorkbenchDebugDiagnostics;\n externalStateSource?: WorkbenchHostExternalStateSource;\n nodes: readonly WorkbenchHostNodeDefinition[];\n onLaunchRequest?: (\n request: WorkbenchHostLaunchRequest\n ) =>\n | Promise<WorkbenchHostLaunchResult | null | void>\n | WorkbenchHostLaunchResult\n | null\n | void;\n onNodeCloseRequest?: (\n request: WorkbenchHostNodeCloseRequest\n ) =>\n | Promise<WorkbenchHostNodeCloseDecision | void>\n | WorkbenchHostNodeCloseDecision\n | void;\n projectedNodes?: readonly WorkbenchHostProjectedNode[];\n snapshotRepository: WorkbenchHostSnapshotRepository;\n workspaceId: string;\n}): WorkbenchHostRuntimeHandle {\n return new WorkbenchHostSessionController(input);\n}\n\nclass WorkbenchHostSessionController implements WorkbenchHostRuntimeHandle {\n readonly controller: WorkbenchController<WorkbenchHostNodeData>;\n private readonly input: {\n debugDiagnostics?: WorkbenchDebugDiagnostics;\n externalStateSource?: WorkbenchHostExternalStateSource;\n nodes: readonly WorkbenchHostNodeDefinition[];\n onLaunchRequest?: (\n request: WorkbenchHostLaunchRequest\n ) =>\n | Promise<WorkbenchHostLaunchResult | null | void>\n | WorkbenchHostLaunchResult\n | null\n | void;\n onNodeCloseRequest?: (\n request: WorkbenchHostNodeCloseRequest\n ) =>\n | Promise<WorkbenchHostNodeCloseDecision | void>\n | WorkbenchHostNodeCloseDecision\n | void;\n projectedNodes?: readonly WorkbenchHostProjectedNode[];\n snapshotRepository: WorkbenchHostSnapshotRepository;\n workspaceId: string;\n };\n\n private readonly nodeDefinitions: readonly WorkbenchHostNodeDefinition[];\n private readonly nodeDefinitionByType = new Map<\n string,\n WorkbenchHostNodeDefinition\n >();\n private isHydratingInitialSnapshot = true;\n private isDisposed = false;\n private isSnapshotLoaded = false;\n private loadedSnapshot: WorkbenchSnapshot | null;\n private closedDockWindowFrameEntries = new Map<\n string,\n ClosedDockWindowFrameEntry\n >();\n private loadGeneration = 0;\n private loadPromise: Promise<void> | null = null;\n private readonly nodeLeases = new Map<string, WorkbenchHostNodeLeaseHandle>();\n private nextActivationSequence = 1;\n private hasAppliedInitialCompactRestoredFrames = false;\n private hasReceivedSurfaceSize = false;\n private observedSurfaceSize:\n | WorkbenchState<WorkbenchHostNodeData>[\"surfaceSize\"]\n | null = null;\n private pendingProjectedNodeReconciliation = false;\n private projectedNodes: readonly WorkbenchHostProjectedNode[];\n private readyPromise: Promise<void>;\n private resolveReady: () => void = noop;\n private saveTimer: ReturnType<typeof globalThis.setTimeout> | null = null;\n private externalStateUnsubscribe: (() => void) | null = null;\n private leaseUnsubscribe: (() => void) | null = null;\n private unsubscribe: (() => void) | null = null;\n\n constructor(input: {\n debugDiagnostics?: WorkbenchDebugDiagnostics;\n externalStateSource?: WorkbenchHostExternalStateSource;\n nodes: readonly WorkbenchHostNodeDefinition[];\n onLaunchRequest?: (\n request: WorkbenchHostLaunchRequest\n ) =>\n | Promise<WorkbenchHostLaunchResult | null | void>\n | WorkbenchHostLaunchResult\n | null\n | void;\n onNodeCloseRequest?: (\n request: WorkbenchHostNodeCloseRequest\n ) =>\n | Promise<WorkbenchHostNodeCloseDecision | void>\n | WorkbenchHostNodeCloseDecision\n | void;\n projectedNodes?: readonly WorkbenchHostProjectedNode[];\n snapshotRepository: WorkbenchHostSnapshotRepository;\n workspaceId: string;\n }) {\n this.input = input;\n this.readyPromise = new Promise((resolve) => {\n this.resolveReady = resolve;\n });\n this.nodeDefinitions = input.nodes;\n for (const definition of input.nodes) {\n this.nodeDefinitionByType.set(definition.typeId, definition);\n }\n this.loadedSnapshot = this.readCachedSnapshot();\n this.closedDockWindowFrameEntries = readClosedDockWindowFrameEntries(\n this.loadedSnapshot?.metadata\n );\n this.projectedNodes = input.projectedNodes ?? [];\n this.controller = createWorkbenchController<WorkbenchHostNodeData>(\n stateFromSnapshotOrDefinitions(\n this.loadedSnapshot,\n this.nodeDefinitions,\n this.projectedNodes\n ),\n { debugDiagnostics: input.debugDiagnostics }\n );\n this.observedSurfaceSize = this.controller.getSnapshot().surfaceSize;\n this.leaseUnsubscribe = this.controller.subscribe(() => {\n this.noteSurfaceSizeChange();\n this.reconcileNodeLeases();\n this.applyInitialCompactRestoredFrames();\n });\n this.isSnapshotLoaded = this.loadedSnapshot !== null;\n if (this.isSnapshotLoaded) {\n this.applyInitialCompactRestoredFrames();\n this.subscribeToPersistence();\n }\n }\n\n activateNode(\n target: WorkbenchHostActivationTarget,\n activation: {\n payload?: unknown;\n type: string;\n }\n ): void {\n this.runWhenReady(this.loadGeneration, () => {\n this.activateNodeNow(target, activation);\n });\n }\n\n private activateNodeNow(\n target: WorkbenchHostActivationTarget,\n activation: {\n payload?: unknown;\n type: string;\n }\n ): void {\n if (!activation.type.trim()) {\n return;\n }\n\n const node = this.findExistingNodeByTarget(target);\n if (!node) {\n return;\n }\n\n const envelope: WorkbenchHostActivation = {\n sequence: this.nextActivationSequence++,\n type: activation.type,\n ...(activation.payload === undefined\n ? {}\n : { payload: activation.payload })\n };\n this.restoreAndFocusNode(node.id);\n this.controller.commands.replaceState({\n nodes: this.controller.getSnapshot().nodes.map((entry) =>\n entry.id === node.id\n ? {\n ...entry,\n data: {\n ...entry.data,\n activation: envelope\n }\n }\n : entry\n )\n });\n }\n\n clearNodeActivation(nodeId: string, sequence: number): void {\n this.runWhenReady(this.loadGeneration, () => {\n this.clearNodeActivationNow(nodeId, sequence);\n });\n }\n\n private clearNodeActivationNow(nodeId: string, sequence: number): void {\n const snapshot = this.controller.getSnapshot();\n const node = snapshot.nodes.find((entry) => entry.id === nodeId);\n if (node?.data.activation?.sequence !== sequence) {\n return;\n }\n\n this.controller.commands.replaceState({\n nodes: snapshot.nodes.map((entry) =>\n entry.id === nodeId\n ? {\n ...entry,\n data: {\n ...entry.data,\n activation: null\n }\n }\n : entry\n )\n });\n }\n\n async collectWindowCloseEffects(): Promise<\n readonly WorkbenchHostCloseEffect[]\n > {\n const snapshot = this.controller.getSnapshot();\n const effects = await Promise.all(\n snapshot.nodes.map(async (node) => {\n const definition = this.nodeDefinitionByType.get(node.data.typeId);\n if (!definition?.getWindowCloseEffect) {\n return null;\n }\n const externalState = readWorkbenchHostExternalState({\n externalStateSource: this.input.externalStateSource,\n node,\n workspaceId: this.input.workspaceId\n });\n const effect = await definition.getWindowCloseEffect({\n externalNodeState: externalState.externalNodeState,\n externalWorkspaceState: externalState.externalWorkspaceState,\n instanceId: node.data.instanceId,\n instanceKey: node.data.instanceKey ?? null,\n node,\n workspaceId: this.input.workspaceId\n });\n return effect ?? null;\n })\n );\n return effects.filter(\n (effect): effect is WorkbenchHostCloseEffect => effect !== null\n );\n }\n\n closeNode(nodeId: string): void {\n this.runWhenReady(this.loadGeneration, () => {\n this.rememberClosedDockWindowFrame(nodeId);\n this.controller.commands.closeNode(nodeId);\n });\n }\n\n dispose(): void {\n this.isDisposed = true;\n this.loadGeneration++;\n this.loadPromise = null;\n this.markReady();\n this.leaseUnsubscribe?.();\n this.leaseUnsubscribe = null;\n this.unsubscribe?.();\n this.unsubscribe = null;\n this.externalStateUnsubscribe?.();\n this.externalStateUnsubscribe = null;\n if (this.saveTimer !== null) {\n globalThis.clearTimeout(this.saveTimer);\n this.saveTimer = null;\n this.saveSnapshot();\n }\n this.disposeNodeLeases();\n }\n\n focusNode(nodeId: string): void {\n this.runWhenReady(this.loadGeneration, () => {\n this.restoreAndFocusNode(nodeId);\n });\n }\n\n minimizeNode(nodeId: string): void {\n this.runWhenReady(this.loadGeneration, () => {\n this.controller.commands.minimizeNode(nodeId);\n });\n }\n\n exitFullscreenNode(nodeId: string): void {\n this.runWhenReady(this.loadGeneration, () => {\n this.controller.commands.exitFullscreen(nodeId);\n });\n }\n\n getSnapshot(): ReturnType<\n WorkbenchController<WorkbenchHostNodeData>[\"getSnapshot\"]\n > {\n return this.controller.getSnapshot();\n }\n\n isHydrating(): boolean {\n return this.isHydratingInitialSnapshot;\n }\n\n async launchNode(input: WorkbenchHostLaunchInput): Promise<string | null> {\n const generation = this.loadGeneration;\n if (!(await this.waitUntilReady(generation))) {\n return null;\n }\n\n const definition = this.nodeDefinitionByType.get(input.typeId);\n if (!definition) {\n return null;\n }\n\n const launchSource = resolveWorkbenchHostLaunchSource(input);\n const currentState = this.controller.getSnapshot();\n const request: WorkbenchHostLaunchRequest = {\n ...input,\n layoutConstraints: currentState.layoutConstraints,\n surfaceSize: currentState.surfaceSize,\n workspaceId: this.input.workspaceId\n };\n if (launchSource !== null) {\n request.launchSource = launchSource;\n }\n\n let result: WorkbenchHostLaunchResult | null | void;\n try {\n result = this.input.onLaunchRequest\n ? await this.input.onLaunchRequest(request)\n : createDefaultLaunchResult(definition, {\n dockEntryId: input.dockEntryId,\n launchSource\n });\n } catch (error) {\n this.logLaunchFailure(request, error);\n return null;\n }\n if (this.isDisposed || !result || generation !== this.loadGeneration) {\n return null;\n }\n\n return this.openLaunchResult({\n ...result,\n launchSource: result.launchSource ?? launchSource\n });\n }\n\n private logLaunchFailure(\n request: WorkbenchHostLaunchRequest,\n error: unknown\n ): void {\n void Promise.resolve(\n this.input.debugDiagnostics?.log?.({\n details: {\n dockEntryId: request.dockEntryId ?? null,\n error: diagnosticErrorDetails(error),\n launchSource: request.launchSource ?? null,\n payload: diagnosticValueSummary(request.payload),\n reason: request.reason,\n typeId: request.typeId\n },\n event: \"host.launch.failed\",\n level: \"error\",\n source: \"workbench-host\",\n workspaceId: request.workspaceId\n })\n ).catch(() => undefined);\n }\n\n async load(): Promise<void> {\n if (this.loadPromise && !this.isDisposed) {\n return this.loadPromise;\n }\n\n const generation = ++this.loadGeneration;\n if (!this.isHydratingInitialSnapshot) {\n this.resetHydrationBarrier();\n }\n this.isDisposed = false;\n this.loadPromise = this.loadInitialSnapshot(generation);\n return this.loadPromise;\n }\n\n private async loadInitialSnapshot(generation: number): Promise<void> {\n this.unsubscribe?.();\n this.unsubscribe = null;\n this.externalStateUnsubscribe?.();\n this.externalStateUnsubscribe = null;\n if (this.saveTimer !== null) {\n globalThis.clearTimeout(this.saveTimer);\n this.saveTimer = null;\n }\n\n try {\n const snapshot = await this.input.snapshotRepository.load(\n this.input.workspaceId\n );\n if (this.isDisposed || generation !== this.loadGeneration) {\n return;\n }\n\n this.loadedSnapshot = snapshot;\n this.closedDockWindowFrameEntries = readClosedDockWindowFrameEntries(\n snapshot?.metadata\n );\n this.controller.commands.replaceState(\n stateFromSnapshotOrDefinitions(\n snapshot,\n this.nodeDefinitions,\n this.projectedNodes\n )\n );\n this.applyProjectedNodes(this.projectedNodes);\n } catch {\n if (this.isDisposed || generation !== this.loadGeneration) {\n return;\n }\n this.loadedSnapshot = null;\n this.closedDockWindowFrameEntries = new Map();\n this.controller.commands.replaceState(\n stateFromSnapshotOrDefinitions(\n null,\n this.nodeDefinitions,\n this.projectedNodes\n )\n );\n this.applyProjectedNodes(this.projectedNodes);\n }\n\n this.reconcileNodeLeases();\n this.isSnapshotLoaded = true;\n this.applyInitialCompactRestoredFrames();\n this.subscribeToPersistence();\n this.markReady();\n }\n\n requestNodeClose(nodeId: string): void {\n const generation = this.loadGeneration;\n this.runWhenReady(generation, () => {\n this.requestNodeCloseNow(nodeId, generation);\n });\n }\n\n private requestNodeCloseNow(nodeId: string, generation: number): void {\n const node =\n this.controller\n .getSnapshot()\n .nodes.find((entry) => entry.id === nodeId) ?? null;\n if (!node) {\n return;\n }\n\n const request = {\n instanceId: node.data.instanceId,\n instanceKey: node.data.instanceKey ?? null,\n isProjected: node.data.isProjected === true,\n nodeId: node.id,\n subject: node.data.projectionSubject ?? null,\n typeId: node.data.typeId,\n workspaceId: this.input.workspaceId\n };\n if (node.data.isProjected === true && !this.input.onNodeCloseRequest) {\n return;\n }\n const decision = this.input.onNodeCloseRequest?.(request);\n void Promise.resolve(decision).then((resolvedDecision) => {\n if (\n this.isDisposed ||\n resolvedDecision === \"keep-open\" ||\n generation !== this.loadGeneration\n ) {\n return;\n }\n this.rememberClosedDockWindowFrame(node.id);\n this.controller.commands.closeNode(node.id);\n }, noop);\n }\n\n setNodeRuntimeState(nodeId: string, state: unknown): void {\n const snapshot = this.controller.getSnapshot();\n if (!snapshot.nodes.some((node) => node.id === nodeId)) {\n return;\n }\n\n this.controller.commands.replaceState({\n nodes: snapshot.nodes.map((node) =>\n node.id === nodeId\n ? {\n ...node,\n data:\n state === undefined\n ? withoutRuntimeNodeState(node.data)\n : {\n ...node.data,\n runtimeNodeState: state\n }\n }\n : node\n )\n });\n }\n\n setNodeSizeConstraints(\n nodeId: string,\n sizeConstraints: WorkbenchNode[\"sizeConstraints\"]\n ): void {\n this.controller.commands.setNodeSizeConstraints(\n nodeId,\n sizeConstraints ?? null\n );\n }\n\n setNodeTitle(nodeId: string, title: string): void {\n const nextTitle = title.trim();\n if (!nextTitle) {\n return;\n }\n\n const snapshot = this.controller.getSnapshot();\n const node = snapshot.nodes.find((entry) => entry.id === nodeId);\n if (!node || node.title === nextTitle) {\n return;\n }\n\n this.controller.commands.replaceState({\n nodes: snapshot.nodes.map((entry) =>\n entry.id === nodeId\n ? {\n ...entry,\n title: nextTitle\n }\n : entry\n )\n });\n }\n\n setSnapshotNodeState(nodeId: string, state: unknown): void {\n const snapshot = this.controller.getSnapshot();\n if (!snapshot.nodes.some((node) => node.id === nodeId)) {\n return;\n }\n\n this.controller.commands.replaceState({\n nodes: snapshot.nodes.map((node) =>\n node.id === nodeId\n ? {\n ...node,\n data:\n state === undefined\n ? withoutSnapshotNodeState(node.data)\n : {\n ...node.data,\n snapshotNodeState: state\n }\n }\n : node\n )\n });\n }\n\n reconcileProjectedNodes(\n projectedNodes: readonly WorkbenchHostProjectedNode[]\n ): void {\n this.projectedNodes = projectedNodes;\n if (this.isHydratingInitialSnapshot) {\n this.queueProjectedNodeReconciliation();\n return;\n }\n\n this.applyProjectedNodes(projectedNodes);\n }\n\n private applyProjectedNodes(\n projectedNodes: readonly WorkbenchHostProjectedNode[]\n ): void {\n const projectedNodesByID = new Map(\n projectedNodes.map((node) => [\n createProjectedNodeID(node.typeId, node.instanceId),\n node\n ])\n );\n const currentState = this.controller.getSnapshot();\n const snapshotNodesByID = restoredSnapshotNodesByID(\n this.loadedSnapshot,\n this.nodeDefinitions\n );\n\n const nextNodes = currentState.nodes\n .filter(\n (node) => !node.data.isProjected || projectedNodesByID.has(node.id)\n )\n .map((node) => {\n const projectedNode = projectedNodesByID.get(node.id);\n return projectedNode\n ? updateProjectedNodeFromInput(\n node,\n projectedNode,\n this.nodeDefinitionByType.get(projectedNode.typeId)\n )\n : node;\n });\n const nextNodeIDs = new Set(nextNodes.map((node) => node.id));\n\n for (const projectedNode of projectedNodes) {\n const nodeID = createProjectedNodeID(\n projectedNode.typeId,\n projectedNode.instanceId\n );\n if (nextNodeIDs.has(nodeID)) {\n continue;\n }\n\n const definition = this.nodeDefinitionByType.get(projectedNode.typeId);\n if (!definition) {\n continue;\n }\n\n const nextNode = createWorkbenchProjectedHostNode({\n definition,\n projectedNode,\n restoredNode: snapshotNodesByID.get(nodeID) ?? null\n });\n nextNodes.push(nextNode);\n nextNodeIDs.add(nextNode.id);\n }\n\n const nodeStack = projectedWorkbenchNodeStack({\n currentNodeStack: currentState.nodeStack,\n nextNodes,\n snapshot: this.loadedSnapshot\n });\n if (\n shallowArrayEqual(currentState.nodes, nextNodes) &&\n stringArrayEqual(currentState.nodeStack, nodeStack)\n ) {\n return;\n }\n\n this.controller.commands.replaceState({\n nodeStack,\n nodes: nextNodes\n });\n }\n\n private openLaunchResult(result: WorkbenchHostLaunchResult): string | null {\n const definition = this.nodeDefinitionByType.get(result.typeId);\n if (!definition) {\n return null;\n }\n const launchResult = this.applyClosedDockWindowFrame(result);\n\n const exactExisting = this.findExistingNodeByTarget({\n instanceId: launchResult.instanceId,\n typeId: launchResult.typeId\n });\n const dockEntryExisting = exactExisting\n ? null\n : this.findExistingNodeByDockEntry(launchResult);\n const existing = exactExisting ?? dockEntryExisting;\n if (existing) {\n this.controller.commands.setNodeSizeConstraints(\n existing.id,\n launchResult.sizeConstraints ?? definition.sizeConstraints ?? null\n );\n if (\n exactExisting &&\n launchResult.framePolicy === \"cascade-same-type-centered\"\n ) {\n const currentState = this.controller.getSnapshot();\n const resolvedFrame = resolveWorkbenchLaunchedHostNodeFrame({\n currentState: {\n ...currentState,\n nodes: currentState.nodes.filter((node) => node.id !== existing.id),\n nodeStack: currentState.nodeStack.filter(\n (nodeId) => nodeId !== existing.id\n )\n },\n definition,\n result: launchResult\n });\n this.controller.commands.resizeNode(existing.id, resolvedFrame);\n }\n this.restoreAndFocusNode(existing.id);\n if (launchResult.activation) {\n this.activateNodeNow({ nodeId: existing.id }, launchResult.activation);\n }\n return existing.id;\n }\n\n const resolvedFrame = resolveWorkbenchLaunchedHostNodeFrame({\n currentState: this.controller.getSnapshot(),\n definition,\n result: launchResult\n });\n const nextNode = createWorkbenchLaunchedHostNode({\n activation: this.createActivationEnvelope(launchResult.activation),\n definition,\n resolvedFrame,\n result: launchResult\n });\n this.controller.commands.openNode(nextNode);\n this.controller.commands.focusNode(nextNode.id);\n return nextNode.id;\n }\n\n private createActivationEnvelope(\n activation: WorkbenchHostLaunchResult[\"activation\"]\n ): WorkbenchHostActivation | null {\n if (!activation?.type.trim()) {\n return null;\n }\n\n return {\n sequence: this.nextActivationSequence++,\n type: activation.type,\n ...(activation.payload === undefined\n ? {}\n : { payload: activation.payload })\n };\n }\n\n private findExistingNodeByTarget(\n target: WorkbenchHostActivationTarget\n ): WorkbenchNode<WorkbenchHostNodeData> | null {\n const snapshot = this.controller.getSnapshot();\n if (\"nodeId\" in target) {\n return snapshot.nodes.find((node) => node.id === target.nodeId) ?? null;\n }\n\n const definition = this.nodeDefinitionByType.get(target.typeId);\n if (!definition) {\n return null;\n }\n const nodes = snapshot.nodes.filter(\n (node) => node.data.typeId === definition.typeId\n );\n if (target.instanceId) {\n return (\n nodes.find((node) => node.data.instanceId === target.instanceId) ?? null\n );\n }\n\n if (definition.instance?.mode === \"multi\") {\n return null;\n }\n\n return nodes[0] ?? null;\n }\n\n private findExistingNodeByDockEntry(\n result: WorkbenchHostLaunchResult\n ): WorkbenchNode<WorkbenchHostNodeData> | null {\n const dockEntryId = result.dockEntryId?.trim();\n if (!result.reuseDockEntryNode || !dockEntryId) {\n return null;\n }\n\n const snapshot = this.controller.getSnapshot();\n const nodesByID = new Map(snapshot.nodes.map((node) => [node.id, node]));\n for (let index = snapshot.nodeStack.length - 1; index >= 0; index -= 1) {\n const node = nodesByID.get(snapshot.nodeStack[index] ?? \"\");\n if (\n node?.data.typeId === result.typeId &&\n node.data.dockEntryId === dockEntryId\n ) {\n return node;\n }\n }\n\n return (\n snapshot.nodes.find(\n (node) =>\n node.data.typeId === result.typeId &&\n node.data.dockEntryId === dockEntryId\n ) ?? null\n );\n }\n\n private readCachedSnapshot(): WorkbenchSnapshot | null {\n if (!this.input.snapshotRepository.hasLoaded?.(this.input.workspaceId)) {\n return null;\n }\n\n return (\n this.input.snapshotRepository.readCached?.(this.input.workspaceId) ?? null\n );\n }\n\n private markReady(): void {\n if (!this.isHydratingInitialSnapshot) {\n return;\n }\n\n this.isHydratingInitialSnapshot = false;\n this.resolveReady();\n }\n\n private resetHydrationBarrier(): void {\n this.isHydratingInitialSnapshot = true;\n this.hasAppliedInitialCompactRestoredFrames = false;\n this.readyPromise = new Promise((resolve) => {\n this.resolveReady = resolve;\n });\n }\n\n private noteSurfaceSizeChange(): void {\n const currentSurfaceSize = this.controller.getSnapshot().surfaceSize;\n if (\n this.observedSurfaceSize &&\n (this.observedSurfaceSize.width !== currentSurfaceSize.width ||\n this.observedSurfaceSize.height !== currentSurfaceSize.height)\n ) {\n this.hasReceivedSurfaceSize = true;\n }\n this.observedSurfaceSize = currentSurfaceSize;\n }\n\n private applyInitialCompactRestoredFrames(): void {\n if (\n this.hasAppliedInitialCompactRestoredFrames ||\n !this.isSnapshotLoaded ||\n !this.hasReceivedSurfaceSize\n ) {\n return;\n }\n\n const snapshot = this.controller.getSnapshot();\n const compactedNodes = compactRestoredWorkbenchHostNodes({\n constraints: snapshot.layoutConstraints,\n nodeDefinitionByType: this.nodeDefinitionByType,\n nodes: snapshot.nodes,\n surfaceSize: snapshot.surfaceSize\n });\n this.hasAppliedInitialCompactRestoredFrames = true;\n if (shallowArrayEqual(snapshot.nodes, compactedNodes)) {\n return;\n }\n this.controller.commands.replaceNodes(compactedNodes);\n }\n\n private queueProjectedNodeReconciliation(): void {\n if (this.pendingProjectedNodeReconciliation) {\n return;\n }\n\n const generation = this.loadGeneration;\n this.pendingProjectedNodeReconciliation = true;\n void this.readyPromise.then(() => {\n this.pendingProjectedNodeReconciliation = false;\n if (this.isDisposed || generation !== this.loadGeneration) {\n return;\n }\n this.applyProjectedNodes(this.projectedNodes);\n });\n }\n\n private runWhenReady(generation: number, action: () => void): void {\n if (!this.isHydratingInitialSnapshot) {\n if (!this.isDisposed && generation === this.loadGeneration) {\n action();\n }\n return;\n }\n\n void this.readyPromise.then(() => {\n if (this.isDisposed || generation !== this.loadGeneration) {\n return;\n }\n action();\n });\n }\n\n private async waitUntilReady(generation: number): Promise<boolean> {\n if (!this.isHydratingInitialSnapshot) {\n return !this.isDisposed && generation === this.loadGeneration;\n }\n\n await this.readyPromise;\n return !this.isDisposed && generation === this.loadGeneration;\n }\n\n private restoreAndFocusNode(nodeId: string): void {\n const existing = this.controller\n .getSnapshot()\n .nodes.find((node) => node.id === nodeId);\n if (!existing) {\n return;\n }\n if (existing.isMinimized) {\n this.controller.commands.restoreNode(existing.id);\n }\n this.controller.commands.focusNode(existing.id);\n }\n\n private saveSnapshot(): void {\n if (!this.isSnapshotLoaded) {\n return;\n }\n\n const snapshot = sanitizeWorkbenchHostSnapshot(\n createWorkbenchSnapshotFromState(\n this.applyExternalSnapshotNodeState(\n persistedWorkbenchState(\n this.controller.getSnapshot(),\n this.nodeDefinitionByType\n )\n ),\n {\n activeSpaceId: this.loadedSnapshot?.activeSpaceId,\n metadata: writeClosedDockWindowFrameEntries(\n {\n ...(this.loadedSnapshot?.metadata ?? {}),\n [initializedMetadataKey]: true\n },\n this.closedDockWindowFrameEntries.values()\n ),\n spaces: this.loadedSnapshot?.spaces\n }\n )\n );\n if (workbenchSnapshotSaveKey(snapshot) === this.loadedSnapshotSaveKey()) {\n return;\n }\n void Promise.resolve(\n this.input.snapshotRepository.save(this.input.workspaceId, snapshot)\n ).then((savedSnapshot) => {\n this.loadedSnapshot = savedSnapshot;\n }, noop);\n }\n\n private rememberClosedDockWindowFrame(nodeId: string): void {\n const node = this.controller\n .getSnapshot()\n .nodes.find((entry) => entry.id === nodeId);\n const dockEntryId = node?.data.dockEntryId?.trim();\n if (!node || !dockEntryId) {\n return;\n }\n\n const entry: ClosedDockWindowFrameEntry = {\n dockEntryId,\n frame:\n node.displayMode === \"fullscreen\" && node.restoreFrame\n ? node.restoreFrame\n : node.frame,\n typeId: node.data.typeId\n };\n this.closedDockWindowFrameEntries.set(\n closedDockWindowFrameEntryKey(entry),\n entry\n );\n }\n\n private applyClosedDockWindowFrame(\n result: WorkbenchHostLaunchResult\n ): WorkbenchHostLaunchResult {\n const dockEntryId = result.dockEntryId?.trim();\n if (!dockEntryId) {\n return result;\n }\n\n const entry = this.closedDockWindowFrameEntries.get(\n closedDockWindowFrameEntryKey({\n dockEntryId,\n typeId: result.typeId\n })\n );\n if (!entry) {\n return result;\n }\n\n return {\n ...result,\n defaultFrame: entry.frame,\n framePolicy: \"absolute\"\n };\n }\n\n private loadedSnapshotSaveKey(): string | null {\n if (!this.loadedSnapshot) {\n return null;\n }\n return workbenchSnapshotSaveKey(\n sanitizeWorkbenchHostSnapshot(this.loadedSnapshot)\n );\n }\n\n private schedulePersistedSnapshotWrite(): void {\n if (!this.isSnapshotLoaded || this.isDisposed) {\n return;\n }\n\n if (this.saveTimer !== null) {\n globalThis.clearTimeout(this.saveTimer);\n }\n this.saveTimer = globalThis.setTimeout(() => {\n this.saveTimer = null;\n this.saveSnapshot();\n }, snapshotSaveDelayMs);\n }\n\n private subscribeToPersistence(): void {\n if (this.unsubscribe !== null) {\n return;\n }\n\n this.unsubscribe = this.controller.subscribe(() => {\n this.schedulePersistedSnapshotWrite();\n });\n if (this.externalStateUnsubscribe === null) {\n const source = this.input.externalStateSource;\n const canReadSnapshotNodeState =\n typeof source?.getSnapshotNodeState === \"function\";\n if (!canReadSnapshotNodeState) {\n return;\n }\n this.externalStateUnsubscribe =\n source?.subscribe?.(() => {\n this.schedulePersistedSnapshotWrite();\n }) ?? null;\n }\n }\n\n private disposeNodeLeases(): void {\n for (const lease of this.nodeLeases.values()) {\n lease.release();\n }\n this.nodeLeases.clear();\n }\n\n private applyExternalSnapshotNodeState(\n state: Pick<WorkbenchState<WorkbenchHostNodeData>, \"nodeStack\" | \"nodes\">\n ): Pick<WorkbenchState<WorkbenchHostNodeData>, \"nodeStack\" | \"nodes\"> {\n const source = this.input.externalStateSource;\n const getSnapshotNodeState = source?.getSnapshotNodeState?.bind(source);\n if (!getSnapshotNodeState) {\n return state;\n }\n\n return {\n ...state,\n nodes: state.nodes.map((node) => {\n const lookupInput = {\n instanceId: node.data.instanceId,\n instanceKey: node.data.instanceKey ?? null,\n nodeId: node.id,\n typeId: node.data.typeId,\n workspaceId: this.input.workspaceId,\n ...(node.data.projectionSubject\n ? { subject: node.data.projectionSubject }\n : {})\n };\n const snapshotNodeState = getSnapshotNodeState(lookupInput);\n const nextSnapshotNodeState =\n snapshotNodeState ?? node.data.snapshotNodeState;\n if (nextSnapshotNodeState === undefined) {\n return node;\n }\n return {\n ...node,\n data: {\n ...node.data,\n snapshotNodeState: nextSnapshotNodeState\n }\n };\n })\n };\n }\n\n private reconcileNodeLeases(): void {\n const activeNodes = this.controller.getSnapshot().nodes;\n const nextNodeIDs = new Set(activeNodes.map((node) => node.id));\n\n for (const [nodeID, lease] of this.nodeLeases) {\n if (nextNodeIDs.has(nodeID)) {\n continue;\n }\n lease.release();\n this.nodeLeases.delete(nodeID);\n }\n\n for (const node of activeNodes) {\n if (this.nodeLeases.has(node.id)) {\n continue;\n }\n const definition = this.nodeDefinitionByType.get(node.data.typeId);\n const lease = definition?.createLease?.({\n node,\n workspaceId: this.input.workspaceId\n });\n if (lease) {\n this.nodeLeases.set(node.id, lease);\n }\n }\n }\n}\n\nfunction withoutRuntimeNodeState(\n data: WorkbenchHostNodeData\n): WorkbenchHostNodeData {\n const next = { ...data };\n delete next.runtimeNodeState;\n return next;\n}\n\nfunction withoutSnapshotNodeState(\n data: WorkbenchHostNodeData\n): WorkbenchHostNodeData {\n const next = { ...data };\n delete next.snapshotNodeState;\n return next;\n}\n\nfunction workbenchSnapshotSaveKey(snapshot: WorkbenchSnapshot): string {\n return JSON.stringify(snapshot);\n}\n\nfunction resolveWorkbenchHostLaunchSource(\n input: WorkbenchHostLaunchInput\n): string | null {\n if (input.launchSource?.trim()) {\n return input.launchSource.trim();\n }\n switch (input.reason) {\n case \"dock\":\n return \"dock\";\n case \"launchpad\":\n return \"launchpad\";\n case \"shortcut\":\n return \"keyboard\";\n case \"command\":\n return \"command\";\n case \"host\":\n return null;\n }\n}\n\nfunction diagnosticErrorDetails(error: unknown): Record<string, unknown> {\n if (error instanceof Error) {\n return {\n message: limitLaunchDiagnosticText(error.message),\n name: error.name,\n stack: limitLaunchDiagnosticText(error.stack)\n };\n }\n return {\n message: diagnosticValueSummary(error),\n name: typeof error\n };\n}\n\nfunction diagnosticValueSummary(value: unknown): string | null {\n if (value === undefined) {\n return null;\n }\n if (typeof value === \"string\") {\n return limitLaunchDiagnosticText(value) ?? \"\";\n }\n if (\n value === null ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return String(value);\n }\n try {\n return limitLaunchDiagnosticText(JSON.stringify(value)) ?? null;\n } catch {\n return Object.prototype.toString.call(value);\n }\n}\n\nfunction limitLaunchDiagnosticText(value: string | undefined): string | null {\n const trimmed = value?.trim();\n if (!trimmed) {\n return null;\n }\n return trimmed.length > launchDiagnosticTextMaxLength\n ? `${trimmed.slice(0, launchDiagnosticTextMaxLength)}...`\n : trimmed;\n}\n\nfunction noop(): void {}\n","import { Component, useCallback, useMemo } from \"react\";\nimport type { ErrorInfo, ReactNode } from \"react\";\nimport type { WorkbenchNode } from \"../core/types.ts\";\nimport type {\n WorkbenchRenderNodeContext,\n WorkbenchRenderWindowHeader,\n WorkbenchResolveWindowChromeMode,\n WorkbenchWindowActionContext\n} from \"../react/types.ts\";\nimport type {\n WorkbenchDockPreviewCache,\n WorkbenchDockPreviewCacheKey\n} from \"../react/dockPreviewCache.ts\";\nimport { WorkbenchHostDock } from \"./WorkbenchHostDock.tsx\";\nimport {\n createWorkbenchHostNodeBodyContext,\n createWorkbenchHostNodeHeaderContext\n} from \"./hostNodeContext.ts\";\nimport { WorkbenchHostWindowActions } from \"./WorkbenchHostWindowActions.tsx\";\nimport { readWorkbenchHostExternalState } from \"./externalState.ts\";\nimport {\n isWorkbenchMinimizedDockEligibleNode,\n resolveWorkbenchMinimizedDockAnchorKeyForNode,\n resolveWorkbenchMinimizedDockSlots\n} from \"./minimizedDockSlots.ts\";\nimport type {\n WorkbenchHostChromeRenderContext,\n WorkbenchHostDockEntry,\n WorkbenchHostExternalStateSource,\n WorkbenchHostNodeBodyContext,\n WorkbenchHostNodeData,\n WorkbenchHostNodeDefinition,\n WorkbenchHostProps,\n WorkbenchHostRuntimeHandle\n} from \"./types.ts\";\nimport type { WorkbenchHostI18nRuntime } from \"./workbenchHostI18n.ts\";\n\nexport function useWorkbenchHostSurfaceRenderers(input: {\n captureNodePreviewImage?: WorkbenchHostProps[\"captureNodePreviewImage\"];\n chromeContext: WorkbenchHostChromeRenderContext;\n debugDiagnostics?: WorkbenchHostProps[\"debugDiagnostics\"];\n dockPreviewCache?: WorkbenchDockPreviewCache;\n dockPlacement?: WorkbenchHostProps[\"dockPlacement\"];\n dockEntries: readonly WorkbenchHostDockEntry[];\n dockStateSource?: WorkbenchHostProps[\"dockStateSource\"];\n externalStateSource?: WorkbenchHostExternalStateSource;\n externalStateRevision: number;\n hostI18n: WorkbenchHostI18nRuntime;\n hostSession: WorkbenchHostRuntimeHandle;\n nodeDefinitionByType: Map<string, WorkbenchHostNodeDefinition>;\n onDockEntryAction?: WorkbenchHostProps[\"onDockEntryAction\"];\n onDockEntryClick?: WorkbenchHostProps[\"onDockEntryClick\"];\n onMissionControlRequestOpen?: WorkbenchHostProps[\"onMissionControlRequestOpen\"];\n renderBottomChrome?: WorkbenchHostProps[\"renderBottomChrome\"];\n renderTopChrome?: WorkbenchHostProps[\"renderTopChrome\"];\n workspaceId: string;\n}) {\n const renderBottomChrome = useMemo(() => {\n const renderChrome = input.renderBottomChrome;\n return renderChrome\n ? () => (\n <WorkbenchHostSurfaceRenderErrorBoundary\n debugDiagnostics={input.debugDiagnostics}\n details={{\n chromeSlot: \"bottom\"\n }}\n event=\"workbench.chrome.render_error\"\n fallbackKind=\"bottom-chrome\"\n resetKey={`${input.workspaceId}:bottom-chrome`}\n workspaceId={input.workspaceId}\n >\n <WorkbenchHostChromeRenderer\n context={input.chromeContext}\n renderChrome={renderChrome}\n />\n </WorkbenchHostSurfaceRenderErrorBoundary>\n )\n : undefined;\n }, [\n input.chromeContext,\n input.debugDiagnostics,\n input.renderBottomChrome,\n input.workspaceId\n ]);\n const renderTopChrome = useMemo(() => {\n const renderChrome = input.renderTopChrome;\n return renderChrome\n ? () => (\n <WorkbenchHostSurfaceRenderErrorBoundary\n debugDiagnostics={input.debugDiagnostics}\n details={{\n chromeSlot: \"top\"\n }}\n event=\"workbench.chrome.render_error\"\n fallbackKind=\"top-chrome\"\n resetKey={`${input.workspaceId}:top-chrome`}\n workspaceId={input.workspaceId}\n >\n <WorkbenchHostChromeRenderer\n context={input.chromeContext}\n renderChrome={renderChrome}\n />\n </WorkbenchHostSurfaceRenderErrorBoundary>\n )\n : undefined;\n }, [\n input.chromeContext,\n input.debugDiagnostics,\n input.renderTopChrome,\n input.workspaceId\n ]);\n\n const captureNodePreviewImage = useCallback(\n async (node: WorkbenchNode<WorkbenchHostNodeData>) => {\n const definition = input.nodeDefinitionByType.get(node.data.typeId);\n const minimizedDock = definition?.window?.minimizedDock;\n const capturePreview =\n minimizedDock?.kind === \"snapshot\"\n ? minimizedDock.capturePreview\n : undefined;\n const snapshot = input.hostSession.getSnapshot();\n const externalState = readWorkbenchHostExternalState({\n externalStateSource: input.externalStateSource,\n node,\n workspaceId: input.workspaceId\n });\n const nodePreview =\n (await Promise.resolve(\n capturePreview?.({\n externalNodeState: externalState.externalNodeState,\n externalWorkspaceState: externalState.externalWorkspaceState,\n host: input.hostSession,\n isFocused: snapshot.nodeStack.at(-1) === node.id,\n isMinimized: node.isMinimized,\n node\n }) ?? null\n ).catch(() => null)) ??\n (await Promise.resolve(\n input.captureNodePreviewImage?.(node) ?? null\n ).catch(() => null));\n return nodePreview;\n },\n [\n input.captureNodePreviewImage,\n input.externalStateSource,\n input.hostSession,\n input.nodeDefinitionByType,\n input.workspaceId\n ]\n );\n\n const renderDock = useCallback(\n (context: Parameters<typeof WorkbenchHostDock>[0][\"context\"]) => (\n <WorkbenchHostSurfaceRenderErrorBoundary\n debugDiagnostics={input.debugDiagnostics}\n details={{\n dockEntryCount: input.dockEntries.length,\n dockPlacement: input.dockPlacement ?? null\n }}\n event=\"workbench.dock.render_error\"\n fallbackKind=\"dock\"\n resetKey={`${input.workspaceId}:dock`}\n workspaceId={input.workspaceId}\n >\n <WorkbenchHostDock\n captureNodePreviewImage={captureNodePreviewImage}\n context={context}\n debugDiagnostics={input.debugDiagnostics}\n dockEntries={input.dockEntries}\n dockPlacement={input.dockPlacement}\n dockPreviewCache={input.dockPreviewCache}\n dockStateSource={input.dockStateSource}\n externalStateSource={input.externalStateSource}\n host={input.hostSession}\n i18n={input.hostI18n}\n nodeDefinitions={input.nodeDefinitionByType}\n onDockEntryAction={input.onDockEntryAction}\n onDockEntryClick={input.onDockEntryClick}\n onMissionControlRequestOpen={input.onMissionControlRequestOpen}\n workspaceId={input.workspaceId}\n />\n </WorkbenchHostSurfaceRenderErrorBoundary>\n ),\n [\n captureNodePreviewImage,\n input.debugDiagnostics,\n input.dockEntries,\n input.dockPlacement,\n input.dockPreviewCache,\n input.dockStateSource,\n input.externalStateSource,\n input.hostI18n,\n input.hostSession,\n input.nodeDefinitionByType,\n input.onDockEntryAction,\n input.onDockEntryClick,\n input.onMissionControlRequestOpen,\n input.workspaceId\n ]\n );\n\n const renderNode = useCallback(\n (context: WorkbenchRenderNodeContext<WorkbenchHostNodeData>) => {\n const definition = input.nodeDefinitionByType.get(\n context.node.data.typeId\n );\n if (!definition) {\n return null;\n }\n\n const bodyContext = createWorkbenchHostNodeBodyContext({\n context,\n definition,\n externalStateSource: input.externalStateSource,\n host: input.hostSession,\n workspaceId: input.workspaceId\n });\n\n return (\n <WorkbenchHostNodeRenderErrorBoundary\n debugDiagnostics={input.debugDiagnostics}\n node={context.node}\n resetKey={`${context.node.id}:${context.node.data.typeId}:${input.externalStateRevision}`}\n workspaceId={input.workspaceId}\n >\n <WorkbenchHostNodeBodyRenderer\n context={bodyContext}\n definition={definition}\n />\n </WorkbenchHostNodeRenderErrorBoundary>\n );\n },\n [\n input.debugDiagnostics,\n input.externalStateSource,\n input.externalStateRevision,\n input.hostSession,\n input.nodeDefinitionByType,\n input.workspaceId\n ]\n );\n\n const renderWindowActions = useCallback(\n (context: WorkbenchWindowActionContext<WorkbenchHostNodeData>) => (\n <WorkbenchHostWindowActions\n context={context}\n host={input.hostSession}\n i18n={input.hostI18n}\n nodeDefinitions={input.nodeDefinitionByType}\n />\n ),\n [input.hostI18n, input.hostSession, input.nodeDefinitionByType]\n );\n\n const renderWindowHeader = useCallback(\n (\n context: Parameters<WorkbenchRenderWindowHeader<WorkbenchHostNodeData>>[0]\n ) => {\n const definition = input.nodeDefinitionByType.get(\n context.node.data.typeId\n );\n if (!definition?.renderHeader) {\n return null;\n }\n\n return definition.renderHeader(\n createWorkbenchHostNodeHeaderContext({\n context,\n definition,\n externalStateSource: input.externalStateSource,\n host: input.hostSession,\n workspaceId: input.workspaceId\n })\n );\n },\n [\n input.externalStateSource,\n input.externalStateRevision,\n input.hostSession,\n input.nodeDefinitionByType,\n input.workspaceId\n ]\n );\n\n const shouldKeepMinimizedNodeMounted = useCallback(\n (node: WorkbenchNode<WorkbenchHostNodeData>) => {\n const capability = input.nodeDefinitionByType.get(node.data.typeId)\n ?.window?.keepMountedWhenMinimized;\n return typeof capability === \"function\"\n ? capability(node)\n : capability === true;\n },\n [input.nodeDefinitionByType]\n );\n\n const shouldCaptureNodePreviewImage = useCallback(\n (node: WorkbenchNode<WorkbenchHostNodeData>) => {\n const minimizedDock = input.nodeDefinitionByType.get(node.data.typeId)\n ?.window?.minimizedDock;\n return minimizedDock?.kind !== \"component\";\n },\n [input.nodeDefinitionByType]\n );\n\n const resolveDockAnchorKey = useCallback(\n (node: WorkbenchNode<WorkbenchHostNodeData>) => {\n if (\n node.isMinimized &&\n isWorkbenchMinimizedDockEligibleNode({\n node,\n nodeDefinitions: input.nodeDefinitionByType\n })\n ) {\n const snapshotNodes = input.hostSession.getSnapshot().nodes;\n const slotNodes = snapshotNodes.some(\n (snapshotNode) => snapshotNode.id === node.id\n )\n ? snapshotNodes.map((snapshotNode) =>\n snapshotNode.id === node.id ? node : snapshotNode\n )\n : [...snapshotNodes, node];\n const minimizedAnchorKey =\n resolveWorkbenchMinimizedDockAnchorKeyForNode({\n nodeId: node.id,\n slots: resolveWorkbenchMinimizedDockSlots({\n nodeDefinitions: input.nodeDefinitionByType,\n nodes: slotNodes\n })\n });\n if (minimizedAnchorKey) {\n return minimizedAnchorKey;\n }\n }\n\n if (typeof node.data.dockEntryId === \"string\") {\n const dockEntry = input.dockEntries.find(\n (entry) => entry.id === node.data.dockEntryId\n );\n return dockEntry?.anchorKey ?? node.data.dockEntryId;\n }\n\n return node.data.typeId;\n },\n [input.dockEntries, input.hostSession, input.nodeDefinitionByType]\n );\n\n const resolveDockPreviewCacheKey = useCallback(\n (\n node: WorkbenchNode<WorkbenchHostNodeData>\n ): WorkbenchDockPreviewCacheKey | null => ({\n instanceId: node.data.instanceId,\n instanceKey: node.data.instanceKey ?? null,\n nodeId: node.id,\n typeId: node.data.typeId,\n workspaceId: input.workspaceId\n }),\n [input.workspaceId]\n );\n\n const windowChromeMode = useCallback<\n WorkbenchResolveWindowChromeMode<WorkbenchHostNodeData>\n >(\n ({ node }) =>\n input.nodeDefinitionByType.get(node.data.typeId)?.renderHeader\n ? \"custom-header\"\n : \"system\",\n [input.nodeDefinitionByType]\n );\n\n const resolveFullscreenHeaderMode = useCallback(\n ({ node }: { node: WorkbenchNode<WorkbenchHostNodeData> }) =>\n input.nodeDefinitionByType.get(node.data.typeId)?.window\n ?.fullscreenHeaderMode,\n [input.nodeDefinitionByType]\n );\n\n return {\n captureNodePreviewImage,\n renderBottomChrome,\n renderDock,\n renderNode,\n renderTopChrome,\n renderWindowActions,\n renderWindowHeader,\n shouldCaptureNodePreviewImage,\n shouldKeepMinimizedNodeMounted,\n resolveDockAnchorKey,\n resolveDockPreviewCacheKey,\n resolveFullscreenHeaderMode,\n windowChromeMode\n };\n}\n\ninterface WorkbenchHostNodeRenderErrorBoundaryProps {\n children: ReactNode;\n debugDiagnostics?: WorkbenchHostProps[\"debugDiagnostics\"];\n node: WorkbenchNode<WorkbenchHostNodeData>;\n resetKey: string;\n workspaceId: string;\n}\n\ninterface WorkbenchHostSurfaceRenderErrorBoundaryProps {\n children: ReactNode;\n debugDiagnostics?: WorkbenchHostProps[\"debugDiagnostics\"];\n details?: Record<string, unknown>;\n event: string;\n fallbackKind: string;\n resetKey: string;\n workspaceId: string;\n}\n\ninterface WorkbenchHostNodeRenderErrorBoundaryState {\n hasError: boolean;\n}\n\ninterface WorkbenchHostSurfaceRenderErrorBoundaryState {\n hasError: boolean;\n}\n\nclass WorkbenchHostSurfaceRenderErrorBoundary extends Component<\n WorkbenchHostSurfaceRenderErrorBoundaryProps,\n WorkbenchHostSurfaceRenderErrorBoundaryState\n> {\n override state: WorkbenchHostSurfaceRenderErrorBoundaryState = {\n hasError: false\n };\n\n static getDerivedStateFromError(): WorkbenchHostSurfaceRenderErrorBoundaryState {\n return { hasError: true };\n }\n\n override componentDidUpdate(\n previousProps: WorkbenchHostSurfaceRenderErrorBoundaryProps\n ): void {\n if (this.state.hasError && previousProps.resetKey !== this.props.resetKey) {\n this.setState({ hasError: false });\n }\n }\n\n override componentDidCatch(error: unknown, info: ErrorInfo): void {\n try {\n const result = this.props.debugDiagnostics?.log?.({\n details: {\n ...(this.props.details ?? {}),\n componentStack: info.componentStack ?? null,\n errorMessage: error instanceof Error ? error.message : String(error),\n errorName: error instanceof Error ? error.name : typeof error,\n errorStack: error instanceof Error ? (error.stack ?? null) : null\n },\n event: this.props.event,\n level: \"error\",\n source: \"workbench-host\",\n workspaceId: this.props.workspaceId\n });\n void Promise.resolve(result).catch(() => undefined);\n } catch {\n // Rendering recovery must not depend on diagnostics transport.\n }\n }\n\n override render(): ReactNode {\n if (this.state.hasError) {\n return (\n <div\n data-workbench-surface-render-error={this.props.fallbackKind}\n style={{ height: \"100%\", width: \"100%\" }}\n />\n );\n }\n\n return this.props.children;\n }\n}\n\nclass WorkbenchHostNodeRenderErrorBoundary extends Component<\n WorkbenchHostNodeRenderErrorBoundaryProps,\n WorkbenchHostNodeRenderErrorBoundaryState\n> {\n override state: WorkbenchHostNodeRenderErrorBoundaryState = {\n hasError: false\n };\n\n static getDerivedStateFromError(): WorkbenchHostNodeRenderErrorBoundaryState {\n return { hasError: true };\n }\n\n override componentDidUpdate(\n previousProps: WorkbenchHostNodeRenderErrorBoundaryProps\n ): void {\n if (this.state.hasError && previousProps.resetKey !== this.props.resetKey) {\n this.setState({ hasError: false });\n }\n }\n\n override componentDidCatch(error: unknown, info: ErrorInfo): void {\n try {\n const result = this.props.debugDiagnostics?.log?.({\n details: {\n componentStack: info.componentStack ?? null,\n dockEntryId: this.props.node.data.dockEntryId ?? null,\n displayMode: this.props.node.displayMode,\n errorMessage: error instanceof Error ? error.message : String(error),\n errorName: error instanceof Error ? error.name : typeof error,\n errorStack: error instanceof Error ? (error.stack ?? null) : null,\n frame: this.props.node.frame,\n instanceId: this.props.node.data.instanceId,\n instanceKey: this.props.node.data.instanceKey ?? null,\n isMinimized: this.props.node.isMinimized,\n launchSource: this.props.node.data.launchSource ?? null,\n nodeId: this.props.node.id,\n typeId: this.props.node.data.typeId\n },\n event: \"workbench.node.render_error\",\n level: \"error\",\n source: \"workbench-host\",\n workspaceId: this.props.workspaceId\n });\n void Promise.resolve(result).catch(() => undefined);\n } catch {\n // Rendering recovery must not depend on diagnostics transport.\n }\n }\n\n override render(): ReactNode {\n if (this.state.hasError) {\n return (\n <div\n data-workbench-node-render-error=\"true\"\n style={{\n alignItems: \"center\",\n boxSizing: \"border-box\",\n color: \"var(--text-secondary, #6b7280)\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: 8,\n height: \"100%\",\n justifyContent: \"center\",\n padding: 24,\n textAlign: \"center\",\n width: \"100%\"\n }}\n >\n <div\n data-workbench-node-render-error-message=\"true\"\n style={{\n color: \"var(--text-primary, #111827)\",\n fontSize: 14,\n fontWeight: 600\n }}\n >\n This workspace view failed to render.\n </div>\n <div style={{ fontSize: 12 }}>\n Try selecting another conversation or reopen the window.\n </div>\n <button\n type=\"button\"\n onClick={() => this.setState({ hasError: false })}\n style={{\n border: \"1px solid var(--line-2, #d1d5db)\",\n borderRadius: 6,\n background: \"var(--background-fronted, #ffffff)\",\n color: \"var(--text-primary, #111827)\",\n cursor: \"pointer\",\n fontSize: 12,\n fontWeight: 600,\n marginTop: 4,\n padding: \"6px 10px\"\n }}\n >\n Try again\n </button>\n </div>\n );\n }\n\n return this.props.children;\n }\n}\n\nfunction WorkbenchHostNodeBodyRenderer({\n context,\n definition\n}: {\n context: WorkbenchHostNodeBodyContext;\n definition: WorkbenchHostNodeDefinition;\n}): ReactNode {\n return definition.renderBody(context);\n}\n\nfunction WorkbenchHostChromeRenderer({\n context,\n renderChrome\n}: {\n context: WorkbenchHostChromeRenderContext;\n renderChrome: NonNullable<WorkbenchHostProps[\"renderTopChrome\"]>;\n}): ReactNode {\n return renderChrome(context);\n}\n","import {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type Dispatch,\n type FocusEvent as ReactFocusEvent,\n type PointerEvent as ReactPointerEvent,\n type RefObject,\n type SetStateAction\n} from \"react\";\nimport {\n ArrowLeftIcon,\n ArrowRightIcon,\n Button,\n ChevronDownIcon,\n ChevronUpIcon\n} from \"@tutti-os/ui-system\";\nimport type { WorkbenchDockContext } from \"../react/types.ts\";\nimport {\n captureWorkbenchNodePreviewImage,\n readCachedWorkbenchNodePreviewImage,\n writeCachedWorkbenchNodePreviewImage\n} from \"../react/useWorkbenchGenieAnimation.tsx\";\nimport {\n resolveWorkbenchDockEntries,\n resolveWorkbenchDockEntryClick,\n type ResolvedWorkbenchHostDockEntry\n} from \"./dockEntries.ts\";\nimport {\n DOCK_ICON_BASE_SIZE,\n DOCK_ICON_PEAK_SIZE,\n useDockMagnification\n} from \"./dockMagnification.ts\";\nimport {\n resolveWorkbenchHostDockScrollState,\n type WorkbenchHostDockScrollState\n} from \"./dockScrollState.ts\";\nimport { readWorkbenchHostExternalState } from \"./externalState.ts\";\nimport {\n resolveWorkbenchMinimizedDockSlots,\n type WorkbenchMinimizedDockNode,\n type WorkbenchMinimizedDockSlot\n} from \"./minimizedDockSlots.ts\";\nimport { useMinimizedDockStackPromotion } from \"./minimizedDockStackPromotion.ts\";\nimport {\n resolveWorkbenchMinimizedDockRestoreIntent,\n type WorkbenchMinimizedDockRestoreIntent\n} from \"./minimizedDockRestoreIntent.ts\";\nimport {\n WorkbenchHostDockPopup,\n type WorkbenchHostDockPopupAnchorRect,\n type WorkbenchHostDockPopupState\n} from \"./WorkbenchHostDockPopup.tsx\";\nimport type {\n WorkbenchDockPreviewCache,\n WorkbenchDockPreviewCacheKey\n} from \"../react/dockPreviewCache.ts\";\nimport type {\n WorkbenchDockPreviewContent,\n WorkbenchHostDockEntry,\n WorkbenchHostDockEntryStateSource,\n WorkbenchHostExternalStateSource,\n WorkbenchHostHandle,\n WorkbenchHostNodeDefinition,\n WorkbenchHostNodeData,\n WorkbenchHostNodeInstanceStrategy,\n WorkbenchHostProps\n} from \"./types.ts\";\nimport type { createWorkbenchHostI18nRuntime } from \"./workbenchHostI18n.ts\";\n\ntype WorkbenchMinimizedDockNodeSlotRestoreIntent = Extract<\n WorkbenchMinimizedDockRestoreIntent,\n { kind: \"node-slot\" }\n>;\n\ntype WorkbenchMinimizedDockStackPopupCardRestoreIntent = Extract<\n WorkbenchMinimizedDockRestoreIntent,\n { kind: \"stack-popup-card\" }\n>;\n\ntype WorkbenchDockWallpaperTone = \"dark\" | \"light\";\n\nfunction stripDockDescriptionTerminalPunctuation(value: string): string {\n const trimmed = value.trim();\n if (!trimmed || trimmed.endsWith(\"...\") || trimmed.endsWith(\"…\")) {\n return trimmed;\n }\n return trimmed.replace(/[。..]+$/u, \"\");\n}\n\nfunction isDockVisualMutationActive(element: HTMLElement | null): boolean {\n if (!element) {\n return false;\n }\n\n return (\n element.hasAttribute(\"data-dock-pointer-active\") ||\n element.hasAttribute(\"data-dock-hover-panel-open\") ||\n element.querySelector(\n '[data-collapsing=\"true\"], [data-presence=\"entering\"], [data-presence=\"exiting\"], [data-stack-dispatching=\"true\"], [data-promoted-from-stack=\"true\"]'\n ) !== null\n );\n}\n\nexport function WorkbenchHostDock({\n captureNodePreviewImage,\n context,\n debugDiagnostics,\n dockEntries,\n dockPlacement = \"bottom\",\n dockPreviewCache,\n dockStateSource,\n externalStateSource,\n host,\n i18n,\n nodeDefinitions,\n onDockEntryAction,\n onDockEntryClick,\n onMissionControlRequestOpen,\n workspaceId\n}: {\n captureNodePreviewImage?: WorkbenchHostProps[\"captureNodePreviewImage\"];\n context: WorkbenchDockContext<WorkbenchHostNodeData>;\n debugDiagnostics?: WorkbenchHostProps[\"debugDiagnostics\"];\n dockEntries: readonly WorkbenchHostDockEntry[];\n dockPlacement?: WorkbenchHostProps[\"dockPlacement\"];\n dockPreviewCache?: WorkbenchDockPreviewCache;\n dockStateSource?: WorkbenchHostDockEntryStateSource;\n externalStateSource?: WorkbenchHostExternalStateSource;\n host: WorkbenchHostHandle;\n i18n: ReturnType<typeof createWorkbenchHostI18nRuntime>;\n nodeDefinitions: Map<string, WorkbenchHostNodeDefinition>;\n onDockEntryAction?: (input: {\n actionId: string;\n entryId: string;\n host: WorkbenchHostHandle;\n }) => Promise<void> | void;\n onDockEntryClick?: (input: {\n entryId: string;\n host: WorkbenchHostHandle;\n nodeId?: string;\n }) => Promise<void> | void;\n onMissionControlRequestOpen?: WorkbenchHostProps[\"onMissionControlRequestOpen\"];\n workspaceId: string;\n}) {\n const minimizedNodeIDs = useMemo(\n () => new Set(context.minimizedNodes.map((node) => node.id)),\n [context.minimizedNodes]\n );\n const dockMeasureRef = useRef<HTMLDivElement | null>(null);\n const dockItemsRef = useRef<HTMLDivElement | null>(null);\n const hoverPanelRef = useRef<HTMLDivElement | null>(null);\n const hoverPanelCloseTimerRef = useRef<ReturnType<typeof setTimeout> | null>(\n null\n );\n const hoverPanelOpenTimerRef = useRef<ReturnType<typeof setTimeout> | null>(\n null\n );\n const labelTooltipOpenTimerRef = useRef<ReturnType<typeof setTimeout> | null>(\n null\n );\n const hoverPanelScheduledPointRef = useRef<{\n clientX: number;\n clientY: number;\n } | null>(null);\n const labelTooltipScheduledPointRef = useRef<{\n clientX: number;\n clientY: number;\n } | null>(null);\n const hoverPanelRestTargetRef = useRef<{\n anchorKey: string;\n entryId: string;\n } | null>(null);\n const activeHoverPanelRef = useRef<WorkbenchHostDockHoverPanelState | null>(\n null\n );\n const activeLabelTooltipRef =\n useRef<WorkbenchHostDockLabelTooltipState | null>(null);\n const pendingDockStateRefreshRef = useRef(false);\n const slotRefs = useRef(new Map<string, HTMLElement>());\n const wallpaperToneElementRefs = useRef(new Map<string, HTMLElement>());\n const dockSlotRefCallbacksRef = useRef(\n new Map<string, (element: HTMLElement | null) => void>()\n );\n const previousAttentionTokenByEntryId = useRef(new Map<string, unknown>());\n const dockEntryClickThrottleUntilRef = useRef(new Map<string, number>());\n const attentionTimeouts = useRef(\n new Map<string, ReturnType<typeof setTimeout>>()\n );\n const [activeAttentionEntryIds, setActiveAttentionEntryIds] = useState<\n Set<string>\n >(new Set());\n const [activePopup, setActivePopup] =\n useState<WorkbenchHostDockPopupState | null>(null);\n const [activeHoverPanel, setActiveHoverPanel] =\n useState<WorkbenchHostDockHoverPanelState | null>(null);\n const [activeLabelTooltip, setActiveLabelTooltip] =\n useState<WorkbenchHostDockLabelTooltipState | null>(null);\n const [activeMinimizedStackPopup, setActiveMinimizedStackPopup] =\n useState<WorkbenchHostDockPopupAnchorRect | null>(null);\n const [pendingActionKeys, setPendingActionKeys] = useState<Set<string>>(\n () => new Set()\n );\n const [dockFrameSize, setDockFrameSize] = useState<number | null>(null);\n const { triggerDockBounce } = useDockBounce(slotRefs);\n const [dockScrollState, setDockScrollState] =\n useState<WorkbenchHostDockScrollState>(() => ({\n canScrollBackward: false,\n canScrollForward: false,\n hasOverflow: false\n }));\n const [dockStateRevision, setDockStateRevision] = useState(0);\n const [externalStateRevision, setExternalStateRevision] = useState(0);\n const [\n collapsingMinimizedLaunchAnchorKeys,\n setCollapsingMinimizedLaunchAnchorKeys\n ] = useState<Set<string>>(() => new Set());\n const collapsingMinimizedLaunchTimerRef = useRef(\n new Map<string, ReturnType<typeof setTimeout>>()\n );\n\n const clearHoverPanelCloseTimer = useCallback(() => {\n if (hoverPanelCloseTimerRef.current === null) {\n return;\n }\n clearTimeout(hoverPanelCloseTimerRef.current);\n hoverPanelCloseTimerRef.current = null;\n }, []);\n\n const clearHoverPanelOpenTimer = useCallback(() => {\n if (hoverPanelOpenTimerRef.current === null) {\n return;\n }\n clearTimeout(hoverPanelOpenTimerRef.current);\n hoverPanelOpenTimerRef.current = null;\n hoverPanelScheduledPointRef.current = null;\n }, []);\n\n const clearLabelTooltipOpenTimer = useCallback(() => {\n if (labelTooltipOpenTimerRef.current === null) {\n return;\n }\n clearTimeout(labelTooltipOpenTimerRef.current);\n labelTooltipOpenTimerRef.current = null;\n labelTooltipScheduledPointRef.current = null;\n }, []);\n\n useEffect(\n () => () => {\n clearHoverPanelCloseTimer();\n clearHoverPanelOpenTimer();\n clearLabelTooltipOpenTimer();\n for (const timer of collapsingMinimizedLaunchTimerRef.current.values()) {\n clearTimeout(timer);\n }\n collapsingMinimizedLaunchTimerRef.current.clear();\n },\n [\n clearHoverPanelCloseTimer,\n clearHoverPanelOpenTimer,\n clearLabelTooltipOpenTimer\n ]\n );\n\n const clearCollapsingMinimizedLaunch = useCallback((anchorKey: string) => {\n const timer = collapsingMinimizedLaunchTimerRef.current.get(anchorKey);\n if (timer) {\n clearTimeout(timer);\n collapsingMinimizedLaunchTimerRef.current.delete(anchorKey);\n }\n const slotElement = slotRefs.current.get(anchorKey);\n slotElement?.removeAttribute(\"data-collapsing\");\n slotElement?.style.removeProperty(\"--desktop-dock-collapse-inline-size\");\n slotElement?.style.removeProperty(\"--desktop-dock-collapse-block-size\");\n setCollapsingMinimizedLaunchAnchorKeys((current) => {\n if (!current.has(anchorKey)) {\n return current;\n }\n const next = new Set(current);\n next.delete(anchorKey);\n return next;\n });\n }, []);\n\n const scheduleCollapsingMinimizedLaunchClear = useCallback(\n (anchorKey: string) => {\n const existing = collapsingMinimizedLaunchTimerRef.current.get(anchorKey);\n if (existing) {\n clearTimeout(existing);\n }\n collapsingMinimizedLaunchTimerRef.current.set(\n anchorKey,\n setTimeout(() => {\n clearCollapsingMinimizedLaunch(anchorKey);\n }, minimizedDockSlotLayoutAnimationMs)\n );\n },\n [clearCollapsingMinimizedLaunch]\n );\n\n useLayoutEffect(() => {\n const element = dockMeasureRef.current;\n if (!element || typeof window === \"undefined\") {\n return undefined;\n }\n\n let frameId: number | null = null;\n const updateDockFrameSize = () => {\n frameId = null;\n if (isDockVisualMutationActive(dockMeasureRef.current)) {\n return;\n }\n const rect = element.getBoundingClientRect();\n const nextSize = Math.ceil(\n (dockPlacement === \"left\" ? rect.height : rect.width) +\n desktopDockPlateChromeWidth\n );\n setDockFrameSize((current) =>\n current === nextSize ? current : nextSize\n );\n };\n const scheduleUpdate = () => {\n if (frameId !== null) {\n return;\n }\n frameId = window.requestAnimationFrame(updateDockFrameSize);\n };\n\n updateDockFrameSize();\n\n const resizeObserver =\n typeof ResizeObserver === \"undefined\"\n ? null\n : new ResizeObserver(scheduleUpdate);\n resizeObserver?.observe(element);\n window.addEventListener(\"resize\", scheduleUpdate);\n\n return () => {\n if (frameId !== null) {\n window.cancelAnimationFrame(frameId);\n }\n resizeObserver?.disconnect();\n window.removeEventListener(\"resize\", scheduleUpdate);\n };\n }, [dockPlacement]);\n\n const flushPendingDockStateRefresh = useCallback(() => {\n if (!pendingDockStateRefreshRef.current) {\n return;\n }\n pendingDockStateRefreshRef.current = false;\n setDockStateRevision((revision) => revision + 1);\n }, []);\n\n useEffect(() => {\n if (!dockStateSource) {\n return undefined;\n }\n return dockStateSource.subscribe(() => {\n if (isDockVisualMutationActive(dockMeasureRef.current)) {\n pendingDockStateRefreshRef.current = true;\n return;\n }\n setDockStateRevision((revision) => revision + 1);\n });\n }, [dockStateSource]);\n\n const renderedDockEntries = useMemo(\n () =>\n dockEntries.map((entry) => {\n const dynamicState = dockStateSource?.getEntryState(entry.id);\n return dynamicState ? { ...entry, ...dynamicState } : entry;\n }),\n [dockEntries, dockStateRevision, dockStateSource]\n );\n const resolvedEntries = useMemo(\n () =>\n resolveWorkbenchDockEntries({\n dockEntries: renderedDockEntries,\n minimizedNodeIds: minimizedNodeIDs,\n nodes: context.nodes\n }),\n [context.nodes, minimizedNodeIDs, renderedDockEntries]\n );\n const minimizedDockSlots = useMemo(\n () =>\n resolveWorkbenchMinimizedDockSlots({\n nodeDefinitions,\n nodes: context.minimizedNodes\n }),\n [context.minimizedNodes, nodeDefinitions]\n );\n const { promotedNodeId, stackDispatching } =\n useMinimizedDockStackPromotion(minimizedDockSlots);\n const dockItems = useMemo(\n () =>\n createWorkbenchHostDockItems({\n minimizedDockSlots,\n resolvedEntries\n }),\n [minimizedDockSlots, resolvedEntries]\n );\n const presentDockItems = useDockPresenceItems(dockItems, (nodeId) =>\n context.genie.shouldAnimateMinimizedDockEnter(nodeId)\n );\n const presentDockItemKeys = useMemo(\n () => presentDockItems.map((item) => item.key).join(\"\\n\"),\n [presentDockItems]\n );\n const wallpaperTones = useDockWallpaperTones({\n dockItemsRef,\n elementRefs: wallpaperToneElementRefs,\n itemKeys: presentDockItemKeys\n });\n const dockWidth = useMemo(\n () => resolveWorkbenchHostDockItemsWidth(dockItems),\n [dockItems]\n );\n const {\n clearSlotMagnification,\n handlePointerLeave: handleDockPointerLeave,\n handlePointerMove: handleDockPointerMove,\n pauseMagnification: pauseDockMagnification,\n resetMagnification: resetDockMagnification\n } = useDockMagnification({\n dockPlacement,\n dockRootRef: dockMeasureRef,\n slotRefs\n });\n const clearSlotMagnificationRef = useRef<(anchorKey: string) => void>(() => {\n return;\n });\n const registerDockAnchorRef = useRef(\n (anchorKey: string, element: HTMLElement | null) => {\n context.genie.registerDockAnchor(anchorKey, element);\n }\n );\n clearSlotMagnificationRef.current = (anchorKey) => {\n clearSlotMagnification(anchorKey);\n };\n registerDockAnchorRef.current = (anchorKey, element) => {\n context.genie.registerDockAnchor(anchorKey, element);\n };\n const registerWallpaperToneElement = useCallback(\n (key: string) => (element: HTMLElement | null) => {\n if (element) {\n wallpaperToneElementRefs.current.set(key, element);\n return;\n }\n wallpaperToneElementRefs.current.delete(key);\n },\n []\n );\n\n const setDockHoverPanelOpen = useCallback((open: boolean) => {\n if (open) {\n dockMeasureRef.current?.setAttribute(\n \"data-dock-hover-panel-open\",\n \"true\"\n );\n return;\n }\n dockMeasureRef.current?.removeAttribute(\"data-dock-hover-panel-open\");\n }, []);\n\n useEffect(() => {\n activeHoverPanelRef.current = activeHoverPanel;\n }, [activeHoverPanel]);\n\n useEffect(() => {\n activeLabelTooltipRef.current = activeLabelTooltip;\n }, [activeLabelTooltip]);\n\n const closeLabelTooltipImmediate = useCallback(\n (targetKey?: string) => {\n clearLabelTooltipOpenTimer();\n if (\n targetKey !== undefined &&\n activeLabelTooltipRef.current?.key !== targetKey\n ) {\n return;\n }\n if (activeLabelTooltipRef.current === null) {\n return;\n }\n activeLabelTooltipRef.current = null;\n setActiveLabelTooltip(null);\n },\n [clearLabelTooltipOpenTimer]\n );\n\n const closeHoverPanelImmediate = useCallback(\n (entryId?: string) => {\n clearHoverPanelOpenTimer();\n clearHoverPanelCloseTimer();\n if (\n entryId !== undefined &&\n activeHoverPanelRef.current?.entryId !== entryId\n ) {\n return;\n }\n if (activeHoverPanelRef.current === null) {\n return;\n }\n hoverPanelRestTargetRef.current = null;\n setDockHoverPanelOpen(false);\n activeHoverPanelRef.current = null;\n setActiveHoverPanel(null);\n flushPendingDockStateRefresh();\n },\n [\n clearHoverPanelCloseTimer,\n clearHoverPanelOpenTimer,\n flushPendingDockStateRefresh,\n setDockHoverPanelOpen\n ]\n );\n\n const scheduleHoverPanelClose = useCallback(\n (entryId?: string) => {\n clearHoverPanelOpenTimer();\n clearHoverPanelCloseTimer();\n hoverPanelCloseTimerRef.current = setTimeout(() => {\n hoverPanelCloseTimerRef.current = null;\n closeHoverPanelImmediate(entryId);\n handleDockPointerLeave();\n }, dockHoverPanelCloseDelayMs);\n },\n [\n clearHoverPanelCloseTimer,\n clearHoverPanelOpenTimer,\n closeHoverPanelImmediate,\n handleDockPointerLeave\n ]\n );\n\n const showHoverPanel = useCallback(\n (entryId: string, anchorKey: string, anchorElement: HTMLElement): void => {\n const dockElement = dockMeasureRef.current;\n if (!dockElement) {\n return;\n }\n\n pauseDockMagnification();\n const dockRect = dockElement.getBoundingClientRect();\n const anchorRect = anchorElement.getBoundingClientRect();\n clearHoverPanelCloseTimer();\n const nextHoverPanel = {\n anchorKey,\n anchorRect: {\n height: anchorRect.height,\n left: anchorRect.left - dockRect.left,\n top: anchorRect.top - dockRect.top,\n width: anchorRect.width\n },\n entryId\n };\n setDockHoverPanelOpen(true);\n activeHoverPanelRef.current = nextHoverPanel;\n setActiveHoverPanel(nextHoverPanel);\n },\n [clearHoverPanelCloseTimer, pauseDockMagnification, setDockHoverPanelOpen]\n );\n\n const scheduleHoverPanelAfterRest = useCallback(\n (entryId: string, anchorKey: string) => {\n hoverPanelRestTargetRef.current = { anchorKey, entryId };\n clearHoverPanelOpenTimer();\n hoverPanelScheduledPointRef.current = null;\n hoverPanelOpenTimerRef.current = setTimeout(() => {\n hoverPanelOpenTimerRef.current = null;\n hoverPanelScheduledPointRef.current = null;\n const pending = hoverPanelRestTargetRef.current;\n if (!pending || pending.entryId !== entryId) {\n return;\n }\n const slotElement = slotRefs.current.get(anchorKey);\n if (!slotElement) {\n return;\n }\n showHoverPanel(entryId, anchorKey, slotElement);\n }, dockHoverPanelOpenDelayMs);\n },\n [clearHoverPanelOpenTimer, showHoverPanel]\n );\n\n const showLabelTooltip = useCallback(\n (\n target: WorkbenchHostDockLabelTooltipTarget,\n anchorKey: string,\n anchorElement: HTMLElement\n ): void => {\n const dockElement = dockMeasureRef.current;\n if (!dockElement) {\n return;\n }\n\n const dockRect = dockElement.getBoundingClientRect();\n const anchorRect = resolveDockLabelTooltipAnchorRect({\n dockPlacement,\n slotElement: anchorElement\n });\n clearLabelTooltipOpenTimer();\n const nextTooltip = {\n anchorKey,\n anchorRect: {\n height: anchorRect.height,\n left: anchorRect.left - dockRect.left,\n top: anchorRect.top - dockRect.top,\n width: anchorRect.width\n },\n key: target.key,\n label: target.label\n };\n activeLabelTooltipRef.current = nextTooltip;\n setActiveLabelTooltip(nextTooltip);\n },\n [clearLabelTooltipOpenTimer, dockPlacement]\n );\n\n const scheduleLabelTooltipAfterRest = useCallback(\n (target: WorkbenchHostDockLabelTooltipTarget, anchorKey: string) => {\n clearLabelTooltipOpenTimer();\n labelTooltipScheduledPointRef.current = null;\n labelTooltipOpenTimerRef.current = setTimeout(() => {\n labelTooltipOpenTimerRef.current = null;\n labelTooltipScheduledPointRef.current = null;\n const slotElement = slotRefs.current.get(anchorKey);\n if (!slotElement) {\n return;\n }\n showLabelTooltip(target, anchorKey, slotElement);\n }, dockHoverPanelOpenDelayMs);\n },\n [clearLabelTooltipOpenTimer, showLabelTooltip]\n );\n\n const resolveHoverPanelTargetAtPoint = useCallback(\n (\n clientX: number,\n clientY: number\n ): {\n anchorKey: string;\n entryId: string;\n slotElement: HTMLElement;\n } | null => {\n for (const [anchorKey, slotElement] of slotRefs.current) {\n const entryId = slotElement.dataset.dockHoverPanelEntryId;\n if (!entryId) {\n continue;\n }\n\n const rect = slotElement.getBoundingClientRect();\n if (\n clientX >= rect.left - dockHoverPanelHitSlopPx &&\n clientX <= rect.right + dockHoverPanelHitSlopPx &&\n clientY >= rect.top - dockHoverPanelHitSlopPx &&\n clientY <= rect.bottom + dockHoverPanelHitSlopPx\n ) {\n return { anchorKey, entryId, slotElement };\n }\n }\n return null;\n },\n []\n );\n\n const resolveLabelTooltipTargetAtPoint = useCallback(\n (\n clientX: number,\n clientY: number\n ): {\n anchorKey: string;\n slotElement: HTMLElement;\n target: WorkbenchHostDockLabelTooltipTarget;\n } | null => {\n for (const [anchorKey, slotElement] of slotRefs.current) {\n if (slotElement.dataset.dockHoverPanelEntryId) {\n continue;\n }\n const key = slotElement.dataset.dockLabelTooltipKey;\n const label = slotElement.dataset.dockLabelTooltipLabel?.trim() ?? \"\";\n if (!key || !label) {\n continue;\n }\n\n const rect = slotElement.getBoundingClientRect();\n if (\n clientX >= rect.left - dockHoverPanelHitSlopPx &&\n clientX <= rect.right + dockHoverPanelHitSlopPx &&\n clientY >= rect.top - dockHoverPanelHitSlopPx &&\n clientY <= rect.bottom + dockHoverPanelHitSlopPx\n ) {\n return {\n anchorKey,\n slotElement,\n target: {\n key,\n label\n }\n };\n }\n }\n return null;\n },\n []\n );\n\n const isPointerInsideActiveHoverPanelRegion = useCallback(\n (clientX: number, clientY: number): boolean => {\n const activeHoverPanel = activeHoverPanelRef.current;\n if (!activeHoverPanel) {\n return false;\n }\n\n const anchorSlot = slotRefs.current.get(activeHoverPanel.anchorKey);\n const panel = hoverPanelRef.current;\n if (\n !anchorSlot ||\n !panel ||\n !anchorSlot.isConnected ||\n !panel.isConnected\n ) {\n return false;\n }\n\n const anchorRect = anchorSlot.getBoundingClientRect();\n const panelRect = panel.getBoundingClientRect();\n return (\n rectContainsPoint(\n anchorRect,\n clientX,\n clientY,\n dockHoverPanelHitSlopPx\n ) ||\n rectContainsPoint(\n panelRect,\n clientX,\n clientY,\n dockHoverPanelHitSlopPx\n ) ||\n rectContainsPoint(\n createHoverPanelBridgeRect(anchorRect, panelRect),\n clientX,\n clientY,\n dockHoverPanelBridgeSlopPx\n )\n );\n },\n []\n );\n\n const scheduleHoverPanelAtPointAfterRest = useCallback(\n (clientX: number, clientY: number) => {\n const scheduledPoint = hoverPanelScheduledPointRef.current;\n if (\n hoverPanelOpenTimerRef.current !== null &&\n scheduledPoint &&\n Math.abs(clientX - scheduledPoint.clientX) <=\n dockHoverPanelPointerRestTolerancePx &&\n Math.abs(clientY - scheduledPoint.clientY) <=\n dockHoverPanelPointerRestTolerancePx\n ) {\n return;\n }\n\n clearHoverPanelOpenTimer();\n hoverPanelScheduledPointRef.current = { clientX, clientY };\n hoverPanelOpenTimerRef.current = setTimeout(() => {\n hoverPanelOpenTimerRef.current = null;\n hoverPanelScheduledPointRef.current = null;\n if (activeHoverPanelRef.current !== null) {\n return;\n }\n const target = resolveHoverPanelTargetAtPoint(clientX, clientY);\n if (!target) {\n hoverPanelRestTargetRef.current = null;\n return;\n }\n hoverPanelRestTargetRef.current = {\n anchorKey: target.anchorKey,\n entryId: target.entryId\n };\n showHoverPanel(target.entryId, target.anchorKey, target.slotElement);\n }, dockHoverPanelOpenDelayMs);\n },\n [clearHoverPanelOpenTimer, resolveHoverPanelTargetAtPoint, showHoverPanel]\n );\n\n const scheduleLabelTooltipAtPointAfterRest = useCallback(\n (clientX: number, clientY: number) => {\n if (activeLabelTooltipRef.current !== null) {\n return;\n }\n\n const scheduledPoint = labelTooltipScheduledPointRef.current;\n if (\n labelTooltipOpenTimerRef.current !== null &&\n scheduledPoint &&\n Math.abs(clientX - scheduledPoint.clientX) <=\n dockHoverPanelPointerRestTolerancePx &&\n Math.abs(clientY - scheduledPoint.clientY) <=\n dockHoverPanelPointerRestTolerancePx\n ) {\n return;\n }\n\n clearLabelTooltipOpenTimer();\n labelTooltipScheduledPointRef.current = { clientX, clientY };\n labelTooltipOpenTimerRef.current = setTimeout(() => {\n labelTooltipOpenTimerRef.current = null;\n labelTooltipScheduledPointRef.current = null;\n if (activeHoverPanelRef.current !== null) {\n return;\n }\n const target = resolveLabelTooltipTargetAtPoint(clientX, clientY);\n if (!target) {\n return;\n }\n showLabelTooltip(target.target, target.anchorKey, target.slotElement);\n }, dockHoverPanelOpenDelayMs);\n },\n [\n clearLabelTooltipOpenTimer,\n resolveLabelTooltipTargetAtPoint,\n showLabelTooltip\n ]\n );\n\n const beginDockIconInteraction = useCallback(\n (anchorKey: string) => {\n hoverPanelRestTargetRef.current = null;\n clearHoverPanelOpenTimer();\n closeLabelTooltipImmediate();\n closeHoverPanelImmediate();\n triggerDockBounce(anchorKey);\n },\n [\n clearHoverPanelOpenTimer,\n closeHoverPanelImmediate,\n closeLabelTooltipImmediate,\n triggerDockBounce\n ]\n );\n\n const isDockEntryClickThrottled = useCallback(\n (anchorKey: string): boolean => {\n const throttledUntil =\n dockEntryClickThrottleUntilRef.current.get(anchorKey);\n return throttledUntil !== undefined && Date.now() < throttledUntil;\n },\n []\n );\n\n const claimDockEntryClick = useCallback((anchorKey: string): void => {\n dockEntryClickThrottleUntilRef.current.set(\n anchorKey,\n Date.now() + DOCK_ENTRY_CLICK_THROTTLE_MS\n );\n }, []);\n\n const beginDockMinimizedInteraction = useCallback(\n (anchorKey?: string): boolean => {\n hoverPanelRestTargetRef.current = null;\n clearHoverPanelOpenTimer();\n clearLabelTooltipOpenTimer();\n closeLabelTooltipImmediate();\n closeHoverPanelImmediate();\n pauseDockMagnification();\n\n if (!anchorKey) {\n return false;\n }\n const slotElement = slotRefs.current.get(anchorKey);\n if (!slotElement) {\n return false;\n }\n clearSlotMagnification(anchorKey);\n if (slotElement.dataset.collapsing === \"true\") {\n return true;\n }\n const rect = slotElement.getBoundingClientRect();\n slotElement.style.setProperty(\n \"--desktop-dock-collapse-inline-size\",\n `${rect.width}px`\n );\n slotElement.style.setProperty(\n \"--desktop-dock-collapse-block-size\",\n `${rect.height}px`\n );\n slotElement.dataset.collapsing = \"true\";\n return true;\n },\n [\n clearHoverPanelOpenTimer,\n clearLabelTooltipOpenTimer,\n clearSlotMagnification,\n closeHoverPanelImmediate,\n closeLabelTooltipImmediate,\n pauseDockMagnification\n ]\n );\n\n const runDockMinimizedLaunchAfterCollapse = useCallback(\n (\n intent: WorkbenchMinimizedDockNodeSlotRestoreIntent,\n launch: (intent: WorkbenchMinimizedDockNodeSlotRestoreIntent) => void\n ) => {\n const { anchorKey } = intent;\n beginDockMinimizedInteraction(anchorKey);\n setCollapsingMinimizedLaunchAnchorKeys((current) => {\n const next = new Set(current);\n next.add(anchorKey);\n return next;\n });\n scheduleCollapsingMinimizedLaunchClear(anchorKey);\n launch(intent);\n },\n [beginDockMinimizedInteraction, scheduleCollapsingMinimizedLaunchClear]\n );\n\n const runDockMinimizedStackLaunch = useCallback(\n (\n intent: WorkbenchMinimizedDockStackPopupCardRestoreIntent,\n launch: (\n intent: WorkbenchMinimizedDockStackPopupCardRestoreIntent\n ) => void\n ) => {\n beginDockMinimizedInteraction();\n launch(intent);\n },\n [beginDockMinimizedInteraction]\n );\n\n const handleDockPointerTravel = useCallback(\n (clientX: number, clientY: number) => {\n if (activeHoverPanelRef.current !== null) {\n closeLabelTooltipImmediate();\n if (isPointerInsideActiveHoverPanelRegion(clientX, clientY)) {\n clearHoverPanelCloseTimer();\n return;\n }\n scheduleHoverPanelClose(activeHoverPanelRef.current.entryId);\n handleDockPointerLeave();\n return;\n }\n\n const activeLabelTooltip = activeLabelTooltipRef.current;\n if (activeLabelTooltip) {\n const target = resolveLabelTooltipTargetAtPoint(clientX, clientY);\n if (target?.target.key !== activeLabelTooltip.key) {\n closeLabelTooltipImmediate(activeLabelTooltip.key);\n }\n }\n\n handleDockPointerMove(clientX, clientY);\n scheduleHoverPanelAtPointAfterRest(clientX, clientY);\n scheduleLabelTooltipAtPointAfterRest(clientX, clientY);\n },\n [\n clearHoverPanelCloseTimer,\n closeLabelTooltipImmediate,\n handleDockPointerMove,\n handleDockPointerLeave,\n isPointerInsideActiveHoverPanelRegion,\n resolveLabelTooltipTargetAtPoint,\n scheduleHoverPanelClose,\n scheduleHoverPanelAtPointAfterRest,\n scheduleLabelTooltipAtPointAfterRest\n ]\n );\n\n const updateDockScrollState = useCallback(() => {\n const scrollElement = dockItemsRef.current;\n const viewportElement = dockMeasureRef.current;\n if (!scrollElement || !viewportElement) {\n setDockScrollState((current) =>\n current.hasOverflow ||\n current.canScrollBackward ||\n current.canScrollForward\n ? {\n canScrollBackward: false,\n canScrollForward: false,\n hasOverflow: false\n }\n : current\n );\n return;\n }\n\n const isVertical = dockPlacement === \"left\";\n const viewportSize = isVertical\n ? viewportElement.clientHeight\n : viewportElement.clientWidth;\n const scrollSize = isVertical\n ? scrollElement.scrollHeight\n : scrollElement.scrollWidth;\n const scrollOffset = isVertical\n ? scrollElement.scrollTop\n : scrollElement.scrollLeft;\n const nextState = resolveWorkbenchHostDockScrollState({\n contentSize: dockWidth,\n scrollOffset,\n scrollSize,\n viewportSize\n });\n\n setDockScrollState((current) =>\n current.canScrollBackward === nextState.canScrollBackward &&\n current.canScrollForward === nextState.canScrollForward &&\n current.hasOverflow === nextState.hasOverflow\n ? current\n : nextState\n );\n }, [dockPlacement, dockWidth]);\n\n useLayoutEffect(() => {\n const element = dockItemsRef.current;\n if (!element || typeof window === \"undefined\") {\n return undefined;\n }\n\n let frameId: number | null = null;\n const scheduleUpdate = () => {\n if (isDockVisualMutationActive(dockMeasureRef.current)) {\n return;\n }\n if (frameId !== null) {\n return;\n }\n frameId = window.requestAnimationFrame(() => {\n frameId = null;\n updateDockScrollState();\n });\n };\n\n updateDockScrollState();\n\n const resizeObserver =\n typeof ResizeObserver === \"undefined\"\n ? null\n : new ResizeObserver(scheduleUpdate);\n resizeObserver?.observe(element);\n window.addEventListener(\"resize\", scheduleUpdate);\n element.addEventListener(\"scroll\", scheduleUpdate, { passive: true });\n\n return () => {\n if (frameId !== null) {\n window.cancelAnimationFrame(frameId);\n }\n resizeObserver?.disconnect();\n window.removeEventListener(\"resize\", scheduleUpdate);\n element.removeEventListener(\"scroll\", scheduleUpdate);\n };\n }, [dockPlacement, presentDockItems.length, updateDockScrollState]);\n\n const hasMinimizedPreviewCapture = minimizedDockSlots.some((slot) =>\n minimizedDockSlotNodes(slot).some((node) =>\n (() => {\n if (context.genie.isPendingMinimizedDockNode(node.id)) {\n return false;\n }\n const minimizedDock = nodeDefinitions.get(node.data.typeId)?.window\n ?.minimizedDock;\n return (\n minimizedDock?.kind === \"snapshot\" &&\n Boolean(minimizedDock.capturePreview)\n );\n })()\n )\n );\n\n useEffect(() => {\n const shouldSubscribe = activePopup !== null || hasMinimizedPreviewCapture;\n if (!shouldSubscribe || !externalStateSource?.subscribe) {\n return undefined;\n }\n return externalStateSource.subscribe(() => {\n setExternalStateRevision((revision) => revision + 1);\n });\n }, [activePopup, externalStateSource, hasMinimizedPreviewCapture]);\n\n useEffect(() => {\n const nextAttentionIds = new Set<string>();\n\n for (const entry of renderedDockEntries) {\n const nextToken = entry.attentionToken ?? null;\n const previousToken =\n previousAttentionTokenByEntryId.current.get(entry.id) ?? null;\n if (nextToken !== null && nextToken !== previousToken) {\n nextAttentionIds.add(entry.id);\n }\n previousAttentionTokenByEntryId.current.set(entry.id, nextToken);\n }\n\n if (nextAttentionIds.size === 0) {\n return;\n }\n\n setActiveAttentionEntryIds((current) => {\n const next = new Set(current);\n for (const entryId of nextAttentionIds) {\n next.add(entryId);\n }\n return next;\n });\n\n for (const entryId of nextAttentionIds) {\n const existingTimeout = attentionTimeouts.current.get(entryId);\n if (existingTimeout) {\n globalThis.clearTimeout(existingTimeout);\n }\n attentionTimeouts.current.set(\n entryId,\n globalThis.setTimeout(() => {\n attentionTimeouts.current.delete(entryId);\n setActiveAttentionEntryIds((current) => {\n if (!current.has(entryId)) {\n return current;\n }\n const next = new Set(current);\n next.delete(entryId);\n return next;\n });\n }, 900)\n );\n }\n }, [renderedDockEntries]);\n\n useEffect(\n () => () => {\n for (const timeout of attentionTimeouts.current.values()) {\n globalThis.clearTimeout(timeout);\n }\n attentionTimeouts.current.clear();\n },\n []\n );\n\n const captureMinimizedNodePreview = useCallback(\n async (node: WorkbenchMinimizedDockNode) => {\n const minimizedDock = nodeDefinitions.get(node.data.typeId)?.window\n ?.minimizedDock;\n const capturePreview =\n minimizedDock?.kind === \"snapshot\"\n ? minimizedDock.capturePreview\n : undefined;\n const externalState = readWorkbenchHostExternalState({\n externalStateSource,\n node,\n workspaceId\n });\n return (\n (await Promise.resolve(\n capturePreview?.({\n externalNodeState: externalState.externalNodeState,\n externalWorkspaceState: externalState.externalWorkspaceState,\n host,\n isFocused: context.focusedNodeId === node.id,\n isMinimized: node.isMinimized,\n node\n }) ?? null\n ).catch(() => null)) ??\n (await Promise.resolve(captureNodePreviewImage?.(node) ?? null).catch(\n () => null\n ))\n );\n },\n [\n captureNodePreviewImage,\n context.focusedNodeId,\n externalStateRevision,\n externalStateSource,\n nodeDefinitions,\n workspaceId\n ]\n );\n\n const provideMinimizedNodePreview = useCallback(\n (node: WorkbenchMinimizedDockNode): WorkbenchDockPreviewContent | null => {\n const minimizedDock = nodeDefinitions.get(node.data.typeId)?.window\n ?.minimizedDock;\n if (minimizedDock?.kind !== \"component\") {\n return null;\n }\n\n const externalState = readWorkbenchHostExternalState({\n externalStateSource,\n node,\n workspaceId\n });\n return minimizedDock.providePreview({\n externalNodeState: externalState.externalNodeState,\n externalWorkspaceState: externalState.externalWorkspaceState,\n host,\n isFocused: context.focusedNodeId === node.id,\n isMinimized: node.isMinimized,\n node\n });\n },\n [\n context.focusedNodeId,\n externalStateSource,\n host,\n nodeDefinitions,\n workspaceId\n ]\n );\n\n const provideMinimizedNodePreviewForNode = useCallback(\n (node: WorkbenchMinimizedDockNode) => {\n const minimizedDock = nodeDefinitions.get(node.data.typeId)?.window\n ?.minimizedDock;\n return minimizedDock?.kind === \"component\"\n ? provideMinimizedNodePreview\n : undefined;\n },\n [nodeDefinitions, provideMinimizedNodePreview]\n );\n\n if (dockItems.length === 0 && presentDockItems.length === 0) {\n return null;\n }\n\n const closePopup = () => {\n clearHoverPanelCloseTimer();\n clearHoverPanelOpenTimer();\n clearLabelTooltipOpenTimer();\n hoverPanelRestTargetRef.current = null;\n setDockHoverPanelOpen(false);\n setActivePopup(null);\n setActiveHoverPanel(null);\n closeLabelTooltipImmediate();\n setActiveMinimizedStackPopup(null);\n };\n\n const scrollDockItems = (direction: WorkbenchHostDockScrollDirection) => {\n const element = dockItemsRef.current;\n if (!element) {\n return;\n }\n\n resetDockMagnification();\n closeHoverPanelImmediate();\n closeLabelTooltipImmediate();\n hoverPanelRestTargetRef.current = null;\n\n const isVertical = dockPlacement === \"left\";\n const viewportSize = isVertical\n ? element.clientHeight\n : element.clientWidth;\n const delta =\n Math.max(DOCK_ICON_PEAK_SIZE * 2, viewportSize * 0.72) *\n (direction === \"forward\" ? 1 : -1);\n\n element.scrollBy({\n behavior: \"smooth\",\n left: isVertical ? 0 : delta,\n top: isVertical ? delta : 0\n });\n };\n\n const registerDockSlot = useCallback((anchorKey: string) => {\n const existing = dockSlotRefCallbacksRef.current.get(anchorKey);\n if (existing) {\n return existing;\n }\n\n const callback = (element: HTMLElement | null) => {\n if (element) {\n slotRefs.current.set(anchorKey, element);\n wallpaperToneElementRefs.current.set(anchorKey, element);\n } else {\n slotRefs.current.delete(anchorKey);\n wallpaperToneElementRefs.current.delete(anchorKey);\n if (!dockMeasureRef.current?.hasAttribute(\"data-dock-pointer-active\")) {\n clearSlotMagnificationRef.current(anchorKey);\n }\n }\n registerDockAnchorRef.current(anchorKey, element);\n };\n dockSlotRefCallbacksRef.current.set(anchorKey, callback);\n return callback;\n }, []);\n\n const runDockEntryAction = useCallback(\n (entryId: string, actionId: string) => {\n const actionKey = dockActionKey(entryId, actionId);\n if (pendingActionKeys.has(actionKey)) {\n return;\n }\n setPendingActionKeys((current) => {\n const next = new Set(current);\n next.add(actionKey);\n return next;\n });\n void (async () => {\n try {\n await onDockEntryAction?.({\n actionId,\n entryId,\n host\n });\n } catch {\n // Keep dock action failures contained.\n } finally {\n setPendingActionKeys((current) => {\n if (!current.has(actionKey)) {\n return current;\n }\n const next = new Set(current);\n next.delete(actionKey);\n return next;\n });\n }\n })();\n },\n [host, onDockEntryAction, pendingActionKeys]\n );\n\n const popupEntry =\n activePopup === null\n ? null\n : (resolvedEntries.find(\n (entry) => entry.entry.id === activePopup.entryId\n ) ?? null);\n const activeMinimizedStackSlot =\n activeMinimizedStackPopup === null\n ? null\n : (minimizedDockSlots.find(\n (\n slot\n ): slot is Extract<WorkbenchMinimizedDockSlot, { kind: \"stack\" }> =>\n slot.kind === \"stack\"\n ) ?? null);\n const openDockContextMenuNodeIds =\n popupEntry?.matchedNodes.map((node) => node.id) ?? [];\n const dockContextMenuInstanceMode =\n popupEntry === null\n ? undefined\n : resolveDockEntryInstanceMode(popupEntry.entry, nodeDefinitions);\n const canShowAllWindowsFromDockContextMenu =\n onMissionControlRequestOpen !== undefined &&\n dockContextMenuInstanceMode === \"multi\" &&\n openDockContextMenuNodeIds.length > 1;\n const fullscreenNodeFromDockContextMenu =\n popupEntry === null\n ? null\n : resolveDockContextMenuFullscreenNode({\n focusedNodeId: context.focusedNodeId,\n minimizedNodeIDs,\n nodeDefinitions,\n nodes: popupEntry.matchedNodes\n });\n const canOpenFromDockContextMenu =\n popupEntry !== null &&\n popupEntry.matchedNodes.length === 0 &&\n resolveWorkbenchDockEntryClick({\n entry: popupEntry.entry,\n instanceMode: dockContextMenuInstanceMode,\n matchedNodes: popupEntry.matchedNodes\n }).kind === \"launch\";\n\n return (\n <div\n className=\"flex justify-center pointer-events-none\"\n data-dock-placement={dockPlacement}\n >\n <div\n className=\"desktop-dock-plate\"\n style={\n dockFrameSize === null\n ? undefined\n : ({\n \"--desktop-dock-frame-size\": `${dockFrameSize}px`\n } as WorkbenchHostDockPlateStyle)\n }\n >\n <div\n ref={dockMeasureRef}\n aria-label={i18n.t(\"dockLabel\")}\n className=\"desktop-dock\"\n data-dock-placement={dockPlacement}\n data-desktop-dock-root=\"true\"\n data-scroll-overflow={\n dockScrollState.hasOverflow ? \"true\" : undefined\n }\n data-scroll-backward={\n dockScrollState.canScrollBackward ? \"true\" : undefined\n }\n data-scroll-forward={\n dockScrollState.canScrollForward ? \"true\" : undefined\n }\n onPointerLeave={() => {\n hoverPanelRestTargetRef.current = null;\n clearHoverPanelOpenTimer();\n clearLabelTooltipOpenTimer();\n closeLabelTooltipImmediate();\n closeHoverPanelImmediate();\n handleDockPointerLeave();\n flushPendingDockStateRefresh();\n }}\n onPointerMoveCapture={(event) => {\n handleDockPointerTravel(event.clientX, event.clientY);\n }}\n role=\"toolbar\"\n style={\n dockPlacement === \"left\"\n ? { height: dockWidth }\n : { width: dockWidth }\n }\n >\n <span\n className=\"desktop-dock__pointer-rail\"\n data-desktop-dock-pointer-rail=\"true\"\n aria-hidden\n />\n <button\n aria-label={i18n.t(\n dockPlacement === \"left\" ? \"scrollDockUp\" : \"scrollDockLeft\"\n )}\n className=\"desktop-dock__scroll-button desktop-dock__scroll-button--backward\"\n data-scroll-button=\"backward\"\n disabled={!dockScrollState.canScrollBackward}\n onClick={() => scrollDockItems(\"backward\")}\n type=\"button\"\n >\n {dockPlacement === \"left\" ? (\n <ChevronUpIcon size={16} />\n ) : (\n <ArrowLeftIcon size={16} />\n )}\n </button>\n <div ref={dockItemsRef} className=\"desktop-dock__items\">\n {presentDockItems.map((dockItem) => {\n if (dockItem.item.kind === \"separator\") {\n return (\n <span\n ref={registerWallpaperToneElement(dockItem.key)}\n className=\"desktop-dock__separator\"\n aria-hidden=\"true\"\n data-presence={dockItem.presence}\n data-wallpaper-tone={wallpaperTones.get(dockItem.key)}\n key={dockItem.key}\n />\n );\n }\n\n if (dockItem.item.kind === \"entry\") {\n const resolvedEntry = dockItem.item.resolvedEntry;\n const { anchorKey, entry } = resolvedEntry;\n const currentPopup =\n activePopup?.entryId === entry.id ? activePopup : null;\n const instanceMode = resolveDockEntryInstanceMode(\n entry,\n nodeDefinitions\n );\n const clickResolution = resolveWorkbenchDockEntryClick({\n entry,\n instanceMode,\n matchedNodes: resolvedEntry.matchedNodes\n });\n const hasHoverPanel = dockEntryHasHoverPanel(entry);\n const labelTooltipTarget = hasHoverPanel\n ? null\n : dockLabelTooltipTarget(`entry:${entry.id}`, entry.label);\n const dockButton = (\n <button\n aria-expanded={currentPopup ? true : undefined}\n aria-haspopup={\n clickResolution.kind === \"open-popup\"\n ? \"dialog\"\n : undefined\n }\n aria-label={i18n.t(\"launch\", { title: entry.label })}\n aria-disabled={\n clickResolution.kind === \"blocked\" ? true : undefined\n }\n className=\"desktop-dock__btn\"\n data-interactive={\n clickResolution.kind === \"blocked\" ? \"false\" : \"true\"\n }\n type=\"button\"\n onPointerDown={(event) => {\n if (event.button !== 0) {\n return;\n }\n if (clickResolution.kind === \"blocked\") {\n return;\n }\n if (isDockEntryClickThrottled(anchorKey)) {\n return;\n }\n beginDockIconInteraction(anchorKey);\n }}\n onClick={(event) => {\n if (clickResolution.kind === \"blocked\") {\n return;\n }\n if (isDockEntryClickThrottled(anchorKey)) {\n return;\n }\n claimDockEntryClick(anchorKey);\n logWorkbenchDockDebug(\"dock.click\", debugDiagnostics, {\n anchorKey,\n clickResolution,\n dockDiagnostics: entry.diagnostics ?? null,\n dockNodeState: resolvedEntry.dockNodeState,\n entryId: entry.id,\n entryLaunchBehavior: entry.launchBehavior ?? \"enabled\",\n entryOrder: entry.order ?? null,\n entryState: entry.state ?? { kind: \"enabled\" },\n entryVisibility: entry.visibility ?? \"always\",\n hoverActions:\n entry.hoverActions?.map((action) => ({\n disabled: action.disabled === true,\n id: action.id,\n pending: Boolean(action.pendingLabel)\n })) ?? [],\n instanceMode: instanceMode ?? null,\n matchedNodeCount: resolvedEntry.matchedNodes.length,\n matchedNodeIds: resolvedEntry.matchedNodes.map(\n (node) => node.id\n ),\n typeId: entry.typeId,\n workspaceId\n });\n switch (clickResolution.kind) {\n case \"focus-node\":\n closePopup();\n void (async () => {\n try {\n await onDockEntryClick?.({\n entryId: entry.id,\n host,\n nodeId: clickResolution.nodeId\n });\n } catch {\n // Keep dock click failures contained.\n }\n })();\n context.genie.launchNodeFromAnchor(\n anchorKey,\n clickResolution.nodeId,\n () => {\n host.focusNode(clickResolution.nodeId);\n }\n );\n return;\n case \"open-popup\": {\n const rect =\n event.currentTarget.getBoundingClientRect();\n logWorkbenchDockDebug(\n \"dock.popup.toggle\",\n debugDiagnostics,\n {\n anchorKey,\n entryId: entry.id,\n matchedNodeCount:\n resolvedEntry.matchedNodes.length,\n nextOpen: currentPopup === null,\n typeId: entry.typeId,\n workspaceId\n }\n );\n setActivePopup((current) =>\n current?.entryId === entry.id\n ? null\n : {\n anchorRect: {\n height: rect.height,\n left: rect.left,\n top: rect.top,\n width: rect.width\n },\n kind: \"preview\",\n entryId: entry.id\n }\n );\n return;\n }\n case \"action\":\n closePopup();\n void (async () => {\n try {\n await onDockEntryAction?.({\n actionId: clickResolution.actionId,\n entryId: entry.id,\n host\n });\n } catch {\n // Keep dock action failures contained.\n }\n })();\n return;\n case \"launch\":\n closePopup();\n context.genie.launchNodeFromAnchor(\n anchorKey,\n entry.id,\n () =>\n host.launchNode({\n dockEntryId: entry.id,\n payload: entry.launchPayload,\n reason: \"dock\",\n typeId: entry.typeId\n })\n );\n return;\n }\n }}\n onContextMenu={(event) => {\n if (\n clickResolution.kind === \"blocked\" ||\n !dockEntryHasContextMenu(entry, resolvedEntry)\n ) {\n return;\n }\n event.preventDefault();\n const rect = event.currentTarget.getBoundingClientRect();\n logWorkbenchDockDebug(\n \"dock.popup.context_menu\",\n debugDiagnostics,\n {\n anchorKey,\n entryId: entry.id,\n matchedNodeCount: resolvedEntry.matchedNodes.length,\n typeId: entry.typeId,\n workspaceId\n }\n );\n setActivePopup({\n anchorRect: {\n height: rect.height,\n left: rect.left,\n top: rect.top,\n width: rect.width\n },\n kind: \"context-menu\",\n entryId: entry.id\n });\n }}\n >\n <span\n className=\"desktop-dock__icon-shell\"\n data-desktop-dock-icon-shell=\"true\"\n data-entry-state={entry.state?.kind ?? \"enabled\"}\n aria-hidden\n >\n <span className=\"desktop-dock__icon-content\">\n {entry.icon}\n </span>\n {renderDockBadge(\n entry,\n resolvedEntry.matchedNodes.length\n )}\n </span>\n </button>\n );\n\n return (\n <span\n key={dockItem.key}\n ref={registerDockSlot(anchorKey)}\n className=\"desktop-dock__slot\"\n data-attention-active={\n activeAttentionEntryIds.has(entry.id) ? \"true\" : undefined\n }\n data-desktop-dock-anchor-key={anchorKey}\n data-desktop-dock-slot=\"true\"\n data-entry-state={entry.state?.kind ?? \"enabled\"}\n data-dock-hover-panel-entry-id={\n hasHoverPanel ? entry.id : undefined\n }\n data-dock-label-tooltip-key={labelTooltipTarget?.key}\n data-dock-label-tooltip-label={labelTooltipTarget?.label}\n data-icon-size={entry.iconSize ?? \"default\"}\n data-node-state={resolvedEntry.dockNodeState}\n data-popup-active={currentPopup ? \"true\" : undefined}\n data-presence={dockItem.presence}\n data-section-id={entry.sectionId}\n data-wallpaper-tone={wallpaperTones.get(anchorKey)}\n onBlur={(event) => {\n if (\n hasHoverPanel &&\n !event.currentTarget.contains(event.relatedTarget)\n ) {\n closeHoverPanelImmediate(entry.id);\n }\n if (\n labelTooltipTarget &&\n !event.currentTarget.contains(event.relatedTarget)\n ) {\n closeLabelTooltipImmediate(labelTooltipTarget.key);\n }\n }}\n onFocus={(event) => {\n if (hasHoverPanel) {\n showHoverPanel(\n entry.id,\n anchorKey,\n event.currentTarget\n );\n return;\n }\n if (labelTooltipTarget) {\n showLabelTooltip(\n labelTooltipTarget,\n anchorKey,\n event.currentTarget\n );\n }\n }}\n onPointerEnter={() => {\n if (hasHoverPanel) {\n scheduleHoverPanelAfterRest(entry.id, anchorKey);\n return;\n }\n if (labelTooltipTarget) {\n scheduleLabelTooltipAfterRest(\n labelTooltipTarget,\n anchorKey\n );\n }\n }}\n onPointerLeave={(event) => {\n if (!hasHoverPanel) {\n if (labelTooltipTarget) {\n clearLabelTooltipOpenTimer();\n closeLabelTooltipImmediate(labelTooltipTarget.key);\n const relatedTarget = event.relatedTarget;\n if (\n relatedTarget instanceof Node &&\n dockMeasureRef.current?.contains(relatedTarget)\n ) {\n scheduleLabelTooltipAtPointAfterRest(\n event.clientX,\n event.clientY\n );\n }\n }\n return;\n }\n const relatedTarget = event.relatedTarget;\n if (\n relatedTarget instanceof Node &&\n hoverPanelRef.current?.contains(relatedTarget)\n ) {\n return;\n }\n if (\n relatedTarget instanceof Node &&\n dockMeasureRef.current?.contains(relatedTarget)\n ) {\n scheduleHoverPanelAtPointAfterRest(\n event.clientX,\n event.clientY\n );\n return;\n }\n if (\n hoverPanelRestTargetRef.current?.anchorKey === anchorKey\n ) {\n hoverPanelRestTargetRef.current = null;\n }\n clearHoverPanelOpenTimer();\n closeHoverPanelImmediate(entry.id);\n handleDockPointerLeave();\n }}\n >\n {dockButton}\n </span>\n );\n }\n\n const slot = dockItem.item.slot;\n if (slot.kind === \"stack\") {\n const stackPopupActive =\n activeMinimizedStackPopup !== null ? true : undefined;\n const stackLabel = i18n.t(\"minimizedWindows\");\n const labelTooltipTarget = dockLabelTooltipTarget(\n `minimized-stack:${slot.anchorKey}`,\n stackLabel\n );\n const stackButton = (\n <button\n aria-expanded={stackPopupActive}\n aria-haspopup=\"dialog\"\n aria-label={stackLabel}\n className=\"desktop-dock__btn desktop-dock__minimized-btn\"\n data-interactive=\"true\"\n type=\"button\"\n onPointerDown={(event) => {\n if (event.button !== 0) {\n return;\n }\n beginDockMinimizedInteraction();\n }}\n onClick={(event) => {\n setActivePopup(null);\n const rect = event.currentTarget.getBoundingClientRect();\n const dockRect =\n dockMeasureRef.current?.getBoundingClientRect();\n setActiveMinimizedStackPopup((current) =>\n current\n ? null\n : {\n dockRight: Math.max(\n rect.right,\n dockRect?.right ?? rect.right\n ),\n height: rect.height,\n left: rect.left,\n top: rect.top,\n width: rect.width\n }\n );\n }}\n >\n <span\n className=\"desktop-dock__minimized-stack-icon\"\n data-desktop-dock-icon-shell=\"true\"\n data-stack-folded={\n slot.nodes.length > 1 ? \"true\" : undefined\n }\n aria-hidden\n >\n {Array.from(\n {\n length:\n slot.nodes.length > 1\n ? 3\n : Math.min(slot.nodes.length, 1)\n },\n (_, index) => {\n const node = slot.nodes[index];\n if (index === 0 && node) {\n return (\n <WorkbenchHostDockMinimizedNodePreview\n key={minimizedDockPreviewFreezeKey(node)}\n capturePreview={captureMinimizedNodePreview}\n className={`desktop-dock__minimized-stack-layer desktop-dock__minimized-stack-layer--${index}`}\n dockPreviewCache={dockPreviewCache}\n node={node}\n providePreview={provideMinimizedNodePreviewForNode(\n node\n )}\n workspaceId={workspaceId}\n />\n );\n }\n return (\n <span\n key={`${slot.anchorKey}-stack-back-${index}`}\n aria-hidden=\"true\"\n className={`desktop-dock__minimized-preview desktop-dock__minimized-stack-layer desktop-dock__minimized-stack-layer--${index} desktop-dock__minimized-stack-layer-back`}\n />\n );\n }\n )}\n <span className=\"desktop-dock__count-badge\">\n {slot.nodes.length}\n </span>\n </span>\n </button>\n );\n\n return (\n <span\n key={dockItem.key}\n ref={registerDockSlot(slot.anchorKey)}\n className=\"desktop-dock__slot desktop-dock__slot--minimized\"\n data-desktop-dock-anchor-key={slot.anchorKey}\n data-desktop-dock-slot=\"true\"\n data-dock-label-tooltip-key={labelTooltipTarget.key}\n data-dock-label-tooltip-label={labelTooltipTarget.label}\n data-node-state=\"minimized\"\n data-popup-active={stackPopupActive}\n data-presence={dockItem.presence}\n data-section-id=\"minimized\"\n data-stack-dispatching={\n stackDispatching ? \"true\" : undefined\n }\n onBlur={(event) => {\n if (!event.currentTarget.contains(event.relatedTarget)) {\n closeLabelTooltipImmediate(labelTooltipTarget.key);\n }\n }}\n onFocus={(event) => {\n showLabelTooltip(\n labelTooltipTarget,\n slot.anchorKey,\n event.currentTarget\n );\n }}\n onPointerEnter={() => {\n scheduleLabelTooltipAfterRest(\n labelTooltipTarget,\n slot.anchorKey\n );\n }}\n onPointerLeave={(event) => {\n clearLabelTooltipOpenTimer();\n closeLabelTooltipImmediate(labelTooltipTarget.key);\n const relatedTarget = event.relatedTarget;\n if (\n relatedTarget instanceof Node &&\n dockMeasureRef.current?.contains(relatedTarget)\n ) {\n scheduleLabelTooltipAtPointAfterRest(\n event.clientX,\n event.clientY\n );\n }\n }}\n >\n {stackButton}\n </span>\n );\n }\n\n const node = slot.node;\n const isPendingMinimizedNode =\n context.genie.isPendingMinimizedDockNode(node.id);\n const labelTooltipTarget = dockLabelTooltipTarget(\n `minimized-node:${node.id}`,\n node.title\n );\n const dockButton = (\n <button\n aria-label={i18n.t(\"launch\", { title: node.title })}\n className=\"desktop-dock__btn desktop-dock__minimized-btn\"\n data-interactive=\"true\"\n disabled={isPendingMinimizedNode}\n type=\"button\"\n onPointerDown={(event) => {\n if (event.button !== 0 || isPendingMinimizedNode) {\n return;\n }\n const restoreIntent =\n resolveWorkbenchMinimizedDockRestoreIntent({\n nodeId: node.id,\n slots: minimizedDockSlots,\n source: {\n anchorKey: slot.anchorKey,\n kind: \"node-slot\"\n }\n });\n if (restoreIntent?.kind !== \"node-slot\") {\n clearCollapsingMinimizedLaunch(slot.anchorKey);\n return;\n }\n beginDockMinimizedInteraction();\n }}\n onClick={() => {\n if (isPendingMinimizedNode) {\n return;\n }\n const restoreIntent =\n resolveWorkbenchMinimizedDockRestoreIntent({\n nodeId: node.id,\n slots: minimizedDockSlots,\n source: {\n anchorKey: slot.anchorKey,\n kind: \"node-slot\"\n }\n });\n if (restoreIntent?.kind !== \"node-slot\") {\n clearCollapsingMinimizedLaunch(slot.anchorKey);\n return;\n }\n closePopup();\n runDockMinimizedLaunchAfterCollapse(\n restoreIntent,\n (intent) => {\n context.genie.launchNodeFromAnchor(\n intent.anchorKey,\n intent.nodeId,\n () => {\n host.focusNode(intent.nodeId);\n }\n );\n }\n );\n }}\n >\n <WorkbenchHostDockMinimizedNodePreview\n key={minimizedDockPreviewFreezeKey(node)}\n capturePreview={\n isPendingMinimizedNode\n ? undefined\n : captureMinimizedNodePreview\n }\n deferPreview={isPendingMinimizedNode}\n dockPreviewCache={\n isPendingMinimizedNode ? undefined : dockPreviewCache\n }\n node={node}\n providePreview={\n isPendingMinimizedNode\n ? undefined\n : provideMinimizedNodePreviewForNode(node)\n }\n workspaceId={workspaceId}\n />\n </button>\n );\n\n return (\n <span\n key={dockItem.key}\n ref={registerDockSlot(slot.anchorKey)}\n className=\"desktop-dock__slot desktop-dock__slot--minimized\"\n data-collapsing={\n collapsingMinimizedLaunchAnchorKeys.has(slot.anchorKey)\n ? \"true\"\n : undefined\n }\n data-desktop-dock-anchor-key={slot.anchorKey}\n data-desktop-dock-slot=\"true\"\n data-dock-label-tooltip-key={labelTooltipTarget.key}\n data-dock-label-tooltip-label={labelTooltipTarget.label}\n data-node-state=\"minimized\"\n data-pending-minimize={\n isPendingMinimizedNode ? \"true\" : undefined\n }\n data-presence={dockItem.presence}\n data-promoted-from-stack={\n promotedNodeId === node.id ? \"true\" : undefined\n }\n data-section-id=\"minimized\"\n onBlur={(event) => {\n if (!event.currentTarget.contains(event.relatedTarget)) {\n closeLabelTooltipImmediate(labelTooltipTarget.key);\n }\n }}\n onFocus={(event) => {\n showLabelTooltip(\n labelTooltipTarget,\n slot.anchorKey,\n event.currentTarget\n );\n }}\n onPointerEnter={() => {\n scheduleLabelTooltipAfterRest(\n labelTooltipTarget,\n slot.anchorKey\n );\n }}\n onPointerLeave={(event) => {\n clearLabelTooltipOpenTimer();\n closeLabelTooltipImmediate(labelTooltipTarget.key);\n const relatedTarget = event.relatedTarget;\n if (\n relatedTarget instanceof Node &&\n dockMeasureRef.current?.contains(relatedTarget)\n ) {\n scheduleLabelTooltipAtPointAfterRest(\n event.clientX,\n event.clientY\n );\n }\n }}\n >\n {dockButton}\n </span>\n );\n })}\n </div>\n <button\n aria-label={i18n.t(\n dockPlacement === \"left\" ? \"scrollDockDown\" : \"scrollDockRight\"\n )}\n className=\"desktop-dock__scroll-button desktop-dock__scroll-button--forward\"\n data-scroll-button=\"forward\"\n disabled={!dockScrollState.canScrollForward}\n onClick={() => scrollDockItems(\"forward\")}\n type=\"button\"\n >\n {dockPlacement === \"left\" ? (\n <ChevronDownIcon size={16} />\n ) : (\n <ArrowRightIcon size={16} />\n )}\n </button>\n {activeHoverPanel ? (\n <WorkbenchHostDockHoverPanel\n entry={\n resolvedEntries.find(\n (entry) => entry.entry.id === activeHoverPanel.entryId\n )?.entry ?? null\n }\n host={host}\n onDockEntryAction={onDockEntryAction}\n pendingActionKeys={pendingActionKeys}\n placement={dockPlacement}\n hoverPanelRef={hoverPanelRef}\n setPendingActionKeys={setPendingActionKeys}\n state={activeHoverPanel}\n onBlur={(event) => {\n if (!event.currentTarget.contains(event.relatedTarget)) {\n closeHoverPanelImmediate(activeHoverPanel.entryId);\n }\n }}\n onFocus={clearHoverPanelCloseTimer}\n onPointerEnter={clearHoverPanelCloseTimer}\n onPointerLeave={(event) => {\n const relatedTarget = event.relatedTarget;\n const anchorSlot = slotRefs.current.get(\n activeHoverPanel.anchorKey\n );\n if (\n relatedTarget instanceof Node &&\n anchorSlot?.contains(relatedTarget)\n ) {\n return;\n }\n scheduleHoverPanelClose(activeHoverPanel.entryId);\n handleDockPointerLeave();\n }}\n />\n ) : null}\n {activeLabelTooltip ? (\n <WorkbenchHostDockLabelTooltip\n placement={dockPlacement}\n state={activeLabelTooltip}\n />\n ) : null}\n </div>\n </div>\n {popupEntry && activePopup ? (\n <WorkbenchHostDockPopup\n anchorRect={activePopup.anchorRect}\n placement={dockPlacement}\n canEnterFullscreen={fullscreenNodeFromDockContextMenu !== null}\n canShowAllWindows={canShowAllWindowsFromDockContextMenu}\n debugDiagnostics={debugDiagnostics}\n dockRetention={\n popupEntry.entry.dockRetention\n ? {\n checked: popupEntry.entry.dockRetention.retained,\n disabled:\n popupEntry.entry.dockRetention.disabled === true ||\n pendingActionKeys.has(\n dockActionKey(\n popupEntry.entry.id,\n popupEntry.entry.dockRetention.actionId\n )\n ),\n label: i18n.t(\n popupEntry.entry.dockRetention.retained\n ? \"dockContextMenu.removeFromDock\"\n : \"dockContextMenu.keepInDock\"\n ),\n pendingLabel: pendingActionKeys.has(\n dockActionKey(\n popupEntry.entry.id,\n popupEntry.entry.dockRetention.actionId\n )\n )\n ? popupEntry.entry.dockRetention.pendingLabel\n : undefined\n }\n : null\n }\n capturePreview={\n popupEntry.entry.capturePopupItemPreview\n ? async (item) => {\n const previewImageUrl = await Promise.resolve(\n popupEntry.entry.capturePopupItemPreview?.(item) ?? null\n ).catch(() => null);\n return previewImageUrl\n ? {\n kind: \"image\",\n revision: item.previewRevision ?? undefined,\n src: previewImageUrl\n }\n : null;\n }\n : undefined\n }\n dockPreviewCache={dockPreviewCache}\n items={popupEntry.matchedNodes\n .map((node) => {\n const externalState = readWorkbenchHostExternalState({\n externalStateSource,\n node,\n workspaceId\n });\n const item = {\n externalNodeState: externalState.externalNodeState,\n externalWorkspaceState: externalState.externalWorkspaceState,\n host,\n isFocused: context.focusedNodeId === node.id,\n isMinimized: minimizedNodeIDs.has(node.id),\n node\n };\n const descriptor =\n popupEntry.entry.resolvePopupItem?.(item) ?? {};\n const descriptorPreviewImageUrl =\n descriptor.previewImageUrl ?? null;\n const descriptorPreview =\n descriptor.preview ??\n (descriptorPreviewImageUrl\n ? ({\n kind: \"image\",\n revision: descriptor.revision ?? null,\n src: descriptorPreviewImageUrl\n } as const)\n : (popupEntry.entry.providePopupItemPreview?.(item) ?? null));\n return {\n ...item,\n preview: descriptorPreview,\n previewRevision:\n previewRevision(descriptorPreview) ??\n descriptor.revision ??\n null,\n subtitle:\n descriptor.subtitle === undefined\n ? (node.data.instanceKey ?? node.data.instanceId)\n : descriptor.subtitle,\n title:\n descriptor.title === undefined\n ? node.title\n : descriptor.title?.trim() || null\n };\n })\n .sort((left, right) => {\n if (left.isFocused !== right.isFocused) {\n return left.isFocused ? -1 : 1;\n }\n return left.node.id.localeCompare(right.node.id);\n })}\n label={popupEntry.entry.label}\n labelMode={popupEntry.entry.popupCardLabelMode}\n newWindowLabel={i18n.t(\"newWindow\")}\n openLabel={i18n.t(\"dockContextMenu.open\")}\n closeWindowLabel={(title) => i18n.t(\"closeWindow\", { title })}\n fullscreenLabel={i18n.t(\"dockContextMenu.fullscreen\")}\n hideLabel={i18n.t(\"dockContextMenu.hide\")}\n onClose={() => {\n logWorkbenchDockDebug(\n \"dock.popup.close_requested\",\n debugDiagnostics,\n {\n entryId: popupEntry.entry.id,\n itemCount: popupEntry.matchedNodes.length,\n workspaceId\n }\n );\n closePopup();\n }}\n onCloseNode={(nodeId) => {\n host.requestNodeClose(nodeId);\n const hasRemainingItems = popupEntry.matchedNodes.some(\n (node) => node.id !== nodeId\n );\n if (!hasRemainingItems) {\n closePopup();\n }\n }}\n onCreateNew={() => {\n closePopup();\n context.genie.launchNodeFromAnchor(\n anchorKeyFromPopupEntry(popupEntry),\n popupEntry.entry.id,\n () =>\n host.launchNode({\n dockEntryId: popupEntry.entry.id,\n payload: popupEntry.entry.launchPayload,\n reason: \"dock\",\n typeId: popupEntry.entry.typeId\n })\n );\n }}\n onEnterFullscreen={() => {\n if (!fullscreenNodeFromDockContextMenu) {\n return;\n }\n context.controller.commands.enterFullscreen(\n fullscreenNodeFromDockContextMenu.id\n );\n closePopup();\n }}\n onHide={() => {\n for (const node of popupEntry.matchedNodes) {\n if (!minimizedNodeIDs.has(node.id)) {\n host.minimizeNode(node.id);\n }\n }\n closePopup();\n }}\n onRunDockRetentionAction={\n popupEntry.entry.dockRetention\n ? () => {\n const dockRetention = popupEntry.entry.dockRetention;\n if (!dockRetention || dockRetention.disabled === true) {\n return;\n }\n runDockEntryAction(\n popupEntry.entry.id,\n dockRetention.actionId\n );\n closePopup();\n }\n : undefined\n }\n onSelectNode={(nodeId) => {\n closePopup();\n void (async () => {\n try {\n await onDockEntryClick?.({\n entryId: popupEntry.entry.id,\n host,\n nodeId\n });\n } catch {\n // Keep dock click failures contained.\n }\n })();\n context.genie.launchNodeFromAnchor(\n anchorKeyFromPopupEntry(popupEntry),\n nodeId,\n () => {\n host.focusNode(nodeId);\n }\n );\n }}\n onShowAllWindows={() => {\n closePopup();\n for (const node of popupEntry.matchedNodes) {\n if (minimizedNodeIDs.has(node.id)) {\n context.controller.commands.restoreNode(node.id);\n }\n }\n window.requestAnimationFrame(() => {\n onMissionControlRequestOpen?.(\"activate\", {\n nodeIds: openDockContextMenuNodeIds,\n trigger: \"dock-context-menu\"\n });\n });\n }}\n onQuit={() => {\n for (const node of popupEntry.matchedNodes) {\n host.requestNodeClose(node.id);\n }\n closePopup();\n }}\n quitLabel={i18n.t(\"dockContextMenu.quit\")}\n showCreateNew={canCreateNewWindow(\n popupEntry.entry,\n dockContextMenuInstanceMode\n )}\n showOpen={canOpenFromDockContextMenu}\n showAllWindowsLabel={i18n.t(\"dockContextMenu.showAllWindows\")}\n resolveDockPreviewCacheKey={(node) =>\n resolveDockPreviewCacheKey(workspaceId, node)\n }\n variant={\n activePopup.kind === \"context-menu\" ? \"context-menu\" : \"default\"\n }\n />\n ) : null}\n {activeMinimizedStackSlot && activeMinimizedStackPopup ? (\n <WorkbenchHostDockPopup\n anchorRect={activeMinimizedStackPopup}\n placement={dockPlacement}\n debugDiagnostics={debugDiagnostics}\n capturePreview={async (item) => {\n const src = await captureMinimizedNodePreview(item.node);\n return src ? { kind: \"image\", src } : null;\n }}\n dockPreviewCache={dockPreviewCache}\n items={activeMinimizedStackSlot.nodes.map((node) => {\n const externalState = readWorkbenchHostExternalState({\n externalStateSource,\n node,\n workspaceId\n });\n const minimizedDock = nodeDefinitions.get(node.data.typeId)?.window\n ?.minimizedDock;\n return {\n externalNodeState: externalState.externalNodeState,\n externalWorkspaceState: externalState.externalWorkspaceState,\n host,\n isFocused: context.focusedNodeId === node.id,\n isMinimized: true,\n node,\n preview:\n minimizedDock?.kind === \"component\"\n ? (provideMinimizedNodePreview(node) ?? null)\n : minimizedDock?.kind === \"snapshot\" &&\n minimizedDock.capturePreview\n ? null\n : (() => {\n const previewImageUrl =\n readCachedWorkbenchNodePreviewImage(node.id);\n return previewImageUrl\n ? ({ kind: \"image\", src: previewImageUrl } as const)\n : null;\n })(),\n previewRevision: null,\n subtitle: node.data.instanceKey ?? node.data.instanceId,\n title: node.title\n };\n })}\n label={i18n.t(\"minimizedWindows\")}\n newWindowLabel={i18n.t(\"newWindow\")}\n closeWindowLabel={(title) => i18n.t(\"closeWindow\", { title })}\n onClose={() => {\n logWorkbenchDockDebug(\n \"dock.popup.close_requested\",\n debugDiagnostics,\n {\n entryId: \"minimized-stack\",\n itemCount: activeMinimizedStackSlot.nodes.length,\n workspaceId\n }\n );\n closePopup();\n }}\n onCloseNode={(nodeId) => {\n host.requestNodeClose(nodeId);\n const hasRemainingItems = activeMinimizedStackSlot.nodes.some(\n (node) => node.id !== nodeId\n );\n if (!hasRemainingItems) {\n closePopup();\n }\n }}\n onCreateNew={() => undefined}\n onSelectNode={(nodeId) => {\n const restoreIntent = resolveWorkbenchMinimizedDockRestoreIntent({\n nodeId,\n slots: minimizedDockSlots,\n source: {\n kind: \"stack-popup-card\",\n stackAnchorKey: activeMinimizedStackSlot.anchorKey\n }\n });\n if (restoreIntent?.kind !== \"stack-popup-card\") {\n return;\n }\n closePopup();\n runDockMinimizedStackLaunch(restoreIntent, (intent) => {\n context.genie.launchNodeFromAnchor(\n intent.anchorKey,\n intent.nodeId,\n () => {\n host.focusNode(intent.nodeId);\n }\n );\n });\n }}\n showCreateNew={false}\n resolveDockPreviewCacheKey={(node) =>\n resolveDockPreviewCacheKey(workspaceId, node)\n }\n variant=\"minimized-stack\"\n />\n ) : null}\n </div>\n );\n}\n\nfunction WorkbenchHostDockMinimizedNodePreview({\n capturePreview,\n className,\n deferPreview = false,\n dockPreviewCache,\n node,\n providePreview,\n workspaceId\n}: {\n capturePreview?: (\n node: WorkbenchMinimizedDockNode\n ) => Promise<string | null> | string | null;\n className?: string;\n deferPreview?: boolean;\n dockPreviewCache?: WorkbenchDockPreviewCache;\n node: WorkbenchMinimizedDockNode;\n providePreview?: (\n node: WorkbenchMinimizedDockNode\n ) => WorkbenchDockPreviewContent | null;\n workspaceId: string;\n}) {\n const [componentPreview, setComponentPreview] = useState<\n WorkbenchDockPreviewContent | null | undefined\n >(undefined);\n const [previewImageUrl, setPreviewImageUrl] = useState<string | null>(() =>\n deferPreview || providePreview\n ? null\n : readCachedWorkbenchNodePreviewImage(node.id)\n );\n\n useEffect(() => {\n if (deferPreview || !providePreview || componentPreview !== undefined) {\n return undefined;\n }\n\n let cancelled = false;\n let frameId: number | null = null;\n let idleId: number | null = null;\n let timeoutId: ReturnType<typeof globalThis.setTimeout> | null = null;\n const setDeferredComponentPreview = () => {\n if (cancelled) {\n return;\n }\n setComponentPreview(providePreview(node) ?? null);\n };\n const scheduler = globalThis as typeof globalThis & {\n cancelIdleCallback?: (id: number) => void;\n cancelAnimationFrame?: (id: number) => void;\n requestIdleCallback?: (\n callback: () => void,\n options?: { timeout?: number }\n ) => number;\n requestAnimationFrame?: (callback: () => void) => number;\n };\n\n if (typeof scheduler.requestIdleCallback === \"function\") {\n idleId = scheduler.requestIdleCallback(setDeferredComponentPreview, {\n timeout: 250\n });\n } else if (typeof scheduler.requestAnimationFrame === \"function\") {\n frameId = scheduler.requestAnimationFrame(() => {\n frameId = null;\n timeoutId = globalThis.setTimeout(setDeferredComponentPreview, 0);\n });\n } else {\n timeoutId = globalThis.setTimeout(setDeferredComponentPreview, 0);\n }\n\n return () => {\n cancelled = true;\n if (\n idleId !== null &&\n typeof scheduler.cancelIdleCallback === \"function\"\n ) {\n scheduler.cancelIdleCallback(idleId);\n }\n if (\n frameId !== null &&\n typeof scheduler.cancelAnimationFrame === \"function\"\n ) {\n scheduler.cancelAnimationFrame(frameId);\n }\n if (timeoutId !== null) {\n globalThis.clearTimeout(timeoutId);\n }\n };\n }, [\n componentPreview,\n deferPreview,\n node.data.instanceId,\n node.data.instanceKey,\n node.data.typeId,\n node.id,\n node.minimizedAtUnixMs,\n providePreview\n ]);\n\n useEffect(() => {\n if (deferPreview || providePreview) {\n return undefined;\n }\n\n let cancelled = false;\n const cachedPreviewImageUrl = readCachedWorkbenchNodePreviewImage(node.id);\n setPreviewImageUrl(cachedPreviewImageUrl);\n const cacheKey = resolveDockPreviewCacheKey(workspaceId, node);\n if (!cachedPreviewImageUrl && dockPreviewCache) {\n void dockPreviewCache\n .read(cacheKey)\n .catch(() => null)\n .then((persistedPreview) => {\n if (cancelled || !persistedPreview) {\n return;\n }\n writeCachedWorkbenchNodePreviewImage(node.id, persistedPreview);\n setPreviewImageUrl(persistedPreview);\n });\n }\n if (capturePreview) {\n void Promise.resolve(capturePreview(node))\n .catch(() => null)\n .then((nextPreview) => {\n if (cancelled || !nextPreview) {\n return;\n }\n writeCachedWorkbenchNodePreviewImage(node.id, nextPreview);\n dockPreviewCache?.write({\n key: cacheKey,\n previewImageUrl: nextPreview\n });\n setPreviewImageUrl(nextPreview);\n });\n }\n if (cachedPreviewImageUrl || node.isMinimized || capturePreview) {\n return () => {\n cancelled = true;\n };\n }\n void captureWorkbenchNodePreviewImage(node.id).then((nextPreview) => {\n if (!cancelled) {\n setPreviewImageUrl(nextPreview);\n }\n });\n return () => {\n cancelled = true;\n };\n }, [\n capturePreview,\n deferPreview,\n dockPreviewCache,\n node.data.instanceId,\n node.data.instanceKey,\n node.data.typeId,\n node.id,\n node.minimizedAtUnixMs,\n providePreview,\n workspaceId\n ]);\n\n if (deferPreview) {\n return renderMinimizedDockPreviewPlaceholder(className);\n }\n\n if (componentPreview) {\n return renderMinimizedDockPreviewContent(componentPreview, className);\n }\n\n if (previewImageUrl) {\n return (\n <span\n className={[\n \"desktop-dock__minimized-preview\",\n \"desktop-dock__minimized-preview--snapshot\",\n className\n ]\n .filter(Boolean)\n .join(\" \")}\n aria-hidden=\"true\"\n >\n <img\n alt=\"\"\n className=\"desktop-dock__minimized-preview-image\"\n draggable={false}\n src={previewImageUrl}\n />\n </span>\n );\n }\n\n return renderMinimizedDockPreviewPlaceholder(className);\n}\n\nfunction renderMinimizedDockPreviewPlaceholder(className?: string) {\n return (\n <span\n className={[\"desktop-dock__minimized-preview\", className]\n .filter(Boolean)\n .join(\" \")}\n aria-hidden=\"true\"\n >\n <span className=\"desktop-dock__minimized-preview-line\" />\n <span className=\"desktop-dock__minimized-preview-line desktop-dock__minimized-preview-line--short\" />\n <span className=\"desktop-dock__minimized-preview-line desktop-dock__minimized-preview-line--accent\" />\n </span>\n );\n}\n\nfunction renderMinimizedDockPreviewContent(\n preview: WorkbenchDockPreviewContent,\n className?: string\n) {\n if (preview.kind === \"image\") {\n return (\n <span\n className={[\n \"desktop-dock__minimized-preview\",\n \"desktop-dock__minimized-preview--snapshot\",\n className\n ]\n .filter(Boolean)\n .join(\" \")}\n aria-hidden=\"true\"\n >\n <img\n alt=\"\"\n className=\"desktop-dock__minimized-preview-image\"\n draggable={false}\n src={preview.src}\n />\n </span>\n );\n }\n\n return (\n <WorkbenchHostDockFrozenComponentPreview\n className={className}\n preview={preview}\n />\n );\n}\n\nfunction WorkbenchHostDockFrozenComponentPreview({\n className,\n preview\n}: {\n className?: string;\n preview: Extract<WorkbenchDockPreviewContent, { kind: \"component\" }>;\n}) {\n const sourceRef = useRef<HTMLSpanElement | null>(null);\n const [frozenMarkup, setFrozenMarkup] = useState<string | null>(null);\n\n useLayoutEffect(() => {\n if (frozenMarkup !== null) {\n return;\n }\n setFrozenMarkup(sourceRef.current?.innerHTML ?? \"\");\n }, [frozenMarkup]);\n\n return (\n <span\n className={[\n \"desktop-dock__minimized-preview\",\n \"desktop-dock__minimized-preview--component\",\n className\n ]\n .filter(Boolean)\n .join(\" \")}\n aria-hidden=\"true\"\n >\n {frozenMarkup === null ? (\n <span\n ref={sourceRef}\n className=\"desktop-dock__minimized-preview-freeze-source\"\n >\n {preview.element}\n </span>\n ) : (\n <span\n className=\"desktop-dock__minimized-preview-frozen-content\"\n dangerouslySetInnerHTML={{ __html: frozenMarkup }}\n />\n )}\n </span>\n );\n}\n\nfunction minimizedDockPreviewFreezeKey(\n node: WorkbenchMinimizedDockNode\n): string {\n return `${node.id}:${node.minimizedAtUnixMs ?? \"pending\"}`;\n}\n\nfunction dockEntryHasHoverPanel(entry: WorkbenchHostDockEntry): boolean {\n return (\n Boolean(entry.state?.reason?.trim()) ||\n (entry.hoverActions?.length ?? 0) > 0\n );\n}\n\nfunction dockEntryHasContextMenu(\n entry: WorkbenchHostDockEntry,\n resolvedEntry: ResolvedWorkbenchHostDockEntry\n): boolean {\n if (resolvedEntry.matchedNodes.length > 0 || entry.dockRetention) {\n return true;\n }\n return entry.clickActionId === undefined;\n}\n\nfunction resolveDockContextMenuFullscreenNode({\n focusedNodeId,\n minimizedNodeIDs,\n nodeDefinitions,\n nodes\n}: {\n focusedNodeId: string | null;\n minimizedNodeIDs: ReadonlySet<string>;\n nodeDefinitions: ReadonlyMap<string, WorkbenchHostNodeDefinition>;\n nodes: readonly WorkbenchMinimizedDockNode[];\n}) {\n const candidates = nodes.filter((node) => {\n if (node.displayMode === \"fullscreen\" || minimizedNodeIDs.has(node.id)) {\n return false;\n }\n return (\n nodeDefinitions.get(node.data.typeId)?.window?.fullscreenable !== false\n );\n });\n return (\n candidates.find((node) => node.id === focusedNodeId) ??\n candidates[0] ??\n null\n );\n}\n\nfunction dockLabelTooltipTarget(\n key: string,\n label: string\n): WorkbenchHostDockLabelTooltipTarget {\n return { key, label: label.trim() };\n}\n\nfunction resolveDockLabelTooltipAnchorRect({\n dockPlacement,\n slotElement\n}: {\n dockPlacement: WorkbenchHostProps[\"dockPlacement\"];\n slotElement: HTMLElement;\n}): {\n height: number;\n left: number;\n top: number;\n width: number;\n} {\n const slotRect = slotElement.getBoundingClientRect();\n if (dockPlacement === \"left\") {\n return {\n height: DOCK_ICON_BASE_SIZE,\n left: slotRect.left,\n top: slotRect.top + (slotRect.height - DOCK_ICON_BASE_SIZE) / 2,\n width: DOCK_ICON_BASE_SIZE\n };\n }\n\n return {\n height: DOCK_ICON_BASE_SIZE,\n left: slotRect.left + (slotRect.width - DOCK_ICON_BASE_SIZE) / 2,\n top: slotRect.bottom - DOCK_ICON_BASE_SIZE,\n width: DOCK_ICON_BASE_SIZE\n };\n}\n\nfunction renderDockBadge(\n entry: WorkbenchHostDockEntry,\n matchedNodeCount: number\n) {\n const badge =\n entry.badge ??\n (matchedNodeCount > 1\n ? ({\n kind: \"count\",\n value: matchedNodeCount\n } as const)\n : null);\n if (!badge) {\n return null;\n }\n if (badge.kind === \"count\") {\n return <span className=\"desktop-dock__count-badge\">{badge.value}</span>;\n }\n if (badge.kind === \"custom\") {\n return <span className=\"desktop-dock__custom-badge\">{badge.content}</span>;\n }\n return (\n <span className=\"desktop-dock__status-badge\" data-status={badge.status} />\n );\n}\n\nfunction WorkbenchHostDockLabelTooltip({\n placement,\n state\n}: {\n placement: WorkbenchHostProps[\"dockPlacement\"];\n state: WorkbenchHostDockLabelTooltipState;\n}) {\n return (\n <div\n className=\"desktop-dock__label-tooltip\"\n data-dock-placement={placement}\n role=\"tooltip\"\n style={\n {\n \"--desktop-dock-label-tooltip-anchor-height\": `${state.anchorRect.height}px`,\n \"--desktop-dock-label-tooltip-anchor-left\": `${state.anchorRect.left}px`,\n \"--desktop-dock-label-tooltip-anchor-top\": `${state.anchorRect.top}px`,\n \"--desktop-dock-label-tooltip-anchor-width\": `${state.anchorRect.width}px`\n } as WorkbenchHostDockLabelTooltipStyle\n }\n >\n {state.label}\n </div>\n );\n}\n\nfunction WorkbenchHostDockHoverPanel({\n entry,\n host,\n hoverPanelRef,\n onBlur,\n onDockEntryAction,\n onFocus,\n onPointerEnter,\n onPointerLeave,\n pendingActionKeys,\n placement,\n setPendingActionKeys,\n state\n}: {\n entry: WorkbenchHostDockEntry | null;\n host: WorkbenchHostHandle;\n hoverPanelRef: RefObject<HTMLDivElement | null>;\n onDockEntryAction?: (input: {\n actionId: string;\n entryId: string;\n host: WorkbenchHostHandle;\n }) => Promise<void> | void;\n onBlur?: (event: ReactFocusEvent<HTMLDivElement>) => void;\n onFocus?: () => void;\n onPointerEnter?: () => void;\n onPointerLeave?: (event: ReactPointerEvent<HTMLDivElement>) => void;\n pendingActionKeys: Set<string>;\n placement: WorkbenchHostProps[\"dockPlacement\"];\n setPendingActionKeys: Dispatch<SetStateAction<Set<string>>>;\n state: WorkbenchHostDockHoverPanelState;\n}) {\n if (!entry) {\n return null;\n }\n\n return (\n <div\n ref={hoverPanelRef}\n className=\"desktop-dock__hover-panel\"\n data-dock-placement={placement}\n role=\"group\"\n aria-label={entry.label}\n onBlur={onBlur}\n onFocus={onFocus}\n onPointerEnter={onPointerEnter}\n onPointerLeave={onPointerLeave}\n style={\n {\n \"--desktop-dock-hover-panel-anchor-height\": `${state.anchorRect.height}px`,\n \"--desktop-dock-hover-panel-anchor-left\": `${state.anchorRect.left}px`,\n \"--desktop-dock-hover-panel-anchor-top\": `${state.anchorRect.top}px`,\n \"--desktop-dock-hover-panel-anchor-width\": `${state.anchorRect.width}px`\n } as WorkbenchHostDockHoverPanelStyle\n }\n >\n <div className=\"desktop-dock__hover-panel-title\">{entry.label}</div>\n {entry.state?.reason ? (\n <div className=\"desktop-dock__hover-panel-description\">\n {stripDockDescriptionTerminalPunctuation(entry.state.reason)}\n </div>\n ) : null}\n {entry.hoverActions?.length ? (\n <div className=\"desktop-dock__hover-actions\">\n {entry.hoverActions.map((action) => {\n const actionKey = dockActionKey(entry.id, action.id);\n const isLocallyPending = pendingActionKeys.has(actionKey);\n const isPending =\n isLocallyPending ||\n (action.disabled === true && action.pendingLabel !== undefined);\n return (\n <Button\n key={action.id}\n aria-busy={isPending ? true : undefined}\n className=\"desktop-dock__hover-action\"\n disabled={action.disabled || isLocallyPending}\n type=\"button\"\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n if (\n action.disabled === true ||\n pendingActionKeys.has(actionKey)\n ) {\n return;\n }\n setPendingActionKeys((current) => {\n const next = new Set(current);\n next.add(actionKey);\n return next;\n });\n void (async () => {\n try {\n await onDockEntryAction?.({\n actionId: action.id,\n entryId: entry.id,\n host\n });\n } catch {\n // Keep dock action failures contained.\n } finally {\n setPendingActionKeys((current) => {\n if (!current.has(actionKey)) {\n return current;\n }\n const next = new Set(current);\n next.delete(actionKey);\n return next;\n });\n }\n })();\n }}\n >\n {isPending\n ? (action.pendingLabel ?? action.label)\n : action.label}\n </Button>\n );\n })}\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction resolveDockEntryInstanceMode(\n entry: WorkbenchHostDockEntry,\n nodeDefinitions: ReadonlyMap<string, WorkbenchHostNodeDefinition>\n): WorkbenchHostNodeInstanceStrategy[\"mode\"] | undefined {\n return (\n entry.instanceMode ?? nodeDefinitions.get(entry.typeId)?.instance?.mode\n );\n}\n\nfunction canCreateNewWindow(\n entry: WorkbenchHostDockEntry,\n instanceMode: WorkbenchHostNodeInstanceStrategy[\"mode\"] | undefined\n): boolean {\n const stateKind = entry.state?.kind ?? \"enabled\";\n return (\n instanceMode === \"multi\" &&\n (entry.launchBehavior ?? \"enabled\") === \"enabled\" &&\n stateKind !== \"disabled\" &&\n stateKind !== \"loading\" &&\n stateKind !== \"unavailable\"\n );\n}\n\nfunction anchorKeyFromPopupEntry(\n entry: ResolvedWorkbenchHostDockEntry\n): string {\n return entry.anchorKey;\n}\n\nfunction previewRevision(\n preview: WorkbenchDockPreviewContent | null | undefined\n): string | null {\n return preview?.revision ?? null;\n}\n\nfunction logWorkbenchDockDebug(\n event: string,\n debugDiagnostics: WorkbenchHostProps[\"debugDiagnostics\"],\n details: Record<string, unknown>\n): void {\n if (!debugDiagnostics?.log) {\n return;\n }\n void Promise.resolve(\n debugDiagnostics.log({\n details,\n event,\n level: \"info\",\n source: \"workbench-dock\",\n workspaceId:\n typeof details.workspaceId === \"string\" ? details.workspaceId : null\n })\n ).catch(() => undefined);\n}\n\nfunction minimizedDockSlotNodes(\n slot: WorkbenchMinimizedDockSlot\n): readonly WorkbenchMinimizedDockNode[] {\n return slot.kind === \"stack\" ? slot.nodes : [slot.node];\n}\n\nfunction resolveDockPreviewCacheKey(\n workspaceId: string,\n node: WorkbenchMinimizedDockNode\n): WorkbenchDockPreviewCacheKey {\n return {\n instanceId: node.data.instanceId,\n instanceKey: node.data.instanceKey ?? null,\n nodeId: node.id,\n typeId: node.data.typeId,\n workspaceId\n };\n}\n\nfunction dockActionKey(entryId: string, actionId: string): string {\n return `${entryId}:${actionId}`;\n}\n\nfunction createWorkbenchHostDockItems({\n minimizedDockSlots,\n resolvedEntries\n}: {\n minimizedDockSlots: readonly WorkbenchMinimizedDockSlot[];\n resolvedEntries: readonly ResolvedWorkbenchHostDockEntry[];\n}): WorkbenchHostDockItem[] {\n const items: WorkbenchHostDockItem[] = [];\n\n for (const resolvedEntry of resolvedEntries) {\n if (resolvedEntry.sectionBreakBefore) {\n items.push({\n key: `separator:before:${resolvedEntry.entry.id}`,\n kind: \"separator\"\n });\n }\n items.push({\n key: `entry:${resolvedEntry.entry.id}`,\n kind: \"entry\",\n resolvedEntry\n });\n if (resolvedEntry.entry.separatorAfter) {\n items.push({\n key: `separator:after:${resolvedEntry.entry.id}`,\n kind: \"separator\"\n });\n }\n }\n\n if (minimizedDockSlots.length > 0 && resolvedEntries.length > 0) {\n items.push({\n key: \"separator:minimized\",\n kind: \"separator\"\n });\n }\n\n for (const slot of minimizedDockSlots) {\n items.push({\n key: `minimized:${slot.anchorKey}`,\n kind: \"minimized\",\n slot\n });\n }\n\n return items;\n}\n\nfunction resolveMinimizedDockItemNodeId(\n item: WorkbenchHostDockItem\n): string | null {\n if (item.kind !== \"minimized\" || item.slot.kind !== \"node\") {\n return null;\n }\n return item.slot.node.id;\n}\n\nfunction resolveNextDockItemPresence(\n item: WorkbenchHostDockItem,\n initialized: boolean,\n previousPresence: WorkbenchHostDockPresence | undefined,\n shouldAnimateMinimizedDockEnter: (nodeId: string) => boolean\n): WorkbenchHostDockPresence {\n if (!initialized) {\n return \"present\";\n }\n\n if (item.key === \"separator:minimized\") {\n return \"present\";\n }\n\n if (item.kind === \"minimized\") {\n const nodeId = resolveMinimizedDockItemNodeId(item);\n if (nodeId && shouldAnimateMinimizedDockEnter(nodeId)) {\n if (previousPresence === \"exiting\") {\n return \"entering\";\n }\n return previousPresence ?? \"entering\";\n }\n return \"present\";\n }\n\n if (previousPresence === \"exiting\") {\n return \"entering\";\n }\n\n return previousPresence ?? \"entering\";\n}\n\nfunction useDockPresenceItems(\n items: readonly WorkbenchHostDockItem[],\n shouldAnimateMinimizedDockEnter: (nodeId: string) => boolean\n): WorkbenchHostPresentDockItem[] {\n const latestItemsByKey = useRef(new Map<string, WorkbenchHostDockItem>());\n const shouldAnimateMinimizedDockEnterRef = useRef(\n shouldAnimateMinimizedDockEnter\n );\n latestItemsByKey.current = new Map(items.map((item) => [item.key, item]));\n shouldAnimateMinimizedDockEnterRef.current = shouldAnimateMinimizedDockEnter;\n const itemKeys = items.map((item) => item.key).join(\"\\u0000\");\n const [presentItems, setPresentItems] = useState<\n WorkbenchHostPresentDockItem[]\n >(() =>\n items.map((item) => ({\n item,\n key: item.key,\n presence: \"present\" as const\n }))\n );\n const initialized = useRef(false);\n\n useEffect(() => {\n let nextSettleMs = dockPresenceAnimationMs;\n\n setPresentItems((current) => {\n const nextSourceItems = [...latestItemsByKey.current.values()];\n const currentByKey = new Map(current.map((item) => [item.key, item]));\n const currentIndexByKey = new Map(\n current.map((item, index) => [item.key, index])\n );\n const nextByKey = new Map(\n nextSourceItems.map((item) => [item.key, item])\n );\n const nextKeys = new Set(nextSourceItems.map((item) => item.key));\n const currentVisibleItemCount = current.filter(\n (item) => item.presence !== \"exiting\"\n ).length;\n const shouldRetainExitingItems =\n nextSourceItems.length < currentVisibleItemCount;\n const emittedKeys = new Set<string>();\n const nextItems: WorkbenchHostPresentDockItem[] = [];\n let currentIndex = 0;\n\n const emitExitingUntil = (nextCurrentIndex: number) => {\n while (currentIndex < nextCurrentIndex) {\n const currentItem = current[currentIndex];\n currentIndex += 1;\n if (\n shouldRetainExitingItems &&\n currentItem &&\n !nextKeys.has(currentItem.key) &&\n !emittedKeys.has(currentItem.key)\n ) {\n emittedKeys.add(currentItem.key);\n nextItems.push({\n ...currentItem,\n presence: \"exiting\"\n });\n }\n }\n };\n\n for (const item of nextSourceItems) {\n const previousIndex = currentIndexByKey.get(item.key);\n if (previousIndex !== undefined) {\n emitExitingUntil(previousIndex);\n currentIndex = Math.max(currentIndex, previousIndex + 1);\n }\n emittedKeys.add(item.key);\n nextItems.push({\n item,\n key: item.key,\n presence: resolveNextDockItemPresence(\n item,\n initialized.current,\n currentByKey.get(item.key)?.presence,\n shouldAnimateMinimizedDockEnterRef.current\n )\n });\n }\n\n for (const currentItem of current) {\n if (shouldRetainExitingItems && !nextKeys.has(currentItem.key)) {\n if (emittedKeys.has(currentItem.key)) {\n continue;\n }\n emittedKeys.add(currentItem.key);\n nextItems.push({\n ...currentItem,\n presence: \"exiting\"\n });\n }\n }\n\n const filteredItems = nextItems.filter(\n (item) => nextByKey.has(item.key) || item.presence === \"exiting\"\n );\n if (\n filteredItems.some(\n (item) =>\n item.item.kind === \"minimized\" &&\n (item.presence === \"entering\" || item.presence === \"exiting\")\n )\n ) {\n nextSettleMs = minimizedDockSlotLayoutAnimationMs;\n }\n return filteredItems;\n });\n initialized.current = true;\n\n const timeout = globalThis.setTimeout(() => {\n setPresentItems((current) =>\n current\n .filter((item) => item.presence !== \"exiting\")\n .map((item) =>\n item.presence === \"entering\"\n ? { ...item, presence: \"present\" as const }\n : item\n )\n );\n }, nextSettleMs);\n\n return () => globalThis.clearTimeout(timeout);\n }, [itemKeys]);\n\n return presentItems.map((presentItem) => {\n const latestItem = latestItemsByKey.current.get(presentItem.key);\n return latestItem ? { ...presentItem, item: latestItem } : presentItem;\n });\n}\n\nfunction useDockWallpaperTones({\n dockItemsRef,\n elementRefs,\n itemKeys\n}: {\n dockItemsRef: RefObject<HTMLElement | null>;\n elementRefs: RefObject<Map<string, HTMLElement>>;\n itemKeys: string;\n}): ReadonlyMap<string, WorkbenchDockWallpaperTone> {\n const [tones, setTones] = useState<Map<string, WorkbenchDockWallpaperTone>>(\n () => new Map()\n );\n\n useLayoutEffect(() => {\n if (typeof window === \"undefined\") {\n return undefined;\n }\n\n let canceled = false;\n let frameId: number | null = null;\n\n const updateTones = () => {\n frameId = null;\n void resolveDockWallpaperTones({\n dockItemsElement: dockItemsRef.current,\n elements: elementRefs.current\n }).then((nextTones) => {\n if (canceled) {\n return;\n }\n setTones((current) =>\n dockWallpaperToneMapsEqual(current, nextTones) ? current : nextTones\n );\n });\n };\n\n const scheduleUpdate = () => {\n if (frameId !== null) {\n return;\n }\n frameId = window.requestAnimationFrame(updateTones);\n };\n\n scheduleUpdate();\n window.addEventListener(\"resize\", scheduleUpdate);\n\n const resizeObserver =\n typeof ResizeObserver === \"undefined\"\n ? null\n : new ResizeObserver(scheduleUpdate);\n if (dockItemsRef.current) {\n resizeObserver?.observe(dockItemsRef.current);\n }\n const wallpaperElement = dockItemsRef.current\n ?.closest(\".workbench-surface\")\n ?.querySelector(\".workbench-surface__wallpaper\");\n if (wallpaperElement instanceof HTMLElement) {\n resizeObserver?.observe(wallpaperElement);\n }\n\n return () => {\n canceled = true;\n if (frameId !== null) {\n window.cancelAnimationFrame(frameId);\n }\n resizeObserver?.disconnect();\n window.removeEventListener(\"resize\", scheduleUpdate);\n };\n }, [dockItemsRef, elementRefs, itemKeys]);\n\n return tones;\n}\n\nasync function resolveDockWallpaperTones({\n dockItemsElement,\n elements\n}: {\n dockItemsElement: HTMLElement | null;\n elements: ReadonlyMap<string, HTMLElement>;\n}): Promise<Map<string, WorkbenchDockWallpaperTone>> {\n const wallpaperElement = dockItemsElement\n ?.closest(\".workbench-surface\")\n ?.querySelector(\".workbench-surface__wallpaper\");\n if (!(wallpaperElement instanceof HTMLElement)) {\n return new Map();\n }\n\n const wallpaperStyle = window.getComputedStyle(wallpaperElement);\n const wallpaperUrl = parseDockWallpaperCssUrl(wallpaperStyle.backgroundImage);\n if (!wallpaperUrl) {\n return new Map();\n }\n\n const wallpaperImage = await loadDockWallpaperImage(wallpaperUrl);\n if (!wallpaperImage) {\n return new Map();\n }\n\n const sampleCanvas = createDockWallpaperSampleCanvas(wallpaperImage);\n if (!sampleCanvas) {\n return new Map();\n }\n\n const wallpaperRect = wallpaperElement.getBoundingClientRect();\n const renderedImageRect = resolveDockWallpaperRenderedImageRect({\n containerHeight: wallpaperRect.height,\n containerWidth: wallpaperRect.width,\n imageHeight: wallpaperImage.naturalHeight,\n imageWidth: wallpaperImage.naturalWidth,\n positionX: wallpaperStyle.backgroundPositionX,\n positionY: wallpaperStyle.backgroundPositionY,\n size: wallpaperStyle.backgroundSize\n });\n const nextTones = new Map<string, WorkbenchDockWallpaperTone>();\n\n for (const [key, element] of elements) {\n const luminance = sampleDockWallpaperLuminanceAtElement({\n elementRect: element.getBoundingClientRect(),\n renderedImageRect,\n sampleCanvas,\n wallpaperRect\n });\n if (luminance === null) {\n continue;\n }\n nextTones.set(\n key,\n luminance < dockWallpaperDarkLuminanceThreshold ? \"dark\" : \"light\"\n );\n }\n\n return nextTones;\n}\n\nfunction parseDockWallpaperCssUrl(backgroundImage: string): string | null {\n const match = /^url\\((['\"]?)(.*)\\1\\)$/u.exec(backgroundImage.trim());\n return match?.[2] ? match[2] : null;\n}\n\nconst dockWallpaperImageCache = new Map<\n string,\n Promise<HTMLImageElement | null>\n>();\n\nfunction loadDockWallpaperImage(url: string): Promise<HTMLImageElement | null> {\n const cached = dockWallpaperImageCache.get(url);\n if (cached) {\n return cached;\n }\n const promise = new Promise<HTMLImageElement | null>((resolve) => {\n const image = new Image();\n image.decoding = \"async\";\n image.onload = () => resolve(image);\n image.onerror = () => resolve(null);\n image.src = url;\n });\n dockWallpaperImageCache.set(url, promise);\n return promise;\n}\n\nfunction createDockWallpaperSampleCanvas(\n image: HTMLImageElement\n): HTMLCanvasElement | null {\n if (image.naturalWidth <= 0 || image.naturalHeight <= 0) {\n return null;\n }\n const canvas = document.createElement(\"canvas\");\n const scale =\n dockWallpaperSampleCanvasMaxSizePx /\n Math.max(image.naturalWidth, image.naturalHeight);\n canvas.width = Math.max(1, Math.round(image.naturalWidth * scale));\n canvas.height = Math.max(1, Math.round(image.naturalHeight * scale));\n const context = canvas.getContext(\"2d\", { willReadFrequently: true });\n if (!context) {\n return null;\n }\n try {\n context.drawImage(image, 0, 0, canvas.width, canvas.height);\n context.getImageData(0, 0, 1, 1);\n } catch {\n return null;\n }\n return canvas;\n}\n\nfunction resolveDockWallpaperRenderedImageRect({\n containerHeight,\n containerWidth,\n imageHeight,\n imageWidth,\n positionX,\n positionY,\n size\n}: {\n containerHeight: number;\n containerWidth: number;\n imageHeight: number;\n imageWidth: number;\n positionX: string;\n positionY: string;\n size: string;\n}): { height: number; left: number; top: number; width: number } {\n const imageAspect = imageWidth / imageHeight;\n const containerAspect = containerWidth / containerHeight;\n let width = containerWidth;\n let height = containerHeight;\n\n if (size === \"cover\") {\n if (containerAspect > imageAspect) {\n height = containerWidth / imageAspect;\n } else {\n width = containerHeight * imageAspect;\n }\n } else if (size === \"contain\") {\n if (containerAspect > imageAspect) {\n width = containerHeight * imageAspect;\n } else {\n height = containerWidth / imageAspect;\n }\n } else if (size !== \"100% 100%\") {\n width = imageWidth;\n height = imageHeight;\n }\n\n return {\n height,\n left: resolveDockWallpaperPositionOffset(positionX, containerWidth - width),\n top: resolveDockWallpaperPositionOffset(\n positionY,\n containerHeight - height\n ),\n width\n };\n}\n\nfunction resolveDockWallpaperPositionOffset(\n value: string,\n availableSpace: number\n): number {\n const trimmed = value.trim();\n if (trimmed.endsWith(\"%\")) {\n const percentage = Number.parseFloat(trimmed);\n return Number.isFinite(percentage)\n ? (availableSpace * percentage) / 100\n : availableSpace / 2;\n }\n if (trimmed.endsWith(\"px\")) {\n const px = Number.parseFloat(trimmed);\n return Number.isFinite(px) ? px : availableSpace / 2;\n }\n if (trimmed === \"left\" || trimmed === \"top\") {\n return 0;\n }\n if (trimmed === \"right\" || trimmed === \"bottom\") {\n return availableSpace;\n }\n return availableSpace / 2;\n}\n\nfunction sampleDockWallpaperLuminanceAtElement({\n elementRect,\n renderedImageRect,\n sampleCanvas,\n wallpaperRect\n}: {\n elementRect: DOMRect;\n renderedImageRect: {\n height: number;\n left: number;\n top: number;\n width: number;\n };\n sampleCanvas: HTMLCanvasElement;\n wallpaperRect: DOMRect;\n}): number | null {\n const context = sampleCanvas.getContext(\"2d\", { willReadFrequently: true });\n if (!context) {\n return null;\n }\n const isVerticalElement = elementRect.height >= elementRect.width;\n let luminanceSum = 0;\n let samples = 0;\n\n for (let index = 0; index < dockWallpaperToneSampleCount; index += 1) {\n const ratio = index / (dockWallpaperToneSampleCount - 1);\n const clientX = isVerticalElement\n ? elementRect.left + elementRect.width / 2\n : elementRect.left + elementRect.width * ratio;\n const clientY = isVerticalElement\n ? elementRect.top + elementRect.height * ratio\n : elementRect.top + elementRect.height / 2;\n const imageX =\n (clientX - wallpaperRect.left - renderedImageRect.left) /\n renderedImageRect.width;\n const imageY =\n (clientY - wallpaperRect.top - renderedImageRect.top) /\n renderedImageRect.height;\n if (imageX < 0 || imageX > 1 || imageY < 0 || imageY > 1) {\n continue;\n }\n const canvasX = Math.min(\n sampleCanvas.width - 1,\n Math.max(0, Math.round(imageX * (sampleCanvas.width - 1)))\n );\n const canvasY = Math.min(\n sampleCanvas.height - 1,\n Math.max(0, Math.round(imageY * (sampleCanvas.height - 1)))\n );\n const pixel = context.getImageData(canvasX, canvasY, 1, 1).data;\n const red = pixel[0] ?? 0;\n const green = pixel[1] ?? 0;\n const blue = pixel[2] ?? 0;\n luminanceSum += 0.2126 * red + 0.7152 * green + 0.0722 * blue;\n samples += 1;\n }\n\n return samples > 0 ? luminanceSum / samples : null;\n}\n\nfunction dockWallpaperToneMapsEqual(\n left: ReadonlyMap<string, WorkbenchDockWallpaperTone>,\n right: ReadonlyMap<string, WorkbenchDockWallpaperTone>\n): boolean {\n if (left.size !== right.size) {\n return false;\n }\n for (const [key, value] of left) {\n if (right.get(key) !== value) {\n return false;\n }\n }\n return true;\n}\n\nconst DOCK_BOUNCE_MS = 600;\nconst DOCK_ENTRY_CLICK_THROTTLE_MS = DOCK_BOUNCE_MS;\n\nfunction useDockBounce(slotRefs: RefObject<Map<string, HTMLElement>>) {\n const timeoutsRef = useRef(new Map<string, ReturnType<typeof setTimeout>>());\n\n const clearDockBounce = useCallback(\n (anchorKey: string): boolean => {\n const timeout = timeoutsRef.current.get(anchorKey);\n const slotElement = slotRefs.current.get(anchorKey);\n const wasBouncing = slotElement?.hasAttribute(\"data-bouncing\") === true;\n if (timeout) {\n clearTimeout(timeout);\n timeoutsRef.current.delete(anchorKey);\n }\n slotElement?.removeAttribute(\"data-bouncing\");\n return wasBouncing;\n },\n [slotRefs]\n );\n\n useEffect(\n () => () => {\n for (const anchorKey of timeoutsRef.current.keys()) {\n clearDockBounce(anchorKey);\n }\n timeoutsRef.current.clear();\n },\n [clearDockBounce]\n );\n\n const triggerDockBounce = useCallback(\n (anchorKey: string) => {\n const shouldRestartAnimation = clearDockBounce(anchorKey);\n\n const slotElement = slotRefs.current.get(anchorKey);\n if (!slotElement) {\n return;\n }\n\n if (shouldRestartAnimation) {\n // Restart the CSS keyframes without scheduling a React render.\n void slotElement.offsetWidth;\n }\n slotElement.setAttribute(\"data-bouncing\", \"true\");\n timeoutsRef.current.set(\n anchorKey,\n setTimeout(() => {\n clearDockBounce(anchorKey);\n }, DOCK_BOUNCE_MS)\n );\n },\n [clearDockBounce, slotRefs]\n );\n\n return { triggerDockBounce };\n}\n\nfunction resolveWorkbenchHostDockItemsWidth(\n items: readonly WorkbenchHostDockItem[]\n): number {\n if (items.length === 0) {\n return dockItemsHorizontalPaddingPx;\n }\n\n const itemWidth = items.reduce(\n (sum, item) =>\n sum +\n (item.kind === \"separator\" ? dockSeparatorOuterWidthPx : dockSlotWidthPx),\n 0\n );\n const gapWidth = Math.max(0, items.length - 1) * dockItemsGapPx;\n return itemWidth + gapWidth + dockItemsHorizontalPaddingPx;\n}\n\nconst dockHoverPanelOpenDelayMs = 450;\nconst dockHoverPanelCloseDelayMs = 160;\nconst dockHoverPanelHitSlopPx = 12;\nconst dockHoverPanelBridgeSlopPx = 6;\nconst dockHoverPanelPointerRestTolerancePx = 4;\nconst dockWallpaperSampleCanvasMaxSizePx = 192;\nconst dockWallpaperToneSampleCount = 7;\nconst dockWallpaperDarkLuminanceThreshold = 132;\n\nfunction rectContainsPoint(\n rect: DOMRect,\n clientX: number,\n clientY: number,\n slopPx = 0\n): boolean {\n return (\n clientX >= rect.left - slopPx &&\n clientX <= rect.right + slopPx &&\n clientY >= rect.top - slopPx &&\n clientY <= rect.bottom + slopPx\n );\n}\n\nfunction createHoverPanelBridgeRect(anchor: DOMRect, panel: DOMRect): DOMRect {\n if (anchor.right <= panel.left || panel.right <= anchor.left) {\n const left = Math.min(anchor.right, panel.right);\n const right = Math.max(anchor.left, panel.left);\n const top = Math.max(anchor.top, panel.top);\n const bottom = Math.min(anchor.bottom, panel.bottom);\n return new DOMRect(left, top, right - left, Math.max(0, bottom - top));\n }\n\n const left = Math.max(anchor.left, panel.left);\n const right = Math.min(anchor.right, panel.right);\n const top = Math.min(anchor.bottom, panel.bottom);\n const bottom = Math.max(anchor.top, panel.top);\n return new DOMRect(left, top, Math.max(0, right - left), bottom - top);\n}\nconst dockPresenceAnimationMs = 300;\nconst minimizedDockSlotLayoutAnimationMs = 720;\nconst dockItemsGapPx = 10.8;\nconst dockItemsHorizontalPaddingPx = 12.6;\nconst dockSeparatorOuterWidthPx = 8.1;\nconst dockSlotWidthPx = 43.2;\nconst desktopDockPlateChromeWidth = 15.3;\n\ninterface WorkbenchHostDockPlateStyle extends CSSProperties {\n \"--desktop-dock-frame-size\"?: string;\n}\n\ninterface WorkbenchHostDockHoverPanelStyle extends CSSProperties {\n \"--desktop-dock-hover-panel-anchor-height\"?: string;\n \"--desktop-dock-hover-panel-anchor-left\"?: string;\n \"--desktop-dock-hover-panel-anchor-top\"?: string;\n \"--desktop-dock-hover-panel-anchor-width\"?: string;\n}\n\ninterface WorkbenchHostDockLabelTooltipStyle extends CSSProperties {\n \"--desktop-dock-label-tooltip-anchor-height\"?: string;\n \"--desktop-dock-label-tooltip-anchor-left\"?: string;\n \"--desktop-dock-label-tooltip-anchor-top\"?: string;\n \"--desktop-dock-label-tooltip-anchor-width\"?: string;\n}\n\ntype WorkbenchHostDockPresence = \"entering\" | \"exiting\" | \"present\";\ntype WorkbenchHostDockScrollDirection = \"backward\" | \"forward\";\n\ninterface WorkbenchHostDockLabelTooltipTarget {\n key: string;\n label: string;\n}\n\ninterface WorkbenchHostDockLabelTooltipState extends WorkbenchHostDockLabelTooltipTarget {\n anchorKey: string;\n anchorRect: {\n height: number;\n left: number;\n top: number;\n width: number;\n };\n}\n\ninterface WorkbenchHostDockHoverPanelState {\n anchorKey: string;\n anchorRect: {\n height: number;\n left: number;\n top: number;\n width: number;\n };\n entryId: string;\n}\n\ntype WorkbenchHostDockItem =\n | {\n key: string;\n kind: \"entry\";\n resolvedEntry: ResolvedWorkbenchHostDockEntry;\n }\n | {\n key: string;\n kind: \"minimized\";\n slot: WorkbenchMinimizedDockSlot;\n }\n | {\n key: string;\n kind: \"separator\";\n };\n\ninterface WorkbenchHostPresentDockItem {\n item: WorkbenchHostDockItem;\n key: string;\n presence: WorkbenchHostDockPresence;\n}\n","import type { WorkbenchNode } from \"../core/types.ts\";\nimport type {\n WorkbenchHostDockEntry,\n WorkbenchHostNodeData,\n WorkbenchHostNodeInstanceStrategy\n} from \"./types.ts\";\n\nexport type WorkbenchHostDockNodeState = \"closed\" | \"minimized\" | \"open\";\n\nexport interface ResolvedWorkbenchHostDockEntry {\n anchorKey: string;\n dockNodeState: WorkbenchHostDockNodeState;\n entry: WorkbenchHostDockEntry;\n hasMatchingNodes: boolean;\n matchedNodes: WorkbenchNode<WorkbenchHostNodeData>[];\n sectionBreakBefore: boolean;\n}\n\nexport type WorkbenchHostDockClickResolution =\n | { actionId: string; kind: \"action\" }\n | { kind: \"blocked\" }\n | { kind: \"focus-node\"; nodeId: string }\n | { kind: \"launch\" }\n | { kind: \"open-popup\" };\n\nexport function matchWorkbenchDockEntryNode(\n entry: WorkbenchHostDockEntry,\n node: WorkbenchNode<WorkbenchHostNodeData>\n): boolean {\n if (typeof node.data.dockEntryId === \"string\") {\n return node.data.dockEntryId === entry.id;\n }\n return entry.matchNode?.(node) ?? false;\n}\n\nexport function resolveWorkbenchDockEntryAnchorKey(\n entry: WorkbenchHostDockEntry\n): string {\n return entry.anchorKey ?? entry.id;\n}\n\nexport function resolveWorkbenchDockEntries(input: {\n dockEntries: readonly WorkbenchHostDockEntry[];\n minimizedNodeIds: ReadonlySet<string>;\n nodes: readonly WorkbenchNode<WorkbenchHostNodeData>[];\n}): ResolvedWorkbenchHostDockEntry[] {\n const sectionOrder = new Map<string, number>();\n let nextSectionIndex = 0;\n const sortedEntries = [...input.dockEntries]\n .map((entry, index) => {\n const sectionId = entry.sectionId ?? \"\";\n if (!sectionOrder.has(sectionId)) {\n sectionOrder.set(sectionId, nextSectionIndex++);\n }\n return {\n entry,\n index,\n sectionId\n };\n })\n .sort((left, right) => {\n const sectionOrderDelta =\n (sectionOrder.get(left.sectionId) ?? 0) -\n (sectionOrder.get(right.sectionId) ?? 0);\n if (sectionOrderDelta !== 0) {\n return sectionOrderDelta;\n }\n const orderDelta = (left.entry.order ?? 0) - (right.entry.order ?? 0);\n if (orderDelta !== 0) {\n return orderDelta;\n }\n return left.index - right.index;\n });\n\n let previousSectionId: string | null = null;\n const resolvedEntries: ResolvedWorkbenchHostDockEntry[] = [];\n\n for (const { entry, sectionId } of sortedEntries) {\n const matchedNodes = input.nodes.filter((node) =>\n matchWorkbenchDockEntryNode(entry, node)\n );\n const hasMatchingNodes = matchedNodes.length > 0;\n const visibility = entry.visibility ?? \"always\";\n if (\n visibility === \"never\" ||\n (visibility === \"when-open\" && !hasMatchingNodes)\n ) {\n continue;\n }\n\n const hasOpenNode = matchedNodes.some(\n (node) => !input.minimizedNodeIds.has(node.id)\n );\n const hasMinimizedNode = matchedNodes.some((node) =>\n input.minimizedNodeIds.has(node.id)\n );\n\n resolvedEntries.push({\n anchorKey: resolveWorkbenchDockEntryAnchorKey(entry),\n dockNodeState: hasMinimizedNode\n ? \"minimized\"\n : hasOpenNode\n ? \"open\"\n : \"closed\",\n entry,\n hasMatchingNodes,\n matchedNodes,\n sectionBreakBefore:\n previousSectionId !== null && previousSectionId !== sectionId\n });\n previousSectionId = sectionId;\n }\n\n return resolvedEntries;\n}\n\nexport function resolveWorkbenchDockEntryClick(input: {\n entry: WorkbenchHostDockEntry;\n instanceMode?: WorkbenchHostNodeInstanceStrategy[\"mode\"];\n matchedNodes: readonly WorkbenchNode<WorkbenchHostNodeData>[];\n}): WorkbenchHostDockClickResolution {\n if (input.entry.clickActionId) {\n if (isWorkbenchDockEntryBlocked(input.entry)) {\n return { kind: \"blocked\" };\n }\n return { actionId: input.entry.clickActionId, kind: \"action\" };\n }\n if (isWorkbenchDockEntryBlocked(input.entry)) {\n return { kind: \"blocked\" };\n }\n if (input.instanceMode === \"multi\" && input.matchedNodes.length > 0) {\n return { kind: \"open-popup\" };\n }\n if (input.matchedNodes.length === 1) {\n return { kind: \"focus-node\", nodeId: input.matchedNodes[0]!.id };\n }\n if (input.matchedNodes.length > 1) {\n return { kind: \"open-popup\" };\n }\n return { kind: \"launch\" };\n}\n\nfunction isWorkbenchDockEntryBlocked(entry: WorkbenchHostDockEntry): boolean {\n const stateKind = entry.state?.kind ?? \"enabled\";\n return (\n stateKind === \"disabled\" ||\n stateKind === \"loading\" ||\n stateKind === \"unavailable\" ||\n (entry.launchBehavior ?? \"enabled\") !== \"enabled\"\n );\n}\n","import { useCallback, useEffect, useRef, type RefObject } from \"react\";\n\nexport const DOCK_ICON_BASE_SIZE = 43.2;\nexport const DOCK_ICON_PEAK_SIZE = DOCK_ICON_BASE_SIZE * 1.7;\nexport const DOCK_MAGNIFICATION_HALF_RANGE = DOCK_ICON_BASE_SIZE * 2.4;\n\nconst DOCK_MAGNIFICATION_SPRING_MASS = 0.1;\nconst DOCK_MAGNIFICATION_SPRING_STIFFNESS = 200;\nconst DOCK_MAGNIFICATION_SPRING_DAMPING = 14;\nconst MAGNIFICATION_SETTLE_EPSILON = 0.2;\nconst MAGNIFICATION_SIZE_EPSILON = 0.2;\nconst MAX_MAGNIFICATION_STEP_SECONDS = 1 / 30;\nconst MAGNIFICATION_INFLUENCE_PADDING = 8;\nconst DOCK_MAGNIFICATION_ENTRY_RAMP_MS = 90;\nconst DOCK_MAGNIFICATION_CROSS_AXIS_PADDING = 8;\n\ninterface DockMagnificationSpring {\n value: number;\n velocity: number;\n}\n\ninterface DockMagnificationAppliedStyle {\n size: number;\n}\n\nexport interface DockMagnificationSlotRect {\n bottom: number;\n left: number;\n right: number;\n top: number;\n}\n\ninterface DockMagnificationHitBounds {\n crossEnd: number;\n crossStart: number;\n mainEnd: number;\n mainStart: number;\n}\n\nconst dockMagnificationShellBySlot = new WeakMap<\n HTMLElement,\n HTMLElement | null\n>();\n\nexport function mapDistanceToTargetSize(\n distance: number,\n baseSize = DOCK_ICON_BASE_SIZE,\n peakSize = DOCK_ICON_PEAK_SIZE,\n halfRange = DOCK_MAGNIFICATION_HALF_RANGE\n): number {\n const absoluteDistance = Math.abs(distance);\n if (absoluteDistance >= halfRange) {\n return baseSize;\n }\n\n const influence = 1 - absoluteDistance / halfRange;\n return baseSize + (peakSize - baseSize) * influence;\n}\n\nexport function applyDockMagnificationEntryRamp(\n targetSize: number,\n baseSize: number,\n progress: number\n): number {\n const clampedProgress = Math.min(1, Math.max(0, progress));\n return baseSize + (targetSize - baseSize) * clampedProgress;\n}\n\nexport function resolveDockMagnificationHitBounds(\n slotRects: readonly DockMagnificationSlotRect[],\n dockPlacement: \"bottom\" | \"left\",\n crossAxisPadding = DOCK_MAGNIFICATION_CROSS_AXIS_PADDING\n): DockMagnificationHitBounds | null {\n if (slotRects.length === 0) {\n return null;\n }\n\n let mainStart = Number.POSITIVE_INFINITY;\n let mainEnd = Number.NEGATIVE_INFINITY;\n let crossStart = Number.POSITIVE_INFINITY;\n let crossEnd = Number.NEGATIVE_INFINITY;\n\n for (const rect of slotRects) {\n if (dockPlacement === \"left\") {\n mainStart = Math.min(mainStart, rect.top);\n mainEnd = Math.max(mainEnd, rect.bottom);\n crossStart = Math.min(crossStart, rect.left);\n crossEnd = Math.max(crossEnd, rect.right);\n } else {\n mainStart = Math.min(mainStart, rect.left);\n mainEnd = Math.max(mainEnd, rect.right);\n crossStart = Math.min(crossStart, rect.top);\n crossEnd = Math.max(crossEnd, rect.bottom);\n }\n }\n\n const effectiveCrossAxisEndPadding =\n dockPlacement === \"left\"\n ? crossAxisPadding + (DOCK_ICON_PEAK_SIZE - DOCK_ICON_BASE_SIZE)\n : crossAxisPadding;\n\n return {\n crossEnd: crossEnd + effectiveCrossAxisEndPadding,\n crossStart: crossStart - crossAxisPadding,\n mainEnd,\n mainStart\n };\n}\n\nfunction isDockMagnificationPointInsideHitBounds({\n clientX,\n clientY,\n dockPlacement,\n hitBounds\n}: {\n clientX: number;\n clientY: number;\n dockPlacement: \"bottom\" | \"left\";\n hitBounds: DockMagnificationHitBounds | null;\n}): boolean {\n if (!hitBounds) {\n return false;\n }\n\n const mainAxis = dockPlacement === \"left\" ? clientY : clientX;\n const crossAxis = dockPlacement === \"left\" ? clientX : clientY;\n return (\n mainAxis >= hitBounds.mainStart &&\n mainAxis <= hitBounds.mainEnd &&\n crossAxis >= hitBounds.crossStart &&\n crossAxis <= hitBounds.crossEnd\n );\n}\n\nexport function resolveDockMagnificationSlotCenter(\n rect: DockMagnificationSlotRect,\n dockPlacement: \"bottom\" | \"left\",\n baseSize = DOCK_ICON_BASE_SIZE\n): number {\n return dockPlacement === \"left\"\n ? rect.top + baseSize / 2\n : rect.left + baseSize / 2;\n}\n\nconst DOCK_MAGNIFICATION_SPRING_SUBSTEPS = 8;\n\nexport function advanceDockMagnificationSpring(\n current: DockMagnificationSpring,\n target: number,\n deltaSeconds: number\n): DockMagnificationSpring {\n const subDeltaSeconds = deltaSeconds / DOCK_MAGNIFICATION_SPRING_SUBSTEPS;\n let { value, velocity } = current;\n\n for (let step = 0; step < DOCK_MAGNIFICATION_SPRING_SUBSTEPS; step += 1) {\n const force =\n -DOCK_MAGNIFICATION_SPRING_STIFFNESS * (value - target) -\n DOCK_MAGNIFICATION_SPRING_DAMPING * velocity;\n const acceleration = force / DOCK_MAGNIFICATION_SPRING_MASS;\n velocity += acceleration * subDeltaSeconds;\n value += velocity * subDeltaSeconds;\n }\n\n return { value, velocity };\n}\n\nexport function isDockMagnificationSpringSettled(\n spring: DockMagnificationSpring,\n target: number\n): boolean {\n return (\n Math.abs(spring.value - target) <= MAGNIFICATION_SETTLE_EPSILON &&\n Math.abs(spring.velocity) <= MAGNIFICATION_SETTLE_EPSILON\n );\n}\n\nfunction roundDockMagnificationSize(size: number): number {\n return Math.round(size * 10) / 10;\n}\n\nfunction hasAppliedSizeChanged(\n previous: DockMagnificationAppliedStyle | undefined,\n next: DockMagnificationAppliedStyle\n): boolean {\n if (!previous) {\n return true;\n }\n\n return Math.abs(previous.size - next.size) > MAGNIFICATION_SIZE_EPSILON;\n}\n\nexport function resolveDockMagnificationSlotLayoutSize({\n size\n}: {\n size: number;\n}): { height: number; width: number } {\n return { height: size, width: size };\n}\n\nexport function isDockMagnificationSlotLayoutLocked(\n slotElement: HTMLElement\n): boolean {\n return (\n slotElement.dataset.collapsing === \"true\" ||\n slotElement.dataset.presence === \"entering\" ||\n slotElement.dataset.presence === \"exiting\"\n );\n}\n\nfunction resolveDockMagnificationShell(\n slotElement: HTMLElement\n): HTMLElement | null {\n const cachedShell = dockMagnificationShellBySlot.get(slotElement);\n if (\n cachedShell !== undefined &&\n (cachedShell === null || slotElement.contains(cachedShell))\n ) {\n return cachedShell;\n }\n\n const shell =\n slotElement.querySelector<HTMLElement>(\"[data-desktop-dock-icon-shell]\") ??\n slotElement.querySelector<HTMLElement>(\n \".desktop-dock__minimized-preview\"\n ) ??\n slotElement.querySelector<HTMLElement>(\n \".desktop-dock__minimized-stack-icon\"\n );\n dockMagnificationShellBySlot.set(slotElement, shell);\n return shell;\n}\n\nfunction applyDockSlotMagnification(\n slotElement: HTMLElement,\n size: number,\n baseSize: number,\n appliedStylesRef: Map<string, DockMagnificationAppliedStyle>\n): void {\n const anchorKey = slotElement.dataset.desktopDockAnchorKey;\n if (!anchorKey) {\n return;\n }\n\n const shell = resolveDockMagnificationShell(slotElement);\n if (!shell) {\n return;\n }\n\n const nextStyle = {\n size: roundDockMagnificationSize(size)\n };\n\n if (!hasAppliedSizeChanged(appliedStylesRef.get(anchorKey), nextStyle)) {\n return;\n }\n\n appliedStylesRef.set(anchorKey, nextStyle);\n\n if (Math.abs(nextStyle.size - baseSize) <= MAGNIFICATION_SIZE_EPSILON) {\n slotElement.style.removeProperty(\"width\");\n slotElement.style.removeProperty(\"height\");\n shell.style.removeProperty(\"transform\");\n return;\n }\n\n const scale = nextStyle.size / baseSize;\n const layoutSize = resolveDockMagnificationSlotLayoutSize({\n size: nextStyle.size\n });\n slotElement.style.width = `${layoutSize.width}px`;\n slotElement.style.height = `${layoutSize.height}px`;\n shell.style.transform = `scale(${scale})`;\n}\n\nfunction clearDockSlotMagnification(\n slotElement: HTMLElement,\n appliedStylesRef: Map<string, DockMagnificationAppliedStyle>\n): void {\n const anchorKey = slotElement.dataset.desktopDockAnchorKey;\n if (anchorKey) {\n appliedStylesRef.delete(anchorKey);\n }\n slotElement.style.removeProperty(\"width\");\n slotElement.style.removeProperty(\"height\");\n const shell = resolveDockMagnificationShell(slotElement);\n shell?.style.removeProperty(\"transform\");\n}\n\nexport function useDockMagnification({\n dockPlacement,\n dockRootRef,\n slotRefs\n}: {\n dockPlacement: \"bottom\" | \"left\";\n dockRootRef: RefObject<HTMLElement | null>;\n slotRefs: RefObject<Map<string, HTMLElement>>;\n}) {\n const pointerAxisRef = useRef<number | null>(null);\n const pendingPointerAxisRef = useRef<number | null>(null);\n const springsRef = useRef(new Map<string, DockMagnificationSpring>());\n const appliedStylesRef = useRef(\n new Map<string, DockMagnificationAppliedStyle>()\n );\n const animationFrameRef = useRef<number | null>(null);\n const lastFrameTimeRef = useRef<number | null>(null);\n const entryRampStartedAtRef = useRef<number | null>(null);\n const restCentersRef = useRef<Map<string, number> | null>(null);\n const hitBoundsRef = useRef<DockMagnificationHitBounds | null>(null);\n const slotOrderRef = useRef<string[]>([]);\n const magnifyActiveRef = useRef(false);\n\n const setMagnifyActive = useCallback(\n (active: boolean) => {\n if (magnifyActiveRef.current === active) {\n return;\n }\n magnifyActiveRef.current = active;\n if (active) {\n dockRootRef.current?.setAttribute(\"data-dock-pointer-active\", \"true\");\n } else {\n dockRootRef.current?.removeAttribute(\"data-dock-pointer-active\");\n }\n },\n [dockRootRef]\n );\n\n const stopAnimation = useCallback(() => {\n if (animationFrameRef.current !== null) {\n cancelAnimationFrame(animationFrameRef.current);\n animationFrameRef.current = null;\n }\n lastFrameTimeRef.current = null;\n }, []);\n\n const captureRestCenters = useCallback(() => {\n const slots = slotRefs.current;\n const centers = new Map<string, number>();\n const slotRects: DockMagnificationSlotRect[] = [];\n const order: string[] = [];\n for (const [anchorKey, slotElement] of slots) {\n order.push(anchorKey);\n const rect = slotElement.getBoundingClientRect();\n slotRects.push({\n bottom: rect.bottom,\n left: rect.left,\n right: rect.right,\n top: rect.top\n });\n const center = resolveDockMagnificationSlotCenter(rect, dockPlacement);\n centers.set(anchorKey, center);\n }\n slotOrderRef.current = order;\n hitBoundsRef.current = resolveDockMagnificationHitBounds(\n slotRects,\n dockPlacement\n );\n restCentersRef.current = centers;\n }, [dockPlacement, slotRefs]);\n\n const runAnimationFrame = useCallback(\n (frameTime: number) => {\n if (pendingPointerAxisRef.current !== null) {\n pointerAxisRef.current = pendingPointerAxisRef.current;\n }\n\n const pointerAxis = pointerAxisRef.current;\n if (pointerAxis !== null) {\n captureRestCenters();\n entryRampStartedAtRef.current ??= frameTime;\n }\n const slots = slotRefs.current;\n const order = slotOrderRef.current;\n const previousFrameTime = lastFrameTimeRef.current;\n lastFrameTimeRef.current = frameTime;\n const deltaSeconds =\n previousFrameTime === null\n ? 1 / 60\n : Math.min(\n (frameTime - previousFrameTime) / 1000,\n MAX_MAGNIFICATION_STEP_SECONDS\n );\n\n let shouldContinue = false;\n let allSettled = true;\n const influenceRadius =\n DOCK_MAGNIFICATION_HALF_RANGE + MAGNIFICATION_INFLUENCE_PADDING;\n const entryRampProgress =\n pointerAxis === null || entryRampStartedAtRef.current === null\n ? 1\n : (frameTime - entryRampStartedAtRef.current) /\n DOCK_MAGNIFICATION_ENTRY_RAMP_MS;\n\n for (let index = 0; index < order.length; index += 1) {\n const anchorKey = order[index];\n if (!anchorKey) {\n continue;\n }\n\n const center = restCentersRef.current?.get(anchorKey);\n if (center === undefined) {\n continue;\n }\n\n const distance =\n pointerAxis === null\n ? DOCK_MAGNIFICATION_HALF_RANGE\n : pointerAxis - center;\n const absoluteDistance = Math.abs(distance);\n const inRange = absoluteDistance < influenceRadius;\n const targetSize = inRange\n ? applyDockMagnificationEntryRamp(\n mapDistanceToTargetSize(distance),\n DOCK_ICON_BASE_SIZE,\n entryRampProgress\n )\n : DOCK_ICON_BASE_SIZE;\n\n const currentSpring = springsRef.current.get(anchorKey) ?? {\n value: DOCK_ICON_BASE_SIZE,\n velocity: 0\n };\n const nextSpring =\n inRange ||\n !isDockMagnificationSpringSettled(currentSpring, DOCK_ICON_BASE_SIZE)\n ? advanceDockMagnificationSpring(\n currentSpring,\n targetSize,\n deltaSeconds\n )\n : currentSpring;\n\n if (\n !inRange &&\n isDockMagnificationSpringSettled(nextSpring, DOCK_ICON_BASE_SIZE)\n ) {\n springsRef.current.delete(anchorKey);\n const slotElement = slots.get(anchorKey);\n if (slotElement) {\n clearDockSlotMagnification(slotElement, appliedStylesRef.current);\n }\n continue;\n }\n\n springsRef.current.set(anchorKey, nextSpring);\n\n const settled = isDockMagnificationSpringSettled(\n nextSpring,\n targetSize\n );\n if (!settled) {\n shouldContinue = true;\n }\n if (\n !isDockMagnificationSpringSettled(nextSpring, DOCK_ICON_BASE_SIZE)\n ) {\n allSettled = false;\n }\n\n const slotElement = slots.get(anchorKey);\n if (!slotElement) {\n continue;\n }\n\n if (isDockMagnificationSlotLayoutLocked(slotElement)) {\n springsRef.current.delete(anchorKey);\n clearDockSlotMagnification(slotElement, appliedStylesRef.current);\n continue;\n }\n\n if (\n pointerAxis === null &&\n isDockMagnificationSpringSettled(nextSpring, DOCK_ICON_BASE_SIZE)\n ) {\n springsRef.current.delete(anchorKey);\n clearDockSlotMagnification(slotElement, appliedStylesRef.current);\n continue;\n }\n\n applyDockSlotMagnification(\n slotElement,\n nextSpring.value,\n DOCK_ICON_BASE_SIZE,\n appliedStylesRef.current\n );\n }\n\n if (pointerAxis !== null) {\n shouldContinue = true;\n } else if (!allSettled) {\n shouldContinue = true;\n }\n\n if (pointerAxis === null && allSettled) {\n entryRampStartedAtRef.current = null;\n restCentersRef.current = null;\n hitBoundsRef.current = null;\n slotOrderRef.current = [];\n setMagnifyActive(false);\n }\n\n if (shouldContinue) {\n animationFrameRef.current = requestAnimationFrame(runAnimationFrame);\n return;\n }\n\n animationFrameRef.current = null;\n lastFrameTimeRef.current = null;\n },\n [captureRestCenters, setMagnifyActive, slotRefs]\n );\n\n const scheduleAnimation = useCallback(() => {\n if (animationFrameRef.current !== null) {\n return;\n }\n animationFrameRef.current = requestAnimationFrame(runAnimationFrame);\n }, [runAnimationFrame]);\n\n const handlePointerMove = useCallback(\n (clientX: number, clientY: number) => {\n if (restCentersRef.current === null) {\n captureRestCenters();\n }\n\n if (\n !isDockMagnificationPointInsideHitBounds({\n clientX,\n clientY,\n dockPlacement,\n hitBounds: hitBoundsRef.current\n })\n ) {\n pendingPointerAxisRef.current = null;\n pointerAxisRef.current = null;\n entryRampStartedAtRef.current = null;\n scheduleAnimation();\n return;\n }\n\n pendingPointerAxisRef.current =\n dockPlacement === \"left\" ? clientY : clientX;\n if (!magnifyActiveRef.current) {\n setMagnifyActive(true);\n }\n scheduleAnimation();\n },\n [captureRestCenters, dockPlacement, scheduleAnimation, setMagnifyActive]\n );\n\n const handlePointerLeave = useCallback(() => {\n pendingPointerAxisRef.current = null;\n pointerAxisRef.current = null;\n scheduleAnimation();\n }, [scheduleAnimation]);\n\n const clearSlotMagnification = useCallback(\n (anchorKey: string) => {\n springsRef.current.delete(anchorKey);\n restCentersRef.current?.delete(anchorKey);\n appliedStylesRef.current.delete(anchorKey);\n hitBoundsRef.current = null;\n slotOrderRef.current = slotOrderRef.current.filter(\n (key) => key !== anchorKey\n );\n const slotElement = slotRefs.current.get(anchorKey);\n if (slotElement) {\n clearDockSlotMagnification(slotElement, appliedStylesRef.current);\n }\n },\n [slotRefs]\n );\n\n const pauseMagnification = useCallback(() => {\n stopAnimation();\n pendingPointerAxisRef.current = null;\n pointerAxisRef.current = null;\n entryRampStartedAtRef.current = null;\n lastFrameTimeRef.current = null;\n }, [stopAnimation]);\n\n const resetMagnification = useCallback(() => {\n stopAnimation();\n for (const slotElement of slotRefs.current.values()) {\n clearDockSlotMagnification(slotElement, appliedStylesRef.current);\n }\n springsRef.current.clear();\n appliedStylesRef.current.clear();\n restCentersRef.current = null;\n hitBoundsRef.current = null;\n slotOrderRef.current = [];\n pointerAxisRef.current = null;\n pendingPointerAxisRef.current = null;\n entryRampStartedAtRef.current = null;\n setMagnifyActive(false);\n }, [setMagnifyActive, slotRefs, stopAnimation]);\n\n useEffect(\n () => () => {\n resetMagnification();\n },\n [resetMagnification]\n );\n\n return {\n clearSlotMagnification,\n handlePointerLeave,\n handlePointerMove,\n pauseMagnification,\n resetMagnification\n };\n}\n","export interface WorkbenchHostDockScrollState {\n canScrollBackward: boolean;\n canScrollForward: boolean;\n hasOverflow: boolean;\n}\n\nexport interface ResolveWorkbenchHostDockScrollStateInput {\n contentSize: number;\n scrollOffset: number;\n scrollSize: number;\n viewportSize: number;\n}\n\nconst dockScrollOverflowEpsilonPx = 1;\n\nexport function resolveWorkbenchHostDockScrollState({\n contentSize,\n scrollOffset,\n scrollSize,\n viewportSize\n}: ResolveWorkbenchHostDockScrollStateInput): WorkbenchHostDockScrollState {\n const hasOverflow = contentSize > viewportSize + dockScrollOverflowEpsilonPx;\n if (!hasOverflow) {\n return {\n canScrollBackward: false,\n canScrollForward: false,\n hasOverflow: false\n };\n }\n\n const maxScrollOffset = Math.max(\n 0,\n Math.max(scrollSize, contentSize) - viewportSize\n );\n\n return {\n canScrollBackward: scrollOffset > dockScrollOverflowEpsilonPx,\n canScrollForward:\n scrollOffset < maxScrollOffset - dockScrollOverflowEpsilonPx,\n hasOverflow\n };\n}\n","import type { WorkbenchNode } from \"../core/types.ts\";\nimport type {\n WorkbenchHostNodeData,\n WorkbenchHostNodeDefinition\n} from \"./types.ts\";\n\nexport const workbenchMinimizedDockVisibleSlotLimit = 5;\nexport const workbenchMinimizedDockStackedVisibleNodeCount = 4;\nexport const workbenchMinimizedDockStackAnchorKey = \"minimized-stack\";\n\nexport type WorkbenchMinimizedDockNode = WorkbenchNode<WorkbenchHostNodeData>;\n\nexport type WorkbenchMinimizedDockSlot =\n | {\n anchorKey: string;\n kind: \"node\";\n node: WorkbenchMinimizedDockNode;\n }\n | {\n anchorKey: string;\n kind: \"stack\";\n nodes: WorkbenchMinimizedDockNode[];\n };\n\nexport function resolveWorkbenchMinimizedDockNodeAnchorKey(\n nodeId: string\n): string {\n return `minimized:${nodeId}`;\n}\n\nexport function resolveWorkbenchMinimizedDockSlots(input: {\n nodeDefinitions: ReadonlyMap<string, WorkbenchHostNodeDefinition>;\n nodes: readonly WorkbenchMinimizedDockNode[];\n}): WorkbenchMinimizedDockSlot[] {\n const minimizedNodes = orderWorkbenchMinimizedDockNodes(input);\n if (minimizedNodes.length === 0) {\n return [];\n }\n if (minimizedNodes.length <= workbenchMinimizedDockVisibleSlotLimit) {\n return minimizedNodes.map((node) => ({\n anchorKey: resolveWorkbenchMinimizedDockNodeAnchorKey(node.id),\n kind: \"node\",\n node\n }));\n }\n\n return [\n ...minimizedNodes\n .slice(0, workbenchMinimizedDockStackedVisibleNodeCount)\n .map((node) => ({\n anchorKey: resolveWorkbenchMinimizedDockNodeAnchorKey(node.id),\n kind: \"node\" as const,\n node\n })),\n {\n anchorKey: workbenchMinimizedDockStackAnchorKey,\n kind: \"stack\",\n nodes: minimizedNodes.slice(workbenchMinimizedDockStackedVisibleNodeCount)\n }\n ];\n}\n\nexport function resolveWorkbenchMinimizedDockAnchorKeyForNode(input: {\n nodeId: string;\n slots: readonly WorkbenchMinimizedDockSlot[];\n}): string | null {\n for (const slot of input.slots) {\n if (slot.kind === \"node\" && slot.node.id === input.nodeId) {\n return slot.anchorKey;\n }\n if (\n slot.kind === \"stack\" &&\n slot.nodes.some((node) => node.id === input.nodeId)\n ) {\n return slot.anchorKey;\n }\n }\n return null;\n}\n\nexport function isWorkbenchMinimizedDockEligibleNode(input: {\n node: WorkbenchMinimizedDockNode;\n nodeDefinitions: ReadonlyMap<string, WorkbenchHostNodeDefinition>;\n}): boolean {\n const definition = input.nodeDefinitions.get(input.node.data.typeId);\n return definition?.window?.minimizedDock !== undefined;\n}\n\nfunction orderWorkbenchMinimizedDockNodes(input: {\n nodeDefinitions: ReadonlyMap<string, WorkbenchHostNodeDefinition>;\n nodes: readonly WorkbenchMinimizedDockNode[];\n}): WorkbenchMinimizedDockNode[] {\n return input.nodes\n .map((node, index) => ({ index, node }))\n .filter(\n ({ node }) =>\n node.isMinimized &&\n isWorkbenchMinimizedDockEligibleNode({\n node,\n nodeDefinitions: input.nodeDefinitions\n })\n )\n .sort((left, right) => {\n const leftTime = left.node.minimizedAtUnixMs ?? 0;\n const rightTime = right.node.minimizedAtUnixMs ?? 0;\n if (leftTime !== rightTime) {\n return rightTime - leftTime;\n }\n return right.index - left.index;\n })\n .map(({ node }) => node);\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport type { WorkbenchMinimizedDockSlot } from \"./minimizedDockSlots.ts\";\n\nexport const minimizedDockStackPromotionDurationMs = 520;\n\nexport function detectMinimizedDockStackPromotion(\n previous: readonly WorkbenchMinimizedDockSlot[],\n next: readonly WorkbenchMinimizedDockSlot[]\n): string | null {\n const previousVisibleNodeIds = new Set(\n previous\n .filter(\n (slot): slot is Extract<WorkbenchMinimizedDockSlot, { kind: \"node\" }> =>\n slot.kind === \"node\"\n )\n .map((slot) => slot.node.id)\n );\n const previousStackNodeIds =\n previous\n .find((slot) => slot.kind === \"stack\")\n ?.nodes.map((node) => node.id) ?? [];\n\n for (const slot of next) {\n if (slot.kind !== \"node\") {\n continue;\n }\n if (\n !previousVisibleNodeIds.has(slot.node.id) &&\n previousStackNodeIds.includes(slot.node.id)\n ) {\n return slot.node.id;\n }\n }\n\n return null;\n}\n\nexport function useMinimizedDockStackPromotion(\n slots: readonly WorkbenchMinimizedDockSlot[]\n) {\n const previousSlotsRef = useRef(slots);\n const promotionTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const [promotedNodeId, setPromotedNodeId] = useState<string | null>(null);\n const [stackDispatching, setStackDispatching] = useState(false);\n\n useEffect(() => {\n const promotedNodeId = detectMinimizedDockStackPromotion(\n previousSlotsRef.current,\n slots\n );\n previousSlotsRef.current = slots;\n\n if (!promotedNodeId) {\n return undefined;\n }\n\n setPromotedNodeId(promotedNodeId);\n setStackDispatching(true);\n if (promotionTimerRef.current !== null) {\n clearTimeout(promotionTimerRef.current);\n }\n promotionTimerRef.current = setTimeout(() => {\n promotionTimerRef.current = null;\n setPromotedNodeId(null);\n setStackDispatching(false);\n }, minimizedDockStackPromotionDurationMs);\n\n return () => {\n if (promotionTimerRef.current !== null) {\n clearTimeout(promotionTimerRef.current);\n promotionTimerRef.current = null;\n }\n };\n }, [slots]);\n\n return { promotedNodeId, stackDispatching };\n}\n","import type { WorkbenchMinimizedDockSlot } from \"./minimizedDockSlots.ts\";\n\nexport type WorkbenchMinimizedDockRestoreIntent =\n | {\n anchorKey: string;\n kind: \"node-slot\";\n nodeId: string;\n }\n | {\n anchorKey: string;\n kind: \"stack-popup-card\";\n nodeId: string;\n stackAnchorKey: string;\n };\n\nexport type WorkbenchMinimizedDockRestoreSource =\n | {\n anchorKey: string;\n kind: \"node-slot\";\n }\n | {\n kind: \"stack-popup-card\";\n stackAnchorKey: string;\n };\n\nexport function resolveWorkbenchMinimizedDockRestoreIntent(input: {\n nodeId: string;\n slots: readonly WorkbenchMinimizedDockSlot[];\n source: WorkbenchMinimizedDockRestoreSource;\n}): WorkbenchMinimizedDockRestoreIntent | null {\n const { source } = input;\n switch (source.kind) {\n case \"node-slot\": {\n const slot = input.slots.find(\n (slot) => slot.anchorKey === source.anchorKey\n );\n if (slot?.kind !== \"node\" || slot.node.id !== input.nodeId) {\n return null;\n }\n return {\n anchorKey: slot.anchorKey,\n kind: \"node-slot\",\n nodeId: input.nodeId\n };\n }\n\n case \"stack-popup-card\": {\n const slot = input.slots.find(\n (slot) => slot.anchorKey === source.stackAnchorKey\n );\n if (\n slot?.kind !== \"stack\" ||\n !slot.nodes.some((node) => node.id === input.nodeId)\n ) {\n return null;\n }\n return {\n anchorKey: slot.anchorKey,\n kind: \"stack-popup-card\",\n nodeId: input.nodeId,\n stackAnchorKey: slot.anchorKey\n };\n }\n }\n}\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type CSSProperties,\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactNode\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n Button,\n CheckIcon,\n CloseIcon,\n FileCreateIcon,\n MaximizeIcon,\n MinimizeIcon,\n OverviewLayoutIcon,\n PinFilledIcon,\n PinIcon,\n cn\n} from \"@tutti-os/ui-system\";\nimport type { WorkbenchNode } from \"../core/types.ts\";\nimport {\n captureWorkbenchNodePreviewImage,\n writeCachedWorkbenchNodePreviewImage\n} from \"../react/useWorkbenchGenieAnimation.tsx\";\nimport type {\n WorkbenchDockPreviewContent,\n WorkbenchHostDockPopupCardLabelMode,\n WorkbenchHostHandle,\n WorkbenchHostNodeData,\n WorkbenchHostProps\n} from \"./types.ts\";\nimport type { WorkbenchDockPlacement } from \"../react/types.ts\";\nimport {\n resolveInitialMinimizedStackScrollOffset,\n resolveMinimizedStackLeftGutterPx,\n resolveMinimizedStackPanelWidthPx,\n resolveMinimizedStackPopupLeftPx,\n resolveMinimizedStackPopupTopPx,\n resolveMinimizedStackTrackHeightPx,\n resolveMinimizedStackTrackTranslateXPx,\n resolveMinimizedStackViewportHeightPx\n} from \"./minimizedStackScroll.ts\";\nimport type {\n WorkbenchDockPreviewCache,\n WorkbenchDockPreviewCacheKey,\n WorkbenchDockPreviewCacheKeyResolver\n} from \"../react/dockPreviewCache.ts\";\n\nconst dockPopupCardWidthPx = 165;\nconst dockPopupGridGapPx = 8;\nconst dockPopupPanelPaddingInlinePx = 12;\nconst dockPopupPanelBorderInlinePx = 2;\nconst dockPopupPlacementGapPx = 14;\nconst dockPopupMinimizedStackLaunchDisappearMs = 0;\nconst dockPopupMinimizedStackPopupZIndex = 100300;\nconst dockPopupPreviewCacheMaxEntries = 64;\nconst dockPopupPreviewByMemoryKey = new Map<\n string,\n WorkbenchHostDockPopupCapturedPreview\n>();\nconst pendingDockPopupPreviewMemoryKeys = new Set<string>();\n\ntype WorkbenchHostDockPopupCapturedPreview = {\n preview: WorkbenchDockPreviewContent | null;\n revision: string | null;\n};\n\ntype WorkbenchHostDockPopupPreviewState =\n | {\n preview: WorkbenchDockPreviewContent;\n status: \"ready\";\n }\n | {\n status: \"loading\" | \"fallback\";\n };\n\nexport interface WorkbenchHostDockPopupAnchorRect {\n dockRight?: number;\n height: number;\n left: number;\n top: number;\n width: number;\n}\n\nexport interface WorkbenchHostDockPopupState {\n anchorRect: WorkbenchHostDockPopupAnchorRect;\n entryId: string;\n kind: \"context-menu\" | \"preview\";\n}\n\nexport interface WorkbenchHostDockPopupItem {\n externalNodeState?: unknown;\n externalWorkspaceState?: unknown;\n host: WorkbenchHostHandle;\n isFocused: boolean;\n isMinimized: boolean;\n node: WorkbenchNode<WorkbenchHostNodeData>;\n preview: WorkbenchDockPreviewContent | null;\n previewRevision: string | null;\n subtitle: string | null;\n title: string | null;\n}\n\nexport type WorkbenchHostDockPopupVariant =\n | \"context-menu\"\n | \"default\"\n | \"minimized-stack\";\n\nexport interface WorkbenchHostDockPopupRetentionAction {\n checked: boolean;\n disabled?: boolean;\n label: string;\n pendingLabel?: string;\n}\n\ninterface WorkbenchHostDockPopupCardStyle extends CSSProperties {\n \"--desktop-dock-popup-card-lift\"?: string;\n \"--desktop-dock-popup-card-scale\"?: string;\n \"--desktop-dock-popup-card-z-index\"?: string;\n \"--desktop-dock-popup-fan-delay\"?: string;\n \"--desktop-dock-popup-fan-rotate\"?: string;\n \"--desktop-dock-popup-fan-x\"?: string;\n \"--desktop-dock-popup-fan-y\"?: string;\n}\n\ninterface WorkbenchHostDockPopupRootStyle extends CSSProperties {\n \"--desktop-dock-minimized-stack-width\"?: string;\n \"--desktop-dock-popup-columns\": string;\n \"--desktop-dock-popup-width\": string;\n}\n\nconst popupCardMagnificationRange = 160;\nconst popupCardMaxScale = 1.16;\nconst popupCardMaxLiftPx = 10;\n\nfunction resolvePopupCardMagnificationStyle(\n pointer: { x: number; y: number } | null,\n element: HTMLElement | null\n): WorkbenchHostDockPopupCardStyle | undefined {\n if (!pointer || !element) {\n return undefined;\n }\n\n const rect = element.getBoundingClientRect();\n const centerX = rect.left + rect.width / 2;\n const centerY = rect.top + rect.height / 2;\n const distance = Math.hypot(pointer.x - centerX, pointer.y - centerY);\n const influence = Math.max(0, 1 - distance / popupCardMagnificationRange);\n if (influence <= 0) {\n return undefined;\n }\n\n const eased = influence * influence * (3 - 2 * influence);\n const scale = 1 + (popupCardMaxScale - 1) * eased;\n const lift = -popupCardMaxLiftPx * eased;\n return {\n \"--desktop-dock-popup-card-lift\": `${Math.round(lift * 10) / 10}px`,\n \"--desktop-dock-popup-card-scale\": `${Math.round(scale * 1000) / 1000}`,\n \"--desktop-dock-popup-card-z-index\": `${Math.round(1 + influence * 20)}`\n };\n}\n\nfunction resolvePopupFanCardStyle(\n index: number,\n count: number,\n placement: WorkbenchDockPlacement\n): WorkbenchHostDockPopupCardStyle {\n const safeCount = Math.max(1, count);\n const cappedIndex = Math.min(index, safeCount - 1);\n const arcDirection = placement === \"left\" ? -1 : 1;\n const arcX = cappedIndex * 6 * arcDirection;\n const arcY = -18 - cappedIndex * 78;\n const rotateDeg = (-2 + cappedIndex * 0.8) * arcDirection;\n\n return {\n \"--desktop-dock-popup-fan-delay\": `${index * 22}ms`,\n \"--desktop-dock-popup-fan-rotate\": `${Math.round(rotateDeg * 10) / 10}deg`,\n \"--desktop-dock-popup-fan-x\": `${Math.round(arcX)}px`,\n \"--desktop-dock-popup-fan-y\": `${Math.round(arcY)}px`\n };\n}\n\nfunction readDockPopupPreviewImage(\n memoryKey: string\n): WorkbenchHostDockPopupCapturedPreview | undefined {\n return dockPopupPreviewByMemoryKey.get(memoryKey);\n}\n\nfunction writeDockPopupPreviewImage(\n memoryKey: string,\n preview: WorkbenchDockPreviewContent | null,\n revision: string | null\n): void {\n dockPopupPreviewByMemoryKey.delete(memoryKey);\n dockPopupPreviewByMemoryKey.set(memoryKey, { preview, revision });\n while (dockPopupPreviewByMemoryKey.size > dockPopupPreviewCacheMaxEntries) {\n const oldestMemoryKey = dockPopupPreviewByMemoryKey.keys().next().value;\n if (typeof oldestMemoryKey !== \"string\") {\n break;\n }\n dockPopupPreviewByMemoryKey.delete(oldestMemoryKey);\n }\n}\n\nexport function WorkbenchHostDockPopup({\n anchorRect,\n canEnterFullscreen,\n canShowAllWindows,\n capturePreview,\n debugDiagnostics,\n dockRetention,\n dockPreviewCache,\n fullscreenLabel,\n hideLabel,\n items,\n label,\n labelMode,\n newWindowLabel,\n closeWindowLabel,\n onClose,\n onCloseNode,\n onCreateNew,\n onEnterFullscreen,\n onHide,\n onRunDockRetentionAction,\n onSelectNode,\n onShowAllWindows,\n openLabel,\n onQuit,\n placement = \"bottom\",\n quitLabel,\n resolveDockPreviewCacheKey,\n showAllWindowsLabel,\n showCreateNew,\n showOpen,\n variant\n}: {\n anchorRect: WorkbenchHostDockPopupState[\"anchorRect\"];\n canEnterFullscreen?: boolean;\n canShowAllWindows?: boolean;\n capturePreview?: (\n item: WorkbenchHostDockPopupItem\n ) =>\n | Promise<WorkbenchDockPreviewContent | string | null>\n | WorkbenchDockPreviewContent\n | string\n | null;\n debugDiagnostics?: WorkbenchHostProps[\"debugDiagnostics\"];\n dockRetention?: WorkbenchHostDockPopupRetentionAction | null;\n dockPreviewCache?: WorkbenchDockPreviewCache;\n fullscreenLabel?: string;\n hideLabel?: string;\n items: WorkbenchHostDockPopupItem[];\n label: string;\n labelMode?: WorkbenchHostDockPopupCardLabelMode;\n newWindowLabel: string;\n closeWindowLabel: (title: string) => string;\n onClose: () => void;\n onCloseNode: (nodeId: string) => void;\n onCreateNew: () => void;\n onEnterFullscreen?: () => void;\n onHide?: () => void;\n onRunDockRetentionAction?: () => void;\n onSelectNode: (nodeId: string) => void;\n onShowAllWindows?: () => void;\n openLabel?: string;\n onQuit?: () => void;\n placement?: WorkbenchDockPlacement;\n quitLabel?: string;\n resolveDockPreviewCacheKey?: WorkbenchDockPreviewCacheKeyResolver<WorkbenchHostNodeData>;\n showAllWindowsLabel?: string;\n showCreateNew?: boolean;\n showOpen?: boolean;\n variant?: WorkbenchHostDockPopupVariant;\n}) {\n const resolvedLabelMode = labelMode ?? \"hover-overlay\";\n const resolvedVariant = variant ?? \"default\";\n const isMinimizedStack = resolvedVariant === \"minimized-stack\";\n const isContextMenu = resolvedVariant === \"context-menu\";\n const createCardCount = showCreateNew === false ? 0 : 1;\n const cardElementsRef = useRef(new Map<string, HTMLElement>());\n const cardRefCallbacksRef = useRef(\n new Map<string, (element: HTMLElement | null) => void>()\n );\n const popupRootRef = useRef<HTMLDivElement | null>(null);\n const minimizedStackViewportRef = useRef<HTMLDivElement | null>(null);\n const [pointer, setPointer] = useState<{ x: number; y: number } | null>(null);\n const [minimizedStackScrollOffset, setMinimizedStackScrollOffset] =\n useState(0);\n const [capturedPreviewByMemoryKey, setCapturedPreviewByMemoryKey] = useState<\n Record<string, WorkbenchHostDockPopupCapturedPreview | undefined>\n >({});\n const columnCount = isContextMenu\n ? 1\n : Math.min(Math.max(items.length + createCardCount, 1), 3);\n const popupWidthPx = isContextMenu\n ? 268\n : columnCount * dockPopupCardWidthPx +\n Math.max(0, columnCount - 1) * dockPopupGridGapPx +\n dockPopupPanelPaddingInlinePx * 2 +\n dockPopupPanelBorderInlinePx;\n const popupCenterY = anchorRect.top + anchorRect.height / 2;\n const isLeftMinimizedStack = placement === \"left\" && isMinimizedStack;\n const minimizedStackTrackHeightPx = resolveMinimizedStackTrackHeightPx(\n items.length\n );\n const minimizedStackViewportHeightPx = isMinimizedStack\n ? resolveMinimizedStackViewportHeightPx({\n anchorCenterY: popupCenterY,\n placement,\n trackHeightPx: minimizedStackTrackHeightPx\n })\n : minimizedStackTrackHeightPx;\n const minimizedStackTrackTranslateXPx = isMinimizedStack\n ? resolveMinimizedStackTrackTranslateXPx({\n itemCount: items.length,\n placement,\n scrollOffset: minimizedStackScrollOffset,\n trackHeightPx: minimizedStackTrackHeightPx,\n viewportHeightPx: minimizedStackViewportHeightPx\n })\n : 0;\n const minimizedStackLeftGutterPx = isLeftMinimizedStack\n ? resolveMinimizedStackLeftGutterPx({\n itemCount: items.length,\n placement,\n scrollOffset: minimizedStackScrollOffset,\n trackHeightPx: minimizedStackTrackHeightPx,\n viewportHeightPx: minimizedStackViewportHeightPx,\n trackTranslateXPx: minimizedStackTrackTranslateXPx\n })\n : 0;\n const minimizedStackPanelWidthPx = isLeftMinimizedStack\n ? resolveMinimizedStackPanelWidthPx(items.length, placement, {\n leftGutterPx: minimizedStackLeftGutterPx\n })\n : null;\n const popupStyle: WorkbenchHostDockPopupRootStyle = {\n \"--desktop-dock-popup-columns\": String(columnCount),\n \"--desktop-dock-popup-width\":\n minimizedStackPanelWidthPx != null\n ? `${minimizedStackPanelWidthPx}px`\n : `${popupWidthPx}px`,\n ...(minimizedStackPanelWidthPx != null\n ? {\n \"--desktop-dock-minimized-stack-width\": `${minimizedStackPanelWidthPx}px`,\n minWidth: minimizedStackPanelWidthPx,\n width: minimizedStackPanelWidthPx\n }\n : {}),\n left: isLeftMinimizedStack\n ? resolveMinimizedStackPopupLeftPx({\n anchorLeft: anchorRect.left,\n anchorWidth: anchorRect.width,\n dockRightPx: anchorRect.dockRight,\n leftGutterPx: minimizedStackLeftGutterPx\n })\n : placement === \"left\"\n ? anchorRect.left + anchorRect.width + dockPopupPlacementGapPx\n : anchorRect.left + anchorRect.width / 2,\n top: isLeftMinimizedStack\n ? resolveMinimizedStackPopupTopPx({ anchorTop: anchorRect.top })\n : placement === \"left\"\n ? popupCenterY\n : anchorRect.top - dockPopupPlacementGapPx,\n ...(isLeftMinimizedStack\n ? { zIndex: dockPopupMinimizedStackPopupZIndex }\n : {})\n };\n const minimizedStackMaxScrollOffset = Math.max(\n 0,\n minimizedStackTrackHeightPx - minimizedStackViewportHeightPx\n );\n const initialMinimizedStackScrollOffset =\n resolveInitialMinimizedStackScrollOffset({\n maxScrollOffset: minimizedStackMaxScrollOffset\n });\n const panelStyle: CSSProperties = {\n \"--desktop-dock-popup-columns\": String(columnCount),\n \"--desktop-dock-popup-item-count\": String(Math.max(1, items.length)),\n ...(isMinimizedStack\n ? {\n height: minimizedStackViewportHeightPx,\n minHeight: minimizedStackViewportHeightPx,\n ...(isLeftMinimizedStack && minimizedStackPanelWidthPx != null\n ? {\n width: minimizedStackPanelWidthPx,\n minWidth: minimizedStackPanelWidthPx,\n \"--desktop-dock-minimized-stack-left-gutter\": `${minimizedStackLeftGutterPx}px`\n }\n : {})\n }\n : {})\n } as CSSProperties;\n const popupDiagnosticKey = items.map((item) => item.node.id).join(\"|\");\n\n useEffect(() => {\n logWorkbenchDockPopupDebug(\"dock.popup.rendered\", debugDiagnostics, {\n hasCapturePreview: Boolean(capturePreview),\n itemCount: popupDiagnosticKey ? popupDiagnosticKey.split(\"|\").length : 0,\n nodeIds: popupDiagnosticKey ? popupDiagnosticKey.split(\"|\") : [],\n placement,\n variant: resolvedVariant\n });\n }, [\n capturePreview,\n debugDiagnostics,\n placement,\n popupDiagnosticKey,\n resolvedVariant\n ]);\n\n useLayoutEffect(() => {\n const rootElement = popupRootRef.current;\n const panelElement =\n rootElement?.querySelector<HTMLElement>(\n \"[data-desktop-dock-popup-panel]\"\n ) ?? null;\n logWorkbenchDockPopupDebug(\"dock.popup.layout\", debugDiagnostics, {\n panelRect: panelElement ? rectToDiagnostic(panelElement) : null,\n rootRect: rootElement ? rectToDiagnostic(rootElement) : null,\n rootStyle: rootElement ? styleToDiagnostic(rootElement) : null,\n viewportHeight: window.innerHeight,\n viewportWidth: window.innerWidth\n });\n }, [debugDiagnostics, popupDiagnosticKey]);\n\n const registerCard = useCallback((nodeId: string) => {\n const existing = cardRefCallbacksRef.current.get(nodeId);\n if (existing) {\n return existing;\n }\n\n const callback = (element: HTMLElement | null) => {\n if (element) {\n cardElementsRef.current.set(nodeId, element);\n } else {\n cardElementsRef.current.delete(nodeId);\n }\n };\n cardRefCallbacksRef.current.set(nodeId, callback);\n return callback;\n }, []);\n\n useEffect(() => {\n if (!isLeftMinimizedStack) {\n return;\n }\n document.body.setAttribute(\n \"data-desktop-dock-minimized-stack-open\",\n \"true\"\n );\n return () => {\n document.body.removeAttribute(\"data-desktop-dock-minimized-stack-open\");\n };\n }, [isLeftMinimizedStack]);\n\n useEffect(() => {\n const handlePointerDown = (event: PointerEvent) => {\n if (!(event.target instanceof Element)) {\n onClose();\n return;\n }\n if (\n event.target.closest(\"[data-desktop-dock-slot]\") ||\n event.target.closest(\"[data-desktop-dock-popup-card]\") ||\n event.target.closest(\n '.desktop-dock-popup-root:not([data-popup-variant=\"minimized-stack\"])'\n )\n ) {\n return;\n }\n onClose();\n };\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n onClose();\n }\n };\n\n window.addEventListener(\"pointerdown\", handlePointerDown, true);\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n window.removeEventListener(\"pointerdown\", handlePointerDown, true);\n window.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [onClose]);\n\n const previewCaptureKey = items\n .map(\n (item) =>\n `${item.node.id}:${previewCacheToken(item.preview)}:${item.previewRevision ?? \"\"}`\n )\n .join(\"|\");\n\n useEffect(() => {\n if (!isMinimizedStack) {\n return;\n }\n setMinimizedStackScrollOffset(initialMinimizedStackScrollOffset);\n }, [initialMinimizedStackScrollOffset, isMinimizedStack, items.length]);\n\n useEffect(() => {\n if (!isMinimizedStack) {\n return;\n }\n const viewport = minimizedStackViewportRef.current;\n if (!viewport) {\n return;\n }\n const handleWheel = (event: WheelEvent) => {\n event.preventDefault();\n event.stopPropagation();\n setMinimizedStackScrollOffset((current) =>\n Math.min(\n minimizedStackMaxScrollOffset,\n Math.max(0, current + event.deltaY)\n )\n );\n };\n viewport.addEventListener(\"wheel\", handleWheel, { passive: false });\n return () => viewport.removeEventListener(\"wheel\", handleWheel);\n }, [isMinimizedStack, minimizedStackMaxScrollOffset]);\n\n useEffect(() => {\n if (!capturePreview || isContextMenu) {\n return;\n }\n let cancelled = false;\n const missingItems = items.filter((item) => {\n const revision = item.previewRevision;\n const previewMemoryKey = resolveDockPopupPreviewMemoryKey(\n item.node,\n resolveDockPreviewCacheKey?.(item.node) ?? null\n );\n const capturedPreview =\n capturedPreviewByMemoryKey[previewMemoryKey] ??\n readDockPopupPreviewImage(previewMemoryKey);\n const hasCapturedPreview =\n capturedPreview !== undefined && capturedPreview.revision === revision;\n const shouldCaptureMissingPreview = !item.preview && !hasCapturedPreview;\n return (\n shouldCaptureMissingPreview &&\n !pendingDockPopupPreviewMemoryKeys.has(previewMemoryKey)\n );\n });\n if (missingItems.length === 0) {\n logWorkbenchDockPopupDebug(\n \"dock.popup.preview_capture.batch\",\n debugDiagnostics,\n {\n itemCount: items.length,\n missingNodeIds: []\n }\n );\n return () => {\n cancelled = true;\n };\n }\n logWorkbenchDockPopupDebug(\n \"dock.popup.preview_capture.batch\",\n debugDiagnostics,\n {\n itemCount: items.length,\n missingNodeIds: missingItems.map((item) => item.node.id)\n }\n );\n\n for (const item of missingItems) {\n pendingDockPopupPreviewMemoryKeys.add(\n resolveDockPopupPreviewMemoryKey(\n item.node,\n resolveDockPreviewCacheKey?.(item.node) ?? null\n )\n );\n }\n\n void (async () => {\n for (const item of missingItems) {\n if (cancelled) {\n break;\n }\n\n const revision = item.previewRevision;\n logWorkbenchDockPopupDebug(\n \"dock.popup.preview_capture.started\",\n debugDiagnostics,\n {\n isMinimized: item.isMinimized,\n nodeId: item.node.id,\n revision\n }\n );\n const previewMemoryKey = resolveDockPopupPreviewMemoryKey(\n item.node,\n resolveDockPreviewCacheKey?.(item.node) ?? null\n );\n const cacheKey = resolveDockPopupPreviewCacheKey(\n resolveDockPreviewCacheKey?.(item.node) ?? null,\n revision\n );\n if (item.isMinimized && cacheKey) {\n const minimizedPersistedPreview = await readPersistedDockPreview(\n dockPreviewCache,\n cacheKey\n );\n if (cancelled) {\n break;\n }\n if (minimizedPersistedPreview) {\n const persistedPreview: WorkbenchDockPreviewContent = {\n kind: \"image\",\n src: minimizedPersistedPreview\n };\n writeCachedWorkbenchNodePreviewImage(\n item.node.id,\n minimizedPersistedPreview\n );\n writeDockPopupPreviewImage(\n previewMemoryKey,\n persistedPreview,\n revision\n );\n setCapturedPreviewByMemoryKey((current) => ({\n ...current,\n [previewMemoryKey]: {\n preview: persistedPreview,\n revision\n }\n }));\n pendingDockPopupPreviewMemoryKeys.delete(previewMemoryKey);\n continue;\n }\n }\n\n const preview = normalizeDockPopupPreviewContentResult(\n item.isMinimized\n ? ((await capturePreview?.(item)) ??\n (await captureWorkbenchNodePreviewImage(item.node.id, {\n bypassCache: false\n })))\n : await Promise.resolve(capturePreview?.(item) ?? null).catch(\n () => null\n ),\n revision\n );\n if (cancelled) {\n break;\n }\n logWorkbenchDockPopupDebug(\n \"dock.popup.preview_capture.resolved\",\n debugDiagnostics,\n {\n hasPreview: Boolean(preview),\n nodeId: item.node.id,\n providerRevision: preview?.revision ?? null,\n revision\n }\n );\n if (preview) {\n if (preview.kind === \"image\") {\n writeCachedWorkbenchNodePreviewImage(item.node.id, preview.src);\n }\n writeDockPopupPreviewImage(previewMemoryKey, preview, revision);\n if (cacheKey && preview.kind === \"image\") {\n dockPreviewCache?.write({\n key: cacheKey,\n previewImageUrl: preview.src\n });\n }\n setCapturedPreviewByMemoryKey((current) => ({\n ...current,\n [previewMemoryKey]: { preview, revision }\n }));\n pendingDockPopupPreviewMemoryKeys.delete(previewMemoryKey);\n continue;\n }\n\n const fallbackPersistedPreview =\n !item.isMinimized && cacheKey\n ? await readPersistedDockPreview(dockPreviewCache, cacheKey)\n : null;\n if (cancelled) {\n break;\n }\n if (fallbackPersistedPreview) {\n writeCachedWorkbenchNodePreviewImage(\n item.node.id,\n fallbackPersistedPreview\n );\n }\n if (fallbackPersistedPreview || item.isMinimized) {\n const fallbackPreview: WorkbenchDockPreviewContent | null =\n fallbackPersistedPreview\n ? { kind: \"image\", src: fallbackPersistedPreview }\n : null;\n writeDockPopupPreviewImage(\n previewMemoryKey,\n fallbackPreview,\n revision\n );\n }\n if (!cancelled) {\n const fallbackPreview: WorkbenchDockPreviewContent | null =\n fallbackPersistedPreview\n ? { kind: \"image\", src: fallbackPersistedPreview }\n : null;\n setCapturedPreviewByMemoryKey((current) => ({\n ...current,\n [previewMemoryKey]: { preview: fallbackPreview, revision }\n }));\n }\n pendingDockPopupPreviewMemoryKeys.delete(previewMemoryKey);\n }\n })().catch(() => {\n for (const item of missingItems) {\n const previewMemoryKey = resolveDockPopupPreviewMemoryKey(\n item.node,\n resolveDockPreviewCacheKey?.(item.node) ?? null\n );\n writeDockPopupPreviewImage(\n previewMemoryKey,\n null,\n item.previewRevision\n );\n pendingDockPopupPreviewMemoryKeys.delete(previewMemoryKey);\n }\n if (!cancelled) {\n setCapturedPreviewByMemoryKey((current) => ({\n ...current,\n ...Object.fromEntries(\n missingItems.map((item) => {\n const previewMemoryKey = resolveDockPopupPreviewMemoryKey(\n item.node,\n resolveDockPreviewCacheKey?.(item.node) ?? null\n );\n return [\n previewMemoryKey,\n { preview: null, revision: item.previewRevision }\n ];\n })\n )\n }));\n }\n });\n\n return () => {\n cancelled = true;\n for (const item of missingItems) {\n pendingDockPopupPreviewMemoryKeys.delete(\n resolveDockPopupPreviewMemoryKey(\n item.node,\n resolveDockPreviewCacheKey?.(item.node) ?? null\n )\n );\n }\n };\n }, [\n capturePreview,\n dockPreviewCache,\n isContextMenu,\n items,\n previewCaptureKey,\n resolveDockPreviewCacheKey\n ]);\n\n const content = (\n <div\n ref={popupRootRef}\n className=\"desktop-dock-popup-root\"\n data-dock-placement={placement}\n data-desktop-dock-popup-root=\"true\"\n data-popup-variant={resolvedVariant}\n style={popupStyle}\n >\n <div\n aria-label={label}\n className={cn(\n \"desktop-dock-popup relative origin-bottom rounded-lg border border-[var(--border-1)] bg-background-fronted text-[var(--text-primary)] shadow-panel motion-safe:animate-in motion-safe:fade-in-0 motion-safe:zoom-in-95 motion-safe:slide-in-from-bottom-2 motion-safe:duration-[175ms] motion-safe:ease-[cubic-bezier(0.22,1,0.36,1)] motion-reduce:animate-none\",\n isContextMenu ? \"p-1\" : \"p-3\",\n isLeftMinimizedStack\n ? \"w-full min-w-0 max-w-none\"\n : \"w-[min(var(--desktop-dock-popup-width,366px),calc(100vw-32px))]\"\n )}\n data-desktop-dock-popup-panel=\"true\"\n data-popup-variant={resolvedVariant}\n onPointerDown={(event) => event.stopPropagation()}\n onPointerMove={\n isMinimizedStack\n ? (event) => setPointer({ x: event.clientX, y: event.clientY })\n : undefined\n }\n onPointerLeave={isMinimizedStack ? () => setPointer(null) : undefined}\n role=\"dialog\"\n style={panelStyle}\n >\n {isContextMenu ? (\n <WorkbenchHostDockContextMenu\n canCreateNew={showCreateNew !== false}\n canEnterFullscreen={canEnterFullscreen === true}\n canShowAllWindows={canShowAllWindows === true}\n dockRetention={dockRetention}\n fullscreenLabel={fullscreenLabel}\n hideLabel={hideLabel}\n items={items}\n newWindowLabel={newWindowLabel}\n onCreateNew={onCreateNew}\n onEnterFullscreen={onEnterFullscreen}\n onHide={onHide}\n onQuit={onQuit}\n onRunDockRetentionAction={onRunDockRetentionAction}\n onSelectNode={onSelectNode}\n onShowAllWindows={onShowAllWindows}\n openLabel={openLabel}\n quitLabel={quitLabel}\n showAllWindowsLabel={showAllWindowsLabel}\n showOpen={showOpen === true}\n />\n ) : (\n <>\n <div className=\"mb-2.5 flex items-center justify-between\">\n <span className=\"min-w-0 truncate text-sm font-semibold\">\n {label}\n </span>\n </div>\n {isMinimizedStack ? (\n <div\n ref={minimizedStackViewportRef}\n className=\"desktop-dock-popup__minimized-stack-viewport\"\n style={{\n height: minimizedStackViewportHeightPx,\n ...(isLeftMinimizedStack\n ? { paddingLeft: minimizedStackLeftGutterPx }\n : {})\n }}\n >\n <div\n className=\"desktop-dock-popup__minimized-stack-track\"\n style={{\n minHeight: minimizedStackTrackHeightPx,\n transform: `translate(${minimizedStackTrackTranslateXPx}px, ${-minimizedStackScrollOffset}px)`\n }}\n >\n {items.map((item, index) => {\n const previewMemoryKey = resolveDockPopupPreviewMemoryKey(\n item.node,\n resolveDockPreviewCacheKey?.(item.node) ?? null\n );\n const capturedPreview =\n capturedPreviewByMemoryKey[previewMemoryKey] !== undefined\n ? capturedPreviewByMemoryKey[previewMemoryKey]\n : readDockPopupPreviewImage(previewMemoryKey);\n const previewState = resolveDockPopupItemPreviewState(\n item,\n capturedPreview,\n Boolean(capturePreview)\n );\n return (\n <WorkbenchHostDockPopupCard\n key={item.node.id}\n ref={registerCard(item.node.id)}\n closeWindowLabel={closeWindowLabel}\n item={item}\n labelMode={resolvedLabelMode}\n onCloseNode={onCloseNode}\n onSelectNode={onSelectNode}\n previewState={previewState}\n style={{\n ...resolvePopupFanCardStyle(\n index,\n items.length,\n placement\n ),\n ...resolvePopupCardMagnificationStyle(\n pointer,\n cardElementsRef.current.get(item.node.id) ?? null\n )\n }}\n variant={resolvedVariant}\n />\n );\n })}\n </div>\n </div>\n ) : (\n <div className=\"grid max-h-[min(52vh,420px)] grid-cols-[repeat(var(--desktop-dock-popup-columns,2),165px)] gap-2 overflow-auto overscroll-contain\">\n {items.map((item) => {\n const previewMemoryKey = resolveDockPopupPreviewMemoryKey(\n item.node,\n resolveDockPreviewCacheKey?.(item.node) ?? null\n );\n const capturedPreview =\n capturedPreviewByMemoryKey[previewMemoryKey] !== undefined\n ? capturedPreviewByMemoryKey[previewMemoryKey]\n : readDockPopupPreviewImage(previewMemoryKey);\n const previewState = resolveDockPopupItemPreviewState(\n item,\n capturedPreview,\n Boolean(capturePreview)\n );\n return (\n <WorkbenchHostDockPopupCard\n key={item.node.id}\n ref={registerCard(item.node.id)}\n closeWindowLabel={closeWindowLabel}\n item={item}\n labelMode={resolvedLabelMode}\n onCloseNode={onCloseNode}\n onSelectNode={onSelectNode}\n previewState={previewState}\n variant={resolvedVariant}\n />\n );\n })}\n {showCreateNew !== false ? (\n <button\n className=\"flex h-[103px] w-[165px] min-w-0 flex-col items-center justify-center gap-2 rounded-[8px] border border-dashed border-[var(--border-1)] bg-transparency-block text-center text-[var(--text-secondary)] transition-colors hover:bg-transparency-hover hover:text-[var(--text-primary)]\"\n type=\"button\"\n onClick={onCreateNew}\n >\n <FileCreateIcon\n aria-hidden=\"true\"\n className=\"text-[var(--text-primary)]\"\n size={28}\n />\n <span className=\"text-xs font-semibold text-[var(--text-primary)]\">\n {newWindowLabel}\n </span>\n </button>\n ) : null}\n </div>\n )}\n </>\n )}\n </div>\n </div>\n );\n\n if (typeof document === \"undefined\" || !document.body) {\n return content;\n }\n return createPortal(content, document.body);\n}\n\nfunction WorkbenchHostDockContextMenu({\n canCreateNew,\n canEnterFullscreen,\n canShowAllWindows,\n dockRetention,\n fullscreenLabel,\n hideLabel,\n items,\n newWindowLabel,\n onCreateNew,\n onEnterFullscreen,\n onHide,\n onQuit,\n onRunDockRetentionAction,\n onSelectNode,\n onShowAllWindows,\n openLabel,\n quitLabel,\n showAllWindowsLabel,\n showOpen\n}: {\n canCreateNew: boolean;\n canEnterFullscreen: boolean;\n canShowAllWindows: boolean;\n dockRetention?: WorkbenchHostDockPopupRetentionAction | null;\n fullscreenLabel?: string;\n hideLabel?: string;\n items: WorkbenchHostDockPopupItem[];\n newWindowLabel: string;\n onCreateNew: () => void;\n onEnterFullscreen?: () => void;\n onHide?: () => void;\n onQuit?: () => void;\n onRunDockRetentionAction?: () => void;\n onSelectNode: (nodeId: string) => void;\n onShowAllWindows?: () => void;\n openLabel?: string;\n quitLabel?: string;\n showAllWindowsLabel?: string;\n showOpen: boolean;\n}) {\n const hasOpenWindows = items.length > 0;\n const hasNewWindowCommand = hasOpenWindows && canCreateNew;\n const hasOpenCommand = !hasOpenWindows;\n const hasDockActionGroup =\n Boolean(dockRetention) || hasNewWindowCommand || hasOpenCommand;\n const hasWindowActionGroup = hasOpenWindows;\n\n return (\n <div\n className=\"flex min-w-0 flex-col gap-1\"\n data-desktop-dock-context-menu=\"true\"\n role=\"menu\"\n >\n {hasOpenWindows ? (\n <>\n <div className=\"max-h-48 min-w-0 overflow-auto overscroll-contain\">\n {items.map((item) => (\n <WorkbenchHostDockContextMenuItem\n key={item.node.id}\n checked={!item.isMinimized}\n label={item.title?.trim() || item.node.title}\n onSelect={() => onSelectNode(item.node.id)}\n />\n ))}\n </div>\n </>\n ) : null}\n {hasOpenWindows && (hasDockActionGroup || hasWindowActionGroup) ? (\n <WorkbenchHostDockContextMenuSeparator />\n ) : null}\n {dockRetention ? (\n <WorkbenchHostDockContextMenuItem\n checked={dockRetention.checked}\n checkedIcon={\n <PinFilledIcon\n aria-hidden=\"true\"\n className=\"size-4 text-[var(--tutti-purple)]\"\n />\n }\n disabled={dockRetention.disabled}\n icon={<PinIcon aria-hidden=\"true\" className=\"size-4\" />}\n label={dockRetention.pendingLabel ?? dockRetention.label}\n onSelect={onRunDockRetentionAction}\n />\n ) : null}\n {hasNewWindowCommand ? (\n <WorkbenchHostDockContextMenuItem\n icon={<FileCreateIcon aria-hidden=\"true\" className=\"size-4\" />}\n label={newWindowLabel}\n onSelect={onCreateNew}\n />\n ) : null}\n {hasOpenCommand ? (\n <WorkbenchHostDockContextMenuItem\n disabled={!showOpen}\n icon={<FileCreateIcon aria-hidden=\"true\" className=\"size-4\" />}\n label={openLabel}\n onSelect={onCreateNew}\n />\n ) : null}\n {hasOpenWindows ? (\n <>\n {hasDockActionGroup ? (\n <WorkbenchHostDockContextMenuSeparator />\n ) : null}\n {canShowAllWindows && onShowAllWindows ? (\n <WorkbenchHostDockContextMenuItem\n icon={\n <OverviewLayoutIcon aria-hidden=\"true\" className=\"size-4\" />\n }\n label={showAllWindowsLabel}\n onSelect={onShowAllWindows}\n />\n ) : null}\n <WorkbenchHostDockContextMenuItem\n disabled={!canEnterFullscreen || !onEnterFullscreen}\n icon={<MaximizeIcon aria-hidden=\"true\" className=\"size-4\" />}\n label={fullscreenLabel}\n onSelect={onEnterFullscreen}\n />\n <WorkbenchHostDockContextMenuItem\n disabled={!onHide}\n icon={<MinimizeIcon aria-hidden=\"true\" className=\"size-4\" />}\n label={hideLabel}\n onSelect={onHide}\n />\n <WorkbenchHostDockContextMenuItem\n disabled={!onQuit}\n icon={<CloseIcon aria-hidden=\"true\" className=\"size-4\" />}\n label={quitLabel}\n onSelect={onQuit}\n />\n </>\n ) : null}\n </div>\n );\n}\n\nfunction WorkbenchHostDockContextMenuItem({\n checked,\n checkedIcon,\n disabled,\n icon,\n label,\n onSelect\n}: {\n checked?: boolean;\n checkedIcon?: ReactNode;\n disabled?: boolean;\n icon?: ReactNode;\n label?: string;\n onSelect?: () => void;\n}) {\n return (\n <button\n className={cn(\n \"flex h-8 w-full min-w-0 items-center gap-2 rounded-md px-2 text-left text-sm text-[var(--text-primary)] transition-colors\",\n disabled\n ? \"cursor-default opacity-45\"\n : \"hover:bg-transparency-hover focus-visible:bg-transparency-hover focus-visible:outline-none\"\n )}\n disabled={disabled}\n role=\"menuitem\"\n type=\"button\"\n onClick={() => {\n if (disabled || !onSelect) {\n return;\n }\n onSelect();\n }}\n >\n <span className=\"flex size-4 shrink-0 items-center justify-center text-[var(--text-secondary)]\">\n {checked && checkedIcon ? (\n checkedIcon\n ) : checked ? (\n <CheckIcon\n aria-hidden=\"true\"\n className=\"size-4 text-[var(--tutti-purple)]\"\n />\n ) : (\n (icon ?? null)\n )}\n </span>\n <span className=\"min-w-0 truncate\">{label}</span>\n </button>\n );\n}\n\nfunction WorkbenchHostDockContextMenuSeparator() {\n return (\n <div\n aria-hidden=\"true\"\n className=\"mx-2 my-1 h-px bg-[var(--border-1)]\"\n role=\"separator\"\n />\n );\n}\n\nfunction readPersistedDockPreview(\n dockPreviewCache: WorkbenchDockPreviewCache | undefined,\n cacheKey: WorkbenchDockPreviewCacheKey | null\n): Promise<string | null> {\n if (!cacheKey) {\n return Promise.resolve(null);\n }\n return (\n dockPreviewCache?.read(cacheKey).catch(() => null) ?? Promise.resolve(null)\n );\n}\n\nfunction resolveDockPopupPreviewCacheKey(\n cacheKey: WorkbenchDockPreviewCacheKey | null,\n revision: string | null\n): WorkbenchDockPreviewCacheKey | null {\n return cacheKey ? { ...cacheKey, revision } : null;\n}\n\nfunction resolveDockPopupPreviewMemoryKey(\n node: WorkbenchNode<WorkbenchHostNodeData>,\n cacheKey: WorkbenchDockPreviewCacheKey | null\n): string {\n if (!cacheKey) {\n return `node:${node.id}`;\n }\n return `cache:${JSON.stringify({\n instanceId: cacheKey.instanceId,\n instanceKey: cacheKey.instanceKey ?? null,\n nodeId: cacheKey.nodeId,\n typeId: cacheKey.typeId,\n workspaceId: cacheKey.workspaceId\n })}`;\n}\n\nfunction normalizeDockPopupPreviewContentResult(\n preview: WorkbenchDockPreviewContent | string | null | undefined,\n revision: string | null\n): WorkbenchDockPreviewContent | null {\n if (!preview) {\n return null;\n }\n if (typeof preview === \"string\") {\n return { kind: \"image\", revision: revision ?? undefined, src: preview };\n }\n return {\n ...preview,\n revision: preview.revision ?? revision ?? undefined\n };\n}\n\nfunction resolveDockPopupItemPreviewState(\n item: WorkbenchHostDockPopupItem,\n capturedPreview: WorkbenchHostDockPopupCapturedPreview | undefined,\n hasPreviewProvider: boolean\n): WorkbenchHostDockPopupPreviewState {\n const revision = item.previewRevision;\n if (item.preview) {\n return { preview: item.preview, status: \"ready\" };\n }\n if (\n capturedPreview &&\n capturedPreview.revision === revision &&\n capturedPreview.preview\n ) {\n return { preview: capturedPreview.preview, status: \"ready\" };\n }\n if (\n (capturedPreview !== undefined && capturedPreview.revision === revision) ||\n !hasPreviewProvider\n ) {\n return { status: \"fallback\" };\n }\n return { status: \"loading\" };\n}\n\nfunction previewCacheToken(\n preview: WorkbenchDockPreviewContent | null | undefined\n): string {\n if (!preview) {\n return \"\";\n }\n switch (preview.kind) {\n case \"component\":\n return `component:${preview.revision ?? \"\"}`;\n case \"image\":\n return `image:${preview.revision ?? \"\"}:${preview.src}`;\n }\n}\n\nfunction logWorkbenchDockPopupDebug(\n event: string,\n debugDiagnostics: WorkbenchHostProps[\"debugDiagnostics\"],\n details: Record<string, unknown>\n): void {\n if (!debugDiagnostics?.log) {\n return;\n }\n void Promise.resolve(\n debugDiagnostics.log({\n details,\n event,\n level: \"info\",\n source: \"workbench-dock\"\n })\n ).catch(() => undefined);\n}\n\nfunction rectToDiagnostic(element: HTMLElement): Record<string, number> {\n const rect = element.getBoundingClientRect();\n return {\n bottom: Math.round(rect.bottom),\n height: Math.round(rect.height),\n left: Math.round(rect.left),\n right: Math.round(rect.right),\n top: Math.round(rect.top),\n width: Math.round(rect.width)\n };\n}\n\nfunction styleToDiagnostic(element: HTMLElement): Record<string, string> {\n const style = window.getComputedStyle(element);\n return {\n display: style.display,\n opacity: style.opacity,\n pointerEvents: style.pointerEvents,\n position: style.position,\n transform: style.transform,\n visibility: style.visibility,\n zIndex: style.zIndex\n };\n}\n\ninterface WorkbenchHostDockPopupCardProps {\n closeWindowLabel: (title: string) => string;\n item: WorkbenchHostDockPopupItem;\n labelMode?: WorkbenchHostDockPopupCardLabelMode;\n onCloseNode: (nodeId: string) => void;\n onSelectNode: (nodeId: string) => void;\n previewState: WorkbenchHostDockPopupPreviewState;\n style?: CSSProperties;\n variant?: WorkbenchHostDockPopupVariant;\n}\n\nconst WorkbenchHostDockPopupCard = forwardRef<\n HTMLDivElement,\n WorkbenchHostDockPopupCardProps\n>(function WorkbenchHostDockPopupCard(\n {\n closeWindowLabel,\n item,\n labelMode,\n onCloseNode,\n onSelectNode,\n previewState,\n style,\n variant\n },\n ref\n) {\n const title = item.title?.trim() || item.node.title;\n const isMinimizedStack = variant === \"minimized-stack\";\n const [isLaunching, setIsLaunching] = useState(false);\n const launchTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(\n () => () => {\n if (launchTimerRef.current !== null) {\n clearTimeout(launchTimerRef.current);\n }\n },\n []\n );\n\n const handleSelect = useCallback(() => {\n if (!isMinimizedStack) {\n onSelectNode(item.node.id);\n return;\n }\n if (launchTimerRef.current !== null) {\n return;\n }\n setIsLaunching(true);\n launchTimerRef.current = setTimeout(() => {\n launchTimerRef.current = null;\n onSelectNode(item.node.id);\n }, dockPopupMinimizedStackLaunchDisappearMs);\n }, [isMinimizedStack, item.node.id, onSelectNode]);\n const handleSelectKeyDown = useCallback(\n (event: ReactKeyboardEvent<HTMLDivElement>) => {\n if (event.key !== \"Enter\" && event.key !== \" \") {\n return;\n }\n event.preventDefault();\n handleSelect();\n },\n [handleSelect]\n );\n const hasReadyPreview = previewState.status === \"ready\";\n\n return (\n <div\n ref={ref}\n className={cn(\n \"group/dock-popup-card relative flex h-[103px] w-[165px] min-w-0 flex-col overflow-hidden rounded-[8px] border border-[var(--border-1)] bg-background-fronted text-left text-[var(--text-primary)] transition-[border-color,color] duration-150\",\n item.isMinimized && \"text-[var(--text-secondary)]\"\n )}\n data-active={item.isFocused ? \"true\" : undefined}\n data-desktop-dock-popup-card=\"true\"\n data-fan-card={isMinimizedStack ? \"true\" : undefined}\n data-launching={isLaunching ? \"true\" : undefined}\n data-minimized={item.isMinimized ? \"true\" : undefined}\n style={style}\n >\n <div\n aria-label={title}\n data-active={item.isFocused ? \"true\" : undefined}\n className={cn(\n \"relative flex min-h-0 min-w-0 flex-1 cursor-pointer flex-col overflow-hidden rounded-md bg-transparent text-inherit\",\n hasReadyPreview ? \"p-0\" : \"p-1\"\n )}\n role=\"button\"\n tabIndex={0}\n onClick={handleSelect}\n onKeyDown={handleSelectKeyDown}\n >\n <WorkbenchHostDockPopupCardPreview previewState={previewState} />\n {labelMode === \"hover-overlay\" && item.title?.trim() ? (\n <WorkbenchHostDockPopupCardLabel title={item.title} />\n ) : null}\n </div>\n <Button\n aria-label={closeWindowLabel(title)}\n className=\"absolute top-1.5 right-1.5 z-[2] rounded-full bg-[var(--background-fronted)] opacity-0 transition-[background-color,opacity] duration-150 hover:bg-[var(--background-fronted)] focus-visible:bg-[var(--background-fronted)] group-hover/dock-popup-card:opacity-100 group-focus-within/dock-popup-card:opacity-100 focus-visible:opacity-100\"\n size=\"icon-sm\"\n title={closeWindowLabel(title)}\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n onCloseNode(item.node.id);\n }}\n >\n <CloseIcon className=\"size-3.5\" />\n </Button>\n {item.isFocused ? (\n <span\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute inset-0 z-[3] rounded-md shadow-[inset_0_0_0_2px_var(--border-focus)]\"\n data-desktop-dock-popup-card-active-overlay=\"true\"\n />\n ) : null}\n {isMinimizedStack ? (\n <span className=\"desktop-dock-popup__fan-title-tip\" title={title}>\n {title}\n </span>\n ) : null}\n </div>\n );\n});\n\nfunction WorkbenchHostDockPopupCardPreview({\n previewState\n}: {\n previewState: WorkbenchHostDockPopupPreviewState;\n}) {\n if (previewState.status !== \"ready\") {\n return (\n <span\n className=\"flex min-h-0 min-w-0 flex-1 flex-col justify-center gap-[7px] rounded-md border border-[var(--border-1)] bg-transparency-block px-3 py-[11px]\"\n aria-hidden=\"true\"\n data-preview-state={previewState.status}\n >\n <span className=\"block h-[7px] w-[72%] rounded-full bg-transparency-hover\" />\n <span className=\"block h-[7px] w-[58%] rounded-full bg-transparency-hover\" />\n <span className=\"block h-[7px] w-[34%] rounded-full bg-transparency-hover\" />\n </span>\n );\n }\n\n const preview = previewState.preview;\n if (preview.kind === \"component\") {\n return (\n <span\n className=\"block min-h-0 min-w-0 flex-1 overflow-hidden rounded-md\"\n aria-hidden=\"true\"\n data-preview-kind={preview.kind}\n data-preview-state={previewState.status}\n >\n {preview.element}\n </span>\n );\n }\n\n return (\n <span\n className=\"block min-h-0 min-w-0 flex-1 overflow-hidden rounded-md\"\n aria-hidden=\"true\"\n data-preview-kind={preview.kind}\n data-preview-state={previewState.status}\n >\n <img\n alt=\"\"\n className=\"block h-full max-h-full w-full max-w-full object-contain object-center\"\n draggable={false}\n src={preview.src}\n />\n </span>\n );\n}\n\nfunction WorkbenchHostDockPopupCardLabel({ title }: { title: string }) {\n return (\n <span\n className=\"pointer-events-none absolute inset-x-0 bottom-0 z-[1] flex h-[30px] items-end px-[10px] pb-0.5 text-[var(--white-stationary)] opacity-0 transition-opacity duration-150 [text-shadow:0_1px_2px_rgb(0_0_0_/_20%)] group-hover/dock-popup-card:opacity-100 group-focus-within/dock-popup-card:opacity-100\"\n style={{\n background:\n \"linear-gradient(180deg, transparent 0%, color-mix(in srgb, hsl(var(--card)) 28%, transparent) 18%, color-mix(in srgb, hsl(var(--card)) 82%, transparent) 56%, color-mix(in srgb, hsl(var(--card)) 98%, transparent) 100%)\"\n }}\n title={title}\n >\n <span className=\"desktop-dock-popup__title-viewport block min-w-0 flex-1 overflow-hidden whitespace-nowrap\">\n <span className=\"desktop-dock-popup__title-marquee inline-block max-w-full overflow-hidden text-[12px] font-semibold leading-5 text-ellipsis whitespace-nowrap\">\n {title}\n </span>\n </span>\n </span>\n );\n}\n","import type { WorkbenchDockPlacement } from \"../react/types.ts\";\n\nconst minimizedStackViewportMarginPx = 56;\nconst minimizedStackViewportCapPx = 112;\nexport const minimizedStackCardWidthPx = 118;\nexport const minimizedStackLeftPlacementGapPx = 4;\nexport const minimizedStackLeftDockClearancePx = 2;\nexport const workbenchLeftDockLeftInsetPx = 4;\nexport const workbenchLeftDockViewportWidthPx = 124;\nexport const minimizedStackLeftGutterMinPx = 4;\nexport const minimizedStackLeftPopupNudgeLeftPx = 60;\nexport const minimizedStackLeftPopupNudgeDownPx = 32;\nconst minimizedStackLeftGutterBufferPx = 8;\nexport const minimizedStackTitleTipGapPx = 12;\nexport const minimizedStackTitleTipMaxWidthPx = 220;\nexport const minimizedStackFanStepXPx = 6;\nexport const minimizedStackFanStepYPx = 78;\nexport const minimizedStackFanBaseOffsetYPx = 18;\nexport const minimizedStackStackPaddingPx = 96;\n\nexport function resolveMinimizedStackCardHeightPx(): number {\n return Math.round((minimizedStackCardWidthPx * 10) / 16);\n}\n\nexport function resolveMinimizedStackTrackHeightPx(itemCount: number): number {\n const safeCount = Math.max(1, itemCount);\n return (\n minimizedStackFanBaseOffsetYPx +\n Math.max(0, safeCount - 1) * minimizedStackFanStepYPx +\n resolveMinimizedStackCardHeightPx() +\n minimizedStackStackPaddingPx\n );\n}\n\nexport function resolveMaxMinimizedStackTrackTranslateXPx(\n itemCount: number,\n placement: WorkbenchDockPlacement\n): number {\n if (placement !== \"left\" || itemCount <= 1) {\n return 0;\n }\n return (itemCount - 1) * minimizedStackFanStepXPx;\n}\n\nexport function resolveMinimizedStackLeftGutterPx(input: {\n itemCount: number;\n placement: WorkbenchDockPlacement;\n scrollOffset?: number;\n trackHeightPx?: number;\n viewportHeightPx?: number;\n trackTranslateXPx?: number;\n}): number {\n if (input.placement !== \"left\" || input.itemCount <= 0) {\n return 0;\n }\n\n if (\n input.scrollOffset === undefined ||\n input.trackHeightPx === undefined ||\n input.viewportHeightPx === undefined ||\n input.trackTranslateXPx === undefined\n ) {\n return (\n minimizedStackLeftGutterMinPx +\n resolveMaxMinimizedStackTrackTranslateXPx(\n input.itemCount,\n input.placement\n ) +\n minimizedStackLeftGutterBufferPx\n );\n }\n\n const cardHeightPx = resolveMinimizedStackCardHeightPx();\n const visibleTop = input.scrollOffset;\n const visibleBottom = input.scrollOffset + input.viewportHeightPx;\n let minCardLeftPx = 0;\n\n for (let index = 0; index < input.itemCount; index += 1) {\n const cappedIndex = Math.min(index, Math.max(0, input.itemCount - 1));\n const fanYPx =\n -minimizedStackFanBaseOffsetYPx - index * minimizedStackFanStepYPx;\n const cardTop = input.trackHeightPx + fanYPx - cardHeightPx;\n const cardBottom = input.trackHeightPx + fanYPx;\n if (cardBottom < visibleTop || cardTop > visibleBottom) {\n continue;\n }\n\n const fanXPx = -cappedIndex * minimizedStackFanStepXPx;\n const cardLeftPx = input.trackTranslateXPx + fanXPx;\n minCardLeftPx = Math.min(minCardLeftPx, cardLeftPx);\n }\n\n return Math.max(\n minimizedStackLeftGutterMinPx,\n -minCardLeftPx + minimizedStackLeftGutterBufferPx\n );\n}\n\nexport function resolveMinimizedStackPanelWidthPx(\n itemCount: number,\n placement: WorkbenchDockPlacement,\n options?: { leftGutterPx?: number }\n): number {\n const leftGutterPx =\n options?.leftGutterPx ??\n resolveMinimizedStackLeftGutterPx({ itemCount, placement });\n return (\n leftGutterPx +\n minimizedStackCardWidthPx +\n minimizedStackTitleTipGapPx +\n minimizedStackTitleTipMaxWidthPx\n );\n}\n\nexport function resolveMinimizedStackPopupLeftPx(input: {\n anchorLeft: number;\n anchorWidth: number;\n dockRightPx?: number;\n leftGutterPx?: number;\n}): number {\n const fromAnchor =\n input.anchorLeft + input.anchorWidth + minimizedStackLeftPlacementGapPx;\n const dockRight =\n input.dockRightPx ??\n workbenchLeftDockLeftInsetPx + workbenchLeftDockViewportWidthPx;\n const fromDock = dockRight + minimizedStackLeftDockClearancePx;\n const baseLeft = Math.max(fromAnchor, fromDock);\n const leftGutterPx = input.leftGutterPx ?? minimizedStackLeftGutterMinPx;\n return (\n baseLeft -\n Math.max(0, leftGutterPx - minimizedStackLeftGutterMinPx) -\n minimizedStackLeftPopupNudgeLeftPx\n );\n}\n\nexport function resolveMinimizedStackPopupTopPx(input: {\n anchorTop: number;\n}): number {\n return input.anchorTop + minimizedStackLeftPopupNudgeDownPx;\n}\n\nexport function resolveMinimizedStackViewportHeightPx(input: {\n anchorCenterY: number;\n placement: WorkbenchDockPlacement;\n trackHeightPx: number;\n viewportHeightPx?: number;\n}): number {\n const viewportCap =\n input.viewportHeightPx ??\n (typeof window === \"undefined\"\n ? input.trackHeightPx\n : window.innerHeight - minimizedStackViewportCapPx);\n\n if (input.placement === \"left\") {\n const availableAbove = Math.max(\n 160,\n input.anchorCenterY - minimizedStackViewportMarginPx\n );\n return Math.min(input.trackHeightPx, availableAbove, viewportCap);\n }\n\n return Math.min(input.trackHeightPx, viewportCap);\n}\n\nexport function resolveInitialMinimizedStackScrollOffset(input: {\n maxScrollOffset: number;\n}): number {\n return input.maxScrollOffset;\n}\n\nexport function resolveMinimizedStackFocalCardIndex(input: {\n itemCount: number;\n scrollOffset: number;\n trackHeightPx: number;\n viewportHeightPx: number;\n}): number {\n if (input.itemCount <= 1) {\n return 0;\n }\n\n const cardHeightPx = resolveMinimizedStackCardHeightPx();\n const viewportCenterY = input.scrollOffset + input.viewportHeightPx / 2;\n const rawIndex =\n (input.trackHeightPx -\n minimizedStackFanBaseOffsetYPx -\n cardHeightPx / 2 -\n viewportCenterY) /\n minimizedStackFanStepYPx;\n\n return Math.min(input.itemCount - 1, Math.max(0, rawIndex));\n}\n\nexport function resolveMinimizedStackFanXPx(input: {\n focalIndex: number;\n itemCount: number;\n placement: WorkbenchDockPlacement;\n}): number {\n if (input.itemCount <= 0) {\n return 0;\n }\n\n const cappedIndex = Math.min(\n input.focalIndex,\n Math.max(0, input.itemCount - 1)\n );\n const fanDirection = input.placement === \"left\" ? -1 : 1;\n return cappedIndex * minimizedStackFanStepXPx * fanDirection;\n}\n\nexport function resolveMinimizedStackTrackTranslateXPx(input: {\n itemCount: number;\n placement: WorkbenchDockPlacement;\n scrollOffset: number;\n trackHeightPx: number;\n viewportHeightPx: number;\n}): number {\n if (input.itemCount <= 0) {\n return 0;\n }\n\n const focalIndex = resolveMinimizedStackFocalCardIndex({\n itemCount: input.itemCount,\n scrollOffset: input.scrollOffset,\n trackHeightPx: input.trackHeightPx,\n viewportHeightPx: input.viewportHeightPx\n });\n const fanXPx = resolveMinimizedStackFanXPx({\n focalIndex,\n itemCount: input.itemCount,\n placement: input.placement\n });\n\n return -fanXPx;\n}\n","import type { WorkbenchRenderWindowHeader } from \"../react/types.ts\";\nimport type {\n WorkbenchHostNodeData,\n WorkbenchHostNodeHeaderContext\n} from \"./types.ts\";\n\nexport function createWorkbenchHostNodeHeaderWindowActions(\n context: Parameters<WorkbenchRenderWindowHeader<WorkbenchHostNodeData>>[0],\n input: {\n requestNodeClose?: (nodeId: string) => void;\n } = {}\n): WorkbenchHostNodeHeaderContext[\"windowActions\"] {\n return {\n applyQuickLayout(target) {\n context.controller.commands.applyQuickLayout(context.node.id, target);\n },\n close() {\n if (input.requestNodeClose) {\n input.requestNodeClose(context.node.id);\n return;\n }\n context.controller.commands.closeNode(context.node.id);\n },\n focus() {\n context.controller.commands.focusNode(context.node.id);\n },\n minimize() {\n context.genie.minimizeNodeToAnchor(context.node.id, () =>\n context.controller.commands.minimizeNode(context.node.id)\n );\n },\n resize(frame) {\n context.controller.commands.resizeNode(context.node.id, frame);\n },\n toggleDisplayMode() {\n if (context.node.displayMode === \"fullscreen\") {\n context.controller.commands.exitFullscreen(context.node.id);\n return;\n }\n context.controller.commands.enterFullscreen(context.node.id);\n }\n };\n}\n","import { selectFocusedWorkbenchNode } from \"../core/selectors.ts\";\nimport type {\n WorkbenchRenderNodeContext,\n WorkbenchRenderWindowHeader\n} from \"../react/types.ts\";\nimport { readWorkbenchHostExternalState } from \"./externalState.ts\";\nimport { createWorkbenchHostNodeHeaderWindowActions } from \"./windowActions.ts\";\nimport type {\n WorkbenchHostExternalStateSource,\n WorkbenchHostHandle,\n WorkbenchHostNodeBodyContext,\n WorkbenchHostNodeData,\n WorkbenchHostNodeDefinition,\n WorkbenchHostNodeHeaderContext\n} from \"./types.ts\";\n\nexport function createWorkbenchHostNodeBodyContext<\n TExternalNodeState,\n TExternalWorkspaceState\n>({\n context,\n externalStateSource,\n host,\n workspaceId\n}: {\n context: WorkbenchRenderNodeContext<WorkbenchHostNodeData>;\n definition: WorkbenchHostNodeDefinition<\n TExternalNodeState,\n TExternalWorkspaceState\n >;\n externalStateSource?: WorkbenchHostExternalStateSource;\n host: WorkbenchHostHandle;\n workspaceId: string;\n}): WorkbenchHostNodeBodyContext<TExternalNodeState, TExternalWorkspaceState> {\n const externalState = readWorkbenchHostExternalState({\n externalStateSource,\n node: context.node,\n workspaceId\n });\n\n return {\n activation: context.node.data.activation ?? null,\n displayMode: context.node.displayMode,\n externalNodeState: externalState.externalNodeState as TExternalNodeState,\n externalWorkspaceState:\n externalState.externalWorkspaceState as TExternalWorkspaceState,\n focus() {\n host.focusNode(context.node.id);\n },\n host,\n instanceId: context.node.data.instanceId,\n instanceKey: context.node.data.instanceKey ?? null,\n isFocused:\n selectFocusedWorkbenchNode(host.getSnapshot())?.id === context.node.id,\n node: context.node,\n setNodeRuntimeState(state) {\n host.setNodeRuntimeState(context.node.id, state);\n },\n setSnapshotNodeState(state) {\n host.setSnapshotNodeState(context.node.id, state);\n }\n };\n}\n\nexport function createWorkbenchHostNodeHeaderContext<\n TExternalNodeState,\n TExternalWorkspaceState\n>({\n context,\n externalStateSource,\n host,\n workspaceId\n}: {\n context: Parameters<WorkbenchRenderWindowHeader<WorkbenchHostNodeData>>[0];\n definition: WorkbenchHostNodeDefinition<\n TExternalNodeState,\n TExternalWorkspaceState\n >;\n externalStateSource?: WorkbenchHostExternalStateSource;\n host: WorkbenchHostHandle;\n workspaceId: string;\n}): WorkbenchHostNodeHeaderContext<\n TExternalNodeState,\n TExternalWorkspaceState\n> {\n const externalState = readWorkbenchHostExternalState({\n externalStateSource,\n node: context.node,\n workspaceId\n });\n\n return {\n activation: context.node.data.activation ?? null,\n defaultActions: context.defaultActions,\n displayMode: context.node.displayMode,\n dragHandleProps: context.dragHandleProps,\n externalNodeState: externalState.externalNodeState as TExternalNodeState,\n externalWorkspaceState:\n externalState.externalWorkspaceState as TExternalWorkspaceState,\n instanceId: context.node.data.instanceId,\n instanceKey: context.node.data.instanceKey ?? null,\n isFocused:\n selectFocusedWorkbenchNode(host.getSnapshot())?.id === context.node.id,\n node: context.node,\n surfaceSize: context.surfaceSize,\n windowActions: createWorkbenchHostNodeHeaderWindowActions(context, {\n requestNodeClose: (nodeId) => host.requestNodeClose(nodeId)\n })\n };\n}\n","import { Button, CloseIcon, MinimizeIcon } from \"@tutti-os/ui-system\";\nimport type { WorkbenchWindowActionContext } from \"../react/types.ts\";\nimport type {\n WorkbenchHostHandle,\n WorkbenchHostNodeData,\n WorkbenchHostNodeDefinition\n} from \"./types.ts\";\nimport type { WorkbenchHostI18nRuntime } from \"./workbenchHostI18n.ts\";\n\nexport function WorkbenchHostWindowActions({\n context,\n host,\n i18n,\n nodeDefinitions\n}: {\n context: WorkbenchWindowActionContext<WorkbenchHostNodeData>;\n host: WorkbenchHostHandle;\n i18n: WorkbenchHostI18nRuntime;\n nodeDefinitions: Map<string, WorkbenchHostNodeDefinition>;\n}) {\n const definition = nodeDefinitions.get(context.node.data.typeId);\n if (!definition) {\n return null;\n }\n\n const minimizable = definition.window?.minimizable !== false;\n const closable = definition.window?.closable !== false;\n\n return (\n <>\n {minimizable ? (\n <Button\n aria-label={i18n.t(\"actions.minimize\")}\n className=\"order-1 rounded-md\"\n data-workbench-action=\"minimize\"\n size=\"icon-sm\"\n type=\"button\"\n variant=\"chrome\"\n onClick={() => {\n context.genie.minimizeNodeToAnchor(context.node.id, () =>\n context.controller.commands.minimizeNode(context.node.id)\n );\n }}\n >\n <MinimizeIcon className=\"size-3.5\" />\n </Button>\n ) : null}\n {closable ? (\n <Button\n aria-label={i18n.t(\"actions.close\")}\n className=\"order-3 rounded-md\"\n data-workbench-action=\"close\"\n size=\"icon-sm\"\n type=\"button\"\n variant=\"chrome\"\n onClick={() => {\n host.requestNodeClose(context.node.id);\n }}\n >\n <CloseIcon className=\"size-3.5\" />\n </Button>\n ) : null}\n </>\n );\n}\n"],"mappings":"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","names":["useMemo","useLayoutEffect","useRef","useState","useCallback","useState","useState","useCallback","nodeIds","useCallback","useEffect","useMemo","jsx","jsx","useMemo","useMemo","Button","jsx","useCallback","useCallback","useCallback","useCallback","useCallback","useCallback","Fragment","jsx","jsxs","jsx","jsxs","useMemo","useEffect","useEffect","useLayoutEffect","useRef","useCallback","useEffect","useRef","useState","jsx","resolveDockPreviewCacheKey","useRef","useState","useCallback","useEffect","minimizeCommitted","commitMinimize","generation","nodeElement","wasFocusedForCapture","pendingMinimizedNode","anchorKey","dockRect","jsx","jsxs","resolveDockPreviewCacheKey","useCallback","useEffect","useEffect","useMemo","useState","normalizeWorkbenchSnapshot","normalizeWorkbenchSnapshot","resolvedFrame","entry","useState","useMemo","useEffect","noop","useCallback","useMemo","useCallback","useEffect","useLayoutEffect","useMemo","useRef","useState","Button","useCallback","useEffect","useRef","slotElement","useEffect","useRef","useState","promotedNodeId","slot","useCallback","useEffect","useLayoutEffect","useRef","useState","createPortal","Button","MaximizeIcon","Fragment","jsx","jsxs","resolveDockPreviewCacheKey","useRef","useState","useEffect","useLayoutEffect","useCallback","createPortal","MaximizeIcon","WorkbenchHostDockPopupCard","Button","jsx","jsxs","useMemo","useRef","useState","useCallback","useEffect","useLayoutEffect","activeHoverPanel","activeLabelTooltip","labelTooltipTarget","dockButton","node","relatedTarget","Button","left","right","top","bottom","Button","CloseIcon","MinimizeIcon","Fragment","jsx","jsxs","jsx","jsxs","useMemo","useCallback","resolveDockPreviewCacheKey","jsx","noop","useMemo"]}
1
+ {"version":3,"sources":["../src/store/commands.ts","../src/core/types.ts","../src/core/geometry.ts","../src/core/stack.ts","../src/core/reducer.ts","../src/store/subscribe.ts","../src/store/createWorkbenchStore.ts","../src/store/createWorkbenchController.ts","../src/host/WorkbenchHost.tsx","../src/mission-control/WorkbenchMissionControlOverlay.tsx","../src/mission-control/layoutDock.ts","../src/mission-control/useWorkbenchMissionControlPresence.ts","../src/mission-control/useWorkbenchMissionControlState.ts","../src/mission-control/layout.ts","../src/react/WorkbenchSurface.tsx","../src/react/WorkbenchDockFrame.tsx","../src/core/selectors.ts","../src/react/WorkbenchProvider.tsx","../src/react/dockNodeSelectors.ts","../src/react/hooks/useWorkbenchSelector.ts","../src/react/WorkbenchNodeLayer.tsx","../src/react/WorkbenchWindowFrame.tsx","../src/react/WorkbenchWindowFullscreenToggle.tsx","../src/react/hooks/useWorkbenchDrag.ts","../src/react/hooks/useWorkbenchSnap.ts","../src/react/hooks/useWorkbenchResize.ts","../src/react/windowHeader.ts","../src/react/renderedNodeIds.ts","../src/react/hooks/useWorkbenchShortcuts.ts","../src/react/hooks/useWorkbenchSurfaceSize.ts","../src/react/useWorkbenchGenieAnimation.tsx","../src/react/genieAnimation.ts","../src/host/hostConfig.ts","../src/host/useWorkbenchHostRuntime.ts","../src/store/createDerivedSnapshotGetter.ts","../src/host/activations.ts","../src/host/missionControlAdapter.ts","../src/core/snapshot.ts","../src/core/placement.ts","../src/host/nodeIdentity.ts","../src/host/sessionState.ts","../src/host/externalState.ts","../src/host/snapshotSanitizer.ts","../src/host/session.ts","../src/host/useWorkbenchHostSurfaceRenderers.tsx","../src/host/WorkbenchHostDock.tsx","../src/host/dockEntries.ts","../src/host/dockMagnification.ts","../src/host/dockScrollState.ts","../src/host/minimizedDockSlots.ts","../src/host/minimizedDockStackPromotion.ts","../src/host/minimizedDockRestoreIntent.ts","../src/host/WorkbenchHostDockPopup.tsx","../src/host/minimizedStackScroll.ts","../src/host/windowActions.ts","../src/host/hostNodeContext.ts","../src/host/WorkbenchHostWindowActions.tsx"],"sourcesContent":["import type {\n WorkbenchFrame,\n WorkbenchLayoutPreset,\n WorkbenchNode,\n WorkbenchNodeSizeConstraints,\n WorkbenchQuickLayoutTarget,\n WorkbenchLayoutConstraintsInput,\n WorkbenchSize,\n WorkbenchSnapTarget,\n WorkbenchState\n} from \"../core/types.ts\";\nimport type { WorkbenchStore } from \"./types.ts\";\n\nexport interface WorkbenchCommands<TData = unknown> {\n replaceState(state: Partial<WorkbenchState<TData>>): void;\n replaceNodes(nodes: WorkbenchNode<TData>[]): void;\n openNode(node: WorkbenchNode<TData>): void;\n closeNode(nodeID: string): void;\n focusNode(nodeID: string): void;\n minimizeNode(nodeID: string): void;\n restoreNode(nodeID: string): void;\n enterFullscreen(nodeID: string): void;\n exitFullscreen(nodeID: string): void;\n applyQuickLayout(nodeID: string, target: WorkbenchQuickLayoutTarget): void;\n applyLayoutPreset(nodeIDs: string[], preset: WorkbenchLayoutPreset): void;\n applyActiveSnapTarget(nodeID: string): void;\n applySnapTarget(nodeID: string, snapTarget: WorkbenchSnapTarget): void;\n dragNode(nodeID: string, frame: WorkbenchFrame): void;\n moveNode(nodeID: string, frame: WorkbenchFrame): void;\n resizeNode(nodeID: string, frame: WorkbenchFrame): void;\n setActiveDragNode(nodeID: string | null): void;\n setActiveResizeNode(nodeID: string | null): void;\n setActiveSnapTarget(snapTarget: WorkbenchSnapTarget): void;\n setSurfaceSize(size: WorkbenchSize): void;\n setLayoutConstraints(constraints: WorkbenchLayoutConstraintsInput): void;\n setNodeSizeConstraints(\n nodeID: string,\n sizeConstraints: WorkbenchNodeSizeConstraints | null\n ): void;\n}\n\nexport function createWorkbenchCommands<TData>(\n store: WorkbenchStore<TData>\n): WorkbenchCommands<TData> {\n return {\n replaceState(state) {\n store.dispatch({ type: \"replaceState\", state });\n },\n replaceNodes(nodes) {\n store.dispatch({ type: \"replaceNodes\", nodes });\n },\n openNode(node) {\n store.dispatch({ type: \"openNode\", node });\n },\n closeNode(nodeID) {\n store.dispatch({ type: \"closeNode\", nodeID });\n },\n focusNode(nodeID) {\n store.dispatch({ type: \"focusNode\", nodeID });\n },\n minimizeNode(nodeID) {\n store.dispatch({ type: \"minimizeNode\", nodeID });\n },\n restoreNode(nodeID) {\n store.dispatch({ type: \"restoreNode\", nodeID });\n },\n enterFullscreen(nodeID) {\n store.dispatch({ type: \"enterFullscreen\", nodeID });\n },\n exitFullscreen(nodeID) {\n store.dispatch({ type: \"exitFullscreen\", nodeID });\n },\n applyQuickLayout(nodeID, target) {\n store.dispatch({ type: \"applyQuickLayout\", nodeID, target });\n },\n applyLayoutPreset(nodeIDs, preset) {\n store.dispatch({ type: \"applyLayoutPreset\", nodeIDs, preset });\n },\n applyActiveSnapTarget(nodeID) {\n store.dispatch({ type: \"applyActiveSnapTarget\", nodeID });\n },\n applySnapTarget(nodeID, snapTarget) {\n store.dispatch({ type: \"applySnapTarget\", nodeID, snapTarget });\n },\n dragNode(nodeID, frame) {\n store.dispatch({ type: \"dragNode\", nodeID, frame });\n },\n moveNode(nodeID, frame) {\n store.dispatch({ type: \"moveNode\", nodeID, frame });\n },\n resizeNode(nodeID, frame) {\n store.dispatch({ type: \"resizeNode\", nodeID, frame });\n },\n setActiveDragNode(nodeID) {\n store.dispatch({ type: \"setActiveDragNode\", nodeID });\n },\n setActiveResizeNode(nodeID) {\n store.dispatch({ type: \"setActiveResizeNode\", nodeID });\n },\n setActiveSnapTarget(snapTarget) {\n store.dispatch({ type: \"setActiveSnapTarget\", snapTarget });\n },\n setSurfaceSize(size) {\n store.dispatch({ type: \"setSurfaceSize\", size });\n },\n setLayoutConstraints(constraints) {\n store.dispatch({ type: \"setLayoutConstraints\", constraints });\n },\n setNodeSizeConstraints(nodeID, sizeConstraints) {\n store.dispatch({\n type: \"setNodeSizeConstraints\",\n nodeID,\n sizeConstraints\n });\n }\n };\n}\n","import type {\n WorkbenchFrame as WorkbenchSnapshotFrame,\n WorkbenchSnapshotDisplayModeV1\n} from \"@tutti-os/workbench-snapshot\";\n\nexport interface WorkbenchSize {\n width: number;\n height: number;\n}\n\nexport type WorkbenchFrame = WorkbenchSnapshotFrame;\n\nexport interface WorkbenchSafeArea {\n top: number;\n right: number;\n bottom: number;\n left: number;\n}\n\nexport type WorkbenchDisplayMode = WorkbenchSnapshotDisplayModeV1;\nexport type WorkbenchSnapTarget = \"left\" | \"right\" | \"top\" | null;\nexport type WorkbenchQuickLayoutTarget = \"left\" | \"right\" | \"top\" | \"bottom\";\nexport type WorkbenchLayoutPreset =\n | { kind: \"balanced\" }\n | { kind: \"row\" }\n | { kind: \"column\" };\nexport type WorkbenchResizeHandle =\n | \"north\"\n | \"east\"\n | \"south\"\n | \"west\"\n | \"north-east\"\n | \"north-west\"\n | \"south-east\"\n | \"south-west\";\n\nexport interface WorkbenchNode<TData = unknown> {\n id: string;\n kind: string;\n title: string;\n frame: WorkbenchFrame;\n displayMode: WorkbenchDisplayMode;\n restoreFrame: WorkbenchFrame | null;\n isMinimized: boolean;\n minimizedAtUnixMs?: number | null;\n sizeConstraints?: WorkbenchNodeSizeConstraints | null;\n data: TData;\n}\n\nexport interface WorkbenchNodeSizeConstraints {\n minWidth?: number;\n minHeight?: number;\n}\n\nexport interface WorkbenchState<TData = unknown> {\n nodes: WorkbenchNode<TData>[];\n nodeStack: string[];\n activeDragNodeId: string | null;\n activeResizeNodeId: string | null;\n activeSnapTarget: WorkbenchSnapTarget;\n surfaceSize: WorkbenchSize;\n layoutConstraints: WorkbenchLayoutConstraints;\n}\n\nexport interface WorkbenchLayoutConstraints {\n minWidth: number;\n minHeight: number;\n surfacePadding: number;\n safeArea: WorkbenchSafeArea;\n}\n\nexport interface WorkbenchLayoutConstraintsInput extends Partial<\n Omit<WorkbenchLayoutConstraints, \"safeArea\">\n> {\n safeArea?: Partial<WorkbenchSafeArea>;\n}\n\nexport const defaultWorkbenchSafeArea: WorkbenchSafeArea = {\n top: 52,\n right: 0,\n bottom: 88,\n left: 0\n};\n\nexport const defaultWorkbenchLayoutConstraints: WorkbenchLayoutConstraints = {\n minWidth: 280,\n minHeight: 160,\n surfacePadding: 0,\n safeArea: defaultWorkbenchSafeArea\n};\n\nexport const defaultWorkbenchSurfaceSize: WorkbenchSize = {\n width: 1024,\n height: 720\n};\n","import {\n defaultWorkbenchLayoutConstraints,\n type WorkbenchFrame,\n type WorkbenchLayoutPreset,\n type WorkbenchLayoutConstraints,\n type WorkbenchLayoutConstraintsInput,\n type WorkbenchNodeSizeConstraints,\n type WorkbenchQuickLayoutTarget,\n type WorkbenchSafeArea,\n type WorkbenchSize,\n type WorkbenchSnapTarget\n} from \"./types.ts\";\n\nexport const WORKBENCH_MIN_VISIBLE_PX = 40;\nexport const WORKBENCH_LAYOUT_PRESET_GAP_PX = 12;\n\nexport function normalizeWorkbenchLayoutConstraints(\n constraints: WorkbenchLayoutConstraintsInput = {}\n): WorkbenchLayoutConstraints {\n return {\n minWidth:\n constraints.minWidth ?? defaultWorkbenchLayoutConstraints.minWidth,\n minHeight:\n constraints.minHeight ?? defaultWorkbenchLayoutConstraints.minHeight,\n surfacePadding:\n constraints.surfacePadding ??\n defaultWorkbenchLayoutConstraints.surfacePadding,\n safeArea: normalizeWorkbenchSafeArea(constraints.safeArea)\n };\n}\n\nexport function normalizeWorkbenchSafeArea(\n safeArea: Partial<WorkbenchSafeArea> = {}\n): WorkbenchSafeArea {\n return {\n top: Math.max(0, safeArea.top ?? 0),\n right: Math.max(0, safeArea.right ?? 0),\n bottom: Math.max(0, safeArea.bottom ?? 0),\n left: Math.max(0, safeArea.left ?? 0)\n };\n}\n\nexport function getWorkbenchLayoutFrame(\n surfaceSize: WorkbenchSize,\n constraints: WorkbenchLayoutConstraints = defaultWorkbenchLayoutConstraints\n): WorkbenchFrame {\n const normalized = normalizeWorkbenchLayoutConstraints(constraints);\n const width = Math.max(\n normalized.minWidth,\n surfaceSize.width - normalized.safeArea.left - normalized.safeArea.right\n );\n const height = Math.max(\n normalized.minHeight,\n surfaceSize.height - normalized.safeArea.top - normalized.safeArea.bottom\n );\n\n return {\n x: normalized.safeArea.left,\n y: normalized.safeArea.top,\n width,\n height\n };\n}\n\nexport function clampWorkbenchRect(\n rect: WorkbenchFrame,\n surfaceSize: WorkbenchSize,\n constraints: WorkbenchLayoutConstraints = defaultWorkbenchLayoutConstraints,\n sizeConstraints?: WorkbenchNodeSizeConstraints | null\n): WorkbenchFrame {\n const normalized = resolveWorkbenchRectConstraints(\n constraints,\n sizeConstraints\n );\n const frame = getWorkbenchLayoutFrame(surfaceSize, normalized);\n const width = clamp(\n rect.width,\n normalized.minWidth,\n Math.max(normalized.minWidth, frame.width - normalized.surfacePadding * 2)\n );\n const height = clamp(\n rect.height,\n normalized.minHeight,\n Math.max(normalized.minHeight, frame.height - normalized.surfacePadding * 2)\n );\n const maxX = Math.max(\n frame.x + normalized.surfacePadding,\n frame.x + frame.width - width - normalized.surfacePadding\n );\n const maxY = Math.max(\n frame.y + normalized.surfacePadding,\n frame.y + frame.height - height - normalized.surfacePadding\n );\n\n return {\n x: clamp(rect.x, frame.x + normalized.surfacePadding, maxX),\n y: clamp(rect.y, frame.y + normalized.surfacePadding, maxY),\n width,\n height\n };\n}\n\nexport function clampWorkbenchRectToVisibleArea(\n rect: WorkbenchFrame,\n surfaceSize: WorkbenchSize,\n constraints: WorkbenchLayoutConstraints = defaultWorkbenchLayoutConstraints,\n minVisiblePx = WORKBENCH_MIN_VISIBLE_PX,\n sizeConstraints?: WorkbenchNodeSizeConstraints | null\n): WorkbenchFrame {\n const normalized = resolveWorkbenchRectConstraints(\n constraints,\n sizeConstraints\n );\n const visibleFrame = getWorkbenchSafeLayoutRect(surfaceSize, normalized);\n const sizedRect = clampWorkbenchRect(\n {\n ...rect,\n x: visibleFrame.x,\n y: visibleFrame.y\n },\n surfaceSize,\n normalized\n );\n const minVisibleX = Math.min(minVisiblePx, visibleFrame.width);\n const minVisibleY = Math.min(minVisiblePx, visibleFrame.height);\n const minX = visibleFrame.x + minVisibleX - sizedRect.width;\n const maxX = visibleFrame.x + visibleFrame.width - minVisibleX;\n const minY = visibleFrame.y + minVisibleY - sizedRect.height;\n const maxY = visibleFrame.y + visibleFrame.height - minVisibleY;\n\n return {\n ...sizedRect,\n x: Math.round(clamp(rect.x, minX, maxX)),\n y: Math.round(clamp(rect.y, minY, maxY))\n };\n}\n\nexport function clampWorkbenchDragRect(\n rect: WorkbenchFrame,\n surfaceSize: WorkbenchSize,\n constraints: WorkbenchLayoutConstraints = defaultWorkbenchLayoutConstraints,\n sizeConstraints?: WorkbenchNodeSizeConstraints | null\n): WorkbenchFrame {\n const normalized = resolveWorkbenchRectConstraints(\n constraints,\n sizeConstraints\n );\n const layoutFrame = getWorkbenchLayoutFrame(surfaceSize, normalized);\n const visibleRect = clampWorkbenchRectToVisibleArea(\n rect,\n surfaceSize,\n normalized,\n WORKBENCH_MIN_VISIBLE_PX\n );\n\n return {\n ...visibleRect,\n y: Math.max(layoutFrame.y + normalized.surfacePadding, visibleRect.y)\n };\n}\n\nexport function getWorkbenchFullscreenRect(\n surfaceSize: WorkbenchSize,\n constraints: WorkbenchLayoutConstraints = defaultWorkbenchLayoutConstraints,\n sizeConstraints?: WorkbenchNodeSizeConstraints | null\n): WorkbenchFrame {\n const normalized = resolveWorkbenchRectConstraints(\n constraints,\n sizeConstraints\n );\n const fullscreenSafeArea = {\n ...normalized.safeArea,\n bottom: 0,\n left: 0\n };\n return {\n x: fullscreenSafeArea.left + normalized.surfacePadding,\n y: fullscreenSafeArea.top + normalized.surfacePadding,\n width: Math.max(\n normalized.minWidth,\n surfaceSize.width -\n fullscreenSafeArea.left -\n fullscreenSafeArea.right -\n normalized.surfacePadding * 2\n ),\n height: Math.max(\n normalized.minHeight,\n surfaceSize.height -\n fullscreenSafeArea.top -\n fullscreenSafeArea.bottom -\n normalized.surfacePadding * 2\n )\n };\n}\n\nexport function getWorkbenchSnapRect(\n snapTarget: WorkbenchSnapTarget,\n surfaceSize: WorkbenchSize,\n constraints: WorkbenchLayoutConstraints = defaultWorkbenchLayoutConstraints,\n sizeConstraints?: WorkbenchNodeSizeConstraints | null\n): WorkbenchFrame | null {\n const normalized = resolveWorkbenchRectConstraints(\n constraints,\n sizeConstraints\n );\n const full = getWorkbenchSafeLayoutRect(surfaceSize, normalized);\n const clampSnapRect = (rect: WorkbenchFrame): WorkbenchFrame =>\n clampWorkbenchRect(rect, surfaceSize, normalized);\n if (snapTarget === \"left\") {\n return clampSnapRect({ ...full, width: Math.round(full.width / 2) });\n }\n if (snapTarget === \"right\") {\n const width = Math.round(full.width / 2);\n return clampSnapRect({ ...full, x: full.x + full.width - width, width });\n }\n if (snapTarget === \"top\") {\n return clampSnapRect(full);\n }\n return null;\n}\n\nexport function getWorkbenchQuickLayoutRect(\n target: WorkbenchQuickLayoutTarget,\n surfaceSize: WorkbenchSize,\n constraints: WorkbenchLayoutConstraints = defaultWorkbenchLayoutConstraints,\n sizeConstraints?: WorkbenchNodeSizeConstraints | null\n): WorkbenchFrame {\n const normalized = resolveWorkbenchRectConstraints(\n constraints,\n sizeConstraints\n );\n const full = getWorkbenchSafeLayoutRect(surfaceSize, normalized);\n const clampQuickLayoutRect = (rect: WorkbenchFrame): WorkbenchFrame =>\n clampWorkbenchRect(rect, surfaceSize, normalized);\n\n switch (target) {\n case \"left\":\n return clampQuickLayoutRect({\n ...full,\n width: Math.round(full.width / 4)\n });\n case \"right\": {\n const width = Math.round(full.width / 4);\n return clampQuickLayoutRect({\n ...full,\n x: full.x + full.width - width,\n width\n });\n }\n case \"top\":\n return clampQuickLayoutRect({\n ...full,\n height: Math.round(full.height / 2)\n });\n case \"bottom\": {\n const height = Math.round(full.height / 2);\n return clampQuickLayoutRect({\n ...full,\n y: full.y + full.height - height,\n height\n });\n }\n }\n}\n\nfunction resolveWorkbenchRectConstraints(\n constraints: WorkbenchLayoutConstraints = defaultWorkbenchLayoutConstraints,\n sizeConstraints?: WorkbenchNodeSizeConstraints | null\n): WorkbenchLayoutConstraints {\n const normalized = normalizeWorkbenchLayoutConstraints(constraints);\n return {\n ...normalized,\n minHeight: Math.max(\n normalized.minHeight,\n normalizeNodeMinimum(sizeConstraints?.minHeight)\n ),\n minWidth: Math.max(\n normalized.minWidth,\n normalizeNodeMinimum(sizeConstraints?.minWidth)\n )\n };\n}\n\nfunction normalizeNodeMinimum(value: number | undefined): number {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0\n ? value\n : 0;\n}\n\nexport function getWorkbenchLayoutPresetFrames(\n itemCount: number,\n preset: WorkbenchLayoutPreset,\n surfaceSize: WorkbenchSize,\n constraints: WorkbenchLayoutConstraints = defaultWorkbenchLayoutConstraints\n): WorkbenchFrame[] | null {\n if (itemCount <= 0) {\n return [];\n }\n\n const normalized = normalizeWorkbenchLayoutConstraints(constraints);\n const frame = getWorkbenchSafeLayoutRect(surfaceSize, normalized);\n switch (preset.kind) {\n case \"balanced\":\n return getBalancedLayoutFrames(itemCount, frame, normalized);\n case \"row\":\n return getGridLayoutFrames(itemCount, itemCount, frame, normalized);\n case \"column\":\n return getSingleColumnLayoutFrames(itemCount, frame, normalized);\n }\n}\n\nfunction getWorkbenchSafeLayoutRect(\n surfaceSize: WorkbenchSize,\n constraints: WorkbenchLayoutConstraints = defaultWorkbenchLayoutConstraints\n): WorkbenchFrame {\n const normalized = normalizeWorkbenchLayoutConstraints(constraints);\n const frame = getWorkbenchLayoutFrame(surfaceSize, normalized);\n return {\n x: frame.x + normalized.surfacePadding,\n y: frame.y + normalized.surfacePadding,\n width: Math.max(\n normalized.minWidth,\n frame.width - normalized.surfacePadding * 2\n ),\n height: Math.max(\n normalized.minHeight,\n frame.height - normalized.surfacePadding * 2\n )\n };\n}\n\nexport function inferWorkbenchSnapTarget(\n dragPoint: Pick<WorkbenchFrame, \"y\">,\n surfaceSize: WorkbenchSize,\n threshold = 0,\n constraints: WorkbenchLayoutConstraints = defaultWorkbenchLayoutConstraints\n): WorkbenchSnapTarget {\n const frame = getWorkbenchLayoutFrame(surfaceSize, constraints);\n const topSnapBoundary = frame.y - threshold;\n if (\n dragPoint.y < topSnapBoundary ||\n (topSnapBoundary === 0 && dragPoint.y <= 0)\n ) {\n return \"top\";\n }\n return null;\n}\n\nexport function rectsEqual(\n left: WorkbenchFrame,\n right: WorkbenchFrame\n): boolean {\n return (\n left.x === right.x &&\n left.y === right.y &&\n left.width === right.width &&\n left.height === right.height\n );\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n\nfunction getGridLayoutFrames(\n itemCount: number,\n columns: number,\n frame: WorkbenchFrame,\n constraints: WorkbenchLayoutConstraints\n): WorkbenchFrame[] | null {\n const rows = Math.ceil(itemCount / columns);\n const horizontalGap =\n WORKBENCH_LAYOUT_PRESET_GAP_PX * Math.max(0, columns - 1);\n const verticalGap = WORKBENCH_LAYOUT_PRESET_GAP_PX * Math.max(0, rows - 1);\n const cellWidth = Math.floor((frame.width - horizontalGap) / columns);\n const cellHeight = Math.floor((frame.height - verticalGap) / rows);\n\n if (cellWidth < constraints.minWidth || cellHeight < constraints.minHeight) {\n return null;\n }\n\n const contentHeight =\n rows * cellHeight + (rows - 1) * WORKBENCH_LAYOUT_PRESET_GAP_PX;\n let index = 0;\n const frames: WorkbenchFrame[] = [];\n\n for (let rowIndex = 0; rowIndex < rows; rowIndex += 1) {\n const remaining = itemCount - index;\n const itemsInRow = Math.min(columns, remaining);\n const rowWidth =\n itemsInRow * cellWidth +\n Math.max(0, itemsInRow - 1) * WORKBENCH_LAYOUT_PRESET_GAP_PX;\n const rowX = frame.x + Math.round((frame.width - rowWidth) / 2);\n const rowY =\n frame.y +\n Math.round((frame.height - contentHeight) / 2) +\n rowIndex * (cellHeight + WORKBENCH_LAYOUT_PRESET_GAP_PX);\n\n for (let columnIndex = 0; columnIndex < itemsInRow; columnIndex += 1) {\n frames.push({\n x: rowX + columnIndex * (cellWidth + WORKBENCH_LAYOUT_PRESET_GAP_PX),\n y: rowY,\n width: cellWidth,\n height: cellHeight\n });\n index += 1;\n }\n }\n\n return frames;\n}\n\nfunction getBalancedLayoutFrames(\n itemCount: number,\n frame: WorkbenchFrame,\n constraints: WorkbenchLayoutConstraints\n): WorkbenchFrame[] | null {\n if (itemCount === 1) {\n return [frame];\n }\n\n if (itemCount === 2) {\n return getGridLayoutFrames(itemCount, 2, frame, constraints);\n }\n\n if (itemCount >= 4) {\n return getBestBalancedGridLayoutFrames(itemCount, frame, constraints);\n }\n\n const gap = WORKBENCH_LAYOUT_PRESET_GAP_PX;\n const primaryWidth = Math.floor((frame.width - gap) * 0.58);\n const secondaryWidth = frame.width - gap - primaryWidth;\n\n if (\n primaryWidth < constraints.minWidth ||\n secondaryWidth < constraints.minWidth\n ) {\n return null;\n }\n\n const secondaryCount = itemCount - 1;\n const verticalGap =\n WORKBENCH_LAYOUT_PRESET_GAP_PX * Math.max(0, secondaryCount - 1);\n const secondaryHeight = Math.floor(\n (frame.height - verticalGap) / secondaryCount\n );\n\n if (secondaryHeight < constraints.minHeight) {\n return null;\n }\n\n const frames: WorkbenchFrame[] = [\n {\n x: frame.x,\n y: frame.y,\n width: primaryWidth,\n height: frame.height\n }\n ];\n\n const secondaryX = frame.x + primaryWidth + gap;\n for (let index = 0; index < secondaryCount; index += 1) {\n frames.push({\n x: secondaryX,\n y: frame.y + index * (secondaryHeight + WORKBENCH_LAYOUT_PRESET_GAP_PX),\n width: secondaryWidth,\n height: secondaryHeight\n });\n }\n\n return frames;\n}\n\nfunction getBestBalancedGridLayoutFrames(\n itemCount: number,\n frame: WorkbenchFrame,\n constraints: WorkbenchLayoutConstraints\n): WorkbenchFrame[] | null {\n let best: {\n columns: number;\n emptySlots: number;\n frames: WorkbenchFrame[];\n shapeDistance: number;\n } | null = null;\n\n for (let columns = 2; columns <= itemCount; columns += 1) {\n const rows = Math.ceil(itemCount / columns);\n const frames = getGridLayoutFrames(itemCount, columns, frame, constraints);\n if (!frames) {\n continue;\n }\n\n const candidate = {\n columns,\n emptySlots: rows * columns - itemCount,\n frames,\n shapeDistance: Math.abs(columns - rows)\n };\n\n if (\n !best ||\n candidate.shapeDistance < best.shapeDistance ||\n (candidate.shapeDistance === best.shapeDistance &&\n candidate.emptySlots < best.emptySlots) ||\n (candidate.shapeDistance === best.shapeDistance &&\n candidate.emptySlots === best.emptySlots &&\n candidate.columns < best.columns)\n ) {\n best = candidate;\n }\n }\n\n return best?.frames ?? null;\n}\n\nfunction getSingleColumnLayoutFrames(\n itemCount: number,\n frame: WorkbenchFrame,\n constraints: WorkbenchLayoutConstraints\n): WorkbenchFrame[] | null {\n const verticalGap =\n WORKBENCH_LAYOUT_PRESET_GAP_PX * Math.max(0, itemCount - 1);\n const cellHeight = Math.floor((frame.height - verticalGap) / itemCount);\n\n if (cellHeight < constraints.minHeight) {\n return null;\n }\n\n const frames: WorkbenchFrame[] = [];\n for (let index = 0; index < itemCount; index += 1) {\n frames.push({\n x: frame.x,\n y: frame.y + index * (cellHeight + WORKBENCH_LAYOUT_PRESET_GAP_PX),\n width: frame.width,\n height: cellHeight\n });\n }\n\n return frames;\n}\n","import type { WorkbenchNode } from \"./types.ts\";\n\nexport function normalizeWorkbenchStack(\n nodes: readonly WorkbenchNode[],\n stack: readonly string[]\n): string[] {\n const nodeIDs = new Set(nodes.map((node) => node.id));\n const normalized = Array.from(new Set(stack)).filter((id) => nodeIDs.has(id));\n\n for (const node of nodes) {\n if (!normalized.includes(node.id)) {\n normalized.push(node.id);\n }\n }\n\n return normalized;\n}\n\nexport function focusWorkbenchStack(\n stack: readonly string[],\n nodeID: string\n): string[] {\n return [...stack.filter((id) => id !== nodeID), nodeID];\n}\n\nexport function removeFromWorkbenchStack(\n stack: readonly string[],\n nodeID: string\n): string[] {\n return stack.filter((id) => id !== nodeID);\n}\n\nexport function orderWorkbenchNodesForRender<TData>(\n nodes: readonly WorkbenchNode<TData>[],\n stack: readonly string[]\n): WorkbenchNode<TData>[] {\n const order = new Map(stack.map((id, index) => [id, index]));\n return [...nodes].sort(\n (left, right) =>\n (order.get(left.id) ?? Number.MAX_SAFE_INTEGER) -\n (order.get(right.id) ?? Number.MAX_SAFE_INTEGER)\n );\n}\n","import type { WorkbenchAction } from \"./actions.ts\";\nimport {\n clampWorkbenchDragRect,\n clampWorkbenchRect,\n clampWorkbenchRectToVisibleArea,\n getWorkbenchFullscreenRect,\n getWorkbenchLayoutPresetFrames,\n getWorkbenchQuickLayoutRect,\n getWorkbenchSnapRect,\n normalizeWorkbenchLayoutConstraints,\n rectsEqual\n} from \"./geometry.ts\";\nimport {\n focusWorkbenchStack,\n normalizeWorkbenchStack,\n removeFromWorkbenchStack\n} from \"./stack.ts\";\nimport {\n defaultWorkbenchSurfaceSize,\n defaultWorkbenchLayoutConstraints,\n type WorkbenchNode,\n type WorkbenchState\n} from \"./types.ts\";\n\nexport function createWorkbenchInitialState<TData = unknown>(\n partial: Partial<WorkbenchState<TData>> = {}\n): WorkbenchState<TData> {\n const nodes = partial.nodes ?? [];\n return {\n nodes,\n nodeStack: normalizeWorkbenchStack(nodes, partial.nodeStack ?? []),\n activeDragNodeId: partial.activeDragNodeId ?? null,\n activeResizeNodeId: partial.activeResizeNodeId ?? null,\n activeSnapTarget: partial.activeSnapTarget ?? null,\n surfaceSize: partial.surfaceSize ?? defaultWorkbenchSurfaceSize,\n layoutConstraints: normalizeWorkbenchLayoutConstraints(\n partial.layoutConstraints ?? defaultWorkbenchLayoutConstraints\n )\n };\n}\n\nexport function reduceWorkbenchState<TData>(\n state: WorkbenchState<TData>,\n action: WorkbenchAction<TData>\n): WorkbenchState<TData> {\n switch (action.type) {\n case \"replaceState\": {\n const nextState = createWorkbenchInitialState({\n ...state,\n ...action.state\n });\n if (\n state.nodes === nextState.nodes &&\n state.nodeStack === nextState.nodeStack &&\n state.activeDragNodeId === nextState.activeDragNodeId &&\n state.activeResizeNodeId === nextState.activeResizeNodeId &&\n state.activeSnapTarget === nextState.activeSnapTarget &&\n state.surfaceSize === nextState.surfaceSize &&\n layoutConstraintsEqual(\n state.layoutConstraints,\n nextState.layoutConstraints\n )\n ) {\n return state;\n }\n return nextState;\n }\n\n case \"replaceNodes\": {\n const nodeStack = normalizeWorkbenchStack(action.nodes, state.nodeStack);\n if (state.nodes === action.nodes && state.nodeStack === nodeStack) {\n return state;\n }\n return { ...state, nodes: action.nodes, nodeStack };\n }\n\n case \"openNode\": {\n const existing = state.nodes.some((node) => node.id === action.node.id);\n const nodes = existing\n ? state.nodes.map((node) =>\n node.id === action.node.id ? action.node : node\n )\n : [...state.nodes, action.node];\n return {\n ...state,\n nodes,\n nodeStack: focusWorkbenchStack(\n normalizeWorkbenchStack(nodes, state.nodeStack),\n action.node.id\n )\n };\n }\n\n case \"closeNode\":\n if (!state.nodes.some((node) => node.id === action.nodeID)) {\n return state;\n }\n return {\n ...state,\n nodes: state.nodes.filter((node) => node.id !== action.nodeID),\n nodeStack: removeFromWorkbenchStack(state.nodeStack, action.nodeID)\n };\n\n case \"focusNode\":\n if (!state.nodes.some((node) => node.id === action.nodeID)) {\n return state;\n }\n return {\n ...state,\n nodes: state.nodes.map((node) =>\n node.id === action.nodeID\n ? { ...node, isMinimized: false, minimizedAtUnixMs: null }\n : node\n ),\n nodeStack: focusWorkbenchStack(state.nodeStack, action.nodeID)\n };\n\n case \"minimizeNode\":\n return updateNode(state, action.nodeID, (node) =>\n node.isMinimized\n ? node\n : {\n ...node,\n isMinimized: true,\n minimizedAtUnixMs: Date.now()\n }\n );\n\n case \"restoreNode\":\n return updateNode(state, action.nodeID, (node) =>\n node.isMinimized\n ? { ...node, isMinimized: false, minimizedAtUnixMs: null }\n : node\n );\n\n case \"enterFullscreen\":\n return updateNode(state, action.nodeID, (node) => {\n if (node.displayMode === \"fullscreen\") {\n return node;\n }\n return {\n ...node,\n displayMode: \"fullscreen\",\n restoreFrame: node.frame,\n isMinimized: false,\n minimizedAtUnixMs: null,\n frame: getWorkbenchFullscreenRect(\n state.surfaceSize,\n state.layoutConstraints,\n node.sizeConstraints\n )\n };\n });\n\n case \"exitFullscreen\":\n return updateNode(state, action.nodeID, (node) => {\n if (node.displayMode !== \"fullscreen\") {\n return node;\n }\n return {\n ...node,\n displayMode: \"floating\",\n frame: node.restoreFrame ?? node.frame,\n restoreFrame: null\n };\n });\n\n case \"applyQuickLayout\":\n return updateNode(state, action.nodeID, (node) => {\n const frame = getWorkbenchQuickLayoutRect(\n action.target,\n state.surfaceSize,\n state.layoutConstraints,\n node.sizeConstraints\n );\n if (\n node.displayMode === \"floating\" &&\n !node.isMinimized &&\n node.restoreFrame === null &&\n rectsEqual(node.frame, frame)\n ) {\n return node;\n }\n return {\n ...node,\n frame,\n displayMode: \"floating\" as const,\n restoreFrame: null,\n isMinimized: false,\n minimizedAtUnixMs: null\n };\n });\n\n case \"applyLayoutPreset\": {\n const nodeIDs = uniqueKnownNodeIDs(state.nodes, action.nodeIDs);\n if (nodeIDs.length === 0) {\n return state;\n }\n\n const frames = getWorkbenchLayoutPresetFrames(\n nodeIDs.length,\n action.preset,\n state.surfaceSize,\n state.layoutConstraints\n );\n if (!frames) {\n return state;\n }\n\n const frameByNodeID = new Map(\n nodeIDs.map((nodeID, index) => [nodeID, frames[index]] as const)\n );\n const nodes: WorkbenchNode<TData>[] = state.nodes.map((node) => {\n const frame = frameByNodeID.get(node.id);\n if (!frame) {\n return node;\n }\n const nextFrame = clampWorkbenchRect(\n frame,\n state.surfaceSize,\n state.layoutConstraints,\n node.sizeConstraints\n );\n return {\n ...node,\n frame: nextFrame,\n displayMode: \"floating\" as const,\n restoreFrame: null,\n isMinimized: false,\n minimizedAtUnixMs: null\n };\n });\n\n let nodeStack = state.nodeStack;\n for (const nodeID of nodeIDs) {\n nodeStack = focusWorkbenchStack(nodeStack, nodeID);\n }\n\n return { ...state, nodes, nodeStack };\n }\n\n case \"applyActiveSnapTarget\":\n case \"applySnapTarget\":\n return updateNode(state, action.nodeID, (node) => {\n const frame = getWorkbenchSnapRect(\n action.type === \"applySnapTarget\"\n ? action.snapTarget\n : state.activeSnapTarget,\n state.surfaceSize,\n state.layoutConstraints,\n node.sizeConstraints\n );\n if (!frame) {\n return node;\n }\n if (\n node.displayMode === \"floating\" &&\n !node.isMinimized &&\n node.restoreFrame === null &&\n rectsEqual(node.frame, frame)\n ) {\n return node;\n }\n return {\n ...node,\n frame,\n displayMode: \"floating\",\n restoreFrame: null,\n isMinimized: false,\n minimizedAtUnixMs: null\n };\n });\n\n case \"dragNode\":\n return updateNode(state, action.nodeID, (node) => {\n const frame = clampWorkbenchDragRect(\n action.frame,\n state.surfaceSize,\n state.layoutConstraints,\n node.sizeConstraints\n );\n if (rectsEqual(node.frame, frame)) {\n return node;\n }\n return {\n ...node,\n frame,\n displayMode: \"floating\",\n restoreFrame:\n node.displayMode === \"fullscreen\" ? node.restoreFrame : null\n };\n });\n\n case \"moveNode\":\n case \"resizeNode\":\n return updateNode(state, action.nodeID, (node) => {\n const frame = clampWorkbenchRect(\n action.frame,\n state.surfaceSize,\n state.layoutConstraints,\n node.sizeConstraints\n );\n if (rectsEqual(node.frame, frame)) {\n return node;\n }\n return {\n ...node,\n frame,\n displayMode: \"floating\",\n restoreFrame:\n node.displayMode === \"fullscreen\" ? node.restoreFrame : null\n };\n });\n\n case \"setActiveDragNode\":\n if (state.activeDragNodeId === action.nodeID) {\n return state;\n }\n return { ...state, activeDragNodeId: action.nodeID };\n\n case \"setActiveResizeNode\":\n if (state.activeResizeNodeId === action.nodeID) {\n return state;\n }\n return { ...state, activeResizeNodeId: action.nodeID };\n\n case \"setActiveSnapTarget\":\n if (state.activeSnapTarget === action.snapTarget) {\n return state;\n }\n return { ...state, activeSnapTarget: action.snapTarget };\n\n case \"setSurfaceSize\":\n if (\n state.surfaceSize.width === action.size.width &&\n state.surfaceSize.height === action.size.height\n ) {\n return state;\n }\n return {\n ...state,\n surfaceSize: action.size,\n nodes: state.nodes.map((node) =>\n node.displayMode === \"fullscreen\"\n ? {\n ...node,\n frame: getWorkbenchFullscreenRect(\n action.size,\n state.layoutConstraints,\n node.sizeConstraints\n )\n }\n : {\n ...node,\n frame: clampWorkbenchRectToVisibleArea(\n node.frame,\n action.size,\n state.layoutConstraints,\n undefined,\n node.sizeConstraints\n )\n }\n )\n };\n\n case \"setLayoutConstraints\": {\n const constraints = normalizeWorkbenchLayoutConstraints({\n ...state.layoutConstraints,\n ...action.constraints,\n safeArea: {\n ...state.layoutConstraints.safeArea,\n ...action.constraints.safeArea\n }\n });\n if (\n state.layoutConstraints.minWidth === constraints.minWidth &&\n state.layoutConstraints.minHeight === constraints.minHeight &&\n state.layoutConstraints.surfacePadding === constraints.surfacePadding &&\n state.layoutConstraints.safeArea.top === constraints.safeArea.top &&\n state.layoutConstraints.safeArea.right === constraints.safeArea.right &&\n state.layoutConstraints.safeArea.bottom ===\n constraints.safeArea.bottom &&\n state.layoutConstraints.safeArea.left === constraints.safeArea.left\n ) {\n return state;\n }\n return {\n ...state,\n layoutConstraints: constraints,\n nodes: state.nodes.map((node) =>\n node.displayMode === \"fullscreen\"\n ? {\n ...node,\n frame: getWorkbenchFullscreenRect(\n state.surfaceSize,\n constraints,\n node.sizeConstraints\n )\n }\n : {\n ...node,\n frame: clampWorkbenchRectToVisibleArea(\n node.frame,\n state.surfaceSize,\n constraints,\n undefined,\n node.sizeConstraints\n ),\n restoreFrame: node.restoreFrame\n ? clampWorkbenchRectToVisibleArea(\n node.restoreFrame,\n state.surfaceSize,\n constraints,\n undefined,\n node.sizeConstraints\n )\n : null\n }\n )\n };\n }\n\n case \"setNodeSizeConstraints\":\n return updateNode(state, action.nodeID, (node) => {\n if (\n sizeConstraintsEqual(node.sizeConstraints, action.sizeConstraints)\n ) {\n return node;\n }\n const frame =\n node.displayMode === \"fullscreen\"\n ? getWorkbenchFullscreenRect(\n state.surfaceSize,\n state.layoutConstraints,\n action.sizeConstraints\n )\n : clampWorkbenchRectToVisibleArea(\n node.frame,\n state.surfaceSize,\n state.layoutConstraints,\n undefined,\n action.sizeConstraints\n );\n const restoreFrame = node.restoreFrame\n ? clampWorkbenchRectToVisibleArea(\n node.restoreFrame,\n state.surfaceSize,\n state.layoutConstraints,\n undefined,\n action.sizeConstraints\n )\n : null;\n return {\n ...node,\n frame,\n restoreFrame,\n sizeConstraints: action.sizeConstraints\n };\n });\n }\n}\n\nfunction layoutConstraintsEqual(\n left: WorkbenchState[\"layoutConstraints\"],\n right: WorkbenchState[\"layoutConstraints\"]\n): boolean {\n return (\n left.minWidth === right.minWidth &&\n left.minHeight === right.minHeight &&\n left.surfacePadding === right.surfacePadding &&\n left.safeArea.top === right.safeArea.top &&\n left.safeArea.right === right.safeArea.right &&\n left.safeArea.bottom === right.safeArea.bottom &&\n left.safeArea.left === right.safeArea.left\n );\n}\n\nfunction sizeConstraintsEqual(\n left: WorkbenchNode[\"sizeConstraints\"],\n right: WorkbenchNode[\"sizeConstraints\"]\n): boolean {\n return (\n (left?.minWidth ?? null) === (right?.minWidth ?? null) &&\n (left?.minHeight ?? null) === (right?.minHeight ?? null)\n );\n}\n\nfunction updateNode<TData>(\n state: WorkbenchState<TData>,\n nodeID: string,\n update: (node: WorkbenchNode<TData>) => WorkbenchNode<TData>\n): WorkbenchState<TData> {\n let changed = false;\n const nodes = state.nodes.map((node) => {\n if (node.id !== nodeID) {\n return node;\n }\n\n const nextNode = update(node);\n changed = changed || nextNode !== node;\n return nextNode;\n });\n\n if (!changed) {\n return state;\n }\n\n return {\n ...state,\n nodes,\n nodeStack: focusWorkbenchStack(state.nodeStack, nodeID)\n };\n}\n\nfunction uniqueKnownNodeIDs<TData>(\n nodes: readonly WorkbenchNode<TData>[],\n nodeIDs: readonly string[]\n): string[] {\n const knownNodeIDs = new Set(nodes.map((node) => node.id));\n const orderedNodeIDs: string[] = [];\n\n for (const nodeID of nodeIDs) {\n if (!knownNodeIDs.has(nodeID) || orderedNodeIDs.includes(nodeID)) {\n continue;\n }\n orderedNodeIDs.push(nodeID);\n }\n\n return orderedNodeIDs;\n}\n","import type { WorkbenchListener, WorkbenchUnsubscribe } from \"./types.ts\";\n\nexport function createWorkbenchSubscriptionSet() {\n const listeners = new Set<WorkbenchListener>();\n\n return {\n subscribe(listener: WorkbenchListener): WorkbenchUnsubscribe {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n notify(): void {\n for (const listener of listeners) {\n listener();\n }\n }\n };\n}\n","import type { WorkbenchAction } from \"../core/actions.ts\";\nimport {\n createWorkbenchInitialState,\n reduceWorkbenchState\n} from \"../core/reducer.ts\";\nimport type { WorkbenchState } from \"../core/types.ts\";\nimport { createWorkbenchSubscriptionSet } from \"./subscribe.ts\";\nimport type { WorkbenchDebugDiagnostics, WorkbenchStore } from \"./types.ts\";\n\nexport function createWorkbenchStore<TData = unknown>(\n initialState: Partial<WorkbenchState<TData>> = {},\n options: { debugDiagnostics?: WorkbenchDebugDiagnostics } = {}\n): WorkbenchStore<TData> {\n let state = createWorkbenchInitialState(initialState);\n const subscriptions = createWorkbenchSubscriptionSet();\n\n return {\n getSnapshot() {\n return state;\n },\n subscribe(listener) {\n return subscriptions.subscribe(listener);\n },\n dispatch(action: WorkbenchAction<TData>) {\n const nextState = reduceWorkbenchState(state, action);\n if (nextState === state) {\n return;\n }\n\n logWorkbenchFrameChanges(action, state, nextState, options);\n state = nextState;\n subscriptions.notify();\n }\n };\n}\n\nfunction logWorkbenchFrameChanges<TData>(\n action: WorkbenchAction<TData>,\n previousState: WorkbenchState<TData>,\n nextState: WorkbenchState<TData>,\n options: { debugDiagnostics?: WorkbenchDebugDiagnostics }\n): void {\n if (!options.debugDiagnostics?.isEnabled()) {\n return;\n }\n\n const previousNodesByID = new Map(\n previousState.nodes.map((node) => [node.id, node])\n );\n const changes = nextState.nodes\n .map((node) => {\n const previousNode = previousNodesByID.get(node.id);\n if (!previousNode) {\n return {\n id: node.id,\n kind: \"opened\",\n nextFrame: node.frame\n };\n }\n if (\n previousNode.frame.x === node.frame.x &&\n previousNode.frame.y === node.frame.y &&\n previousNode.frame.width === node.frame.width &&\n previousNode.frame.height === node.frame.height\n ) {\n return null;\n }\n return {\n id: node.id,\n kind: \"frame-changed\",\n nextFrame: node.frame,\n previousFrame: previousNode.frame\n };\n })\n .filter((change): change is NonNullable<typeof change> => change !== null);\n\n if (changes.length === 0) {\n return;\n }\n\n console.info(\"[workbench:frame]\", {\n action: summarizeWorkbenchAction(action),\n changes,\n nextSurfaceSize: nextState.surfaceSize,\n previousSurfaceSize: previousState.surfaceSize\n });\n void Promise.resolve(\n options.debugDiagnostics.log?.({\n details: {\n action: summarizeWorkbenchAction(action),\n changes,\n nextSurfaceSize: nextState.surfaceSize,\n previousSurfaceSize: previousState.surfaceSize\n },\n event: \"frame-changed\",\n level: \"info\",\n source: \"workbench-frame\"\n })\n ).catch(() => undefined);\n}\n\nfunction summarizeWorkbenchAction<TData>(\n action: WorkbenchAction<TData>\n): Record<string, unknown> {\n switch (action.type) {\n case \"replaceState\":\n return {\n type: action.type,\n nodeCount: action.state.nodes?.length,\n nodeStack: action.state.nodeStack,\n surfaceSize: action.state.surfaceSize\n };\n case \"replaceNodes\":\n return {\n type: action.type,\n nodeIDs: action.nodes.map((node) => node.id)\n };\n case \"openNode\":\n return {\n type: action.type,\n frame: action.node.frame,\n nodeID: action.node.id\n };\n case \"dragNode\":\n case \"moveNode\":\n case \"resizeNode\":\n return {\n type: action.type,\n frame: action.frame,\n nodeID: action.nodeID\n };\n case \"setSurfaceSize\":\n return {\n type: action.type,\n size: action.size\n };\n case \"setLayoutConstraints\":\n return {\n type: action.type,\n constraints: action.constraints\n };\n case \"applyQuickLayout\":\n return {\n type: action.type,\n nodeID: action.nodeID,\n target: action.target\n };\n case \"applyLayoutPreset\":\n return {\n type: action.type,\n nodeIDs: action.nodeIDs,\n preset: action.preset\n };\n case \"applySnapTarget\":\n return {\n type: action.type,\n nodeID: action.nodeID,\n snapTarget: action.snapTarget\n };\n default:\n return \"nodeID\" in action\n ? { type: action.type, nodeID: action.nodeID }\n : { type: action.type };\n }\n}\n","import type { WorkbenchState } from \"../core/types.ts\";\nimport { createWorkbenchCommands } from \"./commands.ts\";\nimport { createWorkbenchStore } from \"./createWorkbenchStore.ts\";\nimport type {\n WorkbenchController,\n WorkbenchDebugDiagnostics\n} from \"./types.ts\";\n\nexport function createWorkbenchController<TData = unknown>(\n initialState: Partial<WorkbenchState<TData>> = {},\n options: { debugDiagnostics?: WorkbenchDebugDiagnostics } = {}\n): WorkbenchController<TData> {\n const store = createWorkbenchStore(initialState, options);\n\n return {\n ...store,\n commands: createWorkbenchCommands(store)\n };\n}\n","import { useMemo } from \"react\";\nimport {\n WorkbenchMissionControlBackdrop,\n WorkbenchMissionControlOverlay\n} from \"../mission-control/WorkbenchMissionControlOverlay.tsx\";\nimport { useWorkbenchMissionControlPresence } from \"../mission-control/useWorkbenchMissionControlPresence.ts\";\nimport { useWorkbenchMissionControlState } from \"../mission-control/useWorkbenchMissionControlState.ts\";\nimport { WorkbenchSurface } from \"../react/WorkbenchSurface.tsx\";\nimport {\n resolveWorkbenchHostDockEntries,\n resolveWorkbenchHostRuntimeConfig\n} from \"./hostConfig.ts\";\nimport type { WorkbenchHostNodeData, WorkbenchHostProps } from \"./types.ts\";\nimport { useWorkbenchHostRuntime } from \"./useWorkbenchHostRuntime.ts\";\nimport { useWorkbenchHostSurfaceRenderers } from \"./useWorkbenchHostSurfaceRenderers.tsx\";\n\nconst noop = () => {};\n\nexport function WorkbenchHost({\n captureNodePreviewImage,\n className,\n contributions,\n debugDiagnostics,\n dockPreviewCache,\n dockPlacement,\n dockEntries,\n dockStateSource,\n externalStateSource,\n i18n,\n layoutConstraints,\n missionControl,\n minimizeAnimation,\n nodes,\n onDockEntryAction,\n onDockEntryClick,\n onHandleReady,\n onLaunchRequest,\n onMissionControlAdapterReady,\n onMissionControlRequestOpen,\n onNodeCloseRequest,\n projectedNodes,\n renderBottomChrome,\n renderTopChrome,\n snapshotRepository,\n shortcutsEnabled,\n wallpaper,\n workspaceId\n}: WorkbenchHostProps) {\n const hostRuntimeConfig = useMemo(\n () =>\n resolveWorkbenchHostRuntimeConfig({\n contributions,\n externalStateSource,\n nodes,\n onLaunchRequest,\n onNodeCloseRequest\n }),\n [\n contributions,\n externalStateSource,\n nodes,\n onLaunchRequest,\n onNodeCloseRequest\n ]\n );\n const hostDockEntries = useMemo(\n () =>\n resolveWorkbenchHostDockEntries({\n contributions,\n dockEntries\n }),\n [contributions, dockEntries]\n );\n const missionControlMode = missionControl?.mode ?? null;\n const missionControlNodeIds = missionControl?.nodeIds;\n const missionControlClose = missionControl?.onRequestClose ?? noop;\n const missionControlEnabled =\n missionControlMode !== null || onMissionControlAdapterReady !== undefined;\n const {\n chromeContext,\n externalStateRevision,\n hostI18n,\n hostSession,\n isHydrating,\n missionControlI18n,\n missionControlAdapter,\n nodeDefinitionByType,\n windowChromeI18n\n } = useWorkbenchHostRuntime({\n debugDiagnostics,\n externalStateSource: hostRuntimeConfig.externalStateSource,\n i18n,\n missionControlEnabled,\n nodes: hostRuntimeConfig.nodes,\n onHandleReady,\n onLaunchRequest: hostRuntimeConfig.onLaunchRequest,\n onMissionControlAdapterReady,\n onNodeCloseRequest: hostRuntimeConfig.onNodeCloseRequest,\n projectedNodes,\n snapshotRepository,\n workspaceId\n });\n const surfaceRenderers = useWorkbenchHostSurfaceRenderers({\n captureNodePreviewImage,\n chromeContext,\n debugDiagnostics,\n dockPreviewCache,\n dockPlacement,\n dockStateSource,\n dockEntries: hostDockEntries,\n externalStateSource: hostRuntimeConfig.externalStateSource,\n externalStateRevision,\n hostI18n,\n hostSession,\n nodeDefinitionByType,\n onDockEntryAction,\n onDockEntryClick,\n onMissionControlRequestOpen,\n renderBottomChrome,\n renderTopChrome,\n workspaceId\n });\n const missionControlState = useWorkbenchMissionControlState({\n adapter: missionControlAdapter,\n mode: missionControlMode,\n nodeIds: missionControlNodeIds,\n onRequestClose: missionControlClose\n });\n const missionControlPresence =\n useWorkbenchMissionControlPresence(missionControlState);\n const missionControlRenderedState = missionControlPresence.state;\n\n return (\n <WorkbenchSurface<WorkbenchHostNodeData>\n className={className}\n captureNodePreviewImage={surfaceRenderers.captureNodePreviewImage}\n controller={hostSession.controller}\n debugDiagnostics={debugDiagnostics}\n dockPreviewCache={dockPreviewCache}\n dockPlacement={dockPlacement}\n interactive={!isHydrating}\n layoutConstraints={layoutConstraints}\n missionControlPhase={missionControlPresence.phase}\n minimizeAnimation={minimizeAnimation}\n presentation={missionControlState?.presentation ?? null}\n renderBackdrop={\n missionControlRenderedState\n ? () => (\n <WorkbenchMissionControlBackdrop\n onExitTransitionComplete={() =>\n missionControlPresence.completeExitTransition()\n }\n phase={missionControlPresence.phase}\n />\n )\n : undefined\n }\n renderBottomChrome={surfaceRenderers.renderBottomChrome}\n renderDock={surfaceRenderers.renderDock}\n renderNode={surfaceRenderers.renderNode}\n renderNodeGeniePreview={surfaceRenderers.renderNodeGeniePreview}\n renderOverlay={\n missionControlRenderedState\n ? () => (\n <WorkbenchMissionControlOverlay\n i18n={missionControlI18n}\n phase={missionControlPresence.phase}\n state={missionControlRenderedState}\n />\n )\n : undefined\n }\n renderTopChrome={surfaceRenderers.renderTopChrome}\n renderWindowActions={surfaceRenderers.renderWindowActions}\n renderWindowHeader={surfaceRenderers.renderWindowHeader}\n shouldKeepMinimizedNodeMounted={\n surfaceRenderers.shouldKeepMinimizedNodeMounted\n }\n resolveDockPreviewCacheKey={surfaceRenderers.resolveDockPreviewCacheKey}\n resolveFullscreenHeaderMode={surfaceRenderers.resolveFullscreenHeaderMode}\n resolveDockAnchorKey={surfaceRenderers.resolveDockAnchorKey}\n shortcutsEnabled={shortcutsEnabled}\n shouldCaptureNodePreviewImage={\n surfaceRenderers.shouldCaptureNodePreviewImage\n }\n wallpaper={wallpaper}\n windowChromeI18n={windowChromeI18n}\n windowChromeMode={surfaceRenderers.windowChromeMode}\n />\n );\n}\n","import {\n useLayoutEffect,\n useRef,\n useState,\n type ComponentType,\n type TransitionEvent\n} from \"react\";\nimport {\n AppWindowIcon,\n Button,\n GridHorizontalLinedIcon,\n GridVerticalLinedIcon,\n type IconProps\n} from \"@tutti-os/ui-system\";\nimport {\n shouldShowWorkbenchMissionControlLayoutHint,\n shouldShowWorkbenchMissionControlLayoutPreset,\n shouldShowWorkbenchMissionControlNoAvailableLayoutMessage\n} from \"./layoutDock.ts\";\nimport type { WorkbenchMissionControlState } from \"./useWorkbenchMissionControlState.ts\";\nimport type { WorkbenchMissionControlPhase } from \"./useWorkbenchMissionControlPresence.ts\";\nimport type { WorkbenchMissionControlI18nRuntime } from \"./workbenchMissionControlI18n.ts\";\n\nexport interface WorkbenchMissionControlBackdropProps {\n className?: string;\n onExitTransitionComplete?: () => void;\n phase: WorkbenchMissionControlPhase;\n}\n\nexport function WorkbenchMissionControlBackdrop({\n className,\n onExitTransitionComplete,\n phase\n}: WorkbenchMissionControlBackdropProps) {\n return (\n <div\n aria-hidden\n className={[\"workbench-mission-control-backdrop\", className]\n .filter(Boolean)\n .join(\" \")}\n data-phase={phase}\n onTransitionEnd={(event: TransitionEvent<HTMLDivElement>) => {\n if (\n phase !== \"closing\" ||\n event.target !== event.currentTarget ||\n event.propertyName !== \"opacity\"\n ) {\n return;\n }\n onExitTransitionComplete?.();\n }}\n />\n );\n}\n\nexport interface WorkbenchMissionControlOverlayProps {\n i18n: WorkbenchMissionControlI18nRuntime;\n phase: WorkbenchMissionControlPhase;\n state: WorkbenchMissionControlState;\n}\n\nexport function WorkbenchMissionControlOverlay({\n i18n,\n phase,\n state\n}: WorkbenchMissionControlOverlayProps) {\n const layoutDockContentRef = useRef<HTMLDivElement | null>(null);\n const [layoutDockWidth, setLayoutDockWidth] = useState<number | null>(null);\n const layoutPresets: Array<{\n icon: ComponentType<IconProps>;\n key: \"balanced\" | \"row\" | \"column\";\n label: string;\n preset: { kind: \"balanced\" } | { kind: \"row\" } | { kind: \"column\" };\n }> = [\n {\n icon: AppWindowIcon,\n key: \"balanced\" as const,\n label: i18n.t(\"presets.balanced\"),\n preset: { kind: \"balanced\" } as const\n },\n {\n icon: GridHorizontalLinedIcon,\n key: \"row\" as const,\n label: i18n.t(\"presets.row\"),\n preset: { kind: \"row\" } as const\n },\n {\n icon: GridVerticalLinedIcon,\n key: \"column\" as const,\n label: i18n.t(\"presets.column\"),\n preset: { kind: \"column\" } as const\n }\n ].filter((option) =>\n shouldShowWorkbenchMissionControlLayoutPreset(\n state.selectedCount,\n option.preset\n )\n );\n const showLayoutSelectionHint = shouldShowWorkbenchMissionControlLayoutHint(\n state.selectedCount\n );\n const hasUsableLayoutPreset = layoutPresets.some((option) =>\n state.canUsePreset(option.preset)\n );\n const showNoAvailableLayoutMessage =\n shouldShowWorkbenchMissionControlNoAvailableLayoutMessage(\n state.selectedCount,\n hasUsableLayoutPreset\n );\n\n useLayoutEffect(() => {\n const element = layoutDockContentRef.current;\n if (!element) {\n return;\n }\n const computedStyle = window.getComputedStyle(element.parentElement!);\n const horizontalChrome =\n Number.parseFloat(computedStyle.paddingLeft) +\n Number.parseFloat(computedStyle.paddingRight) +\n Number.parseFloat(computedStyle.borderLeftWidth) +\n Number.parseFloat(computedStyle.borderRightWidth);\n setLayoutDockWidth(element.scrollWidth + horizontalChrome);\n }, [\n i18n,\n layoutPresets.length,\n showLayoutSelectionHint,\n showNoAvailableLayoutMessage,\n state.selectedCount\n ]);\n\n return (\n <div\n className=\"workbench-mission-control pointer-events-none absolute inset-0 z-[1100] overflow-hidden\"\n data-phase={phase}\n >\n {state.mode === \"layout\" ? (\n <div className=\"workbench-mission-control__footer-shell pointer-events-none absolute inset-x-0 bottom-0 flex justify-center px-6 pb-6\">\n <div\n className=\"workbench-mission-control__layout-dock desktop-dock-plate pointer-events-auto\"\n style={\n layoutDockWidth === null ? undefined : { width: layoutDockWidth }\n }\n onClick={(event) => event.stopPropagation()}\n >\n <div\n ref={layoutDockContentRef}\n className=\"workbench-mission-control__layout-dock-content\"\n >\n {showLayoutSelectionHint ? (\n <span className=\"workbench-mission-control__layout-hint\">\n {i18n.t(\"layoutSelectionHint\")}\n </span>\n ) : showNoAvailableLayoutMessage ? (\n <span className=\"workbench-mission-control__layout-hint\">\n {i18n.t(\"noAvailableLayout\")}\n </span>\n ) : (\n <div className=\"flex items-end gap-2\">\n {layoutPresets.map((option) => {\n const canApply = state.canApplyPreset(option.preset);\n const LayoutIcon = option.icon;\n\n return (\n <Button\n key={option.key}\n aria-label={option.label}\n className=\"workbench-mission-control__layout-dock-button\"\n data-layout-key={option.key}\n disabled={!canApply}\n size=\"icon\"\n title={option.label}\n type=\"button\"\n variant=\"ghost\"\n onClick={() => state.applyPreset(option.preset)}\n >\n <LayoutIcon\n aria-hidden\n className=\"workbench-mission-control__layout-glyph\"\n />\n </Button>\n );\n })}\n </div>\n )}\n </div>\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n","import type { WorkbenchLayoutPreset } from \"../core/types.ts\";\n\nexport function shouldShowWorkbenchMissionControlLayoutHint(\n selectedCount: number\n): boolean {\n return selectedCount < 2;\n}\n\nexport function shouldShowWorkbenchMissionControlNoAvailableLayoutMessage(\n selectedCount: number,\n hasUsablePreset: boolean\n): boolean {\n return selectedCount >= 2 && !hasUsablePreset;\n}\n\nexport function shouldShowWorkbenchMissionControlLayoutPreset(\n selectedCount: number,\n preset: WorkbenchLayoutPreset\n): boolean {\n if (selectedCount === 2) {\n return preset.kind !== \"balanced\";\n }\n\n if (selectedCount >= 4) {\n return preset.kind === \"balanced\";\n }\n\n return true;\n}\n","import { useCallback, useLayoutEffect, useRef, useState } from \"react\";\nimport type { WorkbenchMissionControlState } from \"./useWorkbenchMissionControlState.ts\";\n\nexport type WorkbenchMissionControlPhase =\n | \"closed\"\n | \"entering\"\n | \"open\"\n | \"closing\";\n\nexport interface WorkbenchMissionControlPresence {\n completeExitTransition(): void;\n phase: WorkbenchMissionControlPhase;\n state: WorkbenchMissionControlState | null;\n}\n\nexport function useWorkbenchMissionControlPresence(\n state: WorkbenchMissionControlState | null\n): WorkbenchMissionControlPresence {\n const [renderedState, setRenderedState] =\n useState<WorkbenchMissionControlState | null>(state);\n const [phase, setPhase] = useState<WorkbenchMissionControlPhase>(\n state ? \"open\" : \"closed\"\n );\n const phaseRef = useRef<WorkbenchMissionControlPhase>(\n state ? \"open\" : \"closed\"\n );\n const enterFrameRef = useRef<number | null>(null);\n const setPresencePhase = useCallback(\n (nextPhase: WorkbenchMissionControlPhase) => {\n phaseRef.current = nextPhase;\n setPhase(nextPhase);\n },\n []\n );\n const completeExitTransition = useCallback(() => {\n if (phaseRef.current !== \"closing\") {\n return;\n }\n setRenderedState(null);\n setPresencePhase(\"closed\");\n }, [setPresencePhase]);\n\n useLayoutEffect(() => {\n if (enterFrameRef.current !== null) {\n window.cancelAnimationFrame(enterFrameRef.current);\n enterFrameRef.current = null;\n }\n\n if (state) {\n setRenderedState(state);\n if (phaseRef.current === \"closed\" || phaseRef.current === \"closing\") {\n setPresencePhase(\"entering\");\n }\n enterFrameRef.current = window.requestAnimationFrame(() => {\n setPresencePhase(\"open\");\n enterFrameRef.current = null;\n });\n\n return () => {\n if (enterFrameRef.current !== null) {\n window.cancelAnimationFrame(enterFrameRef.current);\n enterFrameRef.current = null;\n }\n };\n }\n\n if (renderedState === null) {\n setPresencePhase(\"closed\");\n return undefined;\n }\n\n setPresencePhase(\"closing\");\n return undefined;\n }, [renderedState, setPresencePhase, state]);\n\n return {\n completeExitTransition,\n phase,\n state: renderedState\n };\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport {\n useExternalStoreSnapshot,\n type ExternalStoreSnapshotSource\n} from \"@tutti-os/ui-react-hooks\";\nimport {\n defaultWorkbenchLayoutConstraints,\n defaultWorkbenchSurfaceSize,\n type WorkbenchLayoutConstraints,\n type WorkbenchFrame,\n type WorkbenchLayoutPreset,\n type WorkbenchSize\n} from \"../core/types.ts\";\nimport { getWorkbenchLayoutPresetFrames } from \"../core/geometry.ts\";\nimport type { WorkbenchSurfacePresentation } from \"../react/types.ts\";\nimport {\n orderWorkbenchNodesForMissionControl,\n resolveWorkbenchMissionControlPreviewLayout\n} from \"./layout.ts\";\nimport type {\n WorkbenchMissionControlAdapter,\n WorkbenchMissionControlMode\n} from \"./types.ts\";\n\nconst missionControlStagePaddingX = 24;\nconst missionControlStageTop = 64;\nconst missionControlStageBottom = 104;\nconst inactiveMissionControlSnapshotSource: ExternalStoreSnapshotSource<null> =\n {\n getSnapshot() {\n return null;\n },\n subscribe() {\n return () => {};\n }\n };\n\nexport interface WorkbenchMissionControlState {\n applyPreset(preset: WorkbenchLayoutPreset): void;\n canApplyPreset(preset: WorkbenchLayoutPreset): boolean;\n canUsePreset(preset: WorkbenchLayoutPreset): boolean;\n mode: WorkbenchMissionControlMode;\n presentation: WorkbenchSurfacePresentation;\n selectedCount: number;\n}\n\nexport function useWorkbenchMissionControlState<TData>({\n adapter,\n mode,\n nodeIds,\n onRequestClose\n}: {\n adapter: WorkbenchMissionControlAdapter<TData> | null;\n mode: WorkbenchMissionControlMode | null;\n nodeIds?: readonly string[];\n onRequestClose: () => void;\n}): WorkbenchMissionControlState | null {\n const isActive = mode !== null && adapter !== null;\n const snapshot = useExternalStoreSnapshot(\n isActive\n ? {\n getSnapshot() {\n return adapter.getSnapshot();\n },\n subscribe(listener) {\n return adapter.subscribe(listener);\n }\n }\n : inactiveMissionControlSnapshotSource\n );\n const layoutConstraints: WorkbenchLayoutConstraints =\n snapshot?.layoutConstraints ?? defaultWorkbenchLayoutConstraints;\n const surfaceSize: WorkbenchSize =\n snapshot?.surfaceSize ?? defaultWorkbenchSurfaceSize;\n const scopedNodeIdSet = useMemo(\n () => (nodeIds === undefined ? null : new Set(nodeIds)),\n [nodeIds]\n );\n const visibleNodes = useMemo(() => {\n const nextVisibleNodes = snapshot?.visibleNodes ?? [];\n if (scopedNodeIdSet === null) {\n return nextVisibleNodes;\n }\n return nextVisibleNodes.filter((node) => scopedNodeIdSet.has(node.id));\n }, [scopedNodeIdSet, snapshot?.visibleNodes]);\n const [selectedNodeIds, setSelectedNodeIds] = useState<string[]>([]);\n\n useEffect(() => {\n if (mode === null) {\n return;\n }\n setSelectedNodeIds([]);\n }, [mode]);\n\n useEffect(() => {\n if (mode !== null && visibleNodes.length === 0) {\n onRequestClose();\n }\n }, [mode, onRequestClose, visibleNodes.length]);\n\n const orderedNodes = useMemo(\n () => (isActive ? orderWorkbenchNodesForMissionControl(visibleNodes) : []),\n [isActive, visibleNodes]\n );\n const orderedSelectedNodeIds = useMemo(\n () =>\n orderedNodes\n .map((node) => node.id)\n .filter((nodeId) => selectedNodeIds.includes(nodeId)),\n [orderedNodes, selectedNodeIds]\n );\n\n const previewFrame = useMemo<WorkbenchFrame>(\n () =>\n isActive\n ? {\n x: missionControlStagePaddingX,\n y: missionControlStageTop,\n width: Math.max(\n 240,\n surfaceSize.width - missionControlStagePaddingX * 2\n ),\n height: Math.max(\n 180,\n surfaceSize.height -\n missionControlStageTop -\n missionControlStageBottom\n )\n }\n : {\n x: 0,\n y: 0,\n width: 0,\n height: 0\n },\n [isActive, surfaceSize]\n );\n const previewItems = useMemo(\n () =>\n isActive\n ? resolveWorkbenchMissionControlPreviewLayout({\n container: previewFrame,\n nodes: orderedNodes\n })\n : [],\n [isActive, orderedNodes, previewFrame]\n );\n const canUsePreset = useCallback(\n (nextPreset: WorkbenchLayoutPreset) =>\n orderedSelectedNodeIds.length < 2\n ? true\n : getWorkbenchLayoutPresetFrames(\n orderedSelectedNodeIds.length,\n nextPreset,\n surfaceSize,\n layoutConstraints\n ) !== null,\n [layoutConstraints, orderedSelectedNodeIds.length, surfaceSize]\n );\n const canApplyPreset = useCallback(\n (nextPreset: WorkbenchLayoutPreset) =>\n mode === \"layout\" &&\n orderedSelectedNodeIds.length >= 2 &&\n canUsePreset(nextPreset),\n [canUsePreset, mode, orderedSelectedNodeIds.length]\n );\n const applyActivationAndClose = useCallback(\n (nodeId: string) => {\n const nextAdapter = adapter;\n if (!nextAdapter) {\n return;\n }\n const nextSnapshot = nextAdapter.getSnapshot();\n if (!nextSnapshot.visibleNodes.some((node) => node.id === nodeId)) {\n return;\n }\n onRequestClose();\n window.requestAnimationFrame(() => {\n nextAdapter.focusNode(nodeId);\n });\n },\n [adapter, onRequestClose]\n );\n const applyLayoutAndClose = useCallback(\n (nodeIds: string[], nextPreset: WorkbenchLayoutPreset) => {\n if (!adapter || nodeIds.length < 2) {\n return;\n }\n onRequestClose();\n window.requestAnimationFrame(() => {\n adapter.applyLayoutPreset(nodeIds, nextPreset);\n });\n },\n [adapter, onRequestClose]\n );\n const onPreviewPress = useCallback(\n (nodeId: string) => {\n if (mode === null) {\n return;\n }\n if (mode === \"activate\") {\n applyActivationAndClose(nodeId);\n return;\n }\n\n setSelectedNodeIds((current) =>\n current.includes(nodeId)\n ? current.filter((entry) => entry !== nodeId)\n : [...current, nodeId]\n );\n },\n [applyActivationAndClose, mode]\n );\n const selectedNodeIdSet = useMemo(\n () => new Set(selectedNodeIds),\n [selectedNodeIds]\n );\n const applyPreset = useCallback(\n (nextPreset: WorkbenchLayoutPreset) => {\n if (!canApplyPreset(nextPreset)) {\n return;\n }\n applyLayoutAndClose(orderedSelectedNodeIds, nextPreset);\n },\n [applyLayoutAndClose, canApplyPreset, orderedSelectedNodeIds]\n );\n\n const presentation = useMemo<WorkbenchSurfacePresentation | null>(\n () =>\n mode === null\n ? null\n : {\n frameByNodeId: new Map(\n previewItems.map((item) => [item.node.id, item.frame])\n ),\n interaction: {\n mode,\n onBackdropPress: onRequestClose,\n onNodePress: onPreviewPress,\n selectedNodeIds: selectedNodeIdSet\n },\n mode: \"mission-control\",\n visibleNodeIds: new Set(orderedNodes.map((node) => node.id))\n },\n [\n mode,\n onPreviewPress,\n onRequestClose,\n orderedNodes,\n previewItems,\n selectedNodeIdSet\n ]\n );\n\n useEffect(() => {\n if (mode === null) {\n return undefined;\n }\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n onRequestClose();\n }\n };\n\n window.addEventListener(\"keydown\", onKeyDown, true);\n return () => {\n window.removeEventListener(\"keydown\", onKeyDown, true);\n };\n }, [mode, onRequestClose]);\n\n if (mode === null || presentation === null) {\n return null;\n }\n\n return {\n applyPreset,\n canApplyPreset,\n canUsePreset,\n mode,\n presentation,\n selectedCount: orderedSelectedNodeIds.length\n };\n}\n","import type { WorkbenchFrame, WorkbenchNode } from \"../core/types.ts\";\n\nexport const WORKBENCH_MISSION_CONTROL_GAP_PX = 20;\n\nexport interface WorkbenchMissionControlPreviewLayoutItem<TData = unknown> {\n frame: WorkbenchFrame;\n node: WorkbenchNode<TData>;\n}\n\nexport function orderWorkbenchNodesForMissionControl<TData>(\n nodes: readonly WorkbenchNode<TData>[]\n): WorkbenchNode<TData>[] {\n return [...nodes].sort((left, right) => {\n const topDelta = left.frame.y - right.frame.y;\n if (Math.abs(topDelta) > 24) {\n return topDelta;\n }\n\n const leftDelta = left.frame.x - right.frame.x;\n if (leftDelta !== 0) {\n return leftDelta;\n }\n\n return left.id.localeCompare(right.id);\n });\n}\n\nexport function resolveWorkbenchMissionControlPreviewLayout<TData>(input: {\n container: WorkbenchFrame;\n gap?: number;\n nodes: readonly WorkbenchNode<TData>[];\n}): WorkbenchMissionControlPreviewLayoutItem<TData>[] {\n const nodes = orderWorkbenchNodesForMissionControl(input.nodes);\n if (nodes.length === 0) {\n return [];\n }\n\n const gap = input.gap ?? WORKBENCH_MISSION_CONTROL_GAP_PX;\n const container = input.container;\n const scale = resolveBestPreviewScale(nodes, container, gap);\n if (scale <= 0) {\n return [];\n }\n const rows = packNodesIntoRows(nodes, container.width, gap, scale);\n if (rows.length === 0) {\n return [];\n }\n\n const totalHeight =\n rows.reduce((sum, row) => sum + row.height, 0) +\n Math.max(0, rows.length - 1) * gap;\n const startY = container.y + (container.height - totalHeight) / 2;\n const layout: WorkbenchMissionControlPreviewLayoutItem<TData>[] = [];\n let cursorY = startY;\n\n rows.forEach((row) => {\n let cursorX = container.x + (container.width - row.width) / 2;\n\n row.items.forEach((item) => {\n layout.push({\n frame: {\n x: cursorX,\n y: cursorY + (row.height - item.height) / 2,\n width: item.width,\n height: item.height\n },\n node: item.node\n });\n cursorX += item.width + gap;\n });\n\n cursorY += row.height + gap;\n });\n\n return layout;\n}\n\nfunction resolveBestPreviewScale<TData>(\n nodes: readonly WorkbenchNode<TData>[],\n container: WorkbenchFrame,\n gap: number\n): number {\n if (container.width <= 0 || container.height <= 0) {\n return 0;\n }\n\n let lowerBound = 0;\n let upperBound = 1;\n\n while (\n scaleFitsInsideContainer(\n nodes,\n container.width,\n container.height,\n gap,\n upperBound\n )\n ) {\n lowerBound = upperBound;\n upperBound *= 2;\n\n if (upperBound > 64) {\n return lowerBound;\n }\n }\n\n for (let iteration = 0; iteration < 20; iteration += 1) {\n const next = (lowerBound + upperBound) / 2;\n\n if (\n scaleFitsInsideContainer(\n nodes,\n container.width,\n container.height,\n gap,\n next\n )\n ) {\n lowerBound = next;\n } else {\n upperBound = next;\n }\n }\n\n return lowerBound;\n}\n\nfunction scaleFitsInsideContainer<TData>(\n nodes: readonly WorkbenchNode<TData>[],\n containerWidth: number,\n containerHeight: number,\n gap: number,\n scale: number\n): boolean {\n if (scale <= 0) {\n return false;\n }\n\n const rows = packNodesIntoRows(nodes, containerWidth, gap, scale);\n if (rows.length === 0) {\n return false;\n }\n\n const totalHeight =\n rows.reduce((sum, row) => sum + row.height, 0) +\n Math.max(0, rows.length - 1) * gap;\n return totalHeight <= containerHeight;\n}\n\nfunction packNodesIntoRows<TData>(\n nodes: readonly WorkbenchNode<TData>[],\n containerWidth: number,\n gap: number,\n scale: number\n): PackedPreviewRow<TData>[] {\n const rows: PackedPreviewRow<TData>[] = [];\n let currentRow: PackedPreviewRow<TData> | null = null;\n\n const commitCurrentRow = () => {\n if (currentRow && currentRow.items.length > 0) {\n rows.push(currentRow);\n }\n };\n\n for (const node of nodes) {\n const width = Math.max(1, node.frame.width * scale);\n const height = Math.max(1, node.frame.height * scale);\n\n if (width > containerWidth) {\n return [];\n }\n\n if (!currentRow) {\n currentRow = {\n height,\n items: [{ height, node, width }],\n width\n };\n continue;\n }\n\n const nextWidth = currentRow.width + gap + width;\n if (nextWidth > containerWidth) {\n commitCurrentRow();\n currentRow = {\n height,\n items: [{ height, node, width }],\n width\n };\n continue;\n }\n\n currentRow.items.push({ height, node, width });\n currentRow.width = nextWidth;\n currentRow.height = Math.max(currentRow.height, height);\n }\n\n commitCurrentRow();\n\n return rows;\n}\n\ninterface PackedPreviewRow<TData> {\n height: number;\n items: Array<{\n height: number;\n node: WorkbenchNode<TData>;\n width: number;\n }>;\n width: number;\n}\n","import {\n useCallback,\n useEffect,\n type CSSProperties,\n type ReactNode\n} from \"react\";\nimport type { WorkbenchController } from \"../store/types.ts\";\nimport type {\n WorkbenchLayoutConstraintsInput,\n WorkbenchNode\n} from \"../core/types.ts\";\nimport { WorkbenchDockFrame } from \"./WorkbenchDockFrame.tsx\";\nimport { WorkbenchNodeLayer } from \"./WorkbenchNodeLayer.tsx\";\nimport {\n WorkbenchProvider,\n useWorkbenchController\n} from \"./WorkbenchProvider.tsx\";\nimport type { WorkbenchDebugDiagnostics } from \"../store/types.ts\";\nimport { useWorkbenchShortcuts } from \"./hooks/useWorkbenchShortcuts.ts\";\nimport { useWorkbenchSurfaceSize } from \"./hooks/useWorkbenchSurfaceSize.ts\";\nimport { useWorkbenchGenieAnimation } from \"./useWorkbenchGenieAnimation.tsx\";\nimport type { WorkbenchNodeGeniePreviewRenderer } from \"./useWorkbenchGenieAnimation.tsx\";\nimport type {\n WorkbenchDockContext,\n WorkbenchDockPlacement,\n WorkbenchKeepMinimizedNodeMounted,\n WorkbenchMinimizeAnimation,\n WorkbenchRenderNode,\n WorkbenchSurfacePresentation,\n WorkbenchRenderWindowActions,\n WorkbenchRenderWindowHeader,\n WorkbenchResolveFullscreenHeaderMode,\n WorkbenchResolveWindowChromeMode,\n WorkbenchWindowChromeMode\n} from \"./types.ts\";\nimport type {\n WorkbenchDockPreviewCache,\n WorkbenchDockPreviewCacheKeyResolver\n} from \"./dockPreviewCache.ts\";\nimport type { WorkbenchWindowChromeI18nRuntime } from \"./workbenchWindowI18n.ts\";\n\nexport interface WorkbenchSurfaceProps<TData = unknown> {\n captureNodePreviewImage?: (\n node: WorkbenchNode<TData>\n ) => Promise<string | null> | string | null;\n className?: string;\n controller: WorkbenchController<TData>;\n debugDiagnostics?: WorkbenchDebugDiagnostics;\n dockPreviewCache?: WorkbenchDockPreviewCache;\n dockPlacement?: WorkbenchDockPlacement;\n interactive?: boolean;\n layoutConstraints?: WorkbenchLayoutConstraintsInput;\n missionControlPhase?: \"closed\" | \"entering\" | \"open\" | \"closing\";\n minimizeAnimation?: WorkbenchMinimizeAnimation;\n presentation?: WorkbenchSurfacePresentation | null;\n renderBackdrop?: () => ReactNode;\n renderBottomChrome?: () => ReactNode;\n renderDock?: (context: WorkbenchDockContext<TData>) => ReactNode;\n renderNode: WorkbenchRenderNode<TData>;\n renderNodeGeniePreview?: WorkbenchNodeGeniePreviewRenderer<TData>;\n renderOverlay?: () => ReactNode;\n renderTopChrome?: () => ReactNode;\n renderWindowActions?: WorkbenchRenderWindowActions<TData>;\n renderWindowHeader?: WorkbenchRenderWindowHeader<TData>;\n shouldKeepMinimizedNodeMounted?: WorkbenchKeepMinimizedNodeMounted<TData>;\n resolveFullscreenHeaderMode?: WorkbenchResolveFullscreenHeaderMode<TData>;\n resolveDockAnchorKey?: (node: WorkbenchNode<TData>) => string;\n resolveDockPreviewCacheKey?: WorkbenchDockPreviewCacheKeyResolver<TData>;\n shortcutsEnabled?: boolean;\n shouldCaptureNodePreviewImage?: (node: WorkbenchNode<TData>) => boolean;\n wallpaper?: WorkbenchSurfaceWallpaper;\n windowChromeMode?:\n | WorkbenchWindowChromeMode\n | WorkbenchResolveWindowChromeMode<TData>;\n windowChromeI18n?: WorkbenchWindowChromeI18nRuntime;\n}\n\nexport type WorkbenchSurfaceWallpaperFit =\n | \"contain\"\n | \"cover\"\n | \"stretch\"\n | \"center\";\n\nexport interface WorkbenchSurfaceWallpaper {\n appearance?: \"dark\" | \"light\";\n fit?: WorkbenchSurfaceWallpaperFit;\n position?: string;\n url: string;\n}\n\nexport function WorkbenchSurface<TData>({\n captureNodePreviewImage,\n className,\n controller,\n debugDiagnostics,\n dockPreviewCache,\n dockPlacement,\n interactive,\n layoutConstraints,\n missionControlPhase,\n minimizeAnimation,\n presentation,\n renderBackdrop,\n renderBottomChrome,\n renderDock,\n renderNode,\n renderNodeGeniePreview,\n renderOverlay,\n renderTopChrome,\n renderWindowActions,\n renderWindowHeader,\n shouldKeepMinimizedNodeMounted,\n resolveFullscreenHeaderMode,\n resolveDockAnchorKey,\n resolveDockPreviewCacheKey,\n shortcutsEnabled,\n shouldCaptureNodePreviewImage,\n wallpaper,\n windowChromeMode,\n windowChromeI18n\n}: WorkbenchSurfaceProps<TData>) {\n return (\n <WorkbenchProvider controller={controller}>\n <WorkbenchSurfaceInner\n captureNodePreviewImage={captureNodePreviewImage}\n className={className}\n debugDiagnostics={debugDiagnostics}\n dockPreviewCache={dockPreviewCache}\n dockPlacement={dockPlacement}\n interactive={interactive}\n layoutConstraints={layoutConstraints}\n missionControlPhase={missionControlPhase}\n minimizeAnimation={minimizeAnimation}\n presentation={presentation}\n renderBackdrop={renderBackdrop}\n renderBottomChrome={renderBottomChrome}\n renderDock={renderDock}\n renderNode={renderNode}\n renderNodeGeniePreview={renderNodeGeniePreview}\n renderOverlay={renderOverlay}\n renderTopChrome={renderTopChrome}\n renderWindowActions={renderWindowActions}\n renderWindowHeader={renderWindowHeader}\n shouldKeepMinimizedNodeMounted={shouldKeepMinimizedNodeMounted}\n resolveFullscreenHeaderMode={resolveFullscreenHeaderMode}\n resolveDockAnchorKey={resolveDockAnchorKey}\n resolveDockPreviewCacheKey={resolveDockPreviewCacheKey}\n shortcutsEnabled={shortcutsEnabled}\n shouldCaptureNodePreviewImage={shouldCaptureNodePreviewImage}\n wallpaper={wallpaper}\n windowChromeMode={windowChromeMode}\n windowChromeI18n={windowChromeI18n}\n />\n </WorkbenchProvider>\n );\n}\n\nfunction WorkbenchSurfaceInner<TData>({\n captureNodePreviewImage,\n className,\n debugDiagnostics,\n dockPreviewCache,\n dockPlacement,\n interactive = true,\n layoutConstraints,\n missionControlPhase,\n minimizeAnimation,\n presentation,\n renderBackdrop,\n renderBottomChrome,\n renderDock,\n renderNode,\n renderNodeGeniePreview,\n renderOverlay,\n renderTopChrome,\n renderWindowActions,\n renderWindowHeader,\n shouldKeepMinimizedNodeMounted,\n resolveFullscreenHeaderMode,\n resolveDockAnchorKey,\n resolveDockPreviewCacheKey,\n shortcutsEnabled,\n shouldCaptureNodePreviewImage,\n wallpaper,\n windowChromeMode,\n windowChromeI18n\n}: Omit<WorkbenchSurfaceProps<TData>, \"controller\">) {\n const controller = useWorkbenchController<TData>();\n const onSizeChange = useCallback(\n (size: { width: number; height: number }) => {\n controller.commands.setSurfaceSize(size);\n },\n [controller]\n );\n const ref = useWorkbenchSurfaceSize<HTMLDivElement>(onSizeChange);\n const genie = useWorkbenchGenieAnimation({\n captureNodePreviewImage,\n controller,\n debugDiagnostics,\n dockPreviewCache,\n minimizeAnimation,\n renderNodeGeniePreview,\n resolveDockAnchorKey,\n resolveDockPreviewCacheKey,\n shouldCaptureNodePreviewImage\n });\n useWorkbenchShortcuts<TData>((shortcutsEnabled ?? true) && interactive);\n useEffect(() => {\n if (!layoutConstraints) {\n return;\n }\n controller.commands.setLayoutConstraints(layoutConstraints);\n }, [controller, layoutConstraints]);\n const wallpaperStyle: CSSProperties | undefined = wallpaper\n ? {\n backgroundImage: `url(${JSON.stringify(wallpaper.url)})`,\n backgroundPosition: wallpaper.position ?? \"center\",\n backgroundSize: resolveWorkbenchSurfaceWallpaperBackgroundSize(\n wallpaper.fit ?? \"cover\"\n )\n }\n : undefined;\n\n return (\n <div\n ref={ref}\n className={[\"workbench-surface\", className].filter(Boolean).join(\" \")}\n data-mission-control-phase={missionControlPhase ?? \"closed\"}\n data-presentation-mode={presentation?.mode ?? \"default\"}\n data-workbench-interactive={interactive ? \"true\" : \"false\"}\n >\n {wallpaper ? (\n <div\n className=\"workbench-surface__wallpaper\"\n style={wallpaperStyle}\n aria-hidden\n />\n ) : null}\n {renderTopChrome ? (\n <div className=\"workbench-surface__top-chrome\">{renderTopChrome()}</div>\n ) : null}\n {renderBackdrop ? renderBackdrop() : null}\n <WorkbenchNodeLayer\n genie={genie}\n interactive={interactive}\n presentation={presentation}\n renderNode={renderNode}\n renderWindowActions={renderWindowActions}\n renderWindowHeader={renderWindowHeader}\n shouldKeepMinimizedNodeMounted={shouldKeepMinimizedNodeMounted}\n resolveFullscreenHeaderMode={resolveFullscreenHeaderMode}\n windowChromeMode={windowChromeMode}\n windowChromeI18n={windowChromeI18n}\n />\n <WorkbenchDockFrame\n dockPlacement={dockPlacement}\n genie={genie}\n interactive={interactive}\n renderDock={renderDock}\n />\n {renderBottomChrome ? (\n <div className=\"workbench-surface__bottom-chrome\">\n {renderBottomChrome()}\n </div>\n ) : null}\n {renderOverlay ? renderOverlay() : null}\n {genie.genieLayer}\n </div>\n );\n}\n\nfunction resolveWorkbenchSurfaceWallpaperBackgroundSize(\n fit: WorkbenchSurfaceWallpaperFit\n): string {\n switch (fit) {\n case \"contain\":\n return \"contain\";\n case \"cover\":\n return \"cover\";\n case \"stretch\":\n return \"100% 100%\";\n case \"center\":\n return \"auto\";\n }\n}\n","import { useMemo, type ReactNode } from \"react\";\nimport {\n selectFocusedWorkbenchNode,\n selectFullscreenNodeToExitBeforeDockLaunch\n} from \"../core/selectors.ts\";\nimport type { WorkbenchNode } from \"../core/types.ts\";\nimport type { WorkbenchDockContext, WorkbenchDockPlacement } from \"./types.ts\";\nimport { useWorkbenchController } from \"./WorkbenchProvider.tsx\";\nimport { createWorkbenchDockNodesSelector } from \"./dockNodeSelectors.ts\";\nimport { useWorkbenchSelector } from \"./hooks/useWorkbenchSelector.ts\";\nimport type { WorkbenchGenieController } from \"./useWorkbenchGenieAnimation.tsx\";\n\nexport interface WorkbenchDockFrameProps<TData = unknown> {\n dockPlacement?: WorkbenchDockPlacement;\n genie: WorkbenchGenieController<TData>;\n interactive?: boolean;\n renderDock?: (context: WorkbenchDockContext<TData>) => ReactNode;\n}\n\nexport function WorkbenchDockFrame<TData>({\n dockPlacement = \"bottom\",\n genie,\n interactive = true,\n renderDock\n}: WorkbenchDockFrameProps<TData>) {\n const controller = useWorkbenchController<TData>();\n const selectDockNodes = useMemo(\n () => createWorkbenchDockNodesSelector<TData>(),\n []\n );\n const hasFullscreenNode = useWorkbenchSelector((state) =>\n state.nodes.some(\n (node) => node.displayMode === \"fullscreen\" && !node.isMinimized\n )\n );\n const nodes = useWorkbenchSelector<TData, readonly WorkbenchNode<TData>[]>(\n selectDockNodes\n );\n const minimizedNodesWithPending = useMemo(\n () =>\n mergePendingMinimizedDockNode(\n nodes.filter((node) => node.isMinimized),\n genie.pendingMinimizedNode\n ),\n [genie.pendingMinimizedNode, nodes]\n );\n const minimizedNodes = useMemo(\n () => minimizedNodesWithPending.filter((node) => node.isMinimized),\n [minimizedNodesWithPending]\n );\n const focusedNodeId = useWorkbenchSelector(\n (state) => selectFocusedWorkbenchNode(state)?.id ?? null\n );\n\n if (!renderDock && minimizedNodes.length === 0) {\n return null;\n }\n\n return (\n <>\n {hasFullscreenNode ? (\n <div\n className=\"workbench-dock-frame__immersive-hover-zone\"\n data-dock-placement={dockPlacement}\n aria-hidden\n />\n ) : null}\n <div\n className=\"workbench-dock-frame\"\n data-dock-placement={dockPlacement}\n data-immersive-state={hasFullscreenNode ? \"hidden\" : \"disabled\"}\n >\n {renderDock\n ? renderDock({\n controller,\n focusedNodeId,\n genie: {\n launchNodeFromAnchor: (anchorKey, nodeID, launch) => {\n const fullscreenNode = interactive\n ? selectFullscreenNodeToExitBeforeDockLaunch(\n controller.getSnapshot(),\n nodeID\n )\n : null;\n if (fullscreenNode) {\n controller.commands.exitFullscreen(fullscreenNode.id);\n }\n genie.launchNodeFromAnchor(anchorKey, nodeID, launch);\n },\n registerDockAnchor: (anchorKey, element) => {\n genie.registerDockAnchor(anchorKey, element);\n },\n shouldAnimateMinimizedDockEnter: (nodeID) => {\n return genie.shouldAnimateMinimizedDockEnter(nodeID);\n },\n isPendingMinimizedDockNode: (nodeID) => {\n return genie.isPendingMinimizedDockNode(nodeID);\n }\n },\n minimizedNodes,\n nodes\n })\n : null}\n </div>\n </>\n );\n}\n\nfunction mergePendingMinimizedDockNode<TData>(\n nodes: readonly WorkbenchNode<TData>[],\n pendingNode: WorkbenchNode<TData> | null\n): readonly WorkbenchNode<TData>[] {\n if (!pendingNode) {\n return nodes;\n }\n\n const existingNode = nodes.find((node) => node.id === pendingNode.id);\n if (existingNode?.isMinimized) {\n return nodes;\n }\n\n return [...nodes.filter((node) => node.id !== pendingNode.id), pendingNode];\n}\n","import { getWorkbenchSnapRect } from \"./geometry.ts\";\nimport { orderWorkbenchNodesForRender } from \"./stack.ts\";\nimport type { WorkbenchFrame, WorkbenchNode, WorkbenchState } from \"./types.ts\";\n\nexport function selectVisibleWorkbenchNodes<TData>(\n state: WorkbenchState<TData>\n): WorkbenchNode<TData>[] {\n return state.nodes.filter((node) => !node.isMinimized);\n}\n\nexport function selectFocusedWorkbenchNode<TData>(\n state: WorkbenchState<TData>\n): WorkbenchNode<TData> | null {\n const focusedID = state.nodeStack.at(-1);\n return state.nodes.find((node) => node.id === focusedID) ?? null;\n}\n\nexport function selectFullscreenNodeToExitBeforeDockLaunch<TData>(\n state: WorkbenchState<TData>,\n targetNodeID?: string\n): WorkbenchNode<TData> | null {\n const nodeByID = new Map(state.nodes.map((node) => [node.id, node]));\n const isVisibleFullscreenNode = (\n node: WorkbenchNode<TData> | undefined\n ): node is WorkbenchNode<TData> => {\n return (\n node !== undefined &&\n node.displayMode === \"fullscreen\" &&\n !node.isMinimized\n );\n };\n\n let target: WorkbenchNode<TData> | undefined;\n for (let index = state.nodeStack.length - 1; index >= 0; index -= 1) {\n const stackedNode = nodeByID.get(state.nodeStack[index] ?? \"\");\n if (isVisibleFullscreenNode(stackedNode)) {\n target = stackedNode;\n break;\n }\n }\n target ??= state.nodes.find(isVisibleFullscreenNode);\n\n if (!target || target.id === targetNodeID) {\n return null;\n }\n return target;\n}\n\nexport function selectOrderedWorkbenchNodes<TData>(\n state: WorkbenchState<TData>\n): WorkbenchNode<TData>[] {\n return orderWorkbenchNodesForRender(\n selectVisibleWorkbenchNodes(state),\n state.nodeStack\n );\n}\n\nexport function selectWorkbenchNodeZIndex(\n state: WorkbenchState,\n nodeID: string\n): number {\n const index = state.nodeStack.indexOf(nodeID);\n return index < 0 ? 1 : index + 1;\n}\n\nexport function selectWorkbenchSnapPreviewRect(\n state: WorkbenchState\n): WorkbenchFrame | null {\n return getWorkbenchSnapRect(\n state.activeSnapTarget,\n state.surfaceSize,\n state.layoutConstraints\n );\n}\n","import { createContext, useContext, type PropsWithChildren } from \"react\";\nimport type { WorkbenchController } from \"../store/types.ts\";\n\nconst WorkbenchContext = createContext<WorkbenchController | null>(null);\n\nexport interface WorkbenchProviderProps<\n TData = unknown\n> extends PropsWithChildren {\n controller: WorkbenchController<TData>;\n}\n\nexport function WorkbenchProvider<TData>({\n children,\n controller\n}: WorkbenchProviderProps<TData>) {\n return (\n <WorkbenchContext.Provider value={controller}>\n {children}\n </WorkbenchContext.Provider>\n );\n}\n\nexport function useWorkbenchController<\n TData = unknown\n>(): WorkbenchController<TData> {\n const controller = useContext(WorkbenchContext);\n if (!controller) {\n throw new Error(\"WorkbenchProvider is missing.\");\n }\n return controller as WorkbenchController<TData>;\n}\n","import type { WorkbenchNode, WorkbenchState } from \"../core/types.ts\";\n\nexport function createWorkbenchDockNodesSelector<TData>(): (\n state: WorkbenchState<TData>\n) => readonly WorkbenchNode<TData>[] {\n let previousNodes: readonly WorkbenchNode<TData>[] | null = null;\n\n return (state) => {\n if (\n previousNodes &&\n areWorkbenchDockNodesEqual(previousNodes, state.nodes)\n ) {\n return previousNodes;\n }\n\n previousNodes = state.nodes;\n return state.nodes;\n };\n}\n\nfunction areWorkbenchDockNodesEqual<TData>(\n previousNodes: readonly WorkbenchNode<TData>[],\n nextNodes: readonly WorkbenchNode<TData>[]\n): boolean {\n if (previousNodes.length !== nextNodes.length) {\n return false;\n }\n\n return previousNodes.every((previousNode, index) => {\n const nextNode = nextNodes[index];\n return (\n nextNode !== undefined &&\n previousNode.id === nextNode.id &&\n previousNode.kind === nextNode.kind &&\n previousNode.title === nextNode.title &&\n previousNode.displayMode === nextNode.displayMode &&\n previousNode.isMinimized === nextNode.isMinimized &&\n previousNode.minimizedAtUnixMs === nextNode.minimizedAtUnixMs &&\n previousNode.frame.width === nextNode.frame.width &&\n previousNode.frame.height === nextNode.frame.height &&\n previousNode.data === nextNode.data\n );\n });\n}\n","import { useExternalStoreSelector } from \"@tutti-os/ui-react-hooks\";\nimport type { WorkbenchState } from \"../../core/types.ts\";\nimport { useWorkbenchController } from \"../WorkbenchProvider.tsx\";\n\nexport function useWorkbenchSelector<TData, TResult>(\n selector: (state: WorkbenchState<TData>) => TResult\n): TResult {\n const controller = useWorkbenchController<TData>();\n return useExternalStoreSelector(controller, selector);\n}\n","import { memo, useMemo } from \"react\";\nimport {\n selectFocusedWorkbenchNode,\n selectWorkbenchNodeZIndex,\n selectWorkbenchSnapPreviewRect\n} from \"../core/selectors.ts\";\nimport type { WorkbenchNode } from \"../core/types.ts\";\nimport type {\n WorkbenchKeepMinimizedNodeMounted,\n WorkbenchRenderNode,\n WorkbenchSurfacePresentation,\n WorkbenchRenderWindowActions,\n WorkbenchRenderWindowHeader,\n WorkbenchResolveFullscreenHeaderMode,\n WorkbenchResolveWindowChromeMode,\n WorkbenchWindowChromeMode\n} from \"./types.ts\";\nimport type { WorkbenchGenieController } from \"./useWorkbenchGenieAnimation.tsx\";\nimport { useWorkbenchController } from \"./WorkbenchProvider.tsx\";\nimport { WorkbenchWindowFrame } from \"./WorkbenchWindowFrame.tsx\";\nimport { useWorkbenchSelector } from \"./hooks/useWorkbenchSelector.ts\";\nimport { createRenderedWorkbenchNodeIDsSelector } from \"./renderedNodeIds.ts\";\nimport type { WorkbenchWindowChromeI18nRuntime } from \"./workbenchWindowI18n.ts\";\nimport { resolveWorkbenchWindowChromeMode } from \"./windowHeader.ts\";\n\nexport interface WorkbenchNodeLayerProps<TData = unknown> {\n genie: WorkbenchGenieController<TData>;\n interactive?: boolean;\n presentation?: WorkbenchSurfacePresentation | null;\n renderNode: WorkbenchRenderNode<TData>;\n shouldKeepMinimizedNodeMounted?: WorkbenchKeepMinimizedNodeMounted<TData>;\n renderWindowActions?: WorkbenchRenderWindowActions<TData>;\n renderWindowHeader?: WorkbenchRenderWindowHeader<TData>;\n resolveFullscreenHeaderMode?: WorkbenchResolveFullscreenHeaderMode<TData>;\n windowChromeMode?:\n | WorkbenchWindowChromeMode\n | WorkbenchResolveWindowChromeMode<TData>;\n windowChromeI18n?: WorkbenchWindowChromeI18nRuntime;\n}\n\nexport function WorkbenchNodeLayer<TData>({\n genie,\n interactive = true,\n presentation,\n renderNode,\n shouldKeepMinimizedNodeMounted,\n renderWindowActions,\n renderWindowHeader,\n resolveFullscreenHeaderMode,\n windowChromeMode,\n windowChromeI18n\n}: WorkbenchNodeLayerProps<TData>) {\n const selectRenderedNodeIDs = useMemo(\n () =>\n createRenderedWorkbenchNodeIDsSelector(shouldKeepMinimizedNodeMounted),\n [shouldKeepMinimizedNodeMounted]\n );\n const nodeIDs = useWorkbenchSelector<TData, readonly string[]>(\n selectRenderedNodeIDs\n );\n const snapPreviewRect = useWorkbenchSelector(selectWorkbenchSnapPreviewRect);\n const presentationInteraction =\n interactive && presentation?.mode === \"mission-control\"\n ? (presentation.interaction ?? null)\n : null;\n\n return (\n <div\n className=\"workbench-node-layer\"\n onClick={\n presentationInteraction\n ? (event) => {\n if (event.target !== event.currentTarget) {\n return;\n }\n presentationInteraction.onBackdropPress();\n }\n : undefined\n }\n >\n {snapPreviewRect ? (\n <div\n className=\"workbench-snap-preview\"\n style={{\n height: snapPreviewRect.height,\n left: snapPreviewRect.x,\n top: snapPreviewRect.y,\n width: snapPreviewRect.width\n }}\n />\n ) : null}\n {nodeIDs.map((nodeID) => (\n <MemoizedWorkbenchNodeLayerItem\n key={nodeID}\n fullscreenHeaderMode={resolveFullscreenHeaderMode}\n genie={genie}\n interactive={interactive}\n nodeID={nodeID}\n presentation={presentation}\n renderNode={renderNode}\n renderWindowActions={renderWindowActions}\n renderWindowHeader={renderWindowHeader}\n windowChromeI18n={windowChromeI18n}\n windowChromeMode={windowChromeMode}\n />\n ))}\n </div>\n );\n}\n\ninterface WorkbenchNodeLayerItemProps<TData = unknown> {\n fullscreenHeaderMode?: WorkbenchResolveFullscreenHeaderMode<TData>;\n genie: WorkbenchGenieController<TData>;\n interactive: boolean;\n nodeID: string;\n presentation?: WorkbenchSurfacePresentation | null;\n renderNode: WorkbenchRenderNode<TData>;\n renderWindowActions?: WorkbenchRenderWindowActions<TData>;\n renderWindowHeader?: WorkbenchRenderWindowHeader<TData>;\n windowChromeMode?:\n | WorkbenchWindowChromeMode\n | WorkbenchResolveWindowChromeMode<TData>;\n windowChromeI18n?: WorkbenchWindowChromeI18nRuntime;\n}\n\nfunction WorkbenchNodeLayerItem<TData>({\n fullscreenHeaderMode,\n genie,\n interactive,\n nodeID,\n presentation,\n renderNode,\n renderWindowActions,\n renderWindowHeader,\n windowChromeI18n,\n windowChromeMode\n}: WorkbenchNodeLayerItemProps<TData>) {\n const controller = useWorkbenchController<TData>();\n const node = useWorkbenchSelector<TData, WorkbenchNode<TData> | null>(\n (state) => state.nodes.find((candidate) => candidate.id === nodeID) ?? null\n );\n const isFocused = useWorkbenchSelector(\n (state) => selectFocusedWorkbenchNode(state)?.id === nodeID\n );\n const zIndex = useWorkbenchSelector((state) =>\n selectWorkbenchNodeZIndex(state, nodeID)\n );\n\n if (!node) {\n return null;\n }\n\n return (\n <WorkbenchWindowFrame\n hiddenMounted={node.isMinimized}\n interactive={interactive}\n presentation={presentation}\n node={node}\n genie={genie}\n fullscreenHeaderMode={fullscreenHeaderMode?.({\n controller,\n node\n })}\n renderActions={renderWindowActions}\n renderHeader={renderWindowHeader}\n windowChromeI18n={windowChromeI18n}\n windowChromeMode={resolveWorkbenchWindowChromeMode({\n controller,\n node,\n windowChromeMode\n })}\n >\n {renderNode({\n node,\n layout: {\n frame: node.frame,\n presentation,\n zIndex,\n isFocused\n },\n controller\n })}\n </WorkbenchWindowFrame>\n );\n}\n\nconst MemoizedWorkbenchNodeLayerItem = memo(\n WorkbenchNodeLayerItem\n) as typeof WorkbenchNodeLayerItem;\n","import { type ReactNode } from \"react\";\nimport { createI18nRuntime } from \"@tutti-os/ui-i18n-runtime\";\nimport { Checkbox } from \"@tutti-os/ui-system\";\nimport {\n selectFocusedWorkbenchNode,\n selectWorkbenchNodeZIndex\n} from \"../core/selectors.ts\";\nimport type { WorkbenchNode, WorkbenchResizeHandle } from \"../core/types.ts\";\nimport { useWorkbenchController } from \"./WorkbenchProvider.tsx\";\nimport { WorkbenchWindowFullscreenToggle } from \"./WorkbenchWindowFullscreenToggle.tsx\";\nimport { useWorkbenchDrag } from \"./hooks/useWorkbenchDrag.ts\";\nimport { useWorkbenchResize } from \"./hooks/useWorkbenchResize.ts\";\nimport { useWorkbenchSelector } from \"./hooks/useWorkbenchSelector.ts\";\nimport {\n createWorkbenchWindowChromeI18nRuntime,\n workbenchWindowChromeI18nResources,\n type WorkbenchWindowChromeI18nRuntime\n} from \"./workbenchWindowI18n.ts\";\nimport type {\n WorkbenchFullscreenHeaderMode,\n WorkbenchRenderWindowActions,\n WorkbenchRenderWindowHeader,\n WorkbenchSurfacePresentation,\n WorkbenchWindowChromeMode\n} from \"./types.ts\";\nimport type { WorkbenchGenieController } from \"./useWorkbenchGenieAnimation.tsx\";\nimport { resolveWorkbenchWindowHeader } from \"./windowHeader.ts\";\n\nexport interface WorkbenchWindowFrameProps<TData = unknown> {\n children: ReactNode;\n genie: WorkbenchGenieController;\n hiddenMounted?: boolean;\n interactive?: boolean;\n node: WorkbenchNode<TData>;\n presentation?: WorkbenchSurfacePresentation | null;\n renderActions?: WorkbenchRenderWindowActions<TData>;\n renderHeader?: WorkbenchRenderWindowHeader<TData>;\n fullscreenHeaderMode?: WorkbenchFullscreenHeaderMode;\n windowChromeMode?: WorkbenchWindowChromeMode;\n windowChromeI18n?: WorkbenchWindowChromeI18nRuntime;\n}\n\nconst resizeHandles: WorkbenchResizeHandle[] = [\n \"north\",\n \"east\",\n \"south\",\n \"west\",\n \"north-east\",\n \"north-west\",\n \"south-east\",\n \"south-west\"\n];\n\nconst defaultWindowChromeI18n = createWorkbenchWindowChromeI18nRuntime(\n createI18nRuntime({\n dictionaries: [workbenchWindowChromeI18nResources.en]\n })\n);\n\nfunction resolveWorkbenchNodeLaunchSource(data: unknown): string | undefined {\n if (\n data &&\n typeof data === \"object\" &&\n \"launchSource\" in data &&\n typeof data.launchSource === \"string\" &&\n data.launchSource.length > 0\n ) {\n return data.launchSource;\n }\n return undefined;\n}\n\nfunction resolveWorkbenchNodeTypeId(data: unknown): string | undefined {\n if (\n data &&\n typeof data === \"object\" &&\n \"typeId\" in data &&\n typeof data.typeId === \"string\"\n ) {\n return data.typeId;\n }\n\n return undefined;\n}\n\nexport function WorkbenchWindowFrame<TData>({\n children,\n fullscreenHeaderMode,\n genie,\n hiddenMounted = false,\n interactive = true,\n node,\n presentation = null,\n renderActions,\n renderHeader,\n windowChromeMode = \"system\",\n windowChromeI18n\n}: WorkbenchWindowFrameProps<TData>) {\n const controller = useWorkbenchController<TData>();\n const zIndex = useWorkbenchSelector((state) =>\n selectWorkbenchNodeZIndex(state, node.id)\n );\n const isFocused = useWorkbenchSelector(\n (state) => selectFocusedWorkbenchNode(state)?.id === node.id\n );\n const isDragging = useWorkbenchSelector(\n (state) => state.activeDragNodeId === node.id\n );\n const isResizing = useWorkbenchSelector(\n (state) => state.activeResizeNodeId === node.id\n );\n const onDragStart = useWorkbenchDrag(node);\n const onHeaderDoubleClick = () => {\n if (!interactive) {\n return;\n }\n controller.commands.focusNode(node.id);\n controller.commands.applySnapTarget(node.id, \"top\");\n };\n const genieControls = {\n minimizeNodeToAnchor: (nodeID: string, minimize?: () => void) => {\n genie.minimizeNodeToAnchor(nodeID, minimize);\n }\n } as const;\n const defaultActions = interactive ? (\n <div\n className=\"flex flex-none items-center gap-1\"\n onDoubleClick={(event) => {\n event.stopPropagation();\n }}\n onPointerDown={(event) => {\n event.stopPropagation();\n }}\n >\n <WorkbenchWindowFullscreenToggle\n controller={controller}\n i18n={windowChromeI18n ?? defaultWindowChromeI18n}\n node={node}\n />\n {renderActions\n ? renderActions({\n controller,\n genie: genieControls,\n node\n })\n : null}\n </div>\n ) : null;\n const resolvedHeader = resolveWorkbenchWindowHeader({\n controller,\n defaultActions,\n genie: genieControls,\n node,\n onDoubleClick: onHeaderDoubleClick,\n onDragStart,\n renderHeader: interactive ? renderHeader : undefined,\n windowChromeMode\n });\n const shouldRenderCustomHeader =\n resolvedHeader.windowChromeMode === \"custom-header\";\n const resolvedFullscreenHeaderMode = fullscreenHeaderMode ?? \"reveal\";\n const presentationMode = presentation?.mode ?? null;\n const presentationFrame = presentation?.frameByNodeId.get(node.id) ?? null;\n const isPresentationHidden =\n presentationMode === \"mission-control\" &&\n !presentation?.visibleNodeIds.has(node.id);\n const presentationInteraction =\n interactive &&\n presentationMode === \"mission-control\" &&\n !isPresentationHidden\n ? (presentation?.interaction ?? null)\n : null;\n const isMissionControlSelected =\n presentationInteraction?.selectedNodeIds.has(node.id) ?? false;\n const presentationScale =\n presentationMode === \"mission-control\" && presentationFrame\n ? Math.min(\n presentationFrame.width / Math.max(1, node.frame.width),\n presentationFrame.height / Math.max(1, node.frame.height)\n )\n : 1;\n const presentationOffsetX =\n presentationMode === \"mission-control\" && presentationFrame\n ? presentationFrame.x +\n Math.max(\n 0,\n (presentationFrame.width - node.frame.width * presentationScale) / 2\n ) -\n node.frame.x\n : 0;\n const presentationOffsetY =\n presentationMode === \"mission-control\" && presentationFrame\n ? presentationFrame.y +\n Math.max(\n 0,\n (presentationFrame.height - node.frame.height * presentationScale) / 2\n ) -\n node.frame.y\n : 0;\n const shellTransform =\n presentationMode === \"mission-control\" && presentationFrame\n ? `matrix(${presentationScale}, 0, 0, ${presentationScale}, ${presentationOffsetX}, ${presentationOffsetY})`\n : undefined;\n\n return (\n <section\n aria-hidden={hiddenMounted || isPresentationHidden ? true : undefined}\n className=\"workbench-window-shell\"\n data-focused={isFocused ? \"true\" : \"false\"}\n data-display-mode={node.displayMode}\n data-genie-state={genie.isNodeGenieHidden(node.id) ? \"hidden\" : \"visible\"}\n data-launch-source={resolveWorkbenchNodeLaunchSource(node.data)}\n data-minimized-mount={hiddenMounted ? \"hidden\" : \"visible\"}\n data-presentation-mode={presentationMode ?? \"default\"}\n data-presentation-visibility={isPresentationHidden ? \"hidden\" : \"visible\"}\n data-slot=\"viewport-menu-boundary\"\n data-workbench-node-type-id={resolveWorkbenchNodeTypeId(node.data)}\n data-workbench-window-id={node.id}\n data-window-drag-state={isDragging ? \"dragging\" : \"idle\"}\n data-window-resize-state={isResizing ? \"resizing\" : \"idle\"}\n style={{\n height: node.frame.height,\n left: node.frame.x,\n top: node.frame.y,\n transform: shellTransform,\n transformOrigin: \"top left\",\n width: node.frame.width,\n zIndex\n }}\n onPointerDown={\n hiddenMounted ||\n isPresentationHidden ||\n !interactive ||\n presentationMode === \"mission-control\"\n ? undefined\n : () => controller.commands.focusNode(node.id)\n }\n >\n <div className=\"workbench-window-shell__content\">\n <div\n className=\"workbench-window\"\n data-focused={isFocused ? \"true\" : \"false\"}\n data-display-mode={node.displayMode}\n data-fullscreen-header-mode={resolvedFullscreenHeaderMode}\n data-window-chrome-mode={resolvedHeader.windowChromeMode}\n data-workbench-window-capture=\"true\"\n data-window-drag-state={isDragging ? \"dragging\" : \"idle\"}\n data-window-resize-state={isResizing ? \"resizing\" : \"idle\"}\n >\n {node.displayMode === \"fullscreen\" &&\n resolvedFullscreenHeaderMode === \"reveal\" ? (\n <div className=\"workbench-window__header-reveal-zone\" aria-hidden />\n ) : null}\n <div\n className={[\n \"workbench-window__header\",\n shouldRenderCustomHeader\n ? \"workbench-window__header--custom\"\n : null\n ]\n .filter(Boolean)\n .join(\" \")}\n onDoubleClick={\n shouldRenderCustomHeader || !interactive\n ? undefined\n : onHeaderDoubleClick\n }\n onPointerDown={\n shouldRenderCustomHeader || !interactive ? undefined : onDragStart\n }\n >\n {shouldRenderCustomHeader ? (\n resolvedHeader.customHeader\n ) : (\n <>\n <div className=\"min-w-0 truncate text-[13px] font-semibold\">\n {node.title}\n </div>\n {defaultActions}\n </>\n )}\n </div>\n <div className=\"workbench-window__body\">{children}</div>\n {node.displayMode === \"floating\" &&\n !hiddenMounted &&\n presentationMode !== \"mission-control\" &&\n interactive\n ? resizeHandles.map((handle) => (\n <ResizeHandle key={handle} handle={handle} node={node} />\n ))\n : null}\n </div>\n </div>\n {presentationInteraction ? (\n <button\n aria-label={node.title}\n aria-pressed={\n presentationInteraction.mode === \"layout\"\n ? isMissionControlSelected\n : undefined\n }\n className=\"absolute inset-0 z-10 block appearance-none rounded-lg border-0 bg-transparent p-0 text-left outline-none focus-visible:ring-2 focus-visible:ring-ring/60\"\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n presentationInteraction.onNodePress(node.id);\n }}\n >\n {presentationInteraction.mode === \"layout\" &&\n isMissionControlSelected ? (\n <div className=\"pointer-events-none absolute inset-0 rounded-lg border-2 border-[var(--accent)] transition-[border-color,transform] duration-150 ease-out\" />\n ) : null}\n </button>\n ) : null}\n {presentationInteraction?.mode === \"layout\" &&\n isMissionControlSelected ? (\n <Checkbox\n aria-hidden=\"true\"\n checked\n className=\"pointer-events-none absolute right-3 bottom-3 z-20 size-6 rounded-md text-[var(--white-stationary)] shadow-[0_2px_8px_rgb(0_0_0_/_0.18)] data-[state=checked]:border-[var(--accent)] data-[state=checked]:bg-[var(--accent)] [&_[data-slot=checkbox-indicator]>svg]:size-4\"\n tabIndex={-1}\n />\n ) : null}\n </section>\n );\n}\n\nfunction ResizeHandle<TData>({\n handle,\n node\n}: {\n handle: WorkbenchResizeHandle;\n node: WorkbenchNode<TData>;\n}) {\n const onPointerDown = useWorkbenchResize(node, handle);\n return (\n <div\n className=\"workbench-window__resize-handle\"\n data-handle={handle}\n onPointerDown={onPointerDown}\n />\n );\n}\n","import type { WorkbenchNode } from \"../core/types.ts\";\nimport type { WorkbenchController } from \"../store/types.ts\";\nimport { Button, MaximizeIcon, RestoreIcon } from \"@tutti-os/ui-system\";\nimport type { WorkbenchWindowChromeI18nRuntime } from \"./workbenchWindowI18n.ts\";\n\nexport function WorkbenchWindowFullscreenToggle<TData>({\n controller,\n disabled = false,\n i18n,\n node\n}: {\n controller: WorkbenchController<TData>;\n disabled?: boolean;\n i18n: WorkbenchWindowChromeI18nRuntime;\n node: WorkbenchNode<TData>;\n}) {\n const isFullscreen = node.displayMode === \"fullscreen\";\n const label = i18n.t(isFullscreen ? \"exitFullscreen\" : \"enterFullscreen\");\n const Icon = isFullscreen ? RestoreIcon : MaximizeIcon;\n\n return (\n <Button\n aria-label={label}\n aria-pressed={isFullscreen}\n className=\"order-2 rounded-md\"\n data-workbench-action=\"fullscreen\"\n disabled={disabled}\n size=\"icon-sm\"\n title={label}\n type=\"button\"\n variant=\"chrome\"\n onClick={(event) => {\n if (disabled) {\n return;\n }\n\n controller.commands.focusNode(node.id);\n\n if (isFullscreen) {\n controller.commands.exitFullscreen(node.id);\n return;\n }\n\n event.currentTarget.blur();\n controller.commands.enterFullscreen(node.id);\n }}\n >\n <Icon aria-hidden className=\"size-[15px]\" />\n </Button>\n );\n}\n","import { useCallback } from \"react\";\nimport type { PointerEvent as ReactPointerEvent } from \"react\";\nimport type { WorkbenchNode } from \"../../core/types.ts\";\nimport { useWorkbenchController } from \"../WorkbenchProvider.tsx\";\nimport { useWorkbenchSnap } from \"./useWorkbenchSnap.ts\";\n\nexport function useWorkbenchDrag<TData>(node: WorkbenchNode<TData>) {\n const controller = useWorkbenchController<TData>();\n const updateSnap = useWorkbenchSnap<TData>();\n\n return useCallback(\n (event: ReactPointerEvent<HTMLElement>) => {\n if (event.button !== 0) {\n return;\n }\n\n event.preventDefault();\n controller.commands.focusNode(node.id);\n\n event.currentTarget.setPointerCapture(event.pointerId);\n controller.commands.setActiveDragNode(node.id);\n\n const origin = { x: event.clientX, y: event.clientY };\n const initialFrame = node.frame;\n\n const onPointerMove = (moveEvent: PointerEvent) => {\n const nextFrame = {\n ...initialFrame,\n x: initialFrame.x + moveEvent.clientX - origin.x,\n y: initialFrame.y + moveEvent.clientY - origin.y\n };\n updateSnap(moveEvent.clientY);\n controller.commands.dragNode(node.id, nextFrame);\n };\n\n const clearListeners = () => {\n controller.commands.setActiveDragNode(null);\n controller.commands.setActiveSnapTarget(null);\n window.removeEventListener(\"pointermove\", onPointerMove);\n window.removeEventListener(\"pointerup\", finishDrag);\n window.removeEventListener(\"pointercancel\", cancelDrag);\n };\n\n const finishDrag = (upEvent: PointerEvent) => {\n if (updateSnap(upEvent.clientY) !== null) {\n controller.commands.applyActiveSnapTarget(node.id);\n }\n clearListeners();\n };\n\n const cancelDrag = () => {\n clearListeners();\n };\n\n window.addEventListener(\"pointermove\", onPointerMove);\n window.addEventListener(\"pointerup\", finishDrag);\n window.addEventListener(\"pointercancel\", cancelDrag);\n },\n [controller, node.frame, node.id, updateSnap]\n );\n}\n","import { useCallback } from \"react\";\nimport { inferWorkbenchSnapTarget } from \"../../core/geometry.ts\";\nimport type { WorkbenchSnapTarget } from \"../../core/types.ts\";\nimport { useWorkbenchController } from \"../WorkbenchProvider.tsx\";\n\nexport function useWorkbenchSnap<TData = unknown>() {\n const controller = useWorkbenchController<TData>();\n\n return useCallback(\n (pointerClientY: number): WorkbenchSnapTarget => {\n const target = inferWorkbenchSnapTarget(\n { y: pointerClientY },\n controller.getSnapshot().surfaceSize,\n undefined,\n controller.getSnapshot().layoutConstraints\n );\n controller.commands.setActiveSnapTarget(target);\n return target;\n },\n [controller]\n );\n}\n","import { useCallback } from \"react\";\nimport type { PointerEvent as ReactPointerEvent } from \"react\";\nimport type { WorkbenchNode, WorkbenchResizeHandle } from \"../../core/types.ts\";\nimport { useWorkbenchController } from \"../WorkbenchProvider.tsx\";\n\nexport function useWorkbenchResize<TData>(\n node: WorkbenchNode<TData>,\n handle: WorkbenchResizeHandle\n) {\n const controller = useWorkbenchController<TData>();\n\n return useCallback(\n (event: ReactPointerEvent<HTMLElement>) => {\n if (event.button !== 0) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n event.currentTarget.setPointerCapture(event.pointerId);\n controller.commands.focusNode(node.id);\n controller.commands.setActiveResizeNode(node.id);\n\n const origin = { x: event.clientX, y: event.clientY };\n const initialFrame = node.frame;\n\n const onPointerMove = (moveEvent: PointerEvent) => {\n const deltaX = moveEvent.clientX - origin.x;\n const deltaY = moveEvent.clientY - origin.y;\n controller.commands.resizeNode(\n node.id,\n resizeFrame(initialFrame, handle, deltaX, deltaY)\n );\n };\n\n const cleanup = () => {\n controller.commands.setActiveResizeNode(null);\n window.removeEventListener(\"pointermove\", onPointerMove);\n window.removeEventListener(\"pointerup\", cleanup);\n window.removeEventListener(\"pointercancel\", cleanup);\n };\n\n window.addEventListener(\"pointermove\", onPointerMove);\n window.addEventListener(\"pointerup\", cleanup);\n window.addEventListener(\"pointercancel\", cleanup);\n },\n [controller, handle, node.frame, node.id]\n );\n}\n\nfunction resizeFrame(\n frame: WorkbenchNode[\"frame\"],\n handle: WorkbenchResizeHandle,\n deltaX: number,\n deltaY: number\n): WorkbenchNode[\"frame\"] {\n const next = { ...frame };\n if (handle.includes(\"east\")) {\n next.width += deltaX;\n }\n if (handle.includes(\"south\")) {\n next.height += deltaY;\n }\n if (handle.includes(\"west\")) {\n next.x += deltaX;\n next.width -= deltaX;\n }\n if (handle.includes(\"north\")) {\n next.y += deltaY;\n next.height -= deltaY;\n }\n return next;\n}\n","import type { ReactNode } from \"react\";\nimport type { WorkbenchNode } from \"../core/types.ts\";\nimport type { WorkbenchController } from \"../store/types.ts\";\nimport type {\n WorkbenchRenderWindowHeader,\n WorkbenchResolveWindowChromeMode,\n WorkbenchWindowChromeMode,\n WorkbenchWindowHeaderContext,\n WorkbenchWindowHeaderDragHandleProps\n} from \"./types.ts\";\n\ntype WorkbenchHeaderGenieControls = {\n minimizeNodeToAnchor(nodeID: string, minimize?: () => void): void;\n};\n\nexport interface ResolveWorkbenchWindowHeaderInput<TData = unknown> {\n controller: WorkbenchController<TData>;\n defaultActions: ReactNode;\n genie: WorkbenchHeaderGenieControls;\n node: WorkbenchNode<TData>;\n onDoubleClick: WorkbenchWindowHeaderDragHandleProps[\"onDoubleClick\"];\n onDragStart: WorkbenchWindowHeaderDragHandleProps[\"onPointerDown\"];\n renderHeader?: WorkbenchRenderWindowHeader<TData>;\n windowChromeMode?: WorkbenchWindowChromeMode;\n}\n\nexport interface ResolvedWorkbenchWindowHeader<TData = unknown> {\n context: WorkbenchWindowHeaderContext<TData>;\n customHeader: ReactNode | null;\n windowChromeMode: WorkbenchWindowChromeMode;\n}\n\nexport function resolveWorkbenchWindowChromeMode<TData>({\n controller,\n node,\n windowChromeMode\n}: {\n controller: WorkbenchController<TData>;\n node: WorkbenchNode<TData>;\n windowChromeMode?:\n | WorkbenchWindowChromeMode\n | WorkbenchResolveWindowChromeMode<TData>;\n}): WorkbenchWindowChromeMode {\n if (typeof windowChromeMode === \"function\") {\n return windowChromeMode({ controller, node });\n }\n\n return windowChromeMode ?? \"system\";\n}\n\nexport function resolveWorkbenchWindowHeader<TData>({\n controller,\n defaultActions,\n genie,\n node,\n onDoubleClick,\n onDragStart,\n renderHeader,\n windowChromeMode = \"system\"\n}: ResolveWorkbenchWindowHeaderInput<TData>): ResolvedWorkbenchWindowHeader<TData> {\n const context: WorkbenchWindowHeaderContext<TData> = {\n controller,\n defaultActions,\n dragHandleProps: {\n \"data-workbench-drag-handle\": \"true\",\n onDoubleClick,\n onPointerDown: onDragStart\n },\n genie,\n node,\n surfaceSize: controller.getSnapshot().surfaceSize\n };\n\n const customHeader =\n windowChromeMode === \"custom-header\" && renderHeader\n ? renderHeader(context)\n : null;\n\n return {\n context,\n customHeader,\n windowChromeMode: customHeader === null ? \"system\" : \"custom-header\"\n };\n}\n","import type { WorkbenchNode, WorkbenchState } from \"../core/types.ts\";\nimport type { WorkbenchKeepMinimizedNodeMounted } from \"./types.ts\";\n\nexport function createRenderedWorkbenchNodeIDsSelector<TData>(\n shouldKeepMinimizedNodeMounted:\n | WorkbenchKeepMinimizedNodeMounted<TData>\n | undefined = undefined\n): (state: WorkbenchState<TData>) => readonly string[] {\n let previousIDs: readonly string[] | null = null;\n\n return (state) => {\n const nextIDs = state.nodes\n .filter((node) =>\n shouldRenderWorkbenchNode(node, shouldKeepMinimizedNodeMounted)\n )\n .map((node) => node.id);\n\n if (previousIDs && stringArraysEqual(previousIDs, nextIDs)) {\n return previousIDs;\n }\n\n previousIDs = nextIDs;\n return nextIDs;\n };\n}\n\nfunction shouldRenderWorkbenchNode<TData>(\n node: WorkbenchNode<TData>,\n shouldKeepMinimizedNodeMounted:\n | WorkbenchKeepMinimizedNodeMounted<TData>\n | undefined\n): boolean {\n return !node.isMinimized || shouldKeepMinimizedNodeMounted?.(node) === true;\n}\n\nfunction stringArraysEqual(left: readonly string[], right: readonly string[]) {\n if (left.length !== right.length) {\n return false;\n }\n\n return left.every((value, index) => value === right[index]);\n}\n","import { useEffect } from \"react\";\nimport { selectFocusedWorkbenchNode } from \"../../core/selectors.ts\";\nimport { useWorkbenchController } from \"../WorkbenchProvider.tsx\";\n\nexport function useWorkbenchShortcuts<TData = unknown>(enabled = true): void {\n const controller = useWorkbenchController<TData>();\n\n useEffect(() => {\n if (!enabled) {\n return undefined;\n }\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\") {\n return;\n }\n\n const focusedNode = selectFocusedWorkbenchNode(controller.getSnapshot());\n if (focusedNode?.displayMode === \"fullscreen\") {\n controller.commands.exitFullscreen(focusedNode.id);\n }\n };\n\n window.addEventListener(\"keydown\", onKeyDown);\n return () => {\n window.removeEventListener(\"keydown\", onKeyDown);\n };\n }, [controller, enabled]);\n}\n","import { useLayoutEffect, useRef, type RefObject } from \"react\";\nimport type { WorkbenchSize } from \"../../core/types.ts\";\n\nexport function useWorkbenchSurfaceSize<TElement extends HTMLElement>(\n onSizeChange: (size: WorkbenchSize) => void\n): RefObject<TElement | null> {\n const ref = useRef<TElement | null>(null);\n\n useLayoutEffect(() => {\n const element = ref.current;\n if (!element) {\n return;\n }\n\n const publish = () => {\n const rect = element.getBoundingClientRect();\n onSizeChange({\n width: Math.max(0, Math.round(rect.width)),\n height: Math.max(0, Math.round(rect.height))\n });\n };\n\n publish();\n\n if (typeof ResizeObserver === \"undefined\") {\n window.addEventListener(\"resize\", publish);\n return () => {\n window.removeEventListener(\"resize\", publish);\n };\n }\n\n const observer = new ResizeObserver(publish);\n observer.observe(element);\n return () => {\n observer.disconnect();\n };\n }, [onSizeChange]);\n\n return ref;\n}\n","import {\n useCallback,\n useEffect,\n useRef,\n useState,\n type ReactNode\n} from \"react\";\nimport { createPortal, flushSync } from \"react-dom\";\nimport type {\n WorkbenchController,\n WorkbenchDebugDiagnostics\n} from \"../store/types.ts\";\nimport type { WorkbenchNode } from \"../core/types.ts\";\nimport type { WorkbenchMinimizeAnimation } from \"./types.ts\";\nimport type {\n WorkbenchDockPreviewCache,\n WorkbenchDockPreviewCacheKeyResolver\n} from \"./dockPreviewCache.ts\";\nimport {\n centerPointFromRect,\n cloneMeaningfulGenieElement,\n easeInQuadratic,\n isUsableGenieRect,\n renderGenieScanlines,\n viewportRectFromElement,\n type WorkbenchGenieDirection,\n type WorkbenchGenieMeaningfulImageClone,\n type WorkbenchGenieViewportRect\n} from \"./genieAnimation.ts\";\n\nconst genieDurationMs = 400;\nconst scaleMinimizeDurationMs = 220;\nconst genieMaxDevicePixelRatio = 2;\nconst genieSnapshotScale = 1;\nconst renderedGeniePreviewHeaderOffsetPx = 40;\nconst minimizedDockSlotEnterAnimationMs = 720;\nconst dockAnchorResolveMaxAnimationFrames = 3;\nconst dockPreviewMaxWidth = 260;\nconst dockPreviewMaxHeight = 170;\nconst dockPreviewImageCacheMaxEntries = 96;\nconst inlineImageResourceCacheMaxEntries = 160;\nconst dockAnchorFallbackSizePx = 43.2;\nconst genieInlineImageMaxDevicePixelRatio = 2;\nconst dockPreviewImageByNodeID = new Map<string, string>();\nconst inlineImageResourceByUrl = new Map<string, Promise<string | null>>();\n\ninterface CapturedGenieTexture {\n canvas: HTMLCanvasElement;\n rect: WorkbenchGenieViewportRect;\n}\n\ninterface PreparedGenieTextureCapture {\n clone: HTMLElement;\n images: WorkbenchGenieMeaningfulImageClone[];\n rect: WorkbenchGenieViewportRect;\n}\n\ninterface PendingRenderedGeniePreviewCapture {\n id: number;\n nodeID: string;\n preview: ReactNode;\n rect: WorkbenchGenieViewportRect;\n usedFallbackPreview: boolean;\n}\n\nfunction resolveWorkbenchCaptureElement(\n windowElement: HTMLElement\n): HTMLElement {\n return (\n windowElement.querySelector<HTMLElement>(\n '[data-workbench-window-capture=\"true\"]'\n ) ??\n windowElement.querySelector<HTMLElement>(\".workbench-window\") ??\n windowElement\n );\n}\n\nfunction waitForNextAnimationFrame(): Promise<void> {\n return new Promise((resolve) => {\n window.requestAnimationFrame(() => resolve());\n });\n}\n\nfunction isFocusedWorkbenchNode<TData>(\n controller: WorkbenchController<TData>,\n nodeID: string\n): boolean {\n return controller.getSnapshot().nodeStack.at(-1) === nodeID;\n}\n\nfunction isEmptyGeniePreview(preview: ReactNode): boolean {\n return preview === null || preview === undefined || preview === false;\n}\n\nfunction logWorkbenchGenieDiagnostic(\n debugDiagnostics: WorkbenchDebugDiagnostics | undefined,\n event: string,\n details: Record<string, unknown>,\n level: \"debug\" | \"info\" | \"warn\" = \"info\"\n): void {\n if (!debugDiagnostics?.isEnabled() || !debugDiagnostics.log) {\n return;\n }\n void Promise.resolve(\n debugDiagnostics.log({\n details,\n event,\n level,\n source: \"workbench-genie\"\n })\n ).catch(() => undefined);\n}\n\nfunction describeGenieNode<TData>(\n node: WorkbenchNode<TData> | null | undefined\n): Record<string, unknown> {\n if (!node) {\n return {};\n }\n const data =\n node.data && typeof node.data === \"object\"\n ? (node.data as Record<string, unknown>)\n : {};\n return {\n displayMode: node.displayMode,\n instanceId: typeof data.instanceId === \"string\" ? data.instanceId : null,\n isMinimized: node.isMinimized,\n minimizedAtUnixMs: node.minimizedAtUnixMs,\n nodeId: node.id,\n title: node.title,\n typeId: typeof data.typeId === \"string\" ? data.typeId : null\n };\n}\n\nexport interface WorkbenchGenieController<TData = unknown> {\n genieLayer: ReactNode;\n isNodeGenieHidden: (nodeID: string) => boolean;\n isPendingMinimizedDockNode: (nodeID: string) => boolean;\n launchNodeFromAnchor: (\n anchorKey: string,\n nodeID: string,\n launch: () => Promise<string | null | void> | string | null | void\n ) => void;\n minimizeNodeToAnchor: (nodeID: string, minimize?: () => void) => void;\n pendingMinimizedNode: WorkbenchNode<TData> | null;\n registerDockAnchor: (anchorKey: string, element: HTMLElement | null) => void;\n shouldAnimateMinimizedDockEnter: (nodeID: string) => boolean;\n}\n\nexport type WorkbenchNodePreviewImageCapture<TData = unknown> = (\n node: WorkbenchNode<TData>\n) => Promise<string | null> | string | null;\n\nexport type WorkbenchNodeGeniePreviewRenderer<TData = unknown> = (\n node: WorkbenchNode<TData>,\n input: { previewViewport: { height: number; width: number } }\n) => ReactNode;\n\nfunction shouldReduceMotion(): boolean {\n return (\n window.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches === true\n );\n}\n\nfunction clampProgress(value: number): number {\n return Math.max(0, Math.min(1, value));\n}\n\nfunction resolveGenieAnimationProgress(\n direction: WorkbenchGenieDirection,\n progress: number\n): number {\n return direction === \"open\" ? easeInQuadratic(progress) : progress;\n}\n\nfunction blobToDataUrl(blob: Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.addEventListener(\"load\", () => {\n if (typeof reader.result === \"string\") {\n resolve(reader.result);\n return;\n }\n reject(new Error(\"image blob reader produced a non-string result\"));\n });\n reader.addEventListener(\"error\", () => {\n reject(reader.error ?? new Error(\"image blob reader failed\"));\n });\n reader.readAsDataURL(blob);\n });\n}\n\nasync function fetchInlineImageResource(\n imageUrl: string\n): Promise<string | null> {\n try {\n const response = await fetch(imageUrl);\n if (!response.ok) {\n throw new Error(`image fetch failed with status ${response.status}`);\n }\n const blob = await response.blob();\n return await blobToDataUrl(blob);\n } catch {\n return null;\n }\n}\n\nfunction readInlineImageResource(imageUrl: string): Promise<string | null> {\n if (imageUrl.startsWith(\"data:\")) {\n return Promise.resolve(imageUrl);\n }\n\n const cached = inlineImageResourceByUrl.get(imageUrl);\n if (cached) {\n inlineImageResourceByUrl.delete(imageUrl);\n inlineImageResourceByUrl.set(imageUrl, cached);\n return cached;\n }\n\n const promise = fetchInlineImageResource(imageUrl);\n inlineImageResourceByUrl.set(imageUrl, promise);\n while (inlineImageResourceByUrl.size > inlineImageResourceCacheMaxEntries) {\n const oldestImageUrl = inlineImageResourceByUrl.keys().next().value;\n if (typeof oldestImageUrl !== \"string\") {\n break;\n }\n inlineImageResourceByUrl.delete(oldestImageUrl);\n }\n return promise;\n}\n\nasync function inlineCloneImageResources({\n cloneRoot,\n images\n}: {\n cloneRoot: HTMLElement;\n images: WorkbenchGenieMeaningfulImageClone[];\n}): Promise<void> {\n const cloneImages = Array.from(cloneRoot.querySelectorAll(\"img\"));\n\n await Promise.all(\n images.map(async (imageInfo, index) => {\n const cloneImage = cloneImages[index];\n if (!cloneImage) {\n return;\n }\n\n cloneImage.removeAttribute(\"srcset\");\n cloneImage.removeAttribute(\"sizes\");\n const imageUrl = imageInfo.url;\n if (!imageUrl) {\n return;\n }\n const inlineImageUrl =\n (await readInlineImageResource(imageUrl)) ?? imageUrl;\n const resizedImageUrl = await resizeInlineImageResourceForGenieTexture(\n inlineImageUrl,\n imageInfo\n );\n if (resizedImageUrl && resizedImageUrl !== inlineImageUrl) {\n cloneImage.src = resizedImageUrl;\n return;\n }\n cloneImage.src = inlineImageUrl;\n })\n );\n}\n\nasync function loadImageFromSvg(svg: string): Promise<HTMLImageElement> {\n const image = new Image();\n image.src = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`;\n await image.decode();\n return image;\n}\n\nfunction resolveGenieInlineImageTargetSize({\n displayHeight,\n displayWidth\n}: WorkbenchGenieMeaningfulImageClone): {\n height: number;\n width: number;\n} | null {\n if (displayWidth <= 0 || displayHeight <= 0) {\n return null;\n }\n const scale = Math.min(\n window.devicePixelRatio || 1,\n genieInlineImageMaxDevicePixelRatio\n );\n return {\n height: Math.max(1, Math.ceil(displayHeight * scale)),\n width: Math.max(1, Math.ceil(displayWidth * scale))\n };\n}\n\nasync function resizeInlineImageResourceForGenieTexture(\n imageUrl: string,\n imageInfo: WorkbenchGenieMeaningfulImageClone\n): Promise<string | null> {\n const targetSize = resolveGenieInlineImageTargetSize(imageInfo);\n if (!targetSize) {\n return null;\n }\n\n const image = new Image();\n image.src = imageUrl;\n try {\n await image.decode();\n } catch {\n return null;\n }\n if (\n image.naturalWidth <= targetSize.width &&\n image.naturalHeight <= targetSize.height\n ) {\n return null;\n }\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = targetSize.width;\n canvas.height = targetSize.height;\n const context = canvas.getContext(\"2d\");\n if (!context) {\n return null;\n }\n try {\n context.drawImage(image, 0, 0, targetSize.width, targetSize.height);\n return canvas.toDataURL(\"image/png\");\n } catch {\n return null;\n }\n}\n\nfunction prepareElementTextureCapture(\n element: HTMLElement\n): PreparedGenieTextureCapture | null {\n const windowRect = viewportRectFromElement(element);\n if (!isUsableGenieRect(windowRect)) {\n return null;\n }\n\n const clonedElement = cloneMeaningfulGenieElement(element, windowRect);\n if (!clonedElement) {\n return null;\n }\n const { clone, images } = clonedElement;\n clone.setAttribute(\"xmlns\", \"http://www.w3.org/1999/xhtml\");\n clone.style.position = \"relative\";\n clone.style.left = \"0\";\n clone.style.top = \"0\";\n clone.style.width = `${windowRect.width}px`;\n clone.style.height = `${windowRect.height}px`;\n clone.style.transform = \"none\";\n clone.style.opacity = \"1\";\n clone.style.visibility = \"visible\";\n clone.style.pointerEvents = \"none\";\n return {\n clone,\n images,\n rect: windowRect\n };\n}\n\nfunction prepareRenderedGeniePreviewCloneForTexture(\n clone: HTMLElement,\n textureRect: WorkbenchGenieViewportRect\n): void {\n clone.style.width = `${textureRect.width}px`;\n clone.style.height = `${textureRect.height}px`;\n\n const previewElement = clone.querySelector<HTMLElement>(\n \".workbench-genie-preview-capture__preview\"\n );\n if (!previewElement) {\n return;\n }\n\n previewElement.style.display = \"block\";\n previewElement.style.width = `${textureRect.width}px`;\n previewElement.style.height = `${textureRect.height}px`;\n previewElement.style.padding = \"0\";\n previewElement.style.border = \"0\";\n previewElement.style.borderRadius = \"0\";\n previewElement.style.background = \"var(--background-panel)\";\n previewElement.style.boxShadow = \"none\";\n previewElement.style.transform = `translateY(${renderedGeniePreviewHeaderOffsetPx}px)`;\n}\n\nasync function renderPreparedElementTexture({\n clone,\n images,\n rect\n}: PreparedGenieTextureCapture): Promise<CapturedGenieTexture | null> {\n await inlineCloneImageResources({\n cloneRoot: clone,\n images\n });\n\n const svgTexture = createGenieSvgTexture(clone, rect);\n const image = await loadImageFromSvg(svgTexture);\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = Math.max(1, Math.round(rect.width * genieSnapshotScale));\n canvas.height = Math.max(1, Math.round(rect.height * genieSnapshotScale));\n const context = canvas.getContext(\"2d\");\n if (!context) {\n return null;\n }\n context.imageSmoothingEnabled = true;\n context.imageSmoothingQuality = \"high\";\n context.drawImage(image, 0, 0, canvas.width, canvas.height);\n return { canvas, rect };\n}\n\nasync function captureElementTexture(\n element: HTMLElement\n): Promise<CapturedGenieTexture | null> {\n const preparedCapture = prepareElementTextureCapture(element);\n return preparedCapture ? renderPreparedElementTexture(preparedCapture) : null;\n}\n\nfunction createDockPreviewDataUrl(canvas: HTMLCanvasElement): string | null {\n if (canvas.width <= 0 || canvas.height <= 0) {\n return null;\n }\n\n const scale = Math.min(\n 1,\n dockPreviewMaxWidth / canvas.width,\n dockPreviewMaxHeight / canvas.height\n );\n const output = document.createElement(\"canvas\");\n output.width = Math.max(1, Math.round(canvas.width * scale));\n output.height = Math.max(1, Math.round(canvas.height * scale));\n const context = output.getContext(\"2d\");\n if (!context) {\n return null;\n }\n context.drawImage(canvas, 0, 0, output.width, output.height);\n return output.toDataURL(\"image/png\");\n}\n\nasync function renderPreviewImageTexture({\n previewImageUrl,\n rect\n}: {\n previewImageUrl: string;\n rect: WorkbenchGenieViewportRect;\n}): Promise<CapturedGenieTexture | null> {\n if (!isUsableGenieRect(rect)) {\n return null;\n }\n\n const image = new Image();\n image.src = previewImageUrl;\n await image.decode();\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = Math.max(1, Math.round(rect.width * genieSnapshotScale));\n canvas.height = Math.max(1, Math.round(rect.height * genieSnapshotScale));\n const context = canvas.getContext(\"2d\");\n if (!context) {\n return null;\n }\n context.imageSmoothingEnabled = true;\n context.imageSmoothingQuality = \"high\";\n context.drawImage(image, 0, 0, canvas.width, canvas.height);\n return { canvas, rect };\n}\n\nfunction readDockAnchorFallbackSize(element: HTMLElement): number {\n const cssValue = window\n .getComputedStyle(element)\n .getPropertyValue(\"--desktop-dock-size\");\n const parsed = Number.parseFloat(cssValue);\n return Number.isFinite(parsed) && parsed > 0\n ? parsed\n : dockAnchorFallbackSizePx;\n}\n\nfunction resolveDockAnchorViewportRect(\n element: HTMLElement\n): WorkbenchGenieViewportRect {\n const rect = viewportRectFromElement(element);\n if (\n element.dataset.desktopDockSlot !== \"true\" ||\n element.dataset.nodeState !== \"minimized\"\n ) {\n return rect;\n }\n\n const isLayoutAnimating =\n element.dataset.presence === \"entering\" ||\n element.dataset.collapsing === \"true\";\n if (!isLayoutAnimating) {\n return rect;\n }\n\n const fallbackSize = readDockAnchorFallbackSize(element);\n const minimumUsableSize = fallbackSize * 0.5;\n return {\n ...rect,\n height: rect.height >= minimumUsableSize ? rect.height : fallbackSize,\n width: rect.width >= minimumUsableSize ? rect.width : fallbackSize\n };\n}\n\nexport function writeCachedWorkbenchNodePreviewImage(\n nodeID: string,\n previewImageUrl: string | null | undefined\n): void {\n if (previewImageUrl) {\n dockPreviewImageByNodeID.delete(nodeID);\n dockPreviewImageByNodeID.set(nodeID, previewImageUrl);\n while (dockPreviewImageByNodeID.size > dockPreviewImageCacheMaxEntries) {\n const oldestNodeID = dockPreviewImageByNodeID.keys().next().value;\n if (typeof oldestNodeID !== \"string\") {\n break;\n }\n dockPreviewImageByNodeID.delete(oldestNodeID);\n }\n }\n}\n\nexport function readCachedWorkbenchNodePreviewImage(\n nodeID: string\n): string | null {\n return dockPreviewImageByNodeID.get(nodeID) ?? null;\n}\n\nexport async function captureWorkbenchNodePreviewImage(\n nodeID: string,\n options: { bypassCache?: boolean } = {}\n): Promise<string | null> {\n if (!options.bypassCache) {\n const cachedPreviewImageUrl = readCachedWorkbenchNodePreviewImage(nodeID);\n if (cachedPreviewImageUrl) {\n return cachedPreviewImageUrl;\n }\n }\n\n const windowElement =\n Array.from(\n document.querySelectorAll<HTMLElement>(\"[data-workbench-window-id]\")\n ).find((candidate) => candidate.dataset.workbenchWindowId === nodeID) ??\n null;\n const captureTarget = windowElement\n ? resolveWorkbenchCaptureElement(windowElement)\n : null;\n if (!captureTarget) {\n return null;\n }\n\n const texture = await captureElementTexture(captureTarget).catch(() => null);\n const previewImageUrl = texture\n ? createDockPreviewDataUrl(texture.canvas)\n : null;\n writeCachedWorkbenchNodePreviewImage(nodeID, previewImageUrl);\n return previewImageUrl;\n}\n\nasync function captureProvidedWorkbenchNodePreviewImageForNode<TData>(\n node: WorkbenchNode<TData>,\n input: {\n captureNodePreviewImage?: WorkbenchNodePreviewImageCapture<TData>;\n dockPreviewCache?: WorkbenchDockPreviewCache;\n resolveDockPreviewCacheKey?: WorkbenchDockPreviewCacheKeyResolver<TData>;\n } = {}\n): Promise<string | null> {\n const previewImageUrl = await Promise.resolve(\n input.captureNodePreviewImage?.(node) ?? null\n ).catch(() => null);\n if (!previewImageUrl) {\n return null;\n }\n writeCachedWorkbenchNodePreviewImage(node.id, previewImageUrl);\n persistWorkbenchNodePreviewImage(node, previewImageUrl, input);\n return previewImageUrl;\n}\n\nfunction persistWorkbenchNodePreviewImage<TData>(\n node: WorkbenchNode<TData>,\n previewImageUrl: string | null | undefined,\n input: {\n dockPreviewCache?: WorkbenchDockPreviewCache;\n resolveDockPreviewCacheKey?: WorkbenchDockPreviewCacheKeyResolver<TData>;\n }\n): void {\n if (!previewImageUrl || !input.dockPreviewCache) {\n return;\n }\n const key = input.resolveDockPreviewCacheKey?.(node) ?? null;\n if (!key) {\n return;\n }\n input.dockPreviewCache.write({ key, previewImageUrl });\n}\n\nfunction createGenieSvgTexture(\n element: HTMLElement,\n rect: WorkbenchGenieViewportRect\n): string {\n const svgNamespace = \"http://www.w3.org/2000/svg\";\n const svgDocument = document.implementation.createDocument(\n svgNamespace,\n \"svg\",\n null\n );\n const svg = svgDocument.documentElement;\n svg.setAttribute(\"xmlns\", svgNamespace);\n svg.setAttribute(\"width\", String(rect.width));\n svg.setAttribute(\"height\", String(rect.height));\n svg.setAttribute(\"viewBox\", `0 0 ${rect.width} ${rect.height}`);\n\n const foreignObject = svgDocument.createElementNS(\n svgNamespace,\n \"foreignObject\"\n );\n foreignObject.setAttribute(\"width\", \"100%\");\n foreignObject.setAttribute(\"height\", \"100%\");\n foreignObject.setAttribute(\"x\", \"0\");\n foreignObject.setAttribute(\"y\", \"0\");\n foreignObject.appendChild(svgDocument.importNode(element, true));\n svg.appendChild(foreignObject);\n\n return new XMLSerializer().serializeToString(svgDocument);\n}\n\nexport function useWorkbenchGenieAnimation<TData>({\n captureNodePreviewImage,\n controller,\n debugDiagnostics,\n dockPreviewCache,\n minimizeAnimation = \"genie\",\n renderNodeGeniePreview,\n resolveDockAnchorKey,\n resolveDockPreviewCacheKey,\n shouldCaptureNodePreviewImage\n}: {\n captureNodePreviewImage?: WorkbenchNodePreviewImageCapture<TData>;\n controller: WorkbenchController<TData>;\n debugDiagnostics?: WorkbenchDebugDiagnostics;\n dockPreviewCache?: WorkbenchDockPreviewCache;\n minimizeAnimation?: WorkbenchMinimizeAnimation;\n renderNodeGeniePreview?: WorkbenchNodeGeniePreviewRenderer<TData>;\n resolveDockAnchorKey?: (node: WorkbenchNode<TData>) => string;\n resolveDockPreviewCacheKey?: WorkbenchDockPreviewCacheKeyResolver<TData>;\n shouldCaptureNodePreviewImage?: (node: WorkbenchNode<TData>) => boolean;\n}): WorkbenchGenieController<TData> {\n const dockAnchorElementsRef = useRef(new Map<string, HTMLElement>());\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n const rafRef = useRef<number | null>(null);\n const animationGenerationRef = useRef(0);\n const animationCleanupRef = useRef<(() => void) | null>(null);\n const minimizedDockEnterAnimationNodeIdsRef = useRef(new Set<string>());\n const minimizedDockEnterAnimationTimersRef = useRef(\n new Map<string, ReturnType<typeof setTimeout>>()\n );\n const minimizedGenieTextureByNodeIDRef = useRef(\n new Map<string, CapturedGenieTexture>()\n );\n const renderedPreviewCaptureIDRef = useRef(0);\n const renderedPreviewCaptureElementRef = useRef<HTMLDivElement | null>(null);\n const pendingRenderedPreviewCaptureRef =\n useRef<PendingRenderedGeniePreviewCapture | null>(null);\n const [isCanvasActive, setIsCanvasActive] = useState(false);\n const [genieHiddenNodeIDs, setGenieHiddenNodeIDs] = useState(\n () => new Set<string>()\n );\n const [pendingMinimizedNode, setPendingMinimizedNode] =\n useState<WorkbenchNode<TData> | null>(null);\n const [pendingRenderedPreviewCapture, setPendingRenderedPreviewCapture] =\n useState<PendingRenderedGeniePreviewCapture | null>(null);\n\n const registerDockAnchor = useCallback(\n (anchorKey: string, element: HTMLElement | null) => {\n if (element) {\n dockAnchorElementsRef.current.set(anchorKey, element);\n return;\n }\n dockAnchorElementsRef.current.delete(anchorKey);\n },\n []\n );\n\n const resolveDockAnchorRect = useCallback((anchorKey: string) => {\n const element = dockAnchorElementsRef.current.get(anchorKey) ?? null;\n if (!element) {\n return null;\n }\n return resolveDockAnchorViewportRect(element);\n }, []);\n\n const resolveDockAnchorRectAfterRender = useCallback(\n async (anchorKey: string, isCurrent: () => boolean) => {\n let dockRect = resolveDockAnchorRect(anchorKey);\n for (\n let frame = 0;\n (!dockRect || !isUsableGenieRect(dockRect)) &&\n frame < dockAnchorResolveMaxAnimationFrames;\n frame += 1\n ) {\n await waitForNextAnimationFrame();\n if (!isCurrent()) {\n return null;\n }\n dockRect = resolveDockAnchorRect(anchorKey);\n }\n return dockRect;\n },\n [resolveDockAnchorRect]\n );\n\n const resolveNodeElement = useCallback((nodeID: string) => {\n return (\n Array.from(\n document.querySelectorAll<HTMLElement>(\"[data-workbench-window-id]\")\n ).find((candidate) => candidate.dataset.workbenchWindowId === nodeID) ??\n null\n );\n }, []);\n\n const resolveAnchorKeyForNode = useCallback(\n (node: WorkbenchNode<TData>) => resolveDockAnchorKey?.(node) ?? node.id,\n [resolveDockAnchorKey]\n );\n\n const releaseMinimizedDockEnterAnimation = useCallback((nodeID: string) => {\n const timer = minimizedDockEnterAnimationTimersRef.current.get(nodeID);\n if (timer) {\n clearTimeout(timer);\n minimizedDockEnterAnimationTimersRef.current.delete(nodeID);\n }\n minimizedDockEnterAnimationNodeIdsRef.current.delete(nodeID);\n }, []);\n\n const registerMinimizedDockEnterAnimation = useCallback(\n (nodeID: string) => {\n releaseMinimizedDockEnterAnimation(nodeID);\n minimizedDockEnterAnimationNodeIdsRef.current.add(nodeID);\n },\n [releaseMinimizedDockEnterAnimation]\n );\n\n const scheduleReleaseMinimizedDockEnterAnimation = useCallback(\n (nodeID: string, delayMs = minimizedDockSlotEnterAnimationMs) => {\n const existing = minimizedDockEnterAnimationTimersRef.current.get(nodeID);\n if (existing) {\n clearTimeout(existing);\n }\n minimizedDockEnterAnimationTimersRef.current.set(\n nodeID,\n setTimeout(() => {\n minimizedDockEnterAnimationTimersRef.current.delete(nodeID);\n minimizedDockEnterAnimationNodeIdsRef.current.delete(nodeID);\n }, delayMs)\n );\n },\n []\n );\n\n const shouldAnimateMinimizedDockEnter = useCallback((nodeID: string) => {\n return minimizedDockEnterAnimationNodeIdsRef.current.has(nodeID);\n }, []);\n\n const readMinimizedGenieTexture = useCallback((nodeID: string) => {\n return minimizedGenieTextureByNodeIDRef.current.get(nodeID) ?? null;\n }, []);\n\n const writeMinimizedGenieTexture = useCallback(\n (nodeID: string, texture: CapturedGenieTexture) => {\n const cache = minimizedGenieTextureByNodeIDRef.current;\n cache.delete(nodeID);\n cache.set(nodeID, texture);\n },\n []\n );\n\n const clearMinimizedGenieTexture = useCallback((nodeID: string) => {\n minimizedGenieTextureByNodeIDRef.current.delete(nodeID);\n }, []);\n\n const pruneMinimizedGenieTextures = useCallback(\n (retainNodeID?: string) => {\n const minimizedNodeIDs = new Set(\n controller\n .getSnapshot()\n .nodes.filter((node) => node.isMinimized === true)\n .map((node) => node.id)\n );\n if (retainNodeID) {\n minimizedNodeIDs.add(retainNodeID);\n }\n for (const nodeID of minimizedGenieTextureByNodeIDRef.current.keys()) {\n if (!minimizedNodeIDs.has(nodeID)) {\n minimizedGenieTextureByNodeIDRef.current.delete(nodeID);\n }\n }\n },\n [controller]\n );\n\n const hideNodeForGenie = useCallback((nodeID: string) => {\n setGenieHiddenNodeIDs((current) => {\n if (current.has(nodeID)) {\n return current;\n }\n return new Set([...current, nodeID]);\n });\n }, []);\n\n const showNodeForGenie = useCallback((nodeID: string) => {\n setGenieHiddenNodeIDs((current) => {\n if (!current.has(nodeID)) {\n return current;\n }\n const next = new Set(current);\n next.delete(nodeID);\n return next;\n });\n }, []);\n\n const clearPendingMinimizedNode = useCallback((nodeID: string) => {\n setPendingMinimizedNode((current) =>\n current?.id === nodeID ? null : current\n );\n }, []);\n\n const clearRenderedPreviewCapture = useCallback((id: number) => {\n if (pendingRenderedPreviewCaptureRef.current?.id !== id) {\n return;\n }\n pendingRenderedPreviewCaptureRef.current = null;\n renderedPreviewCaptureElementRef.current = null;\n setPendingRenderedPreviewCapture(null);\n }, []);\n\n const requestRenderedGeniePreviewTexture = useCallback(\n async ({\n node,\n textureRect\n }: {\n node: WorkbenchNode<TData>;\n textureRect: WorkbenchGenieViewportRect;\n }): Promise<CapturedGenieTexture | null> => {\n if (!isUsableGenieRect(textureRect)) {\n return null;\n }\n\n const previewViewport = {\n height: textureRect.height,\n width: textureRect.width\n };\n let preview: ReactNode = null;\n try {\n preview =\n renderNodeGeniePreview?.(node, {\n previewViewport\n }) ?? null;\n } catch {\n preview = null;\n }\n if (isEmptyGeniePreview(preview)) {\n return null;\n }\n const captureID = renderedPreviewCaptureIDRef.current + 1;\n renderedPreviewCaptureIDRef.current = captureID;\n const pendingCapture: PendingRenderedGeniePreviewCapture = {\n id: captureID,\n nodeID: node.id,\n preview,\n rect: textureRect,\n usedFallbackPreview: false\n };\n\n pendingRenderedPreviewCaptureRef.current = pendingCapture;\n flushSync(() => {\n setPendingRenderedPreviewCapture(pendingCapture);\n });\n\n try {\n await waitForNextAnimationFrame();\n await waitForNextAnimationFrame();\n\n if (pendingRenderedPreviewCaptureRef.current?.id !== captureID) {\n return null;\n }\n\n const element = renderedPreviewCaptureElementRef.current;\n if (!element) {\n return null;\n }\n\n const preparedCapture = prepareElementTextureCapture(element);\n if (!preparedCapture) {\n return null;\n }\n\n prepareRenderedGeniePreviewCloneForTexture(\n preparedCapture.clone,\n textureRect\n );\n const texture = await renderPreparedElementTexture({\n ...preparedCapture,\n rect: textureRect\n });\n return texture;\n } catch {\n return null;\n } finally {\n clearRenderedPreviewCapture(captureID);\n }\n },\n [clearRenderedPreviewCapture, renderNodeGeniePreview]\n );\n\n const setupCanvas = useCallback(() => {\n const canvas = canvasRef.current;\n if (!canvas) {\n return null;\n }\n const devicePixelRatio = Math.min(\n window.devicePixelRatio || 1,\n genieMaxDevicePixelRatio\n );\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n canvas.width = Math.max(1, Math.round(viewportWidth * devicePixelRatio));\n canvas.height = Math.max(1, Math.round(viewportHeight * devicePixelRatio));\n canvas.style.width = `${viewportWidth}px`;\n canvas.style.height = `${viewportHeight}px`;\n const context = canvas.getContext(\"2d\");\n if (!context) {\n return null;\n }\n context.setTransform(devicePixelRatio, 0, 0, devicePixelRatio, 0, 0);\n return { context, viewportHeight, viewportWidth };\n }, []);\n\n const clearCanvas = useCallback(() => {\n const canvas = canvasRef.current;\n const context = canvas?.getContext(\"2d\") ?? null;\n if (canvas && context) {\n context.clearRect(0, 0, canvas.width, canvas.height);\n }\n setIsCanvasActive(false);\n }, []);\n\n const stopAnimation = useCallback((runCleanup = true) => {\n animationGenerationRef.current += 1;\n if (rafRef.current !== null) {\n window.cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n const cleanup = animationCleanupRef.current;\n animationCleanupRef.current = null;\n if (runCleanup) {\n cleanup?.();\n }\n }, []);\n\n const runGenieAnimation = useCallback(\n ({\n direction,\n dockRect,\n onComplete,\n onCancel,\n skipStop,\n texture\n }: {\n direction: WorkbenchGenieDirection;\n dockRect: WorkbenchGenieViewportRect;\n onCancel?: () => void;\n onComplete: () => void;\n skipStop?: boolean;\n texture: CapturedGenieTexture;\n }) => {\n if (!skipStop) {\n stopAnimation();\n }\n const setup = setupCanvas();\n if (!setup) {\n onComplete();\n return;\n }\n\n const generation = animationGenerationRef.current;\n const dockPoint = centerPointFromRect(dockRect);\n let startTime: number | null = null;\n animationCleanupRef.current = onCancel ?? null;\n setIsCanvasActive(true);\n renderGenieScanlines(\n setup.context,\n setup.viewportWidth,\n setup.viewportHeight,\n {\n direction,\n dockPoint,\n progress: 0,\n texture: texture.canvas,\n textureRect: texture.rect\n }\n );\n\n const drawFrame = (timestamp: number) => {\n if (generation !== animationGenerationRef.current) {\n return;\n }\n startTime ??= timestamp;\n const progress = clampProgress(\n (timestamp - startTime) / genieDurationMs\n );\n const animationProgress = resolveGenieAnimationProgress(\n direction,\n progress\n );\n renderGenieScanlines(\n setup.context,\n setup.viewportWidth,\n setup.viewportHeight,\n {\n direction,\n dockPoint,\n progress: animationProgress,\n texture: texture.canvas,\n textureRect: texture.rect\n }\n );\n\n if (progress < 1) {\n rafRef.current = window.requestAnimationFrame(drawFrame);\n return;\n }\n\n rafRef.current = null;\n animationCleanupRef.current = null;\n onComplete();\n };\n\n rafRef.current = window.requestAnimationFrame(drawFrame);\n },\n [setupCanvas, stopAnimation]\n );\n\n const runScaleWindowAnimation = useCallback(\n ({\n direction,\n dockRect,\n nodeElement,\n onCancel,\n onComplete,\n skipStop\n }: {\n direction: WorkbenchGenieDirection;\n dockRect: WorkbenchGenieViewportRect;\n nodeElement: HTMLElement;\n onCancel: () => void;\n onComplete: () => void;\n skipStop?: boolean;\n }) => {\n if (!skipStop) {\n stopAnimation();\n }\n const windowRect = viewportRectFromElement(nodeElement);\n if (!isUsableGenieRect(windowRect) || !isUsableGenieRect(dockRect)) {\n onComplete();\n return;\n }\n\n const generation = animationGenerationRef.current;\n const fromCenter = centerPointFromRect(windowRect);\n const toCenter = centerPointFromRect(dockRect);\n const targetScale = Math.max(\n 0.04,\n Math.min(\n 0.32,\n dockRect.width / Math.max(1, windowRect.width),\n dockRect.height / Math.max(1, windowRect.height)\n )\n );\n const previousPointerEvents = nodeElement.style.pointerEvents;\n const previousTransformOrigin = nodeElement.style.transformOrigin;\n const previousVisibility = nodeElement.style.visibility;\n const previousZIndex = nodeElement.style.zIndex;\n nodeElement.style.pointerEvents = \"none\";\n nodeElement.style.transformOrigin = \"center center\";\n nodeElement.style.visibility = \"visible\";\n nodeElement.style.zIndex = \"var(--z-workbench-genie)\";\n\n const dockTransform = `translate3d(${toCenter.x - fromCenter.x}px, ${\n toCenter.y - fromCenter.y\n }px, 0) scale(${targetScale})`;\n const windowTransform = \"translate3d(0, 0, 0) scale(1)\";\n const keyframes =\n direction === \"open\"\n ? [\n {\n opacity: 0,\n transform: dockTransform\n },\n {\n opacity: 1,\n transform: windowTransform\n }\n ]\n : [\n {\n opacity: 1,\n transform: windowTransform\n },\n {\n opacity: 0,\n transform: dockTransform\n }\n ];\n const animation = nodeElement.animate(keyframes, {\n duration: scaleMinimizeDurationMs,\n easing: \"cubic-bezier(0.4, 0, 0.2, 1)\",\n fill: \"forwards\"\n });\n\n const restoreElement = () => {\n animation.cancel();\n nodeElement.style.pointerEvents = previousPointerEvents;\n nodeElement.style.transformOrigin = previousTransformOrigin;\n nodeElement.style.visibility = previousVisibility;\n nodeElement.style.zIndex = previousZIndex;\n };\n\n animationCleanupRef.current = () => {\n restoreElement();\n onCancel();\n };\n animation.finished\n .then(() => {\n if (generation !== animationGenerationRef.current) {\n return;\n }\n animationCleanupRef.current = null;\n restoreElement();\n onComplete();\n })\n .catch(() => {\n if (generation !== animationGenerationRef.current) {\n return;\n }\n animationCleanupRef.current = null;\n restoreElement();\n onComplete();\n });\n },\n [stopAnimation]\n );\n\n useEffect(() => () => stopAnimation(false), [stopAnimation]);\n\n const startOpenOrRestoreAnimation = useCallback(\n async (\n nodeID: string,\n anchorKey: string,\n generation: number,\n dockRectFallback: WorkbenchGenieViewportRect | null,\n minimizedNode: WorkbenchNode<TData> | null\n ) => {\n const effectiveMinimizeAnimation = shouldReduceMotion()\n ? \"off\"\n : minimizeAnimation;\n if (effectiveMinimizeAnimation === \"off\") {\n animationCleanupRef.current = null;\n showNodeForGenie(nodeID);\n clearMinimizedGenieTexture(nodeID);\n return;\n }\n\n await waitForNextAnimationFrame();\n if (generation !== animationGenerationRef.current) {\n return;\n }\n const resolvedDockRect = resolveDockAnchorRect(anchorKey);\n const dockRect =\n resolvedDockRect && isUsableGenieRect(resolvedDockRect)\n ? resolvedDockRect\n : dockRectFallback;\n const nodeElement = resolveNodeElement(nodeID);\n if (effectiveMinimizeAnimation === \"scale\") {\n if (!dockRect || !nodeElement || !isUsableGenieRect(dockRect)) {\n animationCleanupRef.current = null;\n showNodeForGenie(nodeID);\n clearMinimizedGenieTexture(nodeID);\n return;\n }\n flushSync(() => {\n showNodeForGenie(nodeID);\n });\n runScaleWindowAnimation({\n direction: \"open\",\n dockRect,\n nodeElement,\n onCancel: () => {\n flushSync(() => {\n showNodeForGenie(nodeID);\n });\n clearMinimizedGenieTexture(nodeID);\n },\n onComplete: () => {\n flushSync(() => {\n showNodeForGenie(nodeID);\n });\n clearMinimizedGenieTexture(nodeID);\n }\n });\n return;\n }\n\n if (!dockRect || !isUsableGenieRect(dockRect)) {\n animationCleanupRef.current = null;\n showNodeForGenie(nodeID);\n clearMinimizedGenieTexture(nodeID);\n return;\n }\n\n const cachedTexture = readMinimizedGenieTexture(nodeID);\n const restoredWindowRect = nodeElement\n ? viewportRectFromElement(nodeElement)\n : null;\n const shouldRestoreFromRenderedPreview =\n minimizedNode !== null &&\n (shouldCaptureNodePreviewImage?.(minimizedNode) ?? true) === false;\n const renderedPreviewTexture =\n cachedTexture ||\n !shouldRestoreFromRenderedPreview ||\n !restoredWindowRect ||\n !isUsableGenieRect(restoredWindowRect)\n ? null\n : await requestRenderedGeniePreviewTexture({\n node: minimizedNode,\n textureRect: restoredWindowRect\n }).catch(() => null);\n if (generation !== animationGenerationRef.current) {\n return;\n }\n const captureTarget =\n cachedTexture || renderedPreviewTexture || !nodeElement\n ? null\n : resolveWorkbenchCaptureElement(nodeElement);\n if (!cachedTexture && !renderedPreviewTexture && !captureTarget) {\n animationCleanupRef.current = null;\n showNodeForGenie(nodeID);\n clearMinimizedGenieTexture(nodeID);\n return;\n }\n\n const texture =\n cachedTexture ??\n renderedPreviewTexture ??\n (captureTarget\n ? await captureElementTexture(captureTarget).catch(() => null)\n : null);\n if (generation !== animationGenerationRef.current) {\n return;\n }\n if (!texture) {\n animationCleanupRef.current = null;\n showNodeForGenie(nodeID);\n clearMinimizedGenieTexture(nodeID);\n return;\n }\n\n runGenieAnimation({\n direction: \"open\",\n dockRect,\n onCancel: () => {\n flushSync(() => {\n showNodeForGenie(nodeID);\n });\n clearMinimizedGenieTexture(nodeID);\n clearCanvas();\n },\n onComplete: () => {\n flushSync(() => {\n showNodeForGenie(nodeID);\n });\n clearMinimizedGenieTexture(nodeID);\n clearCanvas();\n },\n skipStop: true,\n texture\n });\n },\n [\n clearCanvas,\n clearMinimizedGenieTexture,\n minimizeAnimation,\n readMinimizedGenieTexture,\n requestRenderedGeniePreviewTexture,\n resolveDockAnchorRect,\n resolveNodeElement,\n runGenieAnimation,\n runScaleWindowAnimation,\n shouldCaptureNodePreviewImage,\n showNodeForGenie\n ]\n );\n\n const launchNodeFromAnchor = useCallback(\n (\n anchorKey: string,\n nodeID: string,\n launch: () => Promise<string | null | void> | string | null | void\n ) => {\n const target = controller\n .getSnapshot()\n .nodes.find((node) => node.id === nodeID);\n if (!target) {\n void Promise.resolve(launch()).catch(() => {});\n return;\n }\n\n if (target.isMinimized !== true) {\n void Promise.resolve(launch()).catch(() => {});\n return;\n }\n\n const effectiveMinimizeAnimation = shouldReduceMotion()\n ? \"off\"\n : minimizeAnimation;\n if (effectiveMinimizeAnimation === \"off\") {\n stopAnimation();\n flushSync(() => {\n showNodeForGenie(nodeID);\n });\n void Promise.resolve(launch()).catch(() => {});\n return;\n }\n\n stopAnimation();\n const dockRectFallback = resolveDockAnchorRect(anchorKey);\n hideNodeForGenie(nodeID);\n animationCleanupRef.current = () => {\n if (rafRef.current !== null) {\n window.cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n flushSync(() => {\n showNodeForGenie(nodeID);\n });\n clearMinimizedGenieTexture(nodeID);\n clearCanvas();\n };\n const generation = animationGenerationRef.current;\n rafRef.current = window.requestAnimationFrame(() => {\n rafRef.current = null;\n if (generation !== animationGenerationRef.current) {\n return;\n }\n void Promise.resolve(launch())\n .catch(() => null)\n .then(() => {\n if (generation !== animationGenerationRef.current) {\n return;\n }\n void startOpenOrRestoreAnimation(\n nodeID,\n anchorKey,\n generation,\n dockRectFallback,\n target\n );\n });\n });\n },\n [\n clearCanvas,\n clearMinimizedGenieTexture,\n controller,\n hideNodeForGenie,\n minimizeAnimation,\n resolveDockAnchorRect,\n showNodeForGenie,\n startOpenOrRestoreAnimation,\n stopAnimation\n ]\n );\n\n const minimizeNodeToAnchor = useCallback(\n (nodeID: string, minimize?: () => void) => {\n void (async () => {\n pruneMinimizedGenieTextures();\n const target = controller\n .getSnapshot()\n .nodes.find((node) => node.id === nodeID);\n if (!target) {\n logWorkbenchGenieDiagnostic(\n debugDiagnostics,\n \"workbench.genie.minimize.skipped\",\n {\n nodeId: nodeID,\n reason: \"target_missing\"\n },\n \"warn\"\n );\n return;\n }\n clearMinimizedGenieTexture(nodeID);\n const runMinimize =\n minimize ?? (() => controller.commands.minimizeNode(nodeID));\n const effectiveMinimizeAnimation = shouldReduceMotion()\n ? \"off\"\n : minimizeAnimation;\n const shouldCapturePreview =\n shouldCaptureNodePreviewImage?.(target) ?? true;\n if (effectiveMinimizeAnimation === \"off\") {\n stopAnimation();\n let frameID: number | null = null;\n let timerID: ReturnType<typeof setTimeout> | null = null;\n let minimizeCommitted = false;\n const commitMinimize = () => {\n if (minimizeCommitted) {\n return;\n }\n minimizeCommitted = true;\n if (frameID !== null) {\n window.cancelAnimationFrame(frameID);\n frameID = null;\n }\n if (timerID !== null) {\n clearTimeout(timerID);\n timerID = null;\n }\n animationCleanupRef.current = null;\n flushSync(() => {\n clearPendingMinimizedNode(nodeID);\n showNodeForGenie(nodeID);\n runMinimize();\n });\n scheduleReleaseMinimizedDockEnterAnimation(nodeID);\n };\n animationCleanupRef.current = () => {\n releaseMinimizedDockEnterAnimation(nodeID);\n commitMinimize();\n };\n registerMinimizedDockEnterAnimation(nodeID);\n flushSync(() => {\n hideNodeForGenie(nodeID);\n setPendingMinimizedNode({\n ...target,\n isMinimized: true,\n minimizedAtUnixMs: Date.now()\n });\n });\n if (shouldCapturePreview) {\n void captureProvidedWorkbenchNodePreviewImageForNode(target, {\n captureNodePreviewImage,\n dockPreviewCache,\n resolveDockPreviewCacheKey\n });\n }\n frameID = window.requestAnimationFrame(() => {\n frameID = null;\n timerID = setTimeout(commitMinimize, 0);\n });\n return;\n }\n\n if (effectiveMinimizeAnimation === \"scale\") {\n stopAnimation();\n const generation = animationGenerationRef.current;\n const nodeElement = resolveNodeElement(nodeID);\n if (!nodeElement) {\n logWorkbenchGenieDiagnostic(\n debugDiagnostics,\n \"workbench.genie.minimize.skipped\",\n {\n ...describeGenieNode(target),\n mode: \"scale\",\n reason: \"node_element_missing\"\n },\n \"warn\"\n );\n runMinimize();\n return;\n }\n const wasFocusedForCapture =\n shouldCapturePreview && isFocusedWorkbenchNode(controller, nodeID);\n if (shouldCapturePreview && !wasFocusedForCapture) {\n flushSync(() => {\n controller.commands.focusNode(nodeID);\n });\n await waitForNextAnimationFrame();\n if (generation !== animationGenerationRef.current) {\n return;\n }\n }\n\n if (shouldCapturePreview) {\n void captureProvidedWorkbenchNodePreviewImageForNode(target, {\n captureNodePreviewImage,\n dockPreviewCache,\n resolveDockPreviewCacheKey\n });\n }\n\n let minimizeCommitted = false;\n const commitMinimize = () => {\n if (minimizeCommitted) {\n return;\n }\n minimizeCommitted = true;\n runMinimize();\n };\n const cleanupPendingMinimize = () => {\n releaseMinimizedDockEnterAnimation(nodeID);\n flushSync(() => {\n clearPendingMinimizedNode(nodeID);\n commitMinimize();\n });\n };\n const pendingMinimizedNode: WorkbenchNode<TData> = {\n ...target,\n isMinimized: true,\n minimizedAtUnixMs: Date.now()\n };\n registerMinimizedDockEnterAnimation(nodeID);\n\n flushSync(() => {\n setPendingMinimizedNode(pendingMinimizedNode);\n });\n animationCleanupRef.current = cleanupPendingMinimize;\n\n await waitForNextAnimationFrame();\n if (generation !== animationGenerationRef.current) {\n return;\n }\n\n const anchorKey = resolveAnchorKeyForNode(pendingMinimizedNode);\n const dockRect = await resolveDockAnchorRectAfterRender(\n anchorKey,\n () => generation === animationGenerationRef.current\n );\n if (generation !== animationGenerationRef.current) {\n return;\n }\n if (\n !nodeElement.isConnected ||\n !dockRect ||\n !isUsableGenieRect(dockRect)\n ) {\n logWorkbenchGenieDiagnostic(\n debugDiagnostics,\n \"workbench.genie.minimize.skipped\",\n {\n ...describeGenieNode(target),\n anchorKey,\n dockRect,\n mode: \"scale\",\n nodeElementConnected: nodeElement.isConnected,\n registeredDockAnchorKeys: Array.from(\n dockAnchorElementsRef.current.keys()\n ).filter((key) => key.startsWith(\"minimized:\")),\n reason: \"dock_rect_unusable\"\n },\n \"warn\"\n );\n cleanupPendingMinimize();\n return;\n }\n\n runScaleWindowAnimation({\n direction: \"minimize\",\n dockRect,\n nodeElement,\n onCancel: () => {\n cleanupPendingMinimize();\n },\n onComplete: () => {\n animationCleanupRef.current = null;\n flushSync(() => {\n clearPendingMinimizedNode(nodeID);\n commitMinimize();\n });\n scheduleReleaseMinimizedDockEnterAnimation(nodeID);\n },\n skipStop: true\n });\n return;\n }\n\n stopAnimation();\n const generation = animationGenerationRef.current;\n const nodeElement = resolveNodeElement(nodeID);\n if (!nodeElement) {\n logWorkbenchGenieDiagnostic(\n debugDiagnostics,\n \"workbench.genie.minimize.skipped\",\n {\n ...describeGenieNode(target),\n mode: \"genie\",\n reason: \"node_element_missing\"\n },\n \"warn\"\n );\n runMinimize();\n return;\n }\n const windowRect = viewportRectFromElement(nodeElement);\n if (!isUsableGenieRect(windowRect)) {\n logWorkbenchGenieDiagnostic(\n debugDiagnostics,\n \"workbench.genie.minimize.skipped\",\n {\n ...describeGenieNode(target),\n mode: \"genie\",\n reason: \"window_rect_unusable\",\n windowRect\n },\n \"warn\"\n );\n runMinimize();\n return;\n }\n const pendingMinimizedNode: WorkbenchNode<TData> = {\n ...target,\n isMinimized: true,\n minimizedAtUnixMs: Date.now()\n };\n const componentPreviewTexture = shouldCapturePreview\n ? null\n : await requestRenderedGeniePreviewTexture({\n node: pendingMinimizedNode,\n textureRect: windowRect\n }).catch(() => null);\n if (generation !== animationGenerationRef.current) {\n return;\n }\n if (!shouldCapturePreview) {\n if (!componentPreviewTexture) {\n logWorkbenchGenieDiagnostic(\n debugDiagnostics,\n \"workbench.genie.texture.missing\",\n {\n ...describeGenieNode(target),\n mode: \"genie\",\n reason: \"component_preview_texture_missing\",\n shouldCapturePreview,\n windowRect\n },\n \"warn\"\n );\n runMinimize();\n return;\n }\n }\n\n const captureTarget = resolveWorkbenchCaptureElement(nodeElement);\n const preparedTexture = shouldCapturePreview\n ? prepareElementTextureCapture(captureTarget)\n : null;\n if (!preparedTexture) {\n if (!componentPreviewTexture) {\n logWorkbenchGenieDiagnostic(\n debugDiagnostics,\n \"workbench.genie.minimize.skipped\",\n {\n ...describeGenieNode(target),\n mode: \"genie\",\n reason: \"prepared_texture_missing\",\n shouldCapturePreview\n },\n \"warn\"\n );\n runMinimize();\n return;\n }\n }\n const wasFocusedForCapture = isFocusedWorkbenchNode(controller, nodeID);\n if (shouldCapturePreview && !wasFocusedForCapture) {\n flushSync(() => {\n controller.commands.focusNode(nodeID);\n });\n await waitForNextAnimationFrame();\n if (generation !== animationGenerationRef.current) {\n return;\n }\n }\n const previewImageUrlPromise = shouldCapturePreview\n ? Promise.resolve(captureNodePreviewImage?.(target) ?? null).catch(\n () => null\n )\n : Promise.resolve(null);\n const previewImageUrl = await previewImageUrlPromise;\n const previewImageTexture =\n shouldCapturePreview && previewImageUrl\n ? await renderPreviewImageTexture({\n previewImageUrl,\n rect: windowRect\n }).catch(() => null)\n : null;\n const texture =\n componentPreviewTexture ??\n previewImageTexture ??\n (preparedTexture\n ? await renderPreparedElementTexture(preparedTexture).catch(\n () => null\n )\n : null);\n if (generation !== animationGenerationRef.current) {\n return;\n }\n if (!texture) {\n logWorkbenchGenieDiagnostic(\n debugDiagnostics,\n \"workbench.genie.minimize.skipped\",\n {\n ...describeGenieNode(target),\n hasComponentPreviewTexture: Boolean(componentPreviewTexture),\n hasPreparedDomTexture: Boolean(preparedTexture),\n hasPreviewImageTexture: Boolean(previewImageTexture),\n mode: \"genie\",\n reason: \"texture_missing\",\n shouldCapturePreview\n },\n \"warn\"\n );\n if (previewImageUrl) {\n writeCachedWorkbenchNodePreviewImage(nodeID, previewImageUrl);\n persistWorkbenchNodePreviewImage(target, previewImageUrl, {\n dockPreviewCache,\n resolveDockPreviewCacheKey\n });\n }\n runMinimize();\n return;\n }\n if (previewImageUrl) {\n writeCachedWorkbenchNodePreviewImage(nodeID, previewImageUrl);\n persistWorkbenchNodePreviewImage(target, previewImageUrl, {\n dockPreviewCache,\n resolveDockPreviewCacheKey\n });\n } else {\n const capturedPreviewImageUrl = createDockPreviewDataUrl(\n texture.canvas\n );\n writeCachedWorkbenchNodePreviewImage(nodeID, capturedPreviewImageUrl);\n persistWorkbenchNodePreviewImage(target, capturedPreviewImageUrl, {\n dockPreviewCache,\n resolveDockPreviewCacheKey\n });\n }\n writeMinimizedGenieTexture(nodeID, texture);\n pruneMinimizedGenieTextures(nodeID);\n\n let minimizeCommitted = false;\n const commitMinimize = () => {\n if (minimizeCommitted) {\n return;\n }\n minimizeCommitted = true;\n runMinimize();\n };\n const cleanupPendingGenieMinimize = () => {\n releaseMinimizedDockEnterAnimation(nodeID);\n flushSync(() => {\n clearPendingMinimizedNode(nodeID);\n showNodeForGenie(nodeID);\n commitMinimize();\n });\n clearCanvas();\n };\n animationCleanupRef.current = cleanupPendingGenieMinimize;\n\n registerMinimizedDockEnterAnimation(nodeID);\n\n flushSync(() => {\n setPendingMinimizedNode(pendingMinimizedNode);\n });\n\n await waitForNextAnimationFrame();\n if (generation !== animationGenerationRef.current) {\n return;\n }\n\n const anchorKey = resolveAnchorKeyForNode(pendingMinimizedNode);\n const dockRect = await resolveDockAnchorRectAfterRender(\n anchorKey,\n () => generation === animationGenerationRef.current\n );\n if (generation !== animationGenerationRef.current) {\n return;\n }\n if (!dockRect || !isUsableGenieRect(dockRect)) {\n logWorkbenchGenieDiagnostic(\n debugDiagnostics,\n \"workbench.genie.minimize.skipped\",\n {\n ...describeGenieNode(target),\n anchorKey,\n dockRect,\n mode: \"genie\",\n registeredDockAnchorKeys: Array.from(\n dockAnchorElementsRef.current.keys()\n ).filter((key) => key.startsWith(\"minimized:\")),\n reason: \"dock_rect_unusable\"\n },\n \"warn\"\n );\n animationCleanupRef.current = null;\n cleanupPendingGenieMinimize();\n return;\n }\n\n runGenieAnimation({\n direction: \"minimize\",\n dockRect,\n onCancel: () => {\n cleanupPendingGenieMinimize();\n },\n onComplete: () => {\n scheduleReleaseMinimizedDockEnterAnimation(nodeID);\n flushSync(() => {\n clearPendingMinimizedNode(nodeID);\n showNodeForGenie(nodeID);\n commitMinimize();\n });\n clearCanvas();\n },\n skipStop: true,\n texture\n });\n flushSync(() => {\n hideNodeForGenie(nodeID);\n });\n })();\n },\n [\n clearCanvas,\n clearMinimizedGenieTexture,\n controller,\n captureNodePreviewImage,\n clearPendingMinimizedNode,\n debugDiagnostics,\n dockPreviewCache,\n hideNodeForGenie,\n minimizeAnimation,\n pruneMinimizedGenieTextures,\n registerMinimizedDockEnterAnimation,\n releaseMinimizedDockEnterAnimation,\n requestRenderedGeniePreviewTexture,\n resolveAnchorKeyForNode,\n resolveDockPreviewCacheKey,\n resolveDockAnchorRect,\n resolveNodeElement,\n runGenieAnimation,\n runScaleWindowAnimation,\n scheduleReleaseMinimizedDockEnterAnimation,\n shouldCaptureNodePreviewImage,\n setupCanvas,\n showNodeForGenie,\n stopAnimation,\n writeMinimizedGenieTexture\n ]\n );\n\n useEffect(\n () => () => {\n for (const timer of minimizedDockEnterAnimationTimersRef.current.values()) {\n clearTimeout(timer);\n }\n minimizedDockEnterAnimationTimersRef.current.clear();\n minimizedDockEnterAnimationNodeIdsRef.current.clear();\n minimizedGenieTextureByNodeIDRef.current.clear();\n },\n []\n );\n\n return {\n genieLayer:\n typeof document === \"undefined\"\n ? null\n : createPortal(\n <>\n <canvas\n ref={canvasRef}\n className=\"workbench-genie-layer\"\n data-workbench-genie-layer-state={\n isCanvasActive ? \"active\" : \"idle\"\n }\n aria-hidden\n />\n {pendingRenderedPreviewCapture ? (\n <div\n ref={renderedPreviewCaptureElementRef}\n className=\"workbench-genie-preview-capture\"\n data-workbench-genie-preview-capture-id={\n pendingRenderedPreviewCapture.id\n }\n data-workbench-genie-preview-node-id={\n pendingRenderedPreviewCapture.nodeID\n }\n data-workbench-genie-preview-used-fallback={\n pendingRenderedPreviewCapture.usedFallbackPreview\n ? \"true\"\n : \"false\"\n }\n style={{\n height: pendingRenderedPreviewCapture.rect.height,\n width: pendingRenderedPreviewCapture.rect.width\n }}\n aria-hidden\n >\n {pendingRenderedPreviewCapture.preview}\n </div>\n ) : null}\n </>,\n document.body\n ),\n isNodeGenieHidden: useCallback(\n (nodeID: string) => genieHiddenNodeIDs.has(nodeID),\n [genieHiddenNodeIDs]\n ),\n isPendingMinimizedDockNode: useCallback(\n (nodeID: string) => pendingMinimizedNode?.id === nodeID,\n [pendingMinimizedNode]\n ),\n launchNodeFromAnchor,\n minimizeNodeToAnchor,\n pendingMinimizedNode,\n registerDockAnchor,\n shouldAnimateMinimizedDockEnter\n };\n}\n","export interface WorkbenchGenieViewportRect {\n height: number;\n left: number;\n top: number;\n width: number;\n}\n\nexport type WorkbenchGenieDirection = \"open\" | \"minimize\";\n\nexport interface WorkbenchGeniePoint {\n x: number;\n y: number;\n}\n\nexport interface WorkbenchGenieScanlineFrame {\n direction: WorkbenchGenieDirection;\n dockPoint: WorkbenchGeniePoint;\n progress: number;\n texture: HTMLCanvasElement;\n textureRect: WorkbenchGenieViewportRect;\n}\n\nexport interface WorkbenchGenieMeaningfulElementClone {\n clone: HTMLElement;\n images: WorkbenchGenieMeaningfulImageClone[];\n}\n\nexport interface WorkbenchGenieMeaningfulImageClone {\n displayHeight: number;\n displayWidth: number;\n url: string | null;\n}\n\nconst genieHorizontalRowStagger = 0.65;\nconst genieVerticalRowStagger = 0.2;\nconst genieDockGlowRadius = 55;\nconst genieScanlineStrideThresholdPx = 640;\nconst genieMaxScanlineStride = 3;\n\nexport function clampGenieProgress(value: number): number {\n return Math.max(0, Math.min(1, value));\n}\n\nexport function easeInOutCubic(value: number): number {\n const progress = clampGenieProgress(value);\n return progress < 0.5\n ? 4 * progress * progress * progress\n : 1 - Math.pow(-2 * progress + 2, 3) / 2;\n}\n\nexport function easeInQuadratic(value: number): number {\n const progress = clampGenieProgress(value);\n return progress * progress;\n}\n\nexport function easeOutQuadratic(value: number): number {\n const progress = clampGenieProgress(value);\n return 1 - (1 - progress) * (1 - progress);\n}\n\nexport function lerpGenieValue(\n from: number,\n to: number,\n progress: number\n): number {\n return from + (to - from) * progress;\n}\n\nexport function viewportRectFromElement(\n element: HTMLElement\n): WorkbenchGenieViewportRect {\n const rect = element.getBoundingClientRect();\n return {\n height: rect.height,\n left: rect.left,\n top: rect.top,\n width: rect.width\n };\n}\n\nexport function isUsableGenieRect(rect: WorkbenchGenieViewportRect): boolean {\n return rect.width > 0 && rect.height > 0;\n}\n\nexport function centerPointFromRect(\n rect: WorkbenchGenieViewportRect\n): WorkbenchGeniePoint {\n return {\n x: rect.left + rect.width / 2,\n y: rect.top + rect.height / 2\n };\n}\n\nfunction resolveGenieScanlineStride(textureHeight: number): number {\n return Math.max(\n 1,\n Math.min(\n genieMaxScanlineStride,\n Math.ceil(textureHeight / genieScanlineStrideThresholdPx)\n )\n );\n}\n\nfunction resolveGenieDirtyRect({\n dockPoint,\n textureRect,\n viewportHeight,\n viewportWidth\n}: {\n dockPoint: WorkbenchGeniePoint;\n textureRect: WorkbenchGenieViewportRect;\n viewportHeight: number;\n viewportWidth: number;\n}): WorkbenchGenieViewportRect {\n const padding = genieDockGlowRadius + 4;\n const left = Math.max(\n 0,\n Math.floor(Math.min(textureRect.left, dockPoint.x) - padding)\n );\n const top = Math.max(\n 0,\n Math.floor(Math.min(textureRect.top, dockPoint.y) - padding)\n );\n const right = Math.min(\n viewportWidth,\n Math.ceil(\n Math.max(textureRect.left + textureRect.width, dockPoint.x) + padding\n )\n );\n const bottom = Math.min(\n viewportHeight,\n Math.ceil(\n Math.max(textureRect.top + textureRect.height, dockPoint.y) + padding\n )\n );\n\n return {\n height: Math.max(0, bottom - top),\n left,\n top,\n width: Math.max(0, right - left)\n };\n}\n\nfunction resolveGenieRowProgress({\n direction,\n progress,\n rowProgress,\n stagger\n}: {\n direction: WorkbenchGenieDirection;\n progress: number;\n rowProgress: number;\n stagger: number;\n}): number {\n const start =\n direction === \"minimize\"\n ? (1 - rowProgress) * stagger\n : rowProgress * stagger;\n return clampGenieProgress((progress - start) / (1 - start));\n}\n\nfunction resolveGenieRowTargetY({\n direction,\n dockPoint,\n progress,\n sourceY,\n textureHeight,\n textureRect\n}: {\n direction: WorkbenchGenieDirection;\n dockPoint: WorkbenchGeniePoint;\n progress: number;\n sourceY: number;\n textureHeight: number;\n textureRect: WorkbenchGenieViewportRect;\n}): number {\n const rowProgress = clampGenieProgress(sourceY / textureHeight);\n const verticalProgress = resolveGenieRowProgress({\n direction,\n progress,\n rowProgress,\n stagger: genieVerticalRowStagger\n });\n const verticalEase = easeInQuadratic(verticalProgress);\n return direction === \"minimize\"\n ? lerpGenieValue(textureRect.top + sourceY, dockPoint.y, verticalEase)\n : lerpGenieValue(dockPoint.y, textureRect.top + sourceY, verticalEase);\n}\n\nfunction canInlineComputedStyle(\n element: Element\n): element is HTMLElement | SVGElement {\n return (\n element instanceof HTMLElement ||\n (typeof SVGElement !== \"undefined\" && element instanceof SVGElement)\n );\n}\n\nfunction isHiddenForGenieTexture(computed: CSSStyleDeclaration): boolean {\n return (\n computed.display === \"none\" ||\n computed.visibility === \"hidden\" ||\n computed.visibility === \"collapse\" ||\n Number.parseFloat(computed.opacity || \"1\") <= 0\n );\n}\n\nfunction rectsIntersect(\n a: WorkbenchGenieViewportRect,\n b: WorkbenchGenieViewportRect\n): boolean {\n return (\n a.left < b.left + b.width &&\n a.left + a.width > b.left &&\n a.top < b.top + b.height &&\n a.top + a.height > b.top\n );\n}\n\ntype WorkbenchGenieElementSkipReason =\n | \"hidden\"\n | \"offscreen\"\n | \"unsupported\"\n | \"zero-size\";\n\nfunction resolveElementSkipReasonForGenieTexture(\n element: Element,\n rootRect: WorkbenchGenieViewportRect,\n computed: CSSStyleDeclaration\n): WorkbenchGenieElementSkipReason | null {\n if (isHiddenForGenieTexture(computed)) {\n return \"hidden\";\n }\n const tagName = element.tagName.toLowerCase();\n if (tagName === \"script\" || tagName === \"style\" || tagName === \"template\") {\n return \"unsupported\";\n }\n const rect = element.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) {\n return \"zero-size\";\n }\n return rectsIntersect(\n {\n height: rect.height,\n left: rect.left,\n top: rect.top,\n width: rect.width\n },\n rootRect\n )\n ? null\n : \"offscreen\";\n}\n\nfunction hasMeaningfulTextNode(node: Node): boolean {\n return node.textContent?.trim() ? true : false;\n}\n\nfunction cloneMeaningfulGenieNode(\n source: Node,\n rootRect: WorkbenchGenieViewportRect,\n images: WorkbenchGenieMeaningfulImageClone[],\n forceInclude = false\n): Node | null {\n if (source.nodeType === Node.TEXT_NODE) {\n if (!hasMeaningfulTextNode(source)) {\n return null;\n }\n return source.cloneNode(false);\n }\n if (source.nodeType !== Node.ELEMENT_NODE) {\n return null;\n }\n\n const sourceElement = source as Element;\n if (!canInlineComputedStyle(sourceElement)) {\n return null;\n }\n const computed = window.getComputedStyle(sourceElement);\n const skipReason = resolveElementSkipReasonForGenieTexture(\n sourceElement,\n rootRect,\n computed\n );\n const includeSelf = forceInclude || skipReason === null;\n if (!includeSelf && skipReason === \"hidden\") {\n return null;\n }\n\n const clone = sourceElement.cloneNode(false) as Element;\n copyGenieComputedStyle(sourceElement, clone, computed);\n\n for (const child of Array.from(source.childNodes)) {\n const childClone = cloneMeaningfulGenieNode(child, rootRect, images);\n if (childClone) {\n clone.appendChild(childClone);\n }\n }\n\n if (!includeSelf && clone.childNodes.length === 0) {\n return null;\n }\n\n if (sourceElement instanceof HTMLImageElement) {\n const rect = sourceElement.getBoundingClientRect();\n images.push({\n displayHeight: rect.height,\n displayWidth: rect.width,\n url:\n sourceElement.currentSrc ||\n sourceElement.src ||\n sourceElement.getAttribute(\"src\") ||\n null\n });\n }\n return clone;\n}\n\nfunction copyGenieComputedStyle(\n source: Element,\n clone: Element,\n computed = window.getComputedStyle(source)\n): void {\n if (!canInlineComputedStyle(source) || !canInlineComputedStyle(clone)) {\n return;\n }\n if (computed.cssText) {\n clone.style.cssText = computed.cssText;\n } else {\n for (let index = 0; index < computed.length; index += 1) {\n const propertyName = computed.item(index);\n if (!propertyName) {\n continue;\n }\n clone.style.setProperty(\n propertyName,\n computed.getPropertyValue(propertyName),\n computed.getPropertyPriority(propertyName)\n );\n }\n }\n clone.style.animation = \"none\";\n clone.style.opacity = \"1\";\n clone.style.transition = \"none\";\n clone.style.visibility = \"visible\";\n}\n\nexport function cloneMeaningfulGenieElement(\n source: HTMLElement,\n rootRect: WorkbenchGenieViewportRect\n): WorkbenchGenieMeaningfulElementClone | null {\n const images: WorkbenchGenieMeaningfulImageClone[] = [];\n const clone = cloneMeaningfulGenieNode(source, rootRect, images, true);\n if (!(clone instanceof HTMLElement)) {\n return null;\n }\n return { clone, images };\n}\n\nexport function renderGenieScanlines(\n context: CanvasRenderingContext2D,\n viewportWidth: number,\n viewportHeight: number,\n frame: WorkbenchGenieScanlineFrame\n): void {\n const { direction, dockPoint, texture, textureRect } = frame;\n const progress = clampGenieProgress(frame.progress);\n const sourceWidth = Math.max(1, texture.width);\n const sourceHeight = Math.max(1, texture.height);\n const destinationWidth = Math.max(1, textureRect.width);\n const destinationHeight = Math.max(1, textureRect.height);\n const scanlineStride = resolveGenieScanlineStride(sourceHeight);\n const dirtyRect = resolveGenieDirtyRect({\n dockPoint,\n textureRect,\n viewportHeight,\n viewportWidth\n });\n\n context.clearRect(\n dirtyRect.left,\n dirtyRect.top,\n dirtyRect.width,\n dirtyRect.height\n );\n\n for (let y = 0; y < sourceHeight; y += scanlineStride) {\n const sourceSliceHeight = Math.min(scanlineStride, sourceHeight - y);\n const sourceMidY = y + sourceSliceHeight / 2;\n const rowProgress = sourceMidY / sourceHeight;\n const horizontalProgress = resolveGenieRowProgress({\n direction,\n progress,\n rowProgress,\n stagger: genieHorizontalRowStagger\n });\n const horizontalEase = easeInOutCubic(horizontalProgress);\n\n const left =\n direction === \"minimize\"\n ? lerpGenieValue(textureRect.left, dockPoint.x, horizontalEase)\n : lerpGenieValue(dockPoint.x, textureRect.left, horizontalEase);\n const right =\n direction === \"minimize\"\n ? lerpGenieValue(\n textureRect.left + destinationWidth,\n dockPoint.x,\n horizontalEase\n )\n : lerpGenieValue(\n dockPoint.x,\n textureRect.left + destinationWidth,\n horizontalEase\n );\n const destinationSourceTop = (y / sourceHeight) * destinationHeight;\n const destinationSourceBottom =\n ((y + sourceSliceHeight) / sourceHeight) * destinationHeight;\n const targetTop = resolveGenieRowTargetY({\n direction,\n dockPoint,\n progress,\n sourceY: destinationSourceTop,\n textureHeight: destinationHeight,\n textureRect\n });\n const targetBottom = resolveGenieRowTargetY({\n direction,\n dockPoint,\n progress,\n sourceY: destinationSourceBottom,\n textureHeight: destinationHeight,\n textureRect\n });\n const targetY = Math.min(targetTop, targetBottom) - 0.5;\n const targetHeight = Math.max(1, Math.abs(targetBottom - targetTop) + 1);\n const rowWidth = right - left;\n\n if (rowWidth < 0.8) {\n continue;\n }\n\n context.drawImage(\n texture,\n 0,\n y,\n sourceWidth,\n sourceSliceHeight,\n left,\n targetY,\n rowWidth,\n targetHeight\n );\n }\n\n const glowProgress = direction === \"minimize\" ? progress : 1 - progress;\n if (glowProgress <= 0.75) {\n return;\n }\n\n const glowAlpha = easeOutQuadratic((glowProgress - 0.75) / 0.25) * 0.3;\n const dockGlow = context.createRadialGradient(\n dockPoint.x,\n dockPoint.y,\n 0,\n dockPoint.x,\n dockPoint.y,\n genieDockGlowRadius\n );\n dockGlow.addColorStop(0, `rgba(255, 255, 255, ${glowAlpha})`);\n dockGlow.addColorStop(1, \"rgba(255, 255, 255, 0)\");\n context.fillStyle = dockGlow;\n context.fillRect(\n dirtyRect.left,\n dirtyRect.top,\n dirtyRect.width,\n dirtyRect.height\n );\n}\n","import type {\n WorkbenchContribution,\n WorkbenchHostDockEntry,\n WorkbenchHostExternalStateSource,\n WorkbenchHostClosePreparer,\n WorkbenchHostLaunchRequest,\n WorkbenchHostNodeCloseRequest,\n WorkbenchHostNodeDefinition,\n WorkbenchHostProps\n} from \"./types.ts\";\n\nexport interface ResolvedWorkbenchHostConfig {\n dockEntries: readonly WorkbenchHostDockEntry[];\n externalStateSource?: WorkbenchHostExternalStateSource;\n nodes: readonly WorkbenchHostNodeDefinition[];\n onLaunchRequest?: WorkbenchHostProps[\"onLaunchRequest\"];\n onNodeCloseRequest?: WorkbenchHostProps[\"onNodeCloseRequest\"];\n prepareHostClose?: WorkbenchHostClosePreparer;\n}\n\nexport interface ResolvedWorkbenchHostRuntimeConfig {\n externalStateSource?: WorkbenchHostExternalStateSource;\n nodes: readonly WorkbenchHostNodeDefinition[];\n onLaunchRequest?: WorkbenchHostProps[\"onLaunchRequest\"];\n onNodeCloseRequest?: WorkbenchHostProps[\"onNodeCloseRequest\"];\n}\n\nexport function resolveWorkbenchHostConfig(\n props: Pick<\n WorkbenchHostProps,\n | \"contributions\"\n | \"dockEntries\"\n | \"externalStateSource\"\n | \"nodes\"\n | \"onLaunchRequest\"\n | \"onNodeCloseRequest\"\n >\n): ResolvedWorkbenchHostConfig {\n const contributions = props.contributions ?? [];\n\n return {\n dockEntries: resolveWorkbenchHostDockEntries(props),\n ...resolveWorkbenchHostRuntimeConfig(props),\n prepareHostClose: resolveHostClosePreparer(contributions)\n };\n}\n\nexport function resolveWorkbenchHostDockEntries(\n props: Pick<WorkbenchHostProps, \"contributions\" | \"dockEntries\">\n): readonly WorkbenchHostDockEntry[] {\n const contributions = props.contributions ?? [];\n return mergeByKey(\n contributions.flatMap((contribution) => contribution.dockEntries ?? []),\n props.dockEntries ?? [],\n (entry) => entry.id\n );\n}\n\nexport function resolveWorkbenchHostRuntimeConfig(\n props: Pick<\n WorkbenchHostProps,\n | \"contributions\"\n | \"externalStateSource\"\n | \"nodes\"\n | \"onLaunchRequest\"\n | \"onNodeCloseRequest\"\n >\n): ResolvedWorkbenchHostRuntimeConfig {\n const contributions = props.contributions ?? [];\n\n return {\n externalStateSource:\n props.externalStateSource ??\n combineContributionExternalStateSources(contributions),\n nodes: mergeByKey(\n contributions.flatMap((contribution) => contribution.nodes ?? []),\n props.nodes ?? [],\n (definition) => definition.typeId\n ),\n onLaunchRequest: resolveLaunchRequestHandler({\n contributions,\n explicitHandler: props.onLaunchRequest\n }),\n onNodeCloseRequest: resolveNodeCloseRequestHandler({\n contributions,\n explicitHandler: props.onNodeCloseRequest\n })\n };\n}\n\nfunction mergeByKey<T>(\n contributionItems: readonly T[],\n explicitItems: readonly T[],\n getKey: (item: T) => string\n): readonly T[] {\n const merged = new Map<string, T>();\n for (const item of [...contributionItems, ...explicitItems]) {\n const key = getKey(item);\n merged.delete(key);\n merged.set(key, item);\n }\n return [...merged.values()];\n}\n\nfunction combineContributionExternalStateSources(\n contributions: readonly WorkbenchContribution[]\n): WorkbenchHostExternalStateSource | undefined {\n const sources = contributions\n .map((contribution) => contribution.externalStateSource)\n .filter((source): source is WorkbenchHostExternalStateSource =>\n Boolean(source)\n );\n\n if (sources.length === 0) {\n return undefined;\n }\n\n return {\n getNodeState(input) {\n for (const source of sources) {\n const state = source.getNodeState(input);\n if (state !== null && state !== undefined) {\n return state;\n }\n }\n return null;\n },\n getSnapshotNodeState(input) {\n for (const source of sources) {\n const state = source.getSnapshotNodeState?.(input);\n if (state !== null && state !== undefined) {\n return state;\n }\n }\n return null;\n },\n getWorkspaceState(input) {\n for (const source of sources) {\n const state = source.getWorkspaceState(input);\n if (state !== null && state !== undefined) {\n return state;\n }\n }\n return null;\n },\n subscribe(listener) {\n const disposers = sources\n .map((source) => source.subscribe?.(listener))\n .filter((dispose): dispose is () => void => Boolean(dispose));\n return () => {\n for (const dispose of disposers) {\n dispose();\n }\n };\n }\n };\n}\n\nfunction resolveLaunchRequestHandler(input: {\n contributions: readonly WorkbenchContribution[];\n explicitHandler?: WorkbenchHostProps[\"onLaunchRequest\"];\n}): WorkbenchHostProps[\"onLaunchRequest\"] {\n const contributionHandlers = input.contributions\n .map((contribution) => contribution.onLaunchRequest)\n .filter(\n (\n handler\n ): handler is NonNullable<WorkbenchContribution[\"onLaunchRequest\"]> =>\n Boolean(handler)\n );\n\n if (!input.explicitHandler && contributionHandlers.length === 0) {\n return undefined;\n }\n\n return async (request: WorkbenchHostLaunchRequest) => {\n const explicitResult = await input.explicitHandler?.(request);\n if (explicitResult !== null && explicitResult !== undefined) {\n return explicitResult;\n }\n\n for (const handler of contributionHandlers) {\n const result = await handler(request);\n if (result !== null && result !== undefined) {\n return result;\n }\n }\n\n return null;\n };\n}\n\nfunction resolveNodeCloseRequestHandler(input: {\n contributions: readonly WorkbenchContribution[];\n explicitHandler?: WorkbenchHostProps[\"onNodeCloseRequest\"];\n}): WorkbenchHostProps[\"onNodeCloseRequest\"] {\n const contributionHandlers = input.contributions\n .map((contribution) => contribution.onNodeCloseRequest)\n .filter(\n (\n handler\n ): handler is NonNullable<WorkbenchContribution[\"onNodeCloseRequest\"]> =>\n Boolean(handler)\n );\n\n if (!input.explicitHandler && contributionHandlers.length === 0) {\n return undefined;\n }\n\n return async (request: WorkbenchHostNodeCloseRequest) => {\n const explicitResult = await input.explicitHandler?.(request);\n if (explicitResult !== undefined) {\n return explicitResult;\n }\n\n for (const handler of contributionHandlers) {\n const result = await handler(request);\n if (result !== undefined) {\n return result;\n }\n }\n\n return undefined;\n };\n}\n\nexport function resolveWorkbenchHostPrepareClose(\n contributions: readonly WorkbenchContribution[]\n): WorkbenchHostClosePreparer | undefined {\n return resolveHostClosePreparer(contributions);\n}\n\nfunction resolveHostClosePreparer(\n contributions: readonly WorkbenchContribution[]\n): WorkbenchHostClosePreparer | undefined {\n const preparers = contributions\n .map((contribution) => contribution.prepareHostClose)\n .filter(\n (\n prepare\n ): prepare is NonNullable<WorkbenchContribution[\"prepareHostClose\"]> =>\n Boolean(prepare)\n );\n\n if (preparers.length === 0) {\n return undefined;\n }\n\n return async (context) => {\n for (const prepare of preparers) {\n if (!(await prepare(context))) {\n return false;\n }\n }\n\n return true;\n };\n}\n","import { useEffect, useMemo, useState } from \"react\";\nimport { createWorkbenchMissionControlI18nRuntime } from \"../mission-control/workbenchMissionControlI18n.ts\";\nimport { createWorkbenchWindowChromeI18nRuntime } from \"../react/workbenchWindowI18n.ts\";\nimport type { WorkbenchController } from \"../store/types.ts\";\nimport { createWorkbenchHostMissionControlAdapter } from \"./missionControlAdapter.ts\";\nimport type { ResolvedWorkbenchHostConfig } from \"./hostConfig.ts\";\nimport { createWorkbenchHostSession } from \"./session.ts\";\nimport type {\n WorkbenchHostChromeRenderContext,\n WorkbenchHostNodeData,\n WorkbenchHostProps\n} from \"./types.ts\";\nimport { createWorkbenchHostI18nRuntime } from \"./workbenchHostI18n.ts\";\n\nexport function useWorkbenchHostRuntime({\n debugDiagnostics,\n externalStateSource,\n i18n,\n missionControlEnabled,\n nodes,\n onHandleReady,\n onLaunchRequest,\n onMissionControlAdapterReady,\n onNodeCloseRequest,\n projectedNodes,\n snapshotRepository,\n workspaceId\n}: Pick<\n WorkbenchHostProps,\n | \"debugDiagnostics\"\n | \"i18n\"\n | \"onHandleReady\"\n | \"onMissionControlAdapterReady\"\n | \"projectedNodes\"\n | \"snapshotRepository\"\n | \"workspaceId\"\n> &\n Pick<\n ResolvedWorkbenchHostConfig,\n \"externalStateSource\" | \"nodes\" | \"onLaunchRequest\" | \"onNodeCloseRequest\"\n > & {\n missionControlEnabled: boolean;\n }) {\n const [externalStateRevision, bumpExternalStateRevision] = useState(0);\n const [, bumpHydrationRevision] = useState(0);\n const hostSession = useMemo(() => {\n logWorkbenchHostDebug(\"create-session\", debugDiagnostics, {\n nodeTypeIDs: nodes.map((node) => node.typeId),\n projectedNodeCount: projectedNodes?.length ?? 0,\n workspaceId\n });\n return createWorkbenchHostSession({\n debugDiagnostics,\n externalStateSource,\n nodes,\n onLaunchRequest,\n onNodeCloseRequest,\n projectedNodes: projectedNodes ?? [],\n snapshotRepository,\n workspaceId\n });\n }, [\n debugDiagnostics,\n externalStateSource,\n nodes,\n onLaunchRequest,\n onNodeCloseRequest,\n snapshotRepository,\n workspaceId\n ]);\n const hostI18n = useMemo(() => createWorkbenchHostI18nRuntime(i18n), [i18n]);\n const missionControlI18n = useMemo(\n () => createWorkbenchMissionControlI18nRuntime(i18n),\n [i18n]\n );\n const windowChromeI18n = useMemo(\n () => createWorkbenchWindowChromeI18nRuntime(i18n),\n [i18n]\n );\n const nodeDefinitionByType = useMemo(\n () => new Map(nodes.map((definition) => [definition.typeId, definition])),\n [nodes]\n );\n const isHydrating = hostSession.isHydrating?.() ?? false;\n const missionControlAdapter = useMemo(\n () =>\n missionControlEnabled && !isHydrating\n ? createWorkbenchHostMissionControlAdapter({\n activateNode: hostSession.activateNode.bind(hostSession),\n controller: hostSession.controller\n })\n : null,\n [hostSession.controller, isHydrating, missionControlEnabled]\n );\n const chromeController = useMemo(\n () =>\n isHydrating\n ? createReadOnlyWorkbenchController(hostSession.controller)\n : hostSession.controller,\n [hostSession.controller, isHydrating]\n );\n const chromeContext = useMemo<WorkbenchHostChromeRenderContext>(\n () => ({\n activateNode: hostSession.activateNode.bind(hostSession),\n controller: chromeController,\n focusNode: hostSession.focusNode.bind(hostSession),\n launchNode: hostSession.launchNode.bind(hostSession)\n }),\n [chromeController, hostSession]\n );\n\n useEffect(() => {\n let isCurrent = true;\n void hostSession.load().finally(() => {\n if (isCurrent) {\n bumpHydrationRevision((revision) => revision + 1);\n }\n });\n\n return () => {\n isCurrent = false;\n logWorkbenchHostDebug(\"dispose-session\", debugDiagnostics, {\n workspaceId\n });\n hostSession.dispose();\n };\n }, [debugDiagnostics, hostSession, workspaceId]);\n\n useEffect(() => {\n onHandleReady?.(hostSession);\n return () => {\n onHandleReady?.(null);\n };\n }, [hostSession, onHandleReady]);\n\n useEffect(() => {\n if (!onMissionControlAdapterReady) {\n return undefined;\n }\n\n onMissionControlAdapterReady(missionControlAdapter);\n return () => {\n onMissionControlAdapterReady(null);\n };\n }, [missionControlAdapter, onMissionControlAdapterReady]);\n\n useEffect(() => {\n hostSession.reconcileProjectedNodes(projectedNodes ?? []);\n }, [hostSession, projectedNodes]);\n\n useEffect(() => {\n if (!externalStateSource?.subscribe) {\n return undefined;\n }\n\n return externalStateSource.subscribe(() => {\n bumpExternalStateRevision((revision) => revision + 1);\n });\n }, [externalStateSource, workspaceId]);\n\n return {\n chromeContext,\n externalStateRevision,\n hostI18n,\n isHydrating,\n hostSession,\n missionControlI18n,\n missionControlAdapter,\n nodeDefinitionByType,\n windowChromeI18n\n };\n}\n\nconst noop = () => {};\n\nconst readOnlyWorkbenchCommands = new Proxy(\n {},\n {\n get: () => noop\n }\n) as WorkbenchController<WorkbenchHostNodeData>[\"commands\"];\n\nfunction createReadOnlyWorkbenchController(\n controller: WorkbenchController<WorkbenchHostNodeData>\n): WorkbenchController<WorkbenchHostNodeData> {\n return {\n commands: readOnlyWorkbenchCommands,\n dispatch: noop,\n getSnapshot: controller.getSnapshot.bind(controller),\n subscribe: controller.subscribe.bind(controller)\n };\n}\n\nfunction logWorkbenchHostDebug(\n event: string,\n debugDiagnostics: WorkbenchHostProps[\"debugDiagnostics\"],\n payload: Record<string, unknown>\n): void {\n if (!debugDiagnostics?.isEnabled()) {\n return;\n }\n\n console.info(\"[workbench:host]\", {\n event,\n ...payload\n });\n void Promise.resolve(\n debugDiagnostics.log?.({\n details: payload,\n event,\n level: \"info\",\n source: \"workbench-host\",\n workspaceId:\n typeof payload.workspaceId === \"string\" ? payload.workspaceId : null\n })\n ).catch(() => undefined);\n}\n","export function createDerivedSnapshotGetter<TSourceSnapshot, TSnapshot>(input: {\n deriveSnapshot: (sourceSnapshot: TSourceSnapshot) => TSnapshot;\n getSourceSnapshot: () => TSourceSnapshot;\n}): () => TSnapshot {\n let cachedSourceSnapshot: TSourceSnapshot | null = null;\n let cachedSnapshot: TSnapshot | null = null;\n let hasCachedSnapshot = false;\n\n return () => {\n const sourceSnapshot = input.getSourceSnapshot();\n if (hasCachedSnapshot && cachedSourceSnapshot === sourceSnapshot) {\n return cachedSnapshot as TSnapshot;\n }\n\n const snapshot = input.deriveSnapshot(sourceSnapshot);\n cachedSourceSnapshot = sourceSnapshot;\n cachedSnapshot = snapshot;\n hasCachedSnapshot = true;\n return snapshot;\n };\n}\n","export const workbenchFocusInputActivationType = \"focus-input\";\n","import { selectVisibleWorkbenchNodes } from \"../core/selectors.ts\";\nimport { createDerivedSnapshotGetter } from \"../store/createDerivedSnapshotGetter.ts\";\nimport type { WorkbenchController } from \"../store/types.ts\";\nimport type { WorkbenchMissionControlAdapter } from \"../mission-control/types.ts\";\nimport { workbenchFocusInputActivationType } from \"./activations.ts\";\nimport type {\n WorkbenchHostActivationTarget,\n WorkbenchHostNodeData\n} from \"./types.ts\";\n\nexport function createWorkbenchHostMissionControlAdapter(input: {\n activateNode?: (\n target: WorkbenchHostActivationTarget,\n activation: {\n payload?: unknown;\n type: string;\n }\n ) => void;\n controller: WorkbenchController<WorkbenchHostNodeData>;\n}): WorkbenchMissionControlAdapter<WorkbenchHostNodeData> {\n const getSnapshot = createDerivedSnapshotGetter<\n ReturnType<WorkbenchController<WorkbenchHostNodeData>[\"getSnapshot\"]>,\n ReturnType<\n WorkbenchMissionControlAdapter<WorkbenchHostNodeData>[\"getSnapshot\"]\n >\n >({\n deriveSnapshot(controllerSnapshot) {\n return {\n layoutConstraints: controllerSnapshot.layoutConstraints,\n surfaceSize: controllerSnapshot.surfaceSize,\n visibleNodes: selectVisibleWorkbenchNodes(controllerSnapshot)\n };\n },\n getSourceSnapshot() {\n return input.controller.getSnapshot();\n }\n });\n\n return {\n applyLayoutPreset(nodeIds, preset) {\n input.controller.commands.applyLayoutPreset(nodeIds, preset);\n },\n focusNode(nodeId) {\n if (input.activateNode) {\n input.activateNode(\n { nodeId },\n { type: workbenchFocusInputActivationType }\n );\n return;\n }\n input.controller.commands.focusNode(nodeId);\n },\n getSnapshot,\n subscribe(listener) {\n return input.controller.subscribe(listener);\n }\n };\n}\n","import {\n normalizeWorkbenchSnapshot,\n workbenchSnapshotSchemaVersion,\n type WorkbenchSnapshot,\n type WorkbenchSnapshotNode\n} from \"@tutti-os/workbench-snapshot\";\nimport type { WorkbenchNode, WorkbenchState } from \"./types.ts\";\n\nexport interface CreateWorkbenchNodeInput<TData = unknown> {\n data: TData;\n displayMode?: WorkbenchNode<TData>[\"displayMode\"];\n frame: WorkbenchNode<TData>[\"frame\"];\n id: string;\n isMinimized?: boolean;\n kind: string;\n minimizedAtUnixMs?: WorkbenchNode<TData>[\"minimizedAtUnixMs\"];\n restoreFrame?: WorkbenchNode<TData>[\"restoreFrame\"];\n sizeConstraints?: WorkbenchNode<TData>[\"sizeConstraints\"];\n title: string;\n}\n\nexport interface CreateWorkbenchSnapshotFromStateOptions {\n activeSpaceId?: WorkbenchSnapshot[\"activeSpaceId\"];\n metadata?: WorkbenchSnapshot[\"metadata\"];\n spaces?: WorkbenchSnapshot[\"spaces\"];\n}\n\nexport function createWorkbenchNode<TData = unknown>(\n input: CreateWorkbenchNodeInput<TData>\n): WorkbenchNode<TData> {\n return {\n id: input.id,\n kind: input.kind,\n title: input.title,\n frame: input.frame,\n displayMode: input.displayMode ?? \"floating\",\n restoreFrame: input.restoreFrame ?? null,\n isMinimized: input.isMinimized ?? false,\n minimizedAtUnixMs:\n input.isMinimized === true ? (input.minimizedAtUnixMs ?? null) : null,\n sizeConstraints: input.sizeConstraints ?? null,\n data: input.data\n };\n}\n\nexport function createWorkbenchNodeFromSnapshot<TData = unknown>(\n snapshotNode: WorkbenchSnapshotNode\n): WorkbenchNode<TData> {\n return createWorkbenchNode<TData>({\n id: snapshotNode.id,\n kind: snapshotNode.kind,\n title: snapshotNode.title,\n frame: snapshotNode.frame,\n displayMode: snapshotNode.displayMode,\n restoreFrame: snapshotNode.restoreFrame ?? null,\n isMinimized: snapshotNode.isMinimized,\n minimizedAtUnixMs: snapshotNode.minimizedAtUnixMs ?? null,\n data: snapshotNode.data as TData\n });\n}\n\nexport function createWorkbenchStateFromSnapshot<TData = unknown>(\n snapshot: WorkbenchSnapshot\n): Pick<WorkbenchState<TData>, \"nodeStack\" | \"nodes\"> {\n const normalized = normalizeWorkbenchSnapshot(snapshot);\n const nodes = normalized.nodes.map((node) =>\n createWorkbenchNodeFromSnapshot<TData>(node)\n );\n\n return {\n nodes,\n nodeStack: normalized.nodeStack ?? nodes.map((node) => node.id)\n };\n}\n\nexport function createWorkbenchSnapshotFromState<TData = unknown>(\n state: Pick<WorkbenchState<TData>, \"nodeStack\" | \"nodes\">,\n options: CreateWorkbenchSnapshotFromStateOptions = {}\n): WorkbenchSnapshot {\n return normalizeWorkbenchSnapshot({\n schemaVersion: workbenchSnapshotSchemaVersion,\n nodes: state.nodes.map((node) => ({\n id: node.id,\n kind: node.kind,\n title: node.title,\n frame: node.frame,\n displayMode: node.displayMode,\n restoreFrame: node.restoreFrame,\n isMinimized: node.isMinimized,\n minimizedAtUnixMs: node.minimizedAtUnixMs,\n data: node.data\n })),\n nodeStack: state.nodeStack,\n activeNodeId: state.nodeStack.at(-1) ?? null,\n spaces: options.spaces,\n activeSpaceId: options.activeSpaceId,\n metadata: options.metadata\n });\n}\n","import { clampWorkbenchRect } from \"./geometry.ts\";\nimport {\n defaultWorkbenchLayoutConstraints,\n type WorkbenchLayoutConstraints,\n type WorkbenchFrame,\n type WorkbenchNode,\n type WorkbenchNodeSizeConstraints,\n type WorkbenchSize\n} from \"./types.ts\";\n\nexport const WORKBENCH_WINDOW_CASCADE_OFFSET = 28;\n\nexport function createWorkbenchInitialRect(\n index: number,\n surfaceSize: WorkbenchSize,\n constraints: WorkbenchLayoutConstraints = defaultWorkbenchLayoutConstraints,\n sizeConstraints?: WorkbenchNodeSizeConstraints | null\n): WorkbenchFrame {\n const frameOrigin = {\n x: constraints.safeArea.left + constraints.surfacePadding,\n y: constraints.safeArea.top + constraints.surfacePadding\n };\n const baseWidth = Math.min(760, Math.max(360, surfaceSize.width * 0.62));\n const baseHeight = Math.min(520, Math.max(260, surfaceSize.height * 0.62));\n const offset = (index % 8) * WORKBENCH_WINDOW_CASCADE_OFFSET;\n\n return clampWorkbenchRect(\n {\n x: frameOrigin.x + offset,\n y: frameOrigin.y + offset,\n width: baseWidth,\n height: baseHeight\n },\n surfaceSize,\n constraints,\n sizeConstraints\n );\n}\n\nexport function resolveWorkbenchCascadedRect<TData>(input: {\n constraints?: WorkbenchLayoutConstraints;\n currentNodeStack: readonly string[];\n existingNodes: readonly WorkbenchNode<TData>[];\n preferredFrame: WorkbenchFrame;\n sizeConstraints?: WorkbenchNodeSizeConstraints | null;\n surfaceSize: WorkbenchSize;\n}): WorkbenchFrame {\n const activeNode =\n input.existingNodes.find(\n (node) => node.id === input.currentNodeStack.at(-1)\n ) ?? input.existingNodes.at(-1);\n\n if (!activeNode) {\n return clampWorkbenchRect(\n input.preferredFrame,\n input.surfaceSize,\n input.constraints,\n input.sizeConstraints\n );\n }\n\n return clampWorkbenchRect(\n {\n x: activeNode.frame.x + WORKBENCH_WINDOW_CASCADE_OFFSET,\n y: activeNode.frame.y + WORKBENCH_WINDOW_CASCADE_OFFSET,\n width: input.preferredFrame.width,\n height: input.preferredFrame.height\n },\n input.surfaceSize,\n input.constraints,\n input.sizeConstraints\n );\n}\n\nexport function placeWorkbenchNode<TData>(\n node: Omit<WorkbenchNode<TData>, \"frame\"> & { frame?: WorkbenchFrame },\n index: number,\n surfaceSize: WorkbenchSize\n): WorkbenchNode<TData> {\n return {\n ...node,\n frame: node.frame ?? createWorkbenchInitialRect(index, surfaceSize)\n };\n}\n","export interface WorkbenchHostNodeIdentityInput {\n instanceId: string;\n typeId: string;\n}\n\nexport function createWorkbenchHostProjectedNodeId(\n input: WorkbenchHostNodeIdentityInput\n): string {\n return `${input.typeId}:${input.instanceId}`;\n}\n\nexport function createWorkbenchHostLaunchedNodeId(\n input: WorkbenchHostNodeIdentityInput\n): string {\n return input.instanceId === input.typeId\n ? input.typeId\n : createWorkbenchHostProjectedNodeId(input);\n}\n","import type { WorkbenchSnapshot } from \"@tutti-os/workbench-snapshot\";\nimport {\n clampWorkbenchRect,\n getWorkbenchFullscreenRect,\n getWorkbenchLayoutFrame,\n rectsEqual\n} from \"../core/geometry.ts\";\nimport { resolveWorkbenchCascadedRect } from \"../core/placement.ts\";\nimport {\n createWorkbenchNode,\n createWorkbenchStateFromSnapshot\n} from \"../core/snapshot.ts\";\nimport type {\n WorkbenchFrame,\n WorkbenchNode,\n WorkbenchNodeSizeConstraints,\n WorkbenchState\n} from \"../core/types.ts\";\nimport {\n createWorkbenchHostLaunchedNodeId,\n createWorkbenchHostProjectedNodeId\n} from \"./nodeIdentity.ts\";\nimport type {\n WorkbenchHostActivation,\n WorkbenchHostLaunchFramePolicy,\n WorkbenchHostLaunchResult,\n WorkbenchHostNodeData,\n WorkbenchHostNodeDefinition,\n WorkbenchHostProjectedNode\n} from \"./types.ts\";\n\nconst initializedMetadataKeys = [\n \"tuttiWorkbenchInitialized\",\n \"workbenchHostInitialized\"\n] as const;\nexport const COMPACT_LAUNCH_WIDTH_THRESHOLD = 1440;\nexport const COMPACT_LAUNCH_FRAME_SCALE = 0.85;\nexport const closedDockWindowFramesMetadataKey =\n \"workbenchHostClosedDockWindowFrames\";\nconst maxClosedDockWindowFrameEntries = 128;\n\nexport interface ClosedDockWindowFrameEntry {\n dockEntryId: string;\n frame: WorkbenchFrame;\n typeId: string;\n}\n\nexport function createDefaultLaunchResult(\n definition: WorkbenchHostNodeDefinition,\n input?: Pick<WorkbenchHostLaunchResult, \"dockEntryId\" | \"launchSource\">\n): WorkbenchHostLaunchResult {\n return {\n defaultFrame: definition.frame,\n dockEntryId: input?.dockEntryId,\n instanceId: definition.typeId,\n framePolicy: \"cascade\",\n launchSource: input?.launchSource ?? null,\n sizeConstraints: definition.sizeConstraints ?? null,\n title: definition.title,\n typeId: definition.typeId\n };\n}\n\nexport function createWorkbenchProjectedHostNode(input: {\n definition: WorkbenchHostNodeDefinition;\n projectedNode: WorkbenchHostProjectedNode;\n restoredNode: WorkbenchNode<WorkbenchHostNodeData> | null;\n}): WorkbenchNode<WorkbenchHostNodeData> {\n return createWorkbenchNode<WorkbenchHostNodeData>({\n data: {\n activation: null,\n dockEntryId: input.projectedNode.dockEntryId ?? null,\n ...(input.restoredNode?.data.snapshotNodeState === undefined\n ? {}\n : { snapshotNodeState: input.restoredNode.data.snapshotNodeState }),\n instanceId: input.projectedNode.instanceId,\n instanceKey: input.projectedNode.instanceKey ?? null,\n isProjected: true,\n projectionSubject: input.projectedNode.subject ?? null,\n typeId: input.definition.typeId\n },\n displayMode: input.restoredNode?.displayMode,\n frame:\n input.restoredNode?.frame ??\n input.projectedNode.defaultFrame ??\n input.definition.frame,\n id: createProjectedNodeID(\n input.definition.typeId,\n input.projectedNode.instanceId\n ),\n isMinimized: input.restoredNode?.isMinimized,\n kind: input.definition.typeId,\n restoreFrame: input.restoredNode?.restoreFrame,\n sizeConstraints:\n input.projectedNode.sizeConstraints ??\n input.restoredNode?.sizeConstraints ??\n input.definition.sizeConstraints ??\n null,\n title: input.projectedNode.title\n });\n}\n\nexport function createWorkbenchLaunchedHostNode(input: {\n activation: WorkbenchHostActivation | null;\n definition: WorkbenchHostNodeDefinition;\n resolvedFrame: WorkbenchNode<WorkbenchHostNodeData>[\"frame\"];\n result: WorkbenchHostLaunchResult;\n}): WorkbenchNode<WorkbenchHostNodeData> {\n const preferredFrame = input.result.defaultFrame ?? input.definition.frame;\n return createWorkbenchNode<WorkbenchHostNodeData>({\n data: {\n activation: input.activation,\n dockEntryId: input.result.dockEntryId ?? null,\n instanceId: input.result.instanceId,\n instanceKey: input.result.instanceKey ?? null,\n isProjected: false,\n launchSource: input.result.launchSource ?? null,\n projectionSubject: null,\n typeId: input.definition.typeId\n },\n displayMode: input.result.displayMode,\n frame: input.resolvedFrame,\n id: createLaunchedNodeID(input.definition.typeId, input.result.instanceId),\n kind: input.definition.typeId,\n restoreFrame:\n input.result.displayMode === \"fullscreen\" ? preferredFrame : null,\n sizeConstraints: resolveWorkbenchHostNodeSizeConstraints(\n input.result,\n input.definition\n ),\n title: input.result.title ?? input.definition.title\n });\n}\n\nexport function resolveWorkbenchLaunchedHostNodeFrame(input: {\n currentState: Pick<\n WorkbenchState<WorkbenchHostNodeData>,\n \"layoutConstraints\" | \"nodeStack\" | \"nodes\" | \"surfaceSize\"\n >;\n definition: WorkbenchHostNodeDefinition;\n result: WorkbenchHostLaunchResult;\n}): WorkbenchNode<WorkbenchHostNodeData>[\"frame\"] {\n const preferredFrame = input.result.defaultFrame ?? input.definition.frame;\n const sizeConstraints = resolveWorkbenchHostNodeSizeConstraints(\n input.result,\n input.definition\n );\n\n if (input.result.displayMode === \"fullscreen\") {\n return getWorkbenchFullscreenRect(\n input.currentState.surfaceSize,\n input.currentState.layoutConstraints,\n sizeConstraints\n );\n }\n\n const framePolicy = resolveLaunchFramePolicy(input.result);\n\n if (framePolicy === \"absolute\") {\n return preferredFrame;\n }\n\n const responsivePreferredFrame = resolveCompactWorkbenchPreferredFrame({\n constraints: input.currentState.layoutConstraints,\n preferredFrame,\n sizeConstraints,\n surfaceSize: input.currentState.surfaceSize\n });\n\n if (framePolicy === \"cascade-same-type-centered\") {\n const existingSameTypeNodes = input.currentState.nodes.filter(\n (node) => node.data.typeId === input.result.typeId\n );\n const existingSameTypeNodeIds = new Set(\n existingSameTypeNodes.map((node) => node.id)\n );\n\n return resolveWorkbenchCascadedRect({\n currentNodeStack: input.currentState.nodeStack.filter((nodeId) =>\n existingSameTypeNodeIds.has(nodeId)\n ),\n existingNodes: existingSameTypeNodes,\n preferredFrame: resolveWorkbenchCenteredPreferredFrame({\n constraints: input.currentState.layoutConstraints,\n preferredFrame: responsivePreferredFrame,\n sizeConstraints,\n surfaceSize: input.currentState.surfaceSize\n }),\n sizeConstraints,\n surfaceSize: input.currentState.surfaceSize,\n constraints: input.currentState.layoutConstraints\n });\n }\n\n return resolveWorkbenchCascadedRect({\n currentNodeStack: input.currentState.nodeStack,\n existingNodes: input.currentState.nodes,\n preferredFrame: responsivePreferredFrame,\n sizeConstraints,\n surfaceSize: input.currentState.surfaceSize,\n constraints: input.currentState.layoutConstraints\n });\n}\n\nexport function closedDockWindowFrameEntryKey(input: {\n dockEntryId: string;\n typeId: string;\n}): string {\n return JSON.stringify([input.typeId, input.dockEntryId]);\n}\n\nexport function readClosedDockWindowFrameEntries(\n metadata: WorkbenchSnapshot[\"metadata\"]\n): Map<string, ClosedDockWindowFrameEntry> {\n const value = metadata?.[closedDockWindowFramesMetadataKey];\n if (\n !isRecord(value) ||\n value.version !== 1 ||\n !Array.isArray(value.entries)\n ) {\n return new Map();\n }\n\n const entries = new Map<string, ClosedDockWindowFrameEntry>();\n for (const entry of value.entries.slice(0, maxClosedDockWindowFrameEntries)) {\n const normalized = normalizeClosedDockWindowFrameEntry(entry);\n if (!normalized) {\n continue;\n }\n entries.set(closedDockWindowFrameEntryKey(normalized), normalized);\n }\n return entries;\n}\n\nexport function writeClosedDockWindowFrameEntries(\n metadata: WorkbenchSnapshot[\"metadata\"],\n entries: Iterable<ClosedDockWindowFrameEntry>\n): WorkbenchSnapshot[\"metadata\"] {\n const normalizedEntries = Array.from(entries)\n .map(normalizeClosedDockWindowFrameEntry)\n .filter((entry): entry is ClosedDockWindowFrameEntry => entry !== null)\n .slice(-maxClosedDockWindowFrameEntries);\n const nextMetadata = { ...(metadata ?? {}) };\n if (normalizedEntries.length === 0) {\n delete nextMetadata[closedDockWindowFramesMetadataKey];\n } else {\n nextMetadata[closedDockWindowFramesMetadataKey] = {\n version: 1,\n entries: normalizedEntries\n };\n }\n return Object.keys(nextMetadata).length > 0 ? nextMetadata : undefined;\n}\n\nfunction normalizeClosedDockWindowFrameEntry(\n value: unknown\n): ClosedDockWindowFrameEntry | null {\n if (!isRecord(value)) {\n return null;\n }\n const typeId = normalizeNonEmptyString(value.typeId);\n const dockEntryId = normalizeNonEmptyString(value.dockEntryId);\n const frame = normalizeWorkbenchFrame(value.frame);\n if (!typeId || !dockEntryId || !frame) {\n return null;\n }\n\n return {\n dockEntryId,\n frame,\n typeId\n };\n}\n\nfunction normalizeWorkbenchFrame(value: unknown): WorkbenchFrame | null {\n if (!isRecord(value)) {\n return null;\n }\n const x = normalizeFiniteNumber(value.x);\n const y = normalizeFiniteNumber(value.y);\n const width = normalizeFiniteNumber(value.width);\n const height = normalizeFiniteNumber(value.height);\n if (x === null || y === null || width === null || height === null) {\n return null;\n }\n if (width < 160 || height < 120) {\n return null;\n }\n\n return { height, width, x, y };\n}\n\nfunction normalizeFiniteNumber(value: unknown): number | null {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n return null;\n }\n return Math.round(value);\n}\n\nfunction normalizeNonEmptyString(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction resolveLaunchFramePolicy(\n result: WorkbenchHostLaunchResult\n): WorkbenchHostLaunchFramePolicy {\n return result.framePolicy;\n}\n\nfunction resolveWorkbenchCenteredPreferredFrame(input: {\n constraints: WorkbenchState<WorkbenchHostNodeData>[\"layoutConstraints\"];\n preferredFrame: WorkbenchFrame;\n sizeConstraints?: WorkbenchNodeSizeConstraints | null;\n surfaceSize: WorkbenchState<WorkbenchHostNodeData>[\"surfaceSize\"];\n}): WorkbenchFrame {\n const layoutFrame = getWorkbenchLayoutFrame(\n input.surfaceSize,\n input.constraints\n );\n\n return clampWorkbenchRect(\n {\n height: input.preferredFrame.height,\n width: input.preferredFrame.width,\n x: Math.round(\n layoutFrame.x + (layoutFrame.width - input.preferredFrame.width) / 2\n ),\n y: Math.round(\n layoutFrame.y + (layoutFrame.height - input.preferredFrame.height) / 2\n )\n },\n input.surfaceSize,\n input.constraints,\n input.sizeConstraints\n );\n}\n\nexport function resolveCompactWorkbenchPreferredFrame(input: {\n constraints: WorkbenchState<WorkbenchHostNodeData>[\"layoutConstraints\"];\n preferredFrame: WorkbenchFrame;\n sizeConstraints?: WorkbenchNodeSizeConstraints | null;\n surfaceSize: WorkbenchState<WorkbenchHostNodeData>[\"surfaceSize\"];\n}): WorkbenchFrame {\n if (!shouldUseCompactWorkbenchFrame(input.surfaceSize)) {\n return input.preferredFrame;\n }\n\n const layoutFrame = getWorkbenchLayoutFrame(\n input.surfaceSize,\n input.constraints\n );\n const width = Math.round(\n input.preferredFrame.width * COMPACT_LAUNCH_FRAME_SCALE\n );\n const height = Math.round(\n input.preferredFrame.height * COMPACT_LAUNCH_FRAME_SCALE\n );\n\n return clampWorkbenchRect(\n {\n height,\n width,\n x: Math.round(layoutFrame.x + (layoutFrame.width - width) / 2),\n y: Math.round(layoutFrame.y + (layoutFrame.height - height) / 2)\n },\n input.surfaceSize,\n input.constraints,\n input.sizeConstraints\n );\n}\n\nexport function compactRestoredWorkbenchHostNodes(input: {\n constraints: WorkbenchState<WorkbenchHostNodeData>[\"layoutConstraints\"];\n nodeDefinitionByType: Map<string, WorkbenchHostNodeDefinition>;\n nodes: readonly WorkbenchNode<WorkbenchHostNodeData>[];\n surfaceSize: WorkbenchState<WorkbenchHostNodeData>[\"surfaceSize\"];\n}): WorkbenchNode<WorkbenchHostNodeData>[] {\n if (!shouldUseCompactWorkbenchFrame(input.surfaceSize)) {\n return [...input.nodes];\n }\n\n return input.nodes.map((node) => {\n const sizeConstraints =\n node.sizeConstraints ??\n input.nodeDefinitionByType.get(node.data.typeId)?.sizeConstraints ??\n null;\n if (node.displayMode === \"fullscreen\") {\n return {\n ...node,\n frame: getWorkbenchFullscreenRect(\n input.surfaceSize,\n input.constraints,\n sizeConstraints\n )\n };\n }\n\n const defaultFrame =\n input.nodeDefinitionByType.get(node.data.typeId)?.frame ?? node.frame;\n const compactWidth = Math.round(\n defaultFrame.width * COMPACT_LAUNCH_FRAME_SCALE\n );\n const compactHeight = Math.round(\n defaultFrame.height * COMPACT_LAUNCH_FRAME_SCALE\n );\n const width = Math.min(node.frame.width, compactWidth);\n const height = Math.min(node.frame.height, compactHeight);\n const sizeChanged =\n width !== node.frame.width || height !== node.frame.height;\n const layoutFrame = getWorkbenchLayoutFrame(\n input.surfaceSize,\n input.constraints\n );\n const frame = clampWorkbenchRect(\n sizeChanged\n ? {\n height,\n width,\n x: Math.round(layoutFrame.x + (layoutFrame.width - width) / 2),\n y: Math.round(layoutFrame.y + (layoutFrame.height - height) / 2)\n }\n : node.frame,\n input.surfaceSize,\n input.constraints,\n sizeConstraints\n );\n\n return rectsEqual(node.frame, frame) ? node : { ...node, frame };\n });\n}\n\nfunction shouldUseCompactWorkbenchFrame(\n surfaceSize: WorkbenchState<WorkbenchHostNodeData>[\"surfaceSize\"]\n): boolean {\n return surfaceSize.width < COMPACT_LAUNCH_WIDTH_THRESHOLD;\n}\n\nexport function createProjectedNodeID(\n typeId: string,\n instanceId: string\n): string {\n return createWorkbenchHostProjectedNodeId({ instanceId, typeId });\n}\n\nexport function persistedWorkbenchState(\n state: Pick<WorkbenchState<WorkbenchHostNodeData>, \"nodeStack\" | \"nodes\">,\n nodeDefinitionByType: Map<string, WorkbenchHostNodeDefinition>\n): Pick<WorkbenchState<WorkbenchHostNodeData>, \"nodeStack\" | \"nodes\"> {\n return {\n nodeStack: state.nodeStack,\n nodes: state.nodes\n .filter((node) => {\n return (\n nodeDefinitionByType.get(node.data.typeId)?.window?.persists !== false\n );\n })\n .map((node) => ({\n ...node,\n data: {\n dockEntryId: node.data.dockEntryId ?? null,\n ...(node.data.snapshotNodeState === undefined\n ? {}\n : { snapshotNodeState: node.data.snapshotNodeState }),\n instanceId: node.data.instanceId,\n instanceKey: node.data.instanceKey ?? null,\n ...(node.data.isProjected === true ? { isProjected: true } : {}),\n typeId: node.data.typeId\n }\n }))\n };\n}\n\nexport function stateFromSnapshotOrDefinitions(\n snapshot: WorkbenchSnapshot | null,\n nodeDefinitions: readonly WorkbenchHostNodeDefinition[],\n projectedNodes: readonly WorkbenchHostProjectedNode[] = []\n): Partial<WorkbenchState<WorkbenchHostNodeData>> {\n if (!snapshot) {\n return mergeProjectedNodesIntoState(\n createDefaultWorkbenchState(nodeDefinitions),\n {\n nodeDefinitions,\n projectedNodes,\n snapshot\n }\n );\n }\n\n const snapshotState = createWorkbenchStateFromSnapshot<unknown>(snapshot);\n const nodes = snapshotState.nodes\n .map((node) => {\n const definition = resolveDefinitionForRestoredNode(\n node,\n nodeDefinitions\n );\n if (!definition) {\n return null;\n }\n if (readWorkbenchHostNodeData(node.data)?.isProjected === true) {\n return null;\n }\n return createRestoredNode(definition, node);\n })\n .filter(\n (node): node is WorkbenchNode<WorkbenchHostNodeData> => node !== null\n )\n .filter((node) => {\n const definition = nodeDefinitions.find(\n (candidate) => candidate.typeId === node.data.typeId\n );\n return (\n definition?.window?.persists !== false &&\n definition?.window?.restoreOnLoad !== false\n );\n });\n\n if (nodes.length === 0 && !isSnapshotInitialized(snapshot)) {\n return mergeProjectedNodesIntoState(\n createDefaultWorkbenchState(nodeDefinitions),\n {\n nodeDefinitions,\n projectedNodes,\n snapshot\n }\n );\n }\n\n const nodeIDs = new Set(nodes.map((node) => node.id));\n const nodeStack = snapshotState.nodeStack.filter((nodeID) =>\n nodeIDs.has(nodeID)\n );\n for (const node of nodes) {\n if (!nodeStack.includes(node.id)) {\n nodeStack.push(node.id);\n }\n }\n\n return mergeProjectedNodesIntoState(\n {\n nodeStack,\n nodes\n },\n {\n nodeDefinitions,\n projectedNodes,\n snapshot\n }\n );\n}\n\nexport function restoredSnapshotNodesByID(\n snapshot: WorkbenchSnapshot | null,\n nodeDefinitions: readonly WorkbenchHostNodeDefinition[]\n): Map<string, WorkbenchNode<WorkbenchHostNodeData>> {\n if (!snapshot) {\n return new Map();\n }\n\n const nodes = createWorkbenchStateFromSnapshot<unknown>(snapshot)\n .nodes.map((node) => {\n const definition = resolveDefinitionForRestoredNode(\n node,\n nodeDefinitions\n );\n if (!definition) {\n return null;\n }\n return createRestoredNode(definition, node);\n })\n .filter(\n (node): node is WorkbenchNode<WorkbenchHostNodeData> => node !== null\n );\n\n return new Map(nodes.map((node) => [node.id, node]));\n}\n\nexport function updateProjectedNodeFromInput(\n node: WorkbenchNode<WorkbenchHostNodeData>,\n projectedNode: WorkbenchHostProjectedNode,\n definition?: WorkbenchHostNodeDefinition\n): WorkbenchNode<WorkbenchHostNodeData> {\n const nextInstanceKey = projectedNode.instanceKey ?? null;\n const nextSubject = projectedNode.subject ?? null;\n const nextDockEntryId = projectedNode.dockEntryId ?? null;\n const nextSizeConstraints =\n projectedNode.sizeConstraints ?? definition?.sizeConstraints ?? null;\n if (\n node.title === projectedNode.title &&\n node.data.dockEntryId === nextDockEntryId &&\n node.data.instanceId === projectedNode.instanceId &&\n node.data.instanceKey === nextInstanceKey &&\n node.data.isProjected === true &&\n projectedSubjectsEqual(node.data.projectionSubject ?? null, nextSubject) &&\n node.sizeConstraints?.minWidth === nextSizeConstraints?.minWidth &&\n node.sizeConstraints?.minHeight === nextSizeConstraints?.minHeight &&\n node.data.typeId === projectedNode.typeId\n ) {\n return node;\n }\n\n return {\n ...node,\n data: {\n dockEntryId: nextDockEntryId,\n ...(node.data.snapshotNodeState === undefined\n ? {}\n : { snapshotNodeState: node.data.snapshotNodeState }),\n instanceId: projectedNode.instanceId,\n instanceKey: nextInstanceKey,\n activation: node.data.activation ?? null,\n isProjected: true,\n projectionSubject: nextSubject,\n ...(node.data.runtimeNodeState === undefined\n ? {}\n : { runtimeNodeState: node.data.runtimeNodeState }),\n typeId: projectedNode.typeId\n },\n sizeConstraints: nextSizeConstraints,\n title: projectedNode.title\n };\n}\n\nexport function projectedWorkbenchNodeStack(input: {\n currentNodeStack: readonly string[];\n nextNodes: readonly WorkbenchNode<WorkbenchHostNodeData>[];\n snapshot: WorkbenchSnapshot | null;\n}): string[] {\n const nodeIDs = new Set(input.nextNodes.map((node) => node.id));\n const nodeStack = input.currentNodeStack.filter((nodeID) =>\n nodeIDs.has(nodeID)\n );\n const snapshotState = input.snapshot\n ? createWorkbenchStateFromSnapshot<unknown>(input.snapshot)\n : null;\n for (const nodeID of snapshotState?.nodeStack ?? []) {\n if (nodeIDs.has(nodeID) && !nodeStack.includes(nodeID)) {\n nodeStack.push(nodeID);\n }\n }\n for (const node of input.nextNodes) {\n if (!nodeStack.includes(node.id)) {\n nodeStack.push(node.id);\n }\n }\n return nodeStack;\n}\n\nexport function shallowArrayEqual<T>(\n left: readonly T[],\n right: readonly T[]\n): boolean {\n return (\n left.length === right.length &&\n left.every((entry, index) => entry === right[index])\n );\n}\n\nexport function stringArrayEqual(\n left: readonly string[],\n right: readonly string[]\n): boolean {\n return (\n left.length === right.length &&\n left.every((entry, index) => entry === right[index])\n );\n}\n\nfunction createWorkbenchHostNode(input: {\n definition: WorkbenchHostNodeDefinition;\n descriptor: {\n frame?: WorkbenchNode<WorkbenchHostNodeData>[\"frame\"];\n instanceId?: string;\n instanceKey?: string | null;\n title?: string;\n };\n}): WorkbenchNode<WorkbenchHostNodeData> {\n const strategy = input.definition.instance;\n const instanceId =\n input.descriptor.instanceId ??\n (strategy?.mode === \"multi\"\n ? `${input.definition.typeId}-instance`\n : input.definition.typeId);\n const nodeId =\n strategy?.mode === \"multi\"\n ? `${input.definition.typeId}:${instanceId}`\n : input.definition.typeId;\n\n return createWorkbenchNode<WorkbenchHostNodeData>({\n data: {\n activation: null,\n dockEntryId: null,\n instanceId,\n instanceKey: input.descriptor.instanceKey ?? null,\n isProjected: false,\n projectionSubject: null,\n typeId: input.definition.typeId\n },\n frame: input.descriptor.frame ?? input.definition.frame,\n id: nodeId,\n kind: input.definition.typeId,\n sizeConstraints: input.definition.sizeConstraints ?? null,\n title: input.descriptor.title ?? input.definition.title\n });\n}\n\nfunction createLaunchedNodeID(typeId: string, instanceId: string): string {\n return createWorkbenchHostLaunchedNodeId({ instanceId, typeId });\n}\n\nfunction createDefaultWorkbenchState(\n nodeDefinitions: readonly WorkbenchHostNodeDefinition[]\n): Partial<WorkbenchState<WorkbenchHostNodeData>> {\n const nodes = nodeDefinitions\n .filter((definition) => definition.window?.defaultOpen !== false)\n .filter((definition) => definition.instance?.mode !== \"multi\")\n .map((definition) =>\n createWorkbenchHostNode({\n definition,\n descriptor: {\n frame: definition.frame,\n instanceId: definition.typeId,\n title: definition.title\n }\n })\n );\n return {\n nodeStack: nodes.map((node) => node.id),\n nodes\n };\n}\n\nfunction createRestoredNode(\n definition: WorkbenchHostNodeDefinition,\n node: WorkbenchNode<unknown>\n): WorkbenchNode<WorkbenchHostNodeData> {\n const restoredData = readWorkbenchHostNodeData(node.data);\n return {\n ...node,\n data: {\n dockEntryId: restoredData?.dockEntryId ?? null,\n ...(restoredData?.snapshotNodeState === undefined\n ? {}\n : { snapshotNodeState: restoredData.snapshotNodeState }),\n instanceId:\n restoredData?.instanceId ??\n (definition.instance?.mode === \"multi\"\n ? deriveInstanceIdFromNodeID(definition.typeId, node.id)\n : definition.typeId),\n instanceKey: restoredData?.instanceKey ?? null,\n activation: null,\n isProjected: false,\n projectionSubject: null,\n typeId: definition.typeId\n },\n kind: definition.typeId,\n sizeConstraints: definition.sizeConstraints ?? null,\n title: definition.instance?.mode === \"multi\" ? node.title : definition.title\n };\n}\n\nexport function resolveWorkbenchHostNodeSizeConstraints(\n result: Pick<WorkbenchHostLaunchResult, \"sizeConstraints\">,\n definition: Pick<WorkbenchHostNodeDefinition, \"sizeConstraints\">\n): WorkbenchNodeSizeConstraints | null {\n return result.sizeConstraints ?? definition.sizeConstraints ?? null;\n}\n\nfunction deriveInstanceIdFromNodeID(typeId: string, nodeId: string): string {\n const prefix = `${typeId}:`;\n return nodeId.startsWith(prefix) ? nodeId.slice(prefix.length) : nodeId;\n}\n\nfunction isSnapshotInitialized(snapshot: WorkbenchSnapshot | null): boolean {\n if (!snapshot) {\n return false;\n }\n\n for (const key of initializedMetadataKeys) {\n if (snapshot.metadata?.[key] === true) {\n return true;\n }\n }\n return false;\n}\n\nfunction readWorkbenchHostNodeData(\n value: unknown\n): WorkbenchHostNodeData | null {\n if (!value || typeof value !== \"object\") {\n return null;\n }\n\n const typed = value as Partial<WorkbenchHostNodeData>;\n if (\n typeof typed.typeId !== \"string\" ||\n typeof typed.instanceId !== \"string\"\n ) {\n return null;\n }\n\n return {\n dockEntryId:\n typeof typed.dockEntryId === \"string\" || typed.dockEntryId === null\n ? typed.dockEntryId\n : null,\n ...(typed.snapshotNodeState === undefined\n ? {}\n : { snapshotNodeState: typed.snapshotNodeState }),\n instanceId: typed.instanceId,\n instanceKey:\n typeof typed.instanceKey === \"string\" || typed.instanceKey === null\n ? typed.instanceKey\n : null,\n activation: null,\n isProjected: typed.isProjected === true,\n launchSource: null,\n projectionSubject: null,\n typeId: typed.typeId\n };\n}\n\nfunction resolveDefinitionForRestoredNode(\n node: WorkbenchNode<unknown>,\n nodeDefinitions: readonly WorkbenchHostNodeDefinition[]\n): WorkbenchHostNodeDefinition | null {\n const data = readWorkbenchHostNodeData(node.data);\n if (data) {\n return (\n nodeDefinitions.find((definition) => definition.typeId === data.typeId) ??\n null\n );\n }\n\n return (\n nodeDefinitions.find((definition) => {\n if (definition.instance?.mode === \"multi\") {\n return node.id.startsWith(`${definition.typeId}:`);\n }\n return node.id === definition.typeId;\n }) ?? null\n );\n}\n\nfunction mergeProjectedNodesIntoState(\n state: Partial<WorkbenchState<WorkbenchHostNodeData>>,\n input: {\n nodeDefinitions: readonly WorkbenchHostNodeDefinition[];\n projectedNodes: readonly WorkbenchHostProjectedNode[];\n snapshot: WorkbenchSnapshot | null;\n }\n): Partial<WorkbenchState<WorkbenchHostNodeData>> {\n if (input.projectedNodes.length === 0) {\n return state;\n }\n\n const nodeDefinitionByType = new Map(\n input.nodeDefinitions.map((definition) => [definition.typeId, definition])\n );\n const nodes = state.nodes ? [...state.nodes] : [];\n const nodeIDs = new Set(nodes.map((node) => node.id));\n const restoredNodesByID = restoredSnapshotNodesByID(\n input.snapshot,\n input.nodeDefinitions\n );\n\n for (const projectedNode of input.projectedNodes) {\n const definition = nodeDefinitionByType.get(projectedNode.typeId);\n if (!definition) {\n continue;\n }\n const nodeID = createProjectedNodeID(\n projectedNode.typeId,\n projectedNode.instanceId\n );\n if (nodeIDs.has(nodeID)) {\n continue;\n }\n\n const nextNode = createWorkbenchProjectedHostNode({\n definition,\n projectedNode,\n restoredNode: restoredNodesByID.get(nodeID) ?? null\n });\n nodes.push(nextNode);\n nodeIDs.add(nextNode.id);\n }\n\n return {\n ...state,\n nodeStack: projectedWorkbenchNodeStack({\n currentNodeStack: state.nodeStack ?? [],\n nextNodes: nodes,\n snapshot: input.snapshot\n }),\n nodes\n };\n}\n\nfunction projectedSubjectsEqual(\n left: WorkbenchHostNodeData[\"projectionSubject\"],\n right: WorkbenchHostNodeData[\"projectionSubject\"]\n): boolean {\n return left?.id === right?.id && left?.type === right?.type;\n}\n","import type { WorkbenchNode } from \"../core/types.ts\";\nimport type {\n WorkbenchHostExternalStateSource,\n WorkbenchHostNodeData\n} from \"./types.ts\";\n\nexport interface WorkbenchHostExternalState {\n externalNodeState: unknown;\n externalWorkspaceState: unknown;\n}\n\nexport function readWorkbenchHostExternalState(input: {\n externalStateSource?: WorkbenchHostExternalStateSource;\n node: WorkbenchNode<WorkbenchHostNodeData>;\n workspaceId: string;\n}): WorkbenchHostExternalState {\n if (!input.externalStateSource) {\n return {\n externalNodeState: null,\n externalWorkspaceState: null\n };\n }\n\n const nodeStateInput = {\n instanceId: input.node.data.instanceId,\n instanceKey: input.node.data.instanceKey ?? null,\n nodeId: input.node.id,\n typeId: input.node.data.typeId,\n workspaceId: input.workspaceId,\n ...(input.node.data.projectionSubject\n ? { subject: input.node.data.projectionSubject }\n : {})\n };\n\n const sourceNodeState =\n input.externalStateSource.getNodeState(nodeStateInput);\n\n return {\n externalNodeState:\n sourceNodeState ?? input.node.data.snapshotNodeState ?? null,\n externalWorkspaceState: input.externalStateSource.getWorkspaceState({\n workspaceId: input.workspaceId\n })\n };\n}\n","import {\n normalizeWorkbenchSnapshot,\n type WorkbenchSnapshot,\n type WorkbenchSnapshotNode,\n type WorkbenchSnapshotSpaceV1\n} from \"@tutti-os/workbench-snapshot\";\nimport {\n closedDockWindowFramesMetadataKey,\n readClosedDockWindowFrameEntries,\n writeClosedDockWindowFrameEntries\n} from \"./sessionState.ts\";\n\nexport interface WorkbenchHostSnapshotNodeData {\n dockEntryId?: string | null;\n instanceId: string;\n instanceKey?: string | null;\n isProjected?: true;\n snapshotNodeState?: unknown;\n typeId: string;\n}\n\nconst allowedMetadataKeys = [\n \"tuttiWorkbenchInitialized\",\n \"workbenchHostInitialized\"\n] as const;\n\nexport function sanitizeWorkbenchHostSnapshot(\n snapshot: WorkbenchSnapshot\n): WorkbenchSnapshot {\n const normalized = normalizeWorkbenchSnapshot(snapshot);\n return normalizeWorkbenchSnapshot({\n schemaVersion: normalized.schemaVersion,\n nodes: normalized.nodes.map(sanitizeNode),\n nodeStack: normalized.nodeStack,\n activeNodeId: normalized.activeNodeId,\n spaces: normalized.spaces?.map(sanitizeSpace),\n activeSpaceId: normalized.activeSpaceId,\n metadata: sanitizeMetadata(normalized.metadata)\n });\n}\n\nfunction sanitizeNode(node: WorkbenchSnapshotNode): WorkbenchSnapshotNode {\n return {\n id: node.id,\n kind: node.kind,\n title: node.title,\n frame: node.frame,\n displayMode: node.displayMode,\n restoreFrame: node.restoreFrame,\n isMinimized: node.isMinimized,\n data: sanitizeNodeData(node.data)\n };\n}\n\nfunction sanitizeNodeData(\n value: unknown\n): WorkbenchHostSnapshotNodeData | undefined {\n if (!value || typeof value !== \"object\") {\n return undefined;\n }\n\n const typed = value as Partial<WorkbenchHostSnapshotNodeData>;\n if (\n typeof typed.typeId !== \"string\" ||\n typeof typed.instanceId !== \"string\"\n ) {\n return undefined;\n }\n\n return {\n dockEntryId:\n typeof typed.dockEntryId === \"string\" || typed.dockEntryId === null\n ? typed.dockEntryId\n : null,\n instanceId: typed.instanceId,\n instanceKey:\n typeof typed.instanceKey === \"string\" || typed.instanceKey === null\n ? typed.instanceKey\n : null,\n ...(typed.isProjected === true ? { isProjected: true } : {}),\n ...(typed.snapshotNodeState === undefined\n ? {}\n : { snapshotNodeState: typed.snapshotNodeState }),\n typeId: typed.typeId\n };\n}\n\nfunction sanitizeSpace(\n space: WorkbenchSnapshotSpaceV1\n): WorkbenchSnapshotSpaceV1 {\n return {\n id: space.id,\n name: space.name,\n nodeIds: space.nodeIds,\n frame: space.frame\n };\n}\n\nfunction sanitizeMetadata(\n metadata: WorkbenchSnapshot[\"metadata\"]\n): WorkbenchSnapshot[\"metadata\"] {\n const sanitized: Record<string, unknown> = {};\n for (const key of allowedMetadataKeys) {\n if (metadata?.[key] === true) {\n sanitized[key] = true;\n }\n }\n if (metadata?.[closedDockWindowFramesMetadataKey] !== undefined) {\n return writeClosedDockWindowFrameEntries(\n sanitized,\n readClosedDockWindowFrameEntries(metadata).values()\n );\n }\n\n return Object.keys(sanitized).length > 0 ? sanitized : undefined;\n}\n","import type { WorkbenchSnapshot } from \"@tutti-os/workbench-snapshot\";\nimport { createWorkbenchSnapshotFromState } from \"../core/snapshot.ts\";\nimport type { WorkbenchNode, WorkbenchState } from \"../core/types.ts\";\nimport { createWorkbenchController } from \"../store/createWorkbenchController.ts\";\nimport type {\n WorkbenchController,\n WorkbenchDebugDiagnostics\n} from \"../store/types.ts\";\nimport {\n type ClosedDockWindowFrameEntry,\n compactRestoredWorkbenchHostNodes,\n createDefaultLaunchResult,\n createProjectedNodeID,\n createWorkbenchLaunchedHostNode,\n createWorkbenchProjectedHostNode,\n closedDockWindowFrameEntryKey,\n persistedWorkbenchState,\n projectedWorkbenchNodeStack,\n readClosedDockWindowFrameEntries,\n resolveWorkbenchLaunchedHostNodeFrame,\n restoredSnapshotNodesByID,\n shallowArrayEqual,\n stateFromSnapshotOrDefinitions,\n stringArrayEqual,\n updateProjectedNodeFromInput,\n writeClosedDockWindowFrameEntries\n} from \"./sessionState.ts\";\nimport { readWorkbenchHostExternalState } from \"./externalState.ts\";\nimport { sanitizeWorkbenchHostSnapshot } from \"./snapshotSanitizer.ts\";\nimport type { WorkbenchHostNodeData } from \"./types.ts\";\nimport type {\n WorkbenchHostActivation,\n WorkbenchHostActivationTarget,\n WorkbenchHostCloseEffect,\n WorkbenchHostExternalStateSource,\n WorkbenchHostLaunchInput,\n WorkbenchHostLaunchRequest,\n WorkbenchHostLaunchResult,\n WorkbenchHostNodeLeaseHandle,\n WorkbenchHostNodeCloseDecision,\n WorkbenchHostNodeCloseRequest,\n WorkbenchHostNodeDefinition,\n WorkbenchHostProjectedNode,\n WorkbenchHostRuntimeHandle,\n WorkbenchHostSnapshotRepository\n} from \"./types.ts\";\n\nconst initializedMetadataKey = \"workbenchHostInitialized\";\nconst snapshotSaveDelayMs = 400;\nconst launchDiagnosticTextMaxLength = 800;\n\nexport function createWorkbenchHostSession(input: {\n debugDiagnostics?: WorkbenchDebugDiagnostics;\n externalStateSource?: WorkbenchHostExternalStateSource;\n nodes: readonly WorkbenchHostNodeDefinition[];\n onLaunchRequest?: (\n request: WorkbenchHostLaunchRequest\n ) =>\n | Promise<WorkbenchHostLaunchResult | null | void>\n | WorkbenchHostLaunchResult\n | null\n | void;\n onNodeCloseRequest?: (\n request: WorkbenchHostNodeCloseRequest\n ) =>\n | Promise<WorkbenchHostNodeCloseDecision | void>\n | WorkbenchHostNodeCloseDecision\n | void;\n projectedNodes?: readonly WorkbenchHostProjectedNode[];\n snapshotRepository: WorkbenchHostSnapshotRepository;\n workspaceId: string;\n}): WorkbenchHostRuntimeHandle {\n return new WorkbenchHostSessionController(input);\n}\n\nclass WorkbenchHostSessionController implements WorkbenchHostRuntimeHandle {\n readonly controller: WorkbenchController<WorkbenchHostNodeData>;\n private readonly input: {\n debugDiagnostics?: WorkbenchDebugDiagnostics;\n externalStateSource?: WorkbenchHostExternalStateSource;\n nodes: readonly WorkbenchHostNodeDefinition[];\n onLaunchRequest?: (\n request: WorkbenchHostLaunchRequest\n ) =>\n | Promise<WorkbenchHostLaunchResult | null | void>\n | WorkbenchHostLaunchResult\n | null\n | void;\n onNodeCloseRequest?: (\n request: WorkbenchHostNodeCloseRequest\n ) =>\n | Promise<WorkbenchHostNodeCloseDecision | void>\n | WorkbenchHostNodeCloseDecision\n | void;\n projectedNodes?: readonly WorkbenchHostProjectedNode[];\n snapshotRepository: WorkbenchHostSnapshotRepository;\n workspaceId: string;\n };\n\n private readonly nodeDefinitions: readonly WorkbenchHostNodeDefinition[];\n private readonly nodeDefinitionByType = new Map<\n string,\n WorkbenchHostNodeDefinition\n >();\n private isHydratingInitialSnapshot = true;\n private isDisposed = false;\n private isSnapshotLoaded = false;\n private loadedSnapshot: WorkbenchSnapshot | null;\n private closedDockWindowFrameEntries = new Map<\n string,\n ClosedDockWindowFrameEntry\n >();\n private loadGeneration = 0;\n private loadPromise: Promise<void> | null = null;\n private readonly nodeLeases = new Map<string, WorkbenchHostNodeLeaseHandle>();\n private nextActivationSequence = 1;\n private hasAppliedInitialCompactRestoredFrames = false;\n private hasReceivedSurfaceSize = false;\n private observedSurfaceSize:\n | WorkbenchState<WorkbenchHostNodeData>[\"surfaceSize\"]\n | null = null;\n private pendingProjectedNodeReconciliation = false;\n private projectedNodes: readonly WorkbenchHostProjectedNode[];\n private readyPromise: Promise<void>;\n private resolveReady: () => void = noop;\n private saveTimer: ReturnType<typeof globalThis.setTimeout> | null = null;\n private externalStateUnsubscribe: (() => void) | null = null;\n private leaseUnsubscribe: (() => void) | null = null;\n private unsubscribe: (() => void) | null = null;\n\n constructor(input: {\n debugDiagnostics?: WorkbenchDebugDiagnostics;\n externalStateSource?: WorkbenchHostExternalStateSource;\n nodes: readonly WorkbenchHostNodeDefinition[];\n onLaunchRequest?: (\n request: WorkbenchHostLaunchRequest\n ) =>\n | Promise<WorkbenchHostLaunchResult | null | void>\n | WorkbenchHostLaunchResult\n | null\n | void;\n onNodeCloseRequest?: (\n request: WorkbenchHostNodeCloseRequest\n ) =>\n | Promise<WorkbenchHostNodeCloseDecision | void>\n | WorkbenchHostNodeCloseDecision\n | void;\n projectedNodes?: readonly WorkbenchHostProjectedNode[];\n snapshotRepository: WorkbenchHostSnapshotRepository;\n workspaceId: string;\n }) {\n this.input = input;\n this.readyPromise = new Promise((resolve) => {\n this.resolveReady = resolve;\n });\n this.nodeDefinitions = input.nodes;\n for (const definition of input.nodes) {\n this.nodeDefinitionByType.set(definition.typeId, definition);\n }\n this.loadedSnapshot = this.readCachedSnapshot();\n this.closedDockWindowFrameEntries = readClosedDockWindowFrameEntries(\n this.loadedSnapshot?.metadata\n );\n this.projectedNodes = input.projectedNodes ?? [];\n this.controller = createWorkbenchController<WorkbenchHostNodeData>(\n stateFromSnapshotOrDefinitions(\n this.loadedSnapshot,\n this.nodeDefinitions,\n this.projectedNodes\n ),\n { debugDiagnostics: input.debugDiagnostics }\n );\n this.observedSurfaceSize = this.controller.getSnapshot().surfaceSize;\n this.leaseUnsubscribe = this.controller.subscribe(() => {\n this.noteSurfaceSizeChange();\n this.reconcileNodeLeases();\n this.applyInitialCompactRestoredFrames();\n });\n this.isSnapshotLoaded = this.loadedSnapshot !== null;\n if (this.isSnapshotLoaded) {\n this.applyInitialCompactRestoredFrames();\n this.subscribeToPersistence();\n }\n }\n\n activateNode(\n target: WorkbenchHostActivationTarget,\n activation: {\n payload?: unknown;\n type: string;\n }\n ): void {\n this.runWhenReady(this.loadGeneration, () => {\n this.activateNodeNow(target, activation);\n });\n }\n\n private activateNodeNow(\n target: WorkbenchHostActivationTarget,\n activation: {\n payload?: unknown;\n type: string;\n }\n ): void {\n if (!activation.type.trim()) {\n return;\n }\n\n const node = this.findExistingNodeByTarget(target);\n if (!node) {\n return;\n }\n\n const envelope: WorkbenchHostActivation = {\n sequence: this.nextActivationSequence++,\n type: activation.type,\n ...(activation.payload === undefined\n ? {}\n : { payload: activation.payload })\n };\n this.restoreAndFocusNode(node.id);\n this.controller.commands.replaceState({\n nodes: this.controller.getSnapshot().nodes.map((entry) =>\n entry.id === node.id\n ? {\n ...entry,\n data: {\n ...entry.data,\n activation: envelope\n }\n }\n : entry\n )\n });\n }\n\n clearNodeActivation(nodeId: string, sequence: number): void {\n this.runWhenReady(this.loadGeneration, () => {\n this.clearNodeActivationNow(nodeId, sequence);\n });\n }\n\n private clearNodeActivationNow(nodeId: string, sequence: number): void {\n const snapshot = this.controller.getSnapshot();\n const node = snapshot.nodes.find((entry) => entry.id === nodeId);\n if (node?.data.activation?.sequence !== sequence) {\n return;\n }\n\n this.controller.commands.replaceState({\n nodes: snapshot.nodes.map((entry) =>\n entry.id === nodeId\n ? {\n ...entry,\n data: {\n ...entry.data,\n activation: null\n }\n }\n : entry\n )\n });\n }\n\n async collectWindowCloseEffects(): Promise<\n readonly WorkbenchHostCloseEffect[]\n > {\n const snapshot = this.controller.getSnapshot();\n const effects = await Promise.all(\n snapshot.nodes.map(async (node) => {\n const definition = this.nodeDefinitionByType.get(node.data.typeId);\n if (!definition?.getWindowCloseEffect) {\n return null;\n }\n const externalState = readWorkbenchHostExternalState({\n externalStateSource: this.input.externalStateSource,\n node,\n workspaceId: this.input.workspaceId\n });\n const effect = await definition.getWindowCloseEffect({\n externalNodeState: externalState.externalNodeState,\n externalWorkspaceState: externalState.externalWorkspaceState,\n instanceId: node.data.instanceId,\n instanceKey: node.data.instanceKey ?? null,\n node,\n workspaceId: this.input.workspaceId\n });\n return effect ?? null;\n })\n );\n return effects.filter(\n (effect): effect is WorkbenchHostCloseEffect => effect !== null\n );\n }\n\n closeNode(nodeId: string): void {\n this.runWhenReady(this.loadGeneration, () => {\n this.rememberClosedDockWindowFrame(nodeId);\n this.controller.commands.closeNode(nodeId);\n });\n }\n\n dispose(): void {\n this.isDisposed = true;\n this.loadGeneration++;\n this.loadPromise = null;\n this.markReady();\n this.leaseUnsubscribe?.();\n this.leaseUnsubscribe = null;\n this.unsubscribe?.();\n this.unsubscribe = null;\n this.externalStateUnsubscribe?.();\n this.externalStateUnsubscribe = null;\n if (this.saveTimer !== null) {\n globalThis.clearTimeout(this.saveTimer);\n this.saveTimer = null;\n this.saveSnapshot();\n }\n this.disposeNodeLeases();\n }\n\n focusNode(nodeId: string): void {\n this.runWhenReady(this.loadGeneration, () => {\n this.restoreAndFocusNode(nodeId);\n });\n }\n\n minimizeNode(nodeId: string): void {\n this.runWhenReady(this.loadGeneration, () => {\n this.controller.commands.minimizeNode(nodeId);\n });\n }\n\n exitFullscreenNode(nodeId: string): void {\n this.runWhenReady(this.loadGeneration, () => {\n this.controller.commands.exitFullscreen(nodeId);\n });\n }\n\n getSnapshot(): ReturnType<\n WorkbenchController<WorkbenchHostNodeData>[\"getSnapshot\"]\n > {\n return this.controller.getSnapshot();\n }\n\n isHydrating(): boolean {\n return this.isHydratingInitialSnapshot;\n }\n\n async launchNode(input: WorkbenchHostLaunchInput): Promise<string | null> {\n const generation = this.loadGeneration;\n if (!(await this.waitUntilReady(generation))) {\n return null;\n }\n\n const definition = this.nodeDefinitionByType.get(input.typeId);\n if (!definition) {\n return null;\n }\n\n const launchSource = resolveWorkbenchHostLaunchSource(input);\n const currentState = this.controller.getSnapshot();\n const request: WorkbenchHostLaunchRequest = {\n ...input,\n layoutConstraints: currentState.layoutConstraints,\n surfaceSize: currentState.surfaceSize,\n workspaceId: this.input.workspaceId\n };\n if (launchSource !== null) {\n request.launchSource = launchSource;\n }\n\n let result: WorkbenchHostLaunchResult | null | void;\n try {\n result = this.input.onLaunchRequest\n ? await this.input.onLaunchRequest(request)\n : createDefaultLaunchResult(definition, {\n dockEntryId: input.dockEntryId,\n launchSource\n });\n } catch (error) {\n this.logLaunchFailure(request, error);\n return null;\n }\n if (this.isDisposed || !result || generation !== this.loadGeneration) {\n return null;\n }\n\n return this.openLaunchResult({\n ...result,\n launchSource: result.launchSource ?? launchSource\n });\n }\n\n private logLaunchFailure(\n request: WorkbenchHostLaunchRequest,\n error: unknown\n ): void {\n void Promise.resolve(\n this.input.debugDiagnostics?.log?.({\n details: {\n dockEntryId: request.dockEntryId ?? null,\n error: diagnosticErrorDetails(error),\n launchSource: request.launchSource ?? null,\n payload: diagnosticValueSummary(request.payload),\n reason: request.reason,\n typeId: request.typeId\n },\n event: \"host.launch.failed\",\n level: \"error\",\n source: \"workbench-host\",\n workspaceId: request.workspaceId\n })\n ).catch(() => undefined);\n }\n\n async load(): Promise<void> {\n if (this.loadPromise && !this.isDisposed) {\n return this.loadPromise;\n }\n\n const generation = ++this.loadGeneration;\n if (!this.isHydratingInitialSnapshot) {\n this.resetHydrationBarrier();\n }\n this.isDisposed = false;\n this.loadPromise = this.loadInitialSnapshot(generation);\n return this.loadPromise;\n }\n\n private async loadInitialSnapshot(generation: number): Promise<void> {\n this.unsubscribe?.();\n this.unsubscribe = null;\n this.externalStateUnsubscribe?.();\n this.externalStateUnsubscribe = null;\n if (this.saveTimer !== null) {\n globalThis.clearTimeout(this.saveTimer);\n this.saveTimer = null;\n }\n\n try {\n const snapshot = await this.input.snapshotRepository.load(\n this.input.workspaceId\n );\n if (this.isDisposed || generation !== this.loadGeneration) {\n return;\n }\n\n this.loadedSnapshot = snapshot;\n this.closedDockWindowFrameEntries = readClosedDockWindowFrameEntries(\n snapshot?.metadata\n );\n this.controller.commands.replaceState(\n stateFromSnapshotOrDefinitions(\n snapshot,\n this.nodeDefinitions,\n this.projectedNodes\n )\n );\n this.applyProjectedNodes(this.projectedNodes);\n } catch {\n if (this.isDisposed || generation !== this.loadGeneration) {\n return;\n }\n this.loadedSnapshot = null;\n this.closedDockWindowFrameEntries = new Map();\n this.controller.commands.replaceState(\n stateFromSnapshotOrDefinitions(\n null,\n this.nodeDefinitions,\n this.projectedNodes\n )\n );\n this.applyProjectedNodes(this.projectedNodes);\n }\n\n this.reconcileNodeLeases();\n this.isSnapshotLoaded = true;\n this.applyInitialCompactRestoredFrames();\n this.subscribeToPersistence();\n this.markReady();\n }\n\n requestNodeClose(nodeId: string): void {\n const generation = this.loadGeneration;\n this.runWhenReady(generation, () => {\n this.requestNodeCloseNow(nodeId, generation);\n });\n }\n\n private requestNodeCloseNow(nodeId: string, generation: number): void {\n const node =\n this.controller\n .getSnapshot()\n .nodes.find((entry) => entry.id === nodeId) ?? null;\n if (!node) {\n return;\n }\n\n const request = {\n instanceId: node.data.instanceId,\n instanceKey: node.data.instanceKey ?? null,\n isProjected: node.data.isProjected === true,\n nodeId: node.id,\n subject: node.data.projectionSubject ?? null,\n typeId: node.data.typeId,\n workspaceId: this.input.workspaceId\n };\n if (node.data.isProjected === true && !this.input.onNodeCloseRequest) {\n return;\n }\n const decision = this.input.onNodeCloseRequest?.(request);\n void Promise.resolve(decision).then((resolvedDecision) => {\n if (\n this.isDisposed ||\n resolvedDecision === \"keep-open\" ||\n generation !== this.loadGeneration\n ) {\n return;\n }\n this.rememberClosedDockWindowFrame(node.id);\n this.controller.commands.closeNode(node.id);\n }, noop);\n }\n\n setNodeRuntimeState(nodeId: string, state: unknown): void {\n const snapshot = this.controller.getSnapshot();\n if (!snapshot.nodes.some((node) => node.id === nodeId)) {\n return;\n }\n\n this.controller.commands.replaceState({\n nodes: snapshot.nodes.map((node) =>\n node.id === nodeId\n ? {\n ...node,\n data:\n state === undefined\n ? withoutRuntimeNodeState(node.data)\n : {\n ...node.data,\n runtimeNodeState: state\n }\n }\n : node\n )\n });\n }\n\n setNodeSizeConstraints(\n nodeId: string,\n sizeConstraints: WorkbenchNode[\"sizeConstraints\"]\n ): void {\n this.controller.commands.setNodeSizeConstraints(\n nodeId,\n sizeConstraints ?? null\n );\n }\n\n setNodeTitle(nodeId: string, title: string): void {\n const nextTitle = title.trim();\n if (!nextTitle) {\n return;\n }\n\n const snapshot = this.controller.getSnapshot();\n const node = snapshot.nodes.find((entry) => entry.id === nodeId);\n if (!node || node.title === nextTitle) {\n return;\n }\n\n this.controller.commands.replaceState({\n nodes: snapshot.nodes.map((entry) =>\n entry.id === nodeId\n ? {\n ...entry,\n title: nextTitle\n }\n : entry\n )\n });\n }\n\n setSnapshotNodeState(nodeId: string, state: unknown): void {\n const snapshot = this.controller.getSnapshot();\n if (!snapshot.nodes.some((node) => node.id === nodeId)) {\n return;\n }\n\n this.controller.commands.replaceState({\n nodes: snapshot.nodes.map((node) =>\n node.id === nodeId\n ? {\n ...node,\n data:\n state === undefined\n ? withoutSnapshotNodeState(node.data)\n : {\n ...node.data,\n snapshotNodeState: state\n }\n }\n : node\n )\n });\n }\n\n reconcileProjectedNodes(\n projectedNodes: readonly WorkbenchHostProjectedNode[]\n ): void {\n this.projectedNodes = projectedNodes;\n if (this.isHydratingInitialSnapshot) {\n this.queueProjectedNodeReconciliation();\n return;\n }\n\n this.applyProjectedNodes(projectedNodes);\n }\n\n private applyProjectedNodes(\n projectedNodes: readonly WorkbenchHostProjectedNode[]\n ): void {\n const projectedNodesByID = new Map(\n projectedNodes.map((node) => [\n createProjectedNodeID(node.typeId, node.instanceId),\n node\n ])\n );\n const currentState = this.controller.getSnapshot();\n const snapshotNodesByID = restoredSnapshotNodesByID(\n this.loadedSnapshot,\n this.nodeDefinitions\n );\n\n const nextNodes = currentState.nodes\n .filter(\n (node) => !node.data.isProjected || projectedNodesByID.has(node.id)\n )\n .map((node) => {\n const projectedNode = projectedNodesByID.get(node.id);\n return projectedNode\n ? updateProjectedNodeFromInput(\n node,\n projectedNode,\n this.nodeDefinitionByType.get(projectedNode.typeId)\n )\n : node;\n });\n const nextNodeIDs = new Set(nextNodes.map((node) => node.id));\n\n for (const projectedNode of projectedNodes) {\n const nodeID = createProjectedNodeID(\n projectedNode.typeId,\n projectedNode.instanceId\n );\n if (nextNodeIDs.has(nodeID)) {\n continue;\n }\n\n const definition = this.nodeDefinitionByType.get(projectedNode.typeId);\n if (!definition) {\n continue;\n }\n\n const nextNode = createWorkbenchProjectedHostNode({\n definition,\n projectedNode,\n restoredNode: snapshotNodesByID.get(nodeID) ?? null\n });\n nextNodes.push(nextNode);\n nextNodeIDs.add(nextNode.id);\n }\n\n const nodeStack = projectedWorkbenchNodeStack({\n currentNodeStack: currentState.nodeStack,\n nextNodes,\n snapshot: this.loadedSnapshot\n });\n if (\n shallowArrayEqual(currentState.nodes, nextNodes) &&\n stringArrayEqual(currentState.nodeStack, nodeStack)\n ) {\n return;\n }\n\n this.controller.commands.replaceState({\n nodeStack,\n nodes: nextNodes\n });\n }\n\n private openLaunchResult(result: WorkbenchHostLaunchResult): string | null {\n const definition = this.nodeDefinitionByType.get(result.typeId);\n if (!definition) {\n return null;\n }\n const launchResult = this.applyClosedDockWindowFrame(result);\n\n const exactExisting = this.findExistingNodeByTarget({\n instanceId: launchResult.instanceId,\n typeId: launchResult.typeId\n });\n const dockEntryExisting = exactExisting\n ? null\n : this.findExistingNodeByDockEntry(launchResult);\n const existing = exactExisting ?? dockEntryExisting;\n if (existing) {\n this.controller.commands.setNodeSizeConstraints(\n existing.id,\n launchResult.sizeConstraints ?? definition.sizeConstraints ?? null\n );\n if (\n exactExisting &&\n launchResult.framePolicy === \"cascade-same-type-centered\"\n ) {\n const currentState = this.controller.getSnapshot();\n const resolvedFrame = resolveWorkbenchLaunchedHostNodeFrame({\n currentState: {\n ...currentState,\n nodes: currentState.nodes.filter((node) => node.id !== existing.id),\n nodeStack: currentState.nodeStack.filter(\n (nodeId) => nodeId !== existing.id\n )\n },\n definition,\n result: launchResult\n });\n this.controller.commands.resizeNode(existing.id, resolvedFrame);\n }\n this.restoreAndFocusNode(existing.id);\n if (launchResult.activation) {\n this.activateNodeNow({ nodeId: existing.id }, launchResult.activation);\n }\n return existing.id;\n }\n\n const resolvedFrame = resolveWorkbenchLaunchedHostNodeFrame({\n currentState: this.controller.getSnapshot(),\n definition,\n result: launchResult\n });\n const nextNode = createWorkbenchLaunchedHostNode({\n activation: this.createActivationEnvelope(launchResult.activation),\n definition,\n resolvedFrame,\n result: launchResult\n });\n this.controller.commands.openNode(nextNode);\n this.controller.commands.focusNode(nextNode.id);\n return nextNode.id;\n }\n\n private createActivationEnvelope(\n activation: WorkbenchHostLaunchResult[\"activation\"]\n ): WorkbenchHostActivation | null {\n if (!activation?.type.trim()) {\n return null;\n }\n\n return {\n sequence: this.nextActivationSequence++,\n type: activation.type,\n ...(activation.payload === undefined\n ? {}\n : { payload: activation.payload })\n };\n }\n\n private findExistingNodeByTarget(\n target: WorkbenchHostActivationTarget\n ): WorkbenchNode<WorkbenchHostNodeData> | null {\n const snapshot = this.controller.getSnapshot();\n if (\"nodeId\" in target) {\n return snapshot.nodes.find((node) => node.id === target.nodeId) ?? null;\n }\n\n const definition = this.nodeDefinitionByType.get(target.typeId);\n if (!definition) {\n return null;\n }\n const nodes = snapshot.nodes.filter(\n (node) => node.data.typeId === definition.typeId\n );\n if (target.instanceId) {\n return (\n nodes.find((node) => node.data.instanceId === target.instanceId) ?? null\n );\n }\n\n if (definition.instance?.mode === \"multi\") {\n return null;\n }\n\n return nodes[0] ?? null;\n }\n\n private findExistingNodeByDockEntry(\n result: WorkbenchHostLaunchResult\n ): WorkbenchNode<WorkbenchHostNodeData> | null {\n const dockEntryId = result.dockEntryId?.trim();\n if (!result.reuseDockEntryNode || !dockEntryId) {\n return null;\n }\n\n const snapshot = this.controller.getSnapshot();\n const nodesByID = new Map(snapshot.nodes.map((node) => [node.id, node]));\n for (let index = snapshot.nodeStack.length - 1; index >= 0; index -= 1) {\n const node = nodesByID.get(snapshot.nodeStack[index] ?? \"\");\n if (\n node?.data.typeId === result.typeId &&\n node.data.dockEntryId === dockEntryId\n ) {\n return node;\n }\n }\n\n return (\n snapshot.nodes.find(\n (node) =>\n node.data.typeId === result.typeId &&\n node.data.dockEntryId === dockEntryId\n ) ?? null\n );\n }\n\n private readCachedSnapshot(): WorkbenchSnapshot | null {\n if (!this.input.snapshotRepository.hasLoaded?.(this.input.workspaceId)) {\n return null;\n }\n\n return (\n this.input.snapshotRepository.readCached?.(this.input.workspaceId) ?? null\n );\n }\n\n private markReady(): void {\n if (!this.isHydratingInitialSnapshot) {\n return;\n }\n\n this.isHydratingInitialSnapshot = false;\n this.resolveReady();\n }\n\n private resetHydrationBarrier(): void {\n this.isHydratingInitialSnapshot = true;\n this.hasAppliedInitialCompactRestoredFrames = false;\n this.readyPromise = new Promise((resolve) => {\n this.resolveReady = resolve;\n });\n }\n\n private noteSurfaceSizeChange(): void {\n const currentSurfaceSize = this.controller.getSnapshot().surfaceSize;\n if (\n this.observedSurfaceSize &&\n (this.observedSurfaceSize.width !== currentSurfaceSize.width ||\n this.observedSurfaceSize.height !== currentSurfaceSize.height)\n ) {\n this.hasReceivedSurfaceSize = true;\n }\n this.observedSurfaceSize = currentSurfaceSize;\n }\n\n private applyInitialCompactRestoredFrames(): void {\n if (\n this.hasAppliedInitialCompactRestoredFrames ||\n !this.isSnapshotLoaded ||\n !this.hasReceivedSurfaceSize\n ) {\n return;\n }\n\n const snapshot = this.controller.getSnapshot();\n const compactedNodes = compactRestoredWorkbenchHostNodes({\n constraints: snapshot.layoutConstraints,\n nodeDefinitionByType: this.nodeDefinitionByType,\n nodes: snapshot.nodes,\n surfaceSize: snapshot.surfaceSize\n });\n this.hasAppliedInitialCompactRestoredFrames = true;\n if (shallowArrayEqual(snapshot.nodes, compactedNodes)) {\n return;\n }\n this.controller.commands.replaceNodes(compactedNodes);\n }\n\n private queueProjectedNodeReconciliation(): void {\n if (this.pendingProjectedNodeReconciliation) {\n return;\n }\n\n const generation = this.loadGeneration;\n this.pendingProjectedNodeReconciliation = true;\n void this.readyPromise.then(() => {\n this.pendingProjectedNodeReconciliation = false;\n if (this.isDisposed || generation !== this.loadGeneration) {\n return;\n }\n this.applyProjectedNodes(this.projectedNodes);\n });\n }\n\n private runWhenReady(generation: number, action: () => void): void {\n if (!this.isHydratingInitialSnapshot) {\n if (!this.isDisposed && generation === this.loadGeneration) {\n action();\n }\n return;\n }\n\n void this.readyPromise.then(() => {\n if (this.isDisposed || generation !== this.loadGeneration) {\n return;\n }\n action();\n });\n }\n\n private async waitUntilReady(generation: number): Promise<boolean> {\n if (!this.isHydratingInitialSnapshot) {\n return !this.isDisposed && generation === this.loadGeneration;\n }\n\n await this.readyPromise;\n return !this.isDisposed && generation === this.loadGeneration;\n }\n\n private restoreAndFocusNode(nodeId: string): void {\n const existing = this.controller\n .getSnapshot()\n .nodes.find((node) => node.id === nodeId);\n if (!existing) {\n return;\n }\n if (existing.isMinimized) {\n this.controller.commands.restoreNode(existing.id);\n }\n this.controller.commands.focusNode(existing.id);\n }\n\n private saveSnapshot(): void {\n if (!this.isSnapshotLoaded) {\n return;\n }\n\n const snapshot = sanitizeWorkbenchHostSnapshot(\n createWorkbenchSnapshotFromState(\n this.applyExternalSnapshotNodeState(\n persistedWorkbenchState(\n this.controller.getSnapshot(),\n this.nodeDefinitionByType\n )\n ),\n {\n activeSpaceId: this.loadedSnapshot?.activeSpaceId,\n metadata: writeClosedDockWindowFrameEntries(\n {\n ...(this.loadedSnapshot?.metadata ?? {}),\n [initializedMetadataKey]: true\n },\n this.closedDockWindowFrameEntries.values()\n ),\n spaces: this.loadedSnapshot?.spaces\n }\n )\n );\n if (workbenchSnapshotSaveKey(snapshot) === this.loadedSnapshotSaveKey()) {\n return;\n }\n void Promise.resolve(\n this.input.snapshotRepository.save(this.input.workspaceId, snapshot)\n ).then((savedSnapshot) => {\n this.loadedSnapshot = savedSnapshot;\n }, noop);\n }\n\n private rememberClosedDockWindowFrame(nodeId: string): void {\n const node = this.controller\n .getSnapshot()\n .nodes.find((entry) => entry.id === nodeId);\n const dockEntryId = node?.data.dockEntryId?.trim();\n if (!node || !dockEntryId) {\n return;\n }\n\n const entry: ClosedDockWindowFrameEntry = {\n dockEntryId,\n frame:\n node.displayMode === \"fullscreen\" && node.restoreFrame\n ? node.restoreFrame\n : node.frame,\n typeId: node.data.typeId\n };\n this.closedDockWindowFrameEntries.set(\n closedDockWindowFrameEntryKey(entry),\n entry\n );\n }\n\n private applyClosedDockWindowFrame(\n result: WorkbenchHostLaunchResult\n ): WorkbenchHostLaunchResult {\n const dockEntryId = result.dockEntryId?.trim();\n if (!dockEntryId) {\n return result;\n }\n\n const entry = this.closedDockWindowFrameEntries.get(\n closedDockWindowFrameEntryKey({\n dockEntryId,\n typeId: result.typeId\n })\n );\n if (!entry) {\n return result;\n }\n\n return {\n ...result,\n defaultFrame: entry.frame,\n framePolicy: \"absolute\"\n };\n }\n\n private loadedSnapshotSaveKey(): string | null {\n if (!this.loadedSnapshot) {\n return null;\n }\n return workbenchSnapshotSaveKey(\n sanitizeWorkbenchHostSnapshot(this.loadedSnapshot)\n );\n }\n\n private schedulePersistedSnapshotWrite(): void {\n if (!this.isSnapshotLoaded || this.isDisposed) {\n return;\n }\n\n if (this.saveTimer !== null) {\n globalThis.clearTimeout(this.saveTimer);\n }\n this.saveTimer = globalThis.setTimeout(() => {\n this.saveTimer = null;\n this.saveSnapshot();\n }, snapshotSaveDelayMs);\n }\n\n private subscribeToPersistence(): void {\n if (this.unsubscribe !== null) {\n return;\n }\n\n this.unsubscribe = this.controller.subscribe(() => {\n this.schedulePersistedSnapshotWrite();\n });\n if (this.externalStateUnsubscribe === null) {\n const source = this.input.externalStateSource;\n const canReadSnapshotNodeState =\n typeof source?.getSnapshotNodeState === \"function\";\n if (!canReadSnapshotNodeState) {\n return;\n }\n this.externalStateUnsubscribe =\n source?.subscribe?.(() => {\n this.schedulePersistedSnapshotWrite();\n }) ?? null;\n }\n }\n\n private disposeNodeLeases(): void {\n for (const lease of this.nodeLeases.values()) {\n lease.release();\n }\n this.nodeLeases.clear();\n }\n\n private applyExternalSnapshotNodeState(\n state: Pick<WorkbenchState<WorkbenchHostNodeData>, \"nodeStack\" | \"nodes\">\n ): Pick<WorkbenchState<WorkbenchHostNodeData>, \"nodeStack\" | \"nodes\"> {\n const source = this.input.externalStateSource;\n const getSnapshotNodeState = source?.getSnapshotNodeState?.bind(source);\n if (!getSnapshotNodeState) {\n return state;\n }\n\n return {\n ...state,\n nodes: state.nodes.map((node) => {\n const lookupInput = {\n instanceId: node.data.instanceId,\n instanceKey: node.data.instanceKey ?? null,\n nodeId: node.id,\n typeId: node.data.typeId,\n workspaceId: this.input.workspaceId,\n ...(node.data.projectionSubject\n ? { subject: node.data.projectionSubject }\n : {})\n };\n const snapshotNodeState = getSnapshotNodeState(lookupInput);\n const nextSnapshotNodeState =\n snapshotNodeState ?? node.data.snapshotNodeState;\n if (nextSnapshotNodeState === undefined) {\n return node;\n }\n return {\n ...node,\n data: {\n ...node.data,\n snapshotNodeState: nextSnapshotNodeState\n }\n };\n })\n };\n }\n\n private reconcileNodeLeases(): void {\n const activeNodes = this.controller.getSnapshot().nodes;\n const nextNodeIDs = new Set(activeNodes.map((node) => node.id));\n\n for (const [nodeID, lease] of this.nodeLeases) {\n if (nextNodeIDs.has(nodeID)) {\n continue;\n }\n lease.release();\n this.nodeLeases.delete(nodeID);\n }\n\n for (const node of activeNodes) {\n if (this.nodeLeases.has(node.id)) {\n continue;\n }\n const definition = this.nodeDefinitionByType.get(node.data.typeId);\n const lease = definition?.createLease?.({\n node,\n workspaceId: this.input.workspaceId\n });\n if (lease) {\n this.nodeLeases.set(node.id, lease);\n }\n }\n }\n}\n\nfunction withoutRuntimeNodeState(\n data: WorkbenchHostNodeData\n): WorkbenchHostNodeData {\n const next = { ...data };\n delete next.runtimeNodeState;\n return next;\n}\n\nfunction withoutSnapshotNodeState(\n data: WorkbenchHostNodeData\n): WorkbenchHostNodeData {\n const next = { ...data };\n delete next.snapshotNodeState;\n return next;\n}\n\nfunction workbenchSnapshotSaveKey(snapshot: WorkbenchSnapshot): string {\n return JSON.stringify(snapshot);\n}\n\nfunction resolveWorkbenchHostLaunchSource(\n input: WorkbenchHostLaunchInput\n): string | null {\n if (input.launchSource?.trim()) {\n return input.launchSource.trim();\n }\n switch (input.reason) {\n case \"dock\":\n return \"dock\";\n case \"launchpad\":\n return \"launchpad\";\n case \"shortcut\":\n return \"keyboard\";\n case \"command\":\n return \"command\";\n case \"host\":\n return null;\n }\n}\n\nfunction diagnosticErrorDetails(error: unknown): Record<string, unknown> {\n if (error instanceof Error) {\n return {\n message: limitLaunchDiagnosticText(error.message),\n name: error.name,\n stack: limitLaunchDiagnosticText(error.stack)\n };\n }\n return {\n message: diagnosticValueSummary(error),\n name: typeof error\n };\n}\n\nfunction diagnosticValueSummary(value: unknown): string | null {\n if (value === undefined) {\n return null;\n }\n if (typeof value === \"string\") {\n return limitLaunchDiagnosticText(value) ?? \"\";\n }\n if (\n value === null ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return String(value);\n }\n try {\n return limitLaunchDiagnosticText(JSON.stringify(value)) ?? null;\n } catch {\n return Object.prototype.toString.call(value);\n }\n}\n\nfunction limitLaunchDiagnosticText(value: string | undefined): string | null {\n const trimmed = value?.trim();\n if (!trimmed) {\n return null;\n }\n return trimmed.length > launchDiagnosticTextMaxLength\n ? `${trimmed.slice(0, launchDiagnosticTextMaxLength)}...`\n : trimmed;\n}\n\nfunction noop(): void {}\n","import { Component, useCallback, useMemo } from \"react\";\nimport type { ErrorInfo, ReactNode } from \"react\";\nimport type { WorkbenchNode } from \"../core/types.ts\";\nimport type {\n WorkbenchRenderNodeContext,\n WorkbenchRenderWindowHeader,\n WorkbenchResolveWindowChromeMode,\n WorkbenchWindowActionContext\n} from \"../react/types.ts\";\nimport type {\n WorkbenchDockPreviewCache,\n WorkbenchDockPreviewCacheKey\n} from \"../react/dockPreviewCache.ts\";\nimport {\n renderMinimizedDockPreviewContent,\n WorkbenchHostDock\n} from \"./WorkbenchHostDock.tsx\";\nimport {\n createWorkbenchHostNodeBodyContext,\n createWorkbenchHostNodeHeaderContext\n} from \"./hostNodeContext.ts\";\nimport { WorkbenchHostWindowActions } from \"./WorkbenchHostWindowActions.tsx\";\nimport { readWorkbenchHostExternalState } from \"./externalState.ts\";\nimport {\n isWorkbenchMinimizedDockEligibleNode,\n resolveWorkbenchMinimizedDockAnchorKeyForNode,\n resolveWorkbenchMinimizedDockSlots\n} from \"./minimizedDockSlots.ts\";\nimport type {\n WorkbenchHostChromeRenderContext,\n WorkbenchHostDockEntry,\n WorkbenchHostExternalStateSource,\n WorkbenchHostNodeBodyContext,\n WorkbenchHostNodeData,\n WorkbenchHostNodeDefinition,\n WorkbenchHostProps,\n WorkbenchHostRuntimeHandle\n} from \"./types.ts\";\nimport type { WorkbenchHostI18nRuntime } from \"./workbenchHostI18n.ts\";\n\nexport function useWorkbenchHostSurfaceRenderers(input: {\n captureNodePreviewImage?: WorkbenchHostProps[\"captureNodePreviewImage\"];\n chromeContext: WorkbenchHostChromeRenderContext;\n debugDiagnostics?: WorkbenchHostProps[\"debugDiagnostics\"];\n dockPreviewCache?: WorkbenchDockPreviewCache;\n dockPlacement?: WorkbenchHostProps[\"dockPlacement\"];\n dockEntries: readonly WorkbenchHostDockEntry[];\n dockStateSource?: WorkbenchHostProps[\"dockStateSource\"];\n externalStateSource?: WorkbenchHostExternalStateSource;\n externalStateRevision: number;\n hostI18n: WorkbenchHostI18nRuntime;\n hostSession: WorkbenchHostRuntimeHandle;\n nodeDefinitionByType: Map<string, WorkbenchHostNodeDefinition>;\n onDockEntryAction?: WorkbenchHostProps[\"onDockEntryAction\"];\n onDockEntryClick?: WorkbenchHostProps[\"onDockEntryClick\"];\n onMissionControlRequestOpen?: WorkbenchHostProps[\"onMissionControlRequestOpen\"];\n renderBottomChrome?: WorkbenchHostProps[\"renderBottomChrome\"];\n renderTopChrome?: WorkbenchHostProps[\"renderTopChrome\"];\n workspaceId: string;\n}) {\n const renderBottomChrome = useMemo(() => {\n const renderChrome = input.renderBottomChrome;\n return renderChrome\n ? () => (\n <WorkbenchHostSurfaceRenderErrorBoundary\n debugDiagnostics={input.debugDiagnostics}\n details={{\n chromeSlot: \"bottom\"\n }}\n event=\"workbench.chrome.render_error\"\n fallbackKind=\"bottom-chrome\"\n resetKey={`${input.workspaceId}:bottom-chrome`}\n workspaceId={input.workspaceId}\n >\n <WorkbenchHostChromeRenderer\n context={input.chromeContext}\n renderChrome={renderChrome}\n />\n </WorkbenchHostSurfaceRenderErrorBoundary>\n )\n : undefined;\n }, [\n input.chromeContext,\n input.debugDiagnostics,\n input.renderBottomChrome,\n input.workspaceId\n ]);\n const renderTopChrome = useMemo(() => {\n const renderChrome = input.renderTopChrome;\n return renderChrome\n ? () => (\n <WorkbenchHostSurfaceRenderErrorBoundary\n debugDiagnostics={input.debugDiagnostics}\n details={{\n chromeSlot: \"top\"\n }}\n event=\"workbench.chrome.render_error\"\n fallbackKind=\"top-chrome\"\n resetKey={`${input.workspaceId}:top-chrome`}\n workspaceId={input.workspaceId}\n >\n <WorkbenchHostChromeRenderer\n context={input.chromeContext}\n renderChrome={renderChrome}\n />\n </WorkbenchHostSurfaceRenderErrorBoundary>\n )\n : undefined;\n }, [\n input.chromeContext,\n input.debugDiagnostics,\n input.renderTopChrome,\n input.workspaceId\n ]);\n\n const captureNodePreviewImage = useCallback(\n async (node: WorkbenchNode<WorkbenchHostNodeData>) => {\n const definition = input.nodeDefinitionByType.get(node.data.typeId);\n const minimizedDock = definition?.window?.minimizedDock;\n const capturePreview =\n minimizedDock?.kind === \"snapshot\"\n ? minimizedDock.capturePreview\n : undefined;\n const snapshot = input.hostSession.getSnapshot();\n const externalState = readWorkbenchHostExternalState({\n externalStateSource: input.externalStateSource,\n node,\n workspaceId: input.workspaceId\n });\n const nodePreview =\n (await Promise.resolve(\n capturePreview?.({\n externalNodeState: externalState.externalNodeState,\n externalWorkspaceState: externalState.externalWorkspaceState,\n host: input.hostSession,\n isFocused: snapshot.nodeStack.at(-1) === node.id,\n isMinimized: node.isMinimized,\n node\n }) ?? null\n ).catch(() => null)) ??\n (await Promise.resolve(\n input.captureNodePreviewImage?.(node) ?? null\n ).catch(() => null));\n return nodePreview;\n },\n [\n input.captureNodePreviewImage,\n input.externalStateSource,\n input.hostSession,\n input.nodeDefinitionByType,\n input.workspaceId\n ]\n );\n\n const renderDock = useCallback(\n (context: Parameters<typeof WorkbenchHostDock>[0][\"context\"]) => (\n <WorkbenchHostSurfaceRenderErrorBoundary\n debugDiagnostics={input.debugDiagnostics}\n details={{\n dockEntryCount: input.dockEntries.length,\n dockPlacement: input.dockPlacement ?? null\n }}\n event=\"workbench.dock.render_error\"\n fallbackKind=\"dock\"\n resetKey={`${input.workspaceId}:dock`}\n workspaceId={input.workspaceId}\n >\n <WorkbenchHostDock\n captureNodePreviewImage={captureNodePreviewImage}\n context={context}\n debugDiagnostics={input.debugDiagnostics}\n dockEntries={input.dockEntries}\n dockPlacement={input.dockPlacement}\n dockPreviewCache={input.dockPreviewCache}\n dockStateSource={input.dockStateSource}\n externalStateSource={input.externalStateSource}\n host={input.hostSession}\n i18n={input.hostI18n}\n nodeDefinitions={input.nodeDefinitionByType}\n onDockEntryAction={input.onDockEntryAction}\n onDockEntryClick={input.onDockEntryClick}\n onMissionControlRequestOpen={input.onMissionControlRequestOpen}\n workspaceId={input.workspaceId}\n />\n </WorkbenchHostSurfaceRenderErrorBoundary>\n ),\n [\n captureNodePreviewImage,\n input.debugDiagnostics,\n input.dockEntries,\n input.dockPlacement,\n input.dockPreviewCache,\n input.dockStateSource,\n input.externalStateSource,\n input.hostI18n,\n input.hostSession,\n input.nodeDefinitionByType,\n input.onDockEntryAction,\n input.onDockEntryClick,\n input.onMissionControlRequestOpen,\n input.workspaceId\n ]\n );\n\n const renderNode = useCallback(\n (context: WorkbenchRenderNodeContext<WorkbenchHostNodeData>) => {\n const definition = input.nodeDefinitionByType.get(\n context.node.data.typeId\n );\n if (!definition) {\n return null;\n }\n\n const bodyContext = createWorkbenchHostNodeBodyContext({\n context,\n definition,\n externalStateSource: input.externalStateSource,\n host: input.hostSession,\n workspaceId: input.workspaceId\n });\n\n return (\n <WorkbenchHostNodeRenderErrorBoundary\n debugDiagnostics={input.debugDiagnostics}\n node={context.node}\n resetKey={`${context.node.id}:${context.node.data.typeId}:${input.externalStateRevision}`}\n workspaceId={input.workspaceId}\n >\n <WorkbenchHostNodeBodyRenderer\n context={bodyContext}\n definition={definition}\n />\n </WorkbenchHostNodeRenderErrorBoundary>\n );\n },\n [\n input.debugDiagnostics,\n input.externalStateSource,\n input.externalStateRevision,\n input.hostSession,\n input.nodeDefinitionByType,\n input.workspaceId\n ]\n );\n\n const renderWindowActions = useCallback(\n (context: WorkbenchWindowActionContext<WorkbenchHostNodeData>) => (\n <WorkbenchHostWindowActions\n context={context}\n host={input.hostSession}\n i18n={input.hostI18n}\n nodeDefinitions={input.nodeDefinitionByType}\n />\n ),\n [input.hostI18n, input.hostSession, input.nodeDefinitionByType]\n );\n\n const renderWindowHeader = useCallback(\n (\n context: Parameters<WorkbenchRenderWindowHeader<WorkbenchHostNodeData>>[0]\n ) => {\n const definition = input.nodeDefinitionByType.get(\n context.node.data.typeId\n );\n if (!definition?.renderHeader) {\n return null;\n }\n\n return definition.renderHeader(\n createWorkbenchHostNodeHeaderContext({\n context,\n definition,\n externalStateSource: input.externalStateSource,\n host: input.hostSession,\n workspaceId: input.workspaceId\n })\n );\n },\n [\n input.externalStateSource,\n input.externalStateRevision,\n input.hostSession,\n input.nodeDefinitionByType,\n input.workspaceId\n ]\n );\n\n const shouldKeepMinimizedNodeMounted = useCallback(\n (node: WorkbenchNode<WorkbenchHostNodeData>) => {\n const capability = input.nodeDefinitionByType.get(node.data.typeId)\n ?.window?.keepMountedWhenMinimized;\n return typeof capability === \"function\"\n ? capability(node)\n : capability === true;\n },\n [input.nodeDefinitionByType]\n );\n\n const shouldCaptureNodePreviewImage = useCallback(\n (node: WorkbenchNode<WorkbenchHostNodeData>) => {\n const minimizedDock = input.nodeDefinitionByType.get(node.data.typeId)\n ?.window?.minimizedDock;\n return minimizedDock?.kind !== \"component\";\n },\n [input.nodeDefinitionByType]\n );\n\n const renderNodeGeniePreview = useCallback(\n (\n node: WorkbenchNode<WorkbenchHostNodeData>,\n {\n previewViewport\n }: { previewViewport: { height: number; width: number } }\n ) => {\n const minimizedDock = input.nodeDefinitionByType.get(node.data.typeId)\n ?.window?.minimizedDock;\n if (minimizedDock?.kind !== \"component\") {\n return null;\n }\n\n const externalState = readWorkbenchHostExternalState({\n externalStateSource: input.externalStateSource,\n node,\n workspaceId: input.workspaceId\n });\n const preview = minimizedDock.providePreview({\n externalNodeState: externalState.externalNodeState,\n externalWorkspaceState: externalState.externalWorkspaceState,\n host: input.hostSession,\n isFocused: input.hostSession.getSnapshot().nodeStack.at(-1) === node.id,\n isMinimized: node.isMinimized,\n node,\n previewViewport\n });\n return preview\n ? renderMinimizedDockPreviewContent(\n preview,\n \"workbench-genie-preview-capture__preview\"\n )\n : null;\n },\n [\n input.externalStateSource,\n input.hostSession,\n input.nodeDefinitionByType,\n input.workspaceId\n ]\n );\n\n const resolveDockAnchorKey = useCallback(\n (node: WorkbenchNode<WorkbenchHostNodeData>) => {\n if (\n node.isMinimized &&\n isWorkbenchMinimizedDockEligibleNode({\n node,\n nodeDefinitions: input.nodeDefinitionByType\n })\n ) {\n const snapshotNodes = input.hostSession.getSnapshot().nodes;\n const slotNodes = snapshotNodes.some(\n (snapshotNode) => snapshotNode.id === node.id\n )\n ? snapshotNodes.map((snapshotNode) =>\n snapshotNode.id === node.id ? node : snapshotNode\n )\n : [...snapshotNodes, node];\n const minimizedAnchorKey =\n resolveWorkbenchMinimizedDockAnchorKeyForNode({\n nodeId: node.id,\n slots: resolveWorkbenchMinimizedDockSlots({\n nodeDefinitions: input.nodeDefinitionByType,\n nodes: slotNodes\n })\n });\n if (minimizedAnchorKey) {\n return minimizedAnchorKey;\n }\n }\n\n if (typeof node.data.dockEntryId === \"string\") {\n const dockEntry = input.dockEntries.find(\n (entry) => entry.id === node.data.dockEntryId\n );\n return dockEntry?.anchorKey ?? node.data.dockEntryId;\n }\n\n return node.data.typeId;\n },\n [input.dockEntries, input.hostSession, input.nodeDefinitionByType]\n );\n\n const resolveDockPreviewCacheKey = useCallback(\n (\n node: WorkbenchNode<WorkbenchHostNodeData>\n ): WorkbenchDockPreviewCacheKey | null => ({\n instanceId: node.data.instanceId,\n instanceKey: node.data.instanceKey ?? null,\n nodeId: node.id,\n typeId: node.data.typeId,\n workspaceId: input.workspaceId\n }),\n [input.workspaceId]\n );\n\n const windowChromeMode = useCallback<\n WorkbenchResolveWindowChromeMode<WorkbenchHostNodeData>\n >(\n ({ node }) =>\n input.nodeDefinitionByType.get(node.data.typeId)?.renderHeader\n ? \"custom-header\"\n : \"system\",\n [input.nodeDefinitionByType]\n );\n\n const resolveFullscreenHeaderMode = useCallback(\n ({ node }: { node: WorkbenchNode<WorkbenchHostNodeData> }) =>\n input.nodeDefinitionByType.get(node.data.typeId)?.window\n ?.fullscreenHeaderMode,\n [input.nodeDefinitionByType]\n );\n\n return {\n captureNodePreviewImage,\n renderBottomChrome,\n renderDock,\n renderNode,\n renderNodeGeniePreview,\n renderTopChrome,\n renderWindowActions,\n renderWindowHeader,\n shouldCaptureNodePreviewImage,\n shouldKeepMinimizedNodeMounted,\n resolveDockAnchorKey,\n resolveDockPreviewCacheKey,\n resolveFullscreenHeaderMode,\n windowChromeMode\n };\n}\n\ninterface WorkbenchHostNodeRenderErrorBoundaryProps {\n children: ReactNode;\n debugDiagnostics?: WorkbenchHostProps[\"debugDiagnostics\"];\n node: WorkbenchNode<WorkbenchHostNodeData>;\n resetKey: string;\n workspaceId: string;\n}\n\ninterface WorkbenchHostSurfaceRenderErrorBoundaryProps {\n children: ReactNode;\n debugDiagnostics?: WorkbenchHostProps[\"debugDiagnostics\"];\n details?: Record<string, unknown>;\n event: string;\n fallbackKind: string;\n resetKey: string;\n workspaceId: string;\n}\n\ninterface WorkbenchHostNodeRenderErrorBoundaryState {\n hasError: boolean;\n}\n\ninterface WorkbenchHostSurfaceRenderErrorBoundaryState {\n hasError: boolean;\n}\n\nclass WorkbenchHostSurfaceRenderErrorBoundary extends Component<\n WorkbenchHostSurfaceRenderErrorBoundaryProps,\n WorkbenchHostSurfaceRenderErrorBoundaryState\n> {\n override state: WorkbenchHostSurfaceRenderErrorBoundaryState = {\n hasError: false\n };\n\n static getDerivedStateFromError(): WorkbenchHostSurfaceRenderErrorBoundaryState {\n return { hasError: true };\n }\n\n override componentDidUpdate(\n previousProps: WorkbenchHostSurfaceRenderErrorBoundaryProps\n ): void {\n if (this.state.hasError && previousProps.resetKey !== this.props.resetKey) {\n this.setState({ hasError: false });\n }\n }\n\n override componentDidCatch(error: unknown, info: ErrorInfo): void {\n try {\n const result = this.props.debugDiagnostics?.log?.({\n details: {\n ...(this.props.details ?? {}),\n componentStack: info.componentStack ?? null,\n errorMessage: error instanceof Error ? error.message : String(error),\n errorName: error instanceof Error ? error.name : typeof error,\n errorStack: error instanceof Error ? (error.stack ?? null) : null\n },\n event: this.props.event,\n level: \"error\",\n source: \"workbench-host\",\n workspaceId: this.props.workspaceId\n });\n void Promise.resolve(result).catch(() => undefined);\n } catch {\n // Rendering recovery must not depend on diagnostics transport.\n }\n }\n\n override render(): ReactNode {\n if (this.state.hasError) {\n return (\n <div\n data-workbench-surface-render-error={this.props.fallbackKind}\n style={{ height: \"100%\", width: \"100%\" }}\n />\n );\n }\n\n return this.props.children;\n }\n}\n\nclass WorkbenchHostNodeRenderErrorBoundary extends Component<\n WorkbenchHostNodeRenderErrorBoundaryProps,\n WorkbenchHostNodeRenderErrorBoundaryState\n> {\n override state: WorkbenchHostNodeRenderErrorBoundaryState = {\n hasError: false\n };\n\n static getDerivedStateFromError(): WorkbenchHostNodeRenderErrorBoundaryState {\n return { hasError: true };\n }\n\n override componentDidUpdate(\n previousProps: WorkbenchHostNodeRenderErrorBoundaryProps\n ): void {\n if (this.state.hasError && previousProps.resetKey !== this.props.resetKey) {\n this.setState({ hasError: false });\n }\n }\n\n override componentDidCatch(error: unknown, info: ErrorInfo): void {\n try {\n const result = this.props.debugDiagnostics?.log?.({\n details: {\n componentStack: info.componentStack ?? null,\n dockEntryId: this.props.node.data.dockEntryId ?? null,\n displayMode: this.props.node.displayMode,\n errorMessage: error instanceof Error ? error.message : String(error),\n errorName: error instanceof Error ? error.name : typeof error,\n errorStack: error instanceof Error ? (error.stack ?? null) : null,\n frame: this.props.node.frame,\n instanceId: this.props.node.data.instanceId,\n instanceKey: this.props.node.data.instanceKey ?? null,\n isMinimized: this.props.node.isMinimized,\n launchSource: this.props.node.data.launchSource ?? null,\n nodeId: this.props.node.id,\n typeId: this.props.node.data.typeId\n },\n event: \"workbench.node.render_error\",\n level: \"error\",\n source: \"workbench-host\",\n workspaceId: this.props.workspaceId\n });\n void Promise.resolve(result).catch(() => undefined);\n } catch {\n // Rendering recovery must not depend on diagnostics transport.\n }\n }\n\n override render(): ReactNode {\n if (this.state.hasError) {\n return (\n <div\n data-workbench-node-render-error=\"true\"\n style={{\n alignItems: \"center\",\n boxSizing: \"border-box\",\n color: \"var(--text-secondary, #6b7280)\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: 8,\n height: \"100%\",\n justifyContent: \"center\",\n padding: 24,\n textAlign: \"center\",\n width: \"100%\"\n }}\n >\n <div\n data-workbench-node-render-error-message=\"true\"\n style={{\n color: \"var(--text-primary, #111827)\",\n fontSize: 14,\n fontWeight: 600\n }}\n >\n This workspace view failed to render.\n </div>\n <div style={{ fontSize: 12 }}>\n Try selecting another conversation or reopen the window.\n </div>\n <button\n type=\"button\"\n onClick={() => this.setState({ hasError: false })}\n style={{\n border: \"1px solid var(--line-2, #d1d5db)\",\n borderRadius: 6,\n background: \"var(--background-fronted, #ffffff)\",\n color: \"var(--text-primary, #111827)\",\n cursor: \"pointer\",\n fontSize: 12,\n fontWeight: 600,\n marginTop: 4,\n padding: \"6px 10px\"\n }}\n >\n Try again\n </button>\n </div>\n );\n }\n\n return this.props.children;\n }\n}\n\nfunction WorkbenchHostNodeBodyRenderer({\n context,\n definition\n}: {\n context: WorkbenchHostNodeBodyContext;\n definition: WorkbenchHostNodeDefinition;\n}): ReactNode {\n return definition.renderBody(context);\n}\n\nfunction WorkbenchHostChromeRenderer({\n context,\n renderChrome\n}: {\n context: WorkbenchHostChromeRenderContext;\n renderChrome: NonNullable<WorkbenchHostProps[\"renderTopChrome\"]>;\n}): ReactNode {\n return renderChrome(context);\n}\n","import {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type Dispatch,\n type FocusEvent as ReactFocusEvent,\n type KeyboardEvent as ReactKeyboardEvent,\n type PointerEvent as ReactPointerEvent,\n type RefObject,\n type SetStateAction\n} from \"react\";\nimport {\n ArrowLeftIcon,\n ArrowRightIcon,\n Button,\n ChevronDownIcon,\n ChevronUpIcon\n} from \"@tutti-os/ui-system\";\nimport type { WorkbenchDockContext } from \"../react/types.ts\";\nimport {\n captureWorkbenchNodePreviewImage,\n readCachedWorkbenchNodePreviewImage,\n writeCachedWorkbenchNodePreviewImage\n} from \"../react/useWorkbenchGenieAnimation.tsx\";\nimport {\n resolveWorkbenchDockEntries,\n resolveWorkbenchDockEntryClick,\n type ResolvedWorkbenchHostDockEntry\n} from \"./dockEntries.ts\";\nimport {\n DOCK_ICON_BASE_SIZE,\n DOCK_ICON_PEAK_SIZE,\n useDockMagnification\n} from \"./dockMagnification.ts\";\nimport {\n resolveWorkbenchHostDockScrollState,\n type WorkbenchHostDockScrollState\n} from \"./dockScrollState.ts\";\nimport { readWorkbenchHostExternalState } from \"./externalState.ts\";\nimport {\n resolveWorkbenchMinimizedDockSlots,\n type WorkbenchMinimizedDockNode,\n type WorkbenchMinimizedDockSlot\n} from \"./minimizedDockSlots.ts\";\nimport { useMinimizedDockStackPromotion } from \"./minimizedDockStackPromotion.ts\";\nimport {\n resolveWorkbenchMinimizedDockRestoreIntent,\n type WorkbenchMinimizedDockRestoreIntent\n} from \"./minimizedDockRestoreIntent.ts\";\nimport {\n WorkbenchHostDockPopup,\n type WorkbenchHostDockPopupAnchorRect,\n type WorkbenchHostDockPopupState\n} from \"./WorkbenchHostDockPopup.tsx\";\nimport type {\n WorkbenchDockPreviewCache,\n WorkbenchDockPreviewCacheKey\n} from \"../react/dockPreviewCache.ts\";\nimport type {\n WorkbenchDockPreviewContent,\n WorkbenchHostDockEntry,\n WorkbenchHostDockEntryStateSource,\n WorkbenchHostExternalStateSource,\n WorkbenchHostHandle,\n WorkbenchHostNodeDefinition,\n WorkbenchHostNodeData,\n WorkbenchHostNodeInstanceStrategy,\n WorkbenchHostProps\n} from \"./types.ts\";\nimport type { createWorkbenchHostI18nRuntime } from \"./workbenchHostI18n.ts\";\n\ntype WorkbenchMinimizedDockNodeSlotRestoreIntent = Extract<\n WorkbenchMinimizedDockRestoreIntent,\n { kind: \"node-slot\" }\n>;\n\ntype WorkbenchMinimizedDockStackPopupCardRestoreIntent = Extract<\n WorkbenchMinimizedDockRestoreIntent,\n { kind: \"stack-popup-card\" }\n>;\n\ntype WorkbenchDockWallpaperTone = \"dark\" | \"light\";\n\nconst minimizedDockPreviewViewport = {\n height: 34.2,\n width: 46.8\n};\n\nfunction stripDockDescriptionTerminalPunctuation(value: string): string {\n const trimmed = value.trim();\n if (!trimmed || trimmed.endsWith(\"...\") || trimmed.endsWith(\"…\")) {\n return trimmed;\n }\n return trimmed.replace(/[。..]+$/u, \"\");\n}\n\nfunction activateDockButtonFromKeyboard(\n event: ReactKeyboardEvent<HTMLElement>,\n disabled = false\n) {\n if (disabled || (event.key !== \"Enter\" && event.key !== \" \")) {\n return;\n }\n\n event.preventDefault();\n event.currentTarget.click();\n}\n\nfunction isDockVisualMutationActive(element: HTMLElement | null): boolean {\n if (!element) {\n return false;\n }\n\n return (\n element.hasAttribute(\"data-dock-pointer-active\") ||\n element.hasAttribute(\"data-dock-hover-panel-open\") ||\n element.querySelector(\n '[data-collapsing=\"true\"], [data-presence=\"entering\"], [data-presence=\"exiting\"], [data-stack-dispatching=\"true\"], [data-promoted-from-stack=\"true\"]'\n ) !== null\n );\n}\n\nexport function WorkbenchHostDock({\n captureNodePreviewImage,\n context,\n debugDiagnostics,\n dockEntries,\n dockPlacement = \"bottom\",\n dockPreviewCache,\n dockStateSource,\n externalStateSource,\n host,\n i18n,\n nodeDefinitions,\n onDockEntryAction,\n onDockEntryClick,\n onMissionControlRequestOpen,\n workspaceId\n}: {\n captureNodePreviewImage?: WorkbenchHostProps[\"captureNodePreviewImage\"];\n context: WorkbenchDockContext<WorkbenchHostNodeData>;\n debugDiagnostics?: WorkbenchHostProps[\"debugDiagnostics\"];\n dockEntries: readonly WorkbenchHostDockEntry[];\n dockPlacement?: WorkbenchHostProps[\"dockPlacement\"];\n dockPreviewCache?: WorkbenchDockPreviewCache;\n dockStateSource?: WorkbenchHostDockEntryStateSource;\n externalStateSource?: WorkbenchHostExternalStateSource;\n host: WorkbenchHostHandle;\n i18n: ReturnType<typeof createWorkbenchHostI18nRuntime>;\n nodeDefinitions: Map<string, WorkbenchHostNodeDefinition>;\n onDockEntryAction?: (input: {\n actionId: string;\n entryId: string;\n host: WorkbenchHostHandle;\n }) => Promise<void> | void;\n onDockEntryClick?: (input: {\n entryId: string;\n host: WorkbenchHostHandle;\n nodeId?: string;\n }) => Promise<void> | void;\n onMissionControlRequestOpen?: WorkbenchHostProps[\"onMissionControlRequestOpen\"];\n workspaceId: string;\n}) {\n const minimizedNodeIDs = useMemo(\n () => new Set(context.minimizedNodes.map((node) => node.id)),\n [context.minimizedNodes]\n );\n const dockMeasureRef = useRef<HTMLDivElement | null>(null);\n const dockItemsRef = useRef<HTMLDivElement | null>(null);\n const hoverPanelRef = useRef<HTMLDivElement | null>(null);\n const hoverPanelCloseTimerRef = useRef<ReturnType<typeof setTimeout> | null>(\n null\n );\n const hoverPanelOpenTimerRef = useRef<ReturnType<typeof setTimeout> | null>(\n null\n );\n const labelTooltipOpenTimerRef = useRef<ReturnType<typeof setTimeout> | null>(\n null\n );\n const hoverPanelScheduledPointRef = useRef<{\n clientX: number;\n clientY: number;\n } | null>(null);\n const labelTooltipScheduledPointRef = useRef<{\n clientX: number;\n clientY: number;\n } | null>(null);\n const hoverPanelRestTargetRef = useRef<{\n anchorKey: string;\n entryId: string;\n } | null>(null);\n const activeHoverPanelRef = useRef<WorkbenchHostDockHoverPanelState | null>(\n null\n );\n const activeLabelTooltipRef =\n useRef<WorkbenchHostDockLabelTooltipState | null>(null);\n const pendingDockStateRefreshRef = useRef(false);\n const slotRefs = useRef(new Map<string, HTMLElement>());\n const wallpaperToneElementRefs = useRef(new Map<string, HTMLElement>());\n const dockSlotRefCallbacksRef = useRef(\n new Map<string, (element: HTMLElement | null) => void>()\n );\n const previousAttentionTokenByEntryId = useRef(new Map<string, unknown>());\n const dockEntryClickThrottleUntilRef = useRef(new Map<string, number>());\n const attentionTimeouts = useRef(\n new Map<string, ReturnType<typeof setTimeout>>()\n );\n const [activeAttentionEntryIds, setActiveAttentionEntryIds] = useState<\n Set<string>\n >(new Set());\n const [activePopup, setActivePopup] =\n useState<WorkbenchHostDockPopupState | null>(null);\n const [activeHoverPanel, setActiveHoverPanel] =\n useState<WorkbenchHostDockHoverPanelState | null>(null);\n const [activeLabelTooltip, setActiveLabelTooltip] =\n useState<WorkbenchHostDockLabelTooltipState | null>(null);\n const [activeMinimizedStackPopup, setActiveMinimizedStackPopup] =\n useState<WorkbenchHostDockPopupAnchorRect | null>(null);\n const [pendingActionKeys, setPendingActionKeys] = useState<Set<string>>(\n () => new Set()\n );\n const [dockFrameSize, setDockFrameSize] = useState<number | null>(null);\n const { triggerDockBounce } = useDockBounce(slotRefs);\n const [dockScrollState, setDockScrollState] =\n useState<WorkbenchHostDockScrollState>(() => ({\n canScrollBackward: false,\n canScrollForward: false,\n hasOverflow: false\n }));\n const [dockStateRevision, setDockStateRevision] = useState(0);\n const [externalStateRevision, setExternalStateRevision] = useState(0);\n const [\n collapsingMinimizedLaunchAnchorKeys,\n setCollapsingMinimizedLaunchAnchorKeys\n ] = useState<Set<string>>(() => new Set());\n const collapsingMinimizedLaunchTimerRef = useRef(\n new Map<string, ReturnType<typeof setTimeout>>()\n );\n\n const clearHoverPanelCloseTimer = useCallback(() => {\n if (hoverPanelCloseTimerRef.current === null) {\n return;\n }\n clearTimeout(hoverPanelCloseTimerRef.current);\n hoverPanelCloseTimerRef.current = null;\n }, []);\n\n const clearHoverPanelOpenTimer = useCallback(() => {\n if (hoverPanelOpenTimerRef.current === null) {\n return;\n }\n clearTimeout(hoverPanelOpenTimerRef.current);\n hoverPanelOpenTimerRef.current = null;\n hoverPanelScheduledPointRef.current = null;\n }, []);\n\n const clearLabelTooltipOpenTimer = useCallback(() => {\n if (labelTooltipOpenTimerRef.current === null) {\n return;\n }\n clearTimeout(labelTooltipOpenTimerRef.current);\n labelTooltipOpenTimerRef.current = null;\n labelTooltipScheduledPointRef.current = null;\n }, []);\n\n useEffect(\n () => () => {\n clearHoverPanelCloseTimer();\n clearHoverPanelOpenTimer();\n clearLabelTooltipOpenTimer();\n for (const timer of collapsingMinimizedLaunchTimerRef.current.values()) {\n clearTimeout(timer);\n }\n collapsingMinimizedLaunchTimerRef.current.clear();\n },\n [\n clearHoverPanelCloseTimer,\n clearHoverPanelOpenTimer,\n clearLabelTooltipOpenTimer\n ]\n );\n\n const clearCollapsingMinimizedLaunch = useCallback((anchorKey: string) => {\n const timer = collapsingMinimizedLaunchTimerRef.current.get(anchorKey);\n if (timer) {\n clearTimeout(timer);\n collapsingMinimizedLaunchTimerRef.current.delete(anchorKey);\n }\n const slotElement = slotRefs.current.get(anchorKey);\n slotElement?.removeAttribute(\"data-collapsing\");\n slotElement?.style.removeProperty(\"--desktop-dock-collapse-inline-size\");\n slotElement?.style.removeProperty(\"--desktop-dock-collapse-block-size\");\n setCollapsingMinimizedLaunchAnchorKeys((current) => {\n if (!current.has(anchorKey)) {\n return current;\n }\n const next = new Set(current);\n next.delete(anchorKey);\n return next;\n });\n }, []);\n\n const scheduleCollapsingMinimizedLaunchClear = useCallback(\n (anchorKey: string) => {\n const existing = collapsingMinimizedLaunchTimerRef.current.get(anchorKey);\n if (existing) {\n clearTimeout(existing);\n }\n collapsingMinimizedLaunchTimerRef.current.set(\n anchorKey,\n setTimeout(() => {\n clearCollapsingMinimizedLaunch(anchorKey);\n }, minimizedDockSlotLayoutAnimationMs)\n );\n },\n [clearCollapsingMinimizedLaunch]\n );\n\n useLayoutEffect(() => {\n const element = dockMeasureRef.current;\n if (!element || typeof window === \"undefined\") {\n return undefined;\n }\n\n let frameId: number | null = null;\n const updateDockFrameSize = () => {\n frameId = null;\n if (isDockVisualMutationActive(dockMeasureRef.current)) {\n return;\n }\n const rect = element.getBoundingClientRect();\n const nextSize = Math.ceil(\n (dockPlacement === \"left\" ? rect.height : rect.width) +\n desktopDockPlateChromeWidth\n );\n setDockFrameSize((current) =>\n current === nextSize ? current : nextSize\n );\n };\n const scheduleUpdate = () => {\n if (frameId !== null) {\n return;\n }\n frameId = window.requestAnimationFrame(updateDockFrameSize);\n };\n\n updateDockFrameSize();\n\n const resizeObserver =\n typeof ResizeObserver === \"undefined\"\n ? null\n : new ResizeObserver(scheduleUpdate);\n resizeObserver?.observe(element);\n window.addEventListener(\"resize\", scheduleUpdate);\n\n return () => {\n if (frameId !== null) {\n window.cancelAnimationFrame(frameId);\n }\n resizeObserver?.disconnect();\n window.removeEventListener(\"resize\", scheduleUpdate);\n };\n }, [dockPlacement]);\n\n const flushPendingDockStateRefresh = useCallback(() => {\n if (!pendingDockStateRefreshRef.current) {\n return;\n }\n pendingDockStateRefreshRef.current = false;\n setDockStateRevision((revision) => revision + 1);\n }, []);\n\n useEffect(() => {\n if (!dockStateSource) {\n return undefined;\n }\n return dockStateSource.subscribe(() => {\n if (isDockVisualMutationActive(dockMeasureRef.current)) {\n pendingDockStateRefreshRef.current = true;\n return;\n }\n setDockStateRevision((revision) => revision + 1);\n });\n }, [dockStateSource]);\n\n const renderedDockEntries = useMemo(\n () =>\n dockEntries.map((entry) => {\n const dynamicState = dockStateSource?.getEntryState(entry.id);\n return dynamicState ? { ...entry, ...dynamicState } : entry;\n }),\n [dockEntries, dockStateRevision, dockStateSource]\n );\n const resolvedEntries = useMemo(\n () =>\n resolveWorkbenchDockEntries({\n dockEntries: renderedDockEntries,\n minimizedNodeIds: minimizedNodeIDs,\n nodes: context.nodes\n }),\n [context.nodes, minimizedNodeIDs, renderedDockEntries]\n );\n const minimizedDockSlots = useMemo(\n () =>\n resolveWorkbenchMinimizedDockSlots({\n nodeDefinitions,\n nodes: context.minimizedNodes\n }),\n [context.minimizedNodes, nodeDefinitions]\n );\n const { promotedNodeId, stackDispatching } =\n useMinimizedDockStackPromotion(minimizedDockSlots);\n const dockItems = useMemo(\n () =>\n createWorkbenchHostDockItems({\n minimizedDockSlots,\n resolvedEntries\n }),\n [minimizedDockSlots, resolvedEntries]\n );\n const presentDockItems = useDockPresenceItems(dockItems, (nodeId) =>\n context.genie.shouldAnimateMinimizedDockEnter(nodeId)\n );\n const presentDockItemKeys = useMemo(\n () => presentDockItems.map((item) => item.key).join(\"\\n\"),\n [presentDockItems]\n );\n const wallpaperTones = useDockWallpaperTones({\n dockItemsRef,\n elementRefs: wallpaperToneElementRefs,\n itemKeys: presentDockItemKeys\n });\n const dockWidth = useMemo(\n () => resolveWorkbenchHostDockItemsWidth(dockItems),\n [dockItems]\n );\n const {\n clearSlotMagnification,\n handlePointerLeave: handleDockPointerLeave,\n handlePointerMove: handleDockPointerMove,\n pauseMagnification: pauseDockMagnification,\n resetMagnification: resetDockMagnification\n } = useDockMagnification({\n dockPlacement,\n dockRootRef: dockMeasureRef,\n slotRefs\n });\n const clearSlotMagnificationRef = useRef<(anchorKey: string) => void>(() => {\n return;\n });\n const registerDockAnchorRef = useRef(\n (anchorKey: string, element: HTMLElement | null) => {\n context.genie.registerDockAnchor(anchorKey, element);\n }\n );\n clearSlotMagnificationRef.current = (anchorKey) => {\n clearSlotMagnification(anchorKey);\n };\n registerDockAnchorRef.current = (anchorKey, element) => {\n context.genie.registerDockAnchor(anchorKey, element);\n };\n const registerWallpaperToneElement = useCallback(\n (key: string) => (element: HTMLElement | null) => {\n if (element) {\n wallpaperToneElementRefs.current.set(key, element);\n return;\n }\n wallpaperToneElementRefs.current.delete(key);\n },\n []\n );\n\n const setDockHoverPanelOpen = useCallback((open: boolean) => {\n if (open) {\n dockMeasureRef.current?.setAttribute(\n \"data-dock-hover-panel-open\",\n \"true\"\n );\n return;\n }\n dockMeasureRef.current?.removeAttribute(\"data-dock-hover-panel-open\");\n }, []);\n\n useEffect(() => {\n activeHoverPanelRef.current = activeHoverPanel;\n }, [activeHoverPanel]);\n\n useEffect(() => {\n activeLabelTooltipRef.current = activeLabelTooltip;\n }, [activeLabelTooltip]);\n\n const closeLabelTooltipImmediate = useCallback(\n (targetKey?: string) => {\n clearLabelTooltipOpenTimer();\n if (\n targetKey !== undefined &&\n activeLabelTooltipRef.current?.key !== targetKey\n ) {\n return;\n }\n if (activeLabelTooltipRef.current === null) {\n return;\n }\n activeLabelTooltipRef.current = null;\n setActiveLabelTooltip(null);\n },\n [clearLabelTooltipOpenTimer]\n );\n\n const closeHoverPanelImmediate = useCallback(\n (entryId?: string) => {\n clearHoverPanelOpenTimer();\n clearHoverPanelCloseTimer();\n if (\n entryId !== undefined &&\n activeHoverPanelRef.current?.entryId !== entryId\n ) {\n return;\n }\n if (activeHoverPanelRef.current === null) {\n return;\n }\n hoverPanelRestTargetRef.current = null;\n setDockHoverPanelOpen(false);\n activeHoverPanelRef.current = null;\n setActiveHoverPanel(null);\n flushPendingDockStateRefresh();\n },\n [\n clearHoverPanelCloseTimer,\n clearHoverPanelOpenTimer,\n flushPendingDockStateRefresh,\n setDockHoverPanelOpen\n ]\n );\n\n const scheduleHoverPanelClose = useCallback(\n (entryId?: string) => {\n clearHoverPanelOpenTimer();\n clearHoverPanelCloseTimer();\n hoverPanelCloseTimerRef.current = setTimeout(() => {\n hoverPanelCloseTimerRef.current = null;\n closeHoverPanelImmediate(entryId);\n handleDockPointerLeave();\n }, dockHoverPanelCloseDelayMs);\n },\n [\n clearHoverPanelCloseTimer,\n clearHoverPanelOpenTimer,\n closeHoverPanelImmediate,\n handleDockPointerLeave\n ]\n );\n\n const showHoverPanel = useCallback(\n (entryId: string, anchorKey: string, anchorElement: HTMLElement): void => {\n const dockElement = dockMeasureRef.current;\n if (!dockElement) {\n return;\n }\n\n pauseDockMagnification();\n const dockRect = dockElement.getBoundingClientRect();\n const anchorRect = anchorElement.getBoundingClientRect();\n clearHoverPanelCloseTimer();\n const nextHoverPanel = {\n anchorKey,\n anchorRect: {\n height: anchorRect.height,\n left: anchorRect.left - dockRect.left,\n top: anchorRect.top - dockRect.top,\n width: anchorRect.width\n },\n entryId\n };\n setDockHoverPanelOpen(true);\n activeHoverPanelRef.current = nextHoverPanel;\n setActiveHoverPanel(nextHoverPanel);\n },\n [clearHoverPanelCloseTimer, pauseDockMagnification, setDockHoverPanelOpen]\n );\n\n const scheduleHoverPanelAfterRest = useCallback(\n (entryId: string, anchorKey: string) => {\n hoverPanelRestTargetRef.current = { anchorKey, entryId };\n clearHoverPanelOpenTimer();\n hoverPanelScheduledPointRef.current = null;\n hoverPanelOpenTimerRef.current = setTimeout(() => {\n hoverPanelOpenTimerRef.current = null;\n hoverPanelScheduledPointRef.current = null;\n const pending = hoverPanelRestTargetRef.current;\n if (!pending || pending.entryId !== entryId) {\n return;\n }\n const slotElement = slotRefs.current.get(anchorKey);\n if (!slotElement) {\n return;\n }\n showHoverPanel(entryId, anchorKey, slotElement);\n }, dockHoverPanelOpenDelayMs);\n },\n [clearHoverPanelOpenTimer, showHoverPanel]\n );\n\n const showLabelTooltip = useCallback(\n (\n target: WorkbenchHostDockLabelTooltipTarget,\n anchorKey: string,\n anchorElement: HTMLElement\n ): void => {\n const dockElement = dockMeasureRef.current;\n if (!dockElement) {\n return;\n }\n\n const dockRect = dockElement.getBoundingClientRect();\n const anchorRect = resolveDockLabelTooltipAnchorRect({\n dockPlacement,\n slotElement: anchorElement\n });\n clearLabelTooltipOpenTimer();\n const nextTooltip = {\n anchorKey,\n anchorRect: {\n height: anchorRect.height,\n left: anchorRect.left - dockRect.left,\n top: anchorRect.top - dockRect.top,\n width: anchorRect.width\n },\n key: target.key,\n label: target.label\n };\n activeLabelTooltipRef.current = nextTooltip;\n setActiveLabelTooltip(nextTooltip);\n },\n [clearLabelTooltipOpenTimer, dockPlacement]\n );\n\n const scheduleLabelTooltipAfterRest = useCallback(\n (target: WorkbenchHostDockLabelTooltipTarget, anchorKey: string) => {\n clearLabelTooltipOpenTimer();\n labelTooltipScheduledPointRef.current = null;\n labelTooltipOpenTimerRef.current = setTimeout(() => {\n labelTooltipOpenTimerRef.current = null;\n labelTooltipScheduledPointRef.current = null;\n const slotElement = slotRefs.current.get(anchorKey);\n if (!slotElement) {\n return;\n }\n showLabelTooltip(target, anchorKey, slotElement);\n }, dockHoverPanelOpenDelayMs);\n },\n [clearLabelTooltipOpenTimer, showLabelTooltip]\n );\n\n const resolveHoverPanelTargetAtPoint = useCallback(\n (\n clientX: number,\n clientY: number\n ): {\n anchorKey: string;\n entryId: string;\n slotElement: HTMLElement;\n } | null => {\n for (const [anchorKey, slotElement] of slotRefs.current) {\n const entryId = slotElement.dataset.dockHoverPanelEntryId;\n if (!entryId) {\n continue;\n }\n\n const rect = slotElement.getBoundingClientRect();\n if (\n clientX >= rect.left - dockHoverPanelHitSlopPx &&\n clientX <= rect.right + dockHoverPanelHitSlopPx &&\n clientY >= rect.top - dockHoverPanelHitSlopPx &&\n clientY <= rect.bottom + dockHoverPanelHitSlopPx\n ) {\n return { anchorKey, entryId, slotElement };\n }\n }\n return null;\n },\n []\n );\n\n const resolveLabelTooltipTargetAtPoint = useCallback(\n (\n clientX: number,\n clientY: number\n ): {\n anchorKey: string;\n slotElement: HTMLElement;\n target: WorkbenchHostDockLabelTooltipTarget;\n } | null => {\n for (const [anchorKey, slotElement] of slotRefs.current) {\n if (slotElement.dataset.dockHoverPanelEntryId) {\n continue;\n }\n const key = slotElement.dataset.dockLabelTooltipKey;\n const label = slotElement.dataset.dockLabelTooltipLabel?.trim() ?? \"\";\n if (!key || !label) {\n continue;\n }\n\n const rect = slotElement.getBoundingClientRect();\n if (\n clientX >= rect.left - dockHoverPanelHitSlopPx &&\n clientX <= rect.right + dockHoverPanelHitSlopPx &&\n clientY >= rect.top - dockHoverPanelHitSlopPx &&\n clientY <= rect.bottom + dockHoverPanelHitSlopPx\n ) {\n return {\n anchorKey,\n slotElement,\n target: {\n key,\n label\n }\n };\n }\n }\n return null;\n },\n []\n );\n\n const isPointerInsideActiveHoverPanelRegion = useCallback(\n (clientX: number, clientY: number): boolean => {\n const activeHoverPanel = activeHoverPanelRef.current;\n if (!activeHoverPanel) {\n return false;\n }\n\n const anchorSlot = slotRefs.current.get(activeHoverPanel.anchorKey);\n const panel = hoverPanelRef.current;\n if (\n !anchorSlot ||\n !panel ||\n !anchorSlot.isConnected ||\n !panel.isConnected\n ) {\n return false;\n }\n\n const anchorRect = anchorSlot.getBoundingClientRect();\n const panelRect = panel.getBoundingClientRect();\n return (\n rectContainsPoint(\n anchorRect,\n clientX,\n clientY,\n dockHoverPanelHitSlopPx\n ) ||\n rectContainsPoint(\n panelRect,\n clientX,\n clientY,\n dockHoverPanelHitSlopPx\n ) ||\n rectContainsPoint(\n createHoverPanelBridgeRect(anchorRect, panelRect),\n clientX,\n clientY,\n dockHoverPanelBridgeSlopPx\n )\n );\n },\n []\n );\n\n const scheduleHoverPanelAtPointAfterRest = useCallback(\n (clientX: number, clientY: number) => {\n const scheduledPoint = hoverPanelScheduledPointRef.current;\n if (\n hoverPanelOpenTimerRef.current !== null &&\n scheduledPoint &&\n Math.abs(clientX - scheduledPoint.clientX) <=\n dockHoverPanelPointerRestTolerancePx &&\n Math.abs(clientY - scheduledPoint.clientY) <=\n dockHoverPanelPointerRestTolerancePx\n ) {\n return;\n }\n\n clearHoverPanelOpenTimer();\n hoverPanelScheduledPointRef.current = { clientX, clientY };\n hoverPanelOpenTimerRef.current = setTimeout(() => {\n hoverPanelOpenTimerRef.current = null;\n hoverPanelScheduledPointRef.current = null;\n if (activeHoverPanelRef.current !== null) {\n return;\n }\n const target = resolveHoverPanelTargetAtPoint(clientX, clientY);\n if (!target) {\n hoverPanelRestTargetRef.current = null;\n return;\n }\n hoverPanelRestTargetRef.current = {\n anchorKey: target.anchorKey,\n entryId: target.entryId\n };\n showHoverPanel(target.entryId, target.anchorKey, target.slotElement);\n }, dockHoverPanelOpenDelayMs);\n },\n [clearHoverPanelOpenTimer, resolveHoverPanelTargetAtPoint, showHoverPanel]\n );\n\n const scheduleLabelTooltipAtPointAfterRest = useCallback(\n (clientX: number, clientY: number) => {\n if (activeLabelTooltipRef.current !== null) {\n return;\n }\n\n const scheduledPoint = labelTooltipScheduledPointRef.current;\n if (\n labelTooltipOpenTimerRef.current !== null &&\n scheduledPoint &&\n Math.abs(clientX - scheduledPoint.clientX) <=\n dockHoverPanelPointerRestTolerancePx &&\n Math.abs(clientY - scheduledPoint.clientY) <=\n dockHoverPanelPointerRestTolerancePx\n ) {\n return;\n }\n\n clearLabelTooltipOpenTimer();\n labelTooltipScheduledPointRef.current = { clientX, clientY };\n labelTooltipOpenTimerRef.current = setTimeout(() => {\n labelTooltipOpenTimerRef.current = null;\n labelTooltipScheduledPointRef.current = null;\n if (activeHoverPanelRef.current !== null) {\n return;\n }\n const target = resolveLabelTooltipTargetAtPoint(clientX, clientY);\n if (!target) {\n return;\n }\n showLabelTooltip(target.target, target.anchorKey, target.slotElement);\n }, dockHoverPanelOpenDelayMs);\n },\n [\n clearLabelTooltipOpenTimer,\n resolveLabelTooltipTargetAtPoint,\n showLabelTooltip\n ]\n );\n\n const beginDockIconInteraction = useCallback(\n (anchorKey: string) => {\n hoverPanelRestTargetRef.current = null;\n clearHoverPanelOpenTimer();\n closeLabelTooltipImmediate();\n closeHoverPanelImmediate();\n triggerDockBounce(anchorKey);\n },\n [\n clearHoverPanelOpenTimer,\n closeHoverPanelImmediate,\n closeLabelTooltipImmediate,\n triggerDockBounce\n ]\n );\n\n const isDockEntryClickThrottled = useCallback(\n (anchorKey: string): boolean => {\n const throttledUntil =\n dockEntryClickThrottleUntilRef.current.get(anchorKey);\n return throttledUntil !== undefined && Date.now() < throttledUntil;\n },\n []\n );\n\n const claimDockEntryClick = useCallback((anchorKey: string): void => {\n dockEntryClickThrottleUntilRef.current.set(\n anchorKey,\n Date.now() + DOCK_ENTRY_CLICK_THROTTLE_MS\n );\n }, []);\n\n const beginDockMinimizedInteraction = useCallback(\n (anchorKey?: string): boolean => {\n hoverPanelRestTargetRef.current = null;\n clearHoverPanelOpenTimer();\n clearLabelTooltipOpenTimer();\n closeLabelTooltipImmediate();\n closeHoverPanelImmediate();\n pauseDockMagnification();\n\n if (!anchorKey) {\n return false;\n }\n const slotElement = slotRefs.current.get(anchorKey);\n if (!slotElement) {\n return false;\n }\n clearSlotMagnification(anchorKey);\n if (slotElement.dataset.collapsing === \"true\") {\n return true;\n }\n const rect = slotElement.getBoundingClientRect();\n slotElement.style.setProperty(\n \"--desktop-dock-collapse-inline-size\",\n `${rect.width}px`\n );\n slotElement.style.setProperty(\n \"--desktop-dock-collapse-block-size\",\n `${rect.height}px`\n );\n slotElement.dataset.collapsing = \"true\";\n return true;\n },\n [\n clearHoverPanelOpenTimer,\n clearLabelTooltipOpenTimer,\n clearSlotMagnification,\n closeHoverPanelImmediate,\n closeLabelTooltipImmediate,\n pauseDockMagnification\n ]\n );\n\n const runDockMinimizedLaunchAfterCollapse = useCallback(\n (\n intent: WorkbenchMinimizedDockNodeSlotRestoreIntent,\n launch: (intent: WorkbenchMinimizedDockNodeSlotRestoreIntent) => void\n ) => {\n const { anchorKey } = intent;\n beginDockMinimizedInteraction(anchorKey);\n setCollapsingMinimizedLaunchAnchorKeys((current) => {\n const next = new Set(current);\n next.add(anchorKey);\n return next;\n });\n scheduleCollapsingMinimizedLaunchClear(anchorKey);\n launch(intent);\n },\n [beginDockMinimizedInteraction, scheduleCollapsingMinimizedLaunchClear]\n );\n\n const runDockMinimizedStackLaunch = useCallback(\n (\n intent: WorkbenchMinimizedDockStackPopupCardRestoreIntent,\n launch: (\n intent: WorkbenchMinimizedDockStackPopupCardRestoreIntent\n ) => void\n ) => {\n beginDockMinimizedInteraction();\n launch(intent);\n },\n [beginDockMinimizedInteraction]\n );\n\n const handleDockPointerTravel = useCallback(\n (clientX: number, clientY: number) => {\n if (activeHoverPanelRef.current !== null) {\n closeLabelTooltipImmediate();\n if (isPointerInsideActiveHoverPanelRegion(clientX, clientY)) {\n clearHoverPanelCloseTimer();\n return;\n }\n scheduleHoverPanelClose(activeHoverPanelRef.current.entryId);\n handleDockPointerLeave();\n return;\n }\n\n const activeLabelTooltip = activeLabelTooltipRef.current;\n if (activeLabelTooltip) {\n const target = resolveLabelTooltipTargetAtPoint(clientX, clientY);\n if (target?.target.key !== activeLabelTooltip.key) {\n closeLabelTooltipImmediate(activeLabelTooltip.key);\n }\n }\n\n handleDockPointerMove(clientX, clientY);\n scheduleHoverPanelAtPointAfterRest(clientX, clientY);\n scheduleLabelTooltipAtPointAfterRest(clientX, clientY);\n },\n [\n clearHoverPanelCloseTimer,\n closeLabelTooltipImmediate,\n handleDockPointerMove,\n handleDockPointerLeave,\n isPointerInsideActiveHoverPanelRegion,\n resolveLabelTooltipTargetAtPoint,\n scheduleHoverPanelClose,\n scheduleHoverPanelAtPointAfterRest,\n scheduleLabelTooltipAtPointAfterRest\n ]\n );\n\n const updateDockScrollState = useCallback(() => {\n const scrollElement = dockItemsRef.current;\n const viewportElement = dockMeasureRef.current;\n if (!scrollElement || !viewportElement) {\n setDockScrollState((current) =>\n current.hasOverflow ||\n current.canScrollBackward ||\n current.canScrollForward\n ? {\n canScrollBackward: false,\n canScrollForward: false,\n hasOverflow: false\n }\n : current\n );\n return;\n }\n\n const isVertical = dockPlacement === \"left\";\n const viewportSize = isVertical\n ? viewportElement.clientHeight\n : viewportElement.clientWidth;\n const scrollSize = isVertical\n ? scrollElement.scrollHeight\n : scrollElement.scrollWidth;\n const scrollOffset = isVertical\n ? scrollElement.scrollTop\n : scrollElement.scrollLeft;\n const nextState = resolveWorkbenchHostDockScrollState({\n contentSize: dockWidth,\n scrollOffset,\n scrollSize,\n viewportSize\n });\n\n setDockScrollState((current) =>\n current.canScrollBackward === nextState.canScrollBackward &&\n current.canScrollForward === nextState.canScrollForward &&\n current.hasOverflow === nextState.hasOverflow\n ? current\n : nextState\n );\n }, [dockPlacement, dockWidth]);\n\n useLayoutEffect(() => {\n const element = dockItemsRef.current;\n if (!element || typeof window === \"undefined\") {\n return undefined;\n }\n\n let frameId: number | null = null;\n const scheduleUpdate = () => {\n if (isDockVisualMutationActive(dockMeasureRef.current)) {\n return;\n }\n if (frameId !== null) {\n return;\n }\n frameId = window.requestAnimationFrame(() => {\n frameId = null;\n updateDockScrollState();\n });\n };\n\n updateDockScrollState();\n\n const resizeObserver =\n typeof ResizeObserver === \"undefined\"\n ? null\n : new ResizeObserver(scheduleUpdate);\n resizeObserver?.observe(element);\n window.addEventListener(\"resize\", scheduleUpdate);\n element.addEventListener(\"scroll\", scheduleUpdate, { passive: true });\n\n return () => {\n if (frameId !== null) {\n window.cancelAnimationFrame(frameId);\n }\n resizeObserver?.disconnect();\n window.removeEventListener(\"resize\", scheduleUpdate);\n element.removeEventListener(\"scroll\", scheduleUpdate);\n };\n }, [dockPlacement, presentDockItems.length, updateDockScrollState]);\n\n const hasMinimizedPreviewCapture = minimizedDockSlots.some((slot) =>\n minimizedDockSlotNodes(slot).some((node) =>\n (() => {\n if (context.genie.isPendingMinimizedDockNode(node.id)) {\n return false;\n }\n const minimizedDock = nodeDefinitions.get(node.data.typeId)?.window\n ?.minimizedDock;\n return (\n minimizedDock?.kind === \"snapshot\" &&\n Boolean(minimizedDock.capturePreview)\n );\n })()\n )\n );\n\n useEffect(() => {\n const shouldSubscribe = activePopup !== null || hasMinimizedPreviewCapture;\n if (!shouldSubscribe || !externalStateSource?.subscribe) {\n return undefined;\n }\n return externalStateSource.subscribe(() => {\n setExternalStateRevision((revision) => revision + 1);\n });\n }, [activePopup, externalStateSource, hasMinimizedPreviewCapture]);\n\n useEffect(() => {\n const nextAttentionIds = new Set<string>();\n\n for (const entry of renderedDockEntries) {\n const nextToken = entry.attentionToken ?? null;\n const previousToken =\n previousAttentionTokenByEntryId.current.get(entry.id) ?? null;\n if (nextToken !== null && nextToken !== previousToken) {\n nextAttentionIds.add(entry.id);\n }\n previousAttentionTokenByEntryId.current.set(entry.id, nextToken);\n }\n\n if (nextAttentionIds.size === 0) {\n return;\n }\n\n setActiveAttentionEntryIds((current) => {\n const next = new Set(current);\n for (const entryId of nextAttentionIds) {\n next.add(entryId);\n }\n return next;\n });\n\n for (const entryId of nextAttentionIds) {\n const existingTimeout = attentionTimeouts.current.get(entryId);\n if (existingTimeout) {\n globalThis.clearTimeout(existingTimeout);\n }\n attentionTimeouts.current.set(\n entryId,\n globalThis.setTimeout(() => {\n attentionTimeouts.current.delete(entryId);\n setActiveAttentionEntryIds((current) => {\n if (!current.has(entryId)) {\n return current;\n }\n const next = new Set(current);\n next.delete(entryId);\n return next;\n });\n }, 900)\n );\n }\n }, [renderedDockEntries]);\n\n useEffect(\n () => () => {\n for (const timeout of attentionTimeouts.current.values()) {\n globalThis.clearTimeout(timeout);\n }\n attentionTimeouts.current.clear();\n },\n []\n );\n\n const captureMinimizedNodePreview = useCallback(\n async (node: WorkbenchMinimizedDockNode) => {\n const minimizedDock = nodeDefinitions.get(node.data.typeId)?.window\n ?.minimizedDock;\n const capturePreview =\n minimizedDock?.kind === \"snapshot\"\n ? minimizedDock.capturePreview\n : undefined;\n const externalState = readWorkbenchHostExternalState({\n externalStateSource,\n node,\n workspaceId\n });\n return (\n (await Promise.resolve(\n capturePreview?.({\n externalNodeState: externalState.externalNodeState,\n externalWorkspaceState: externalState.externalWorkspaceState,\n host,\n isFocused: context.focusedNodeId === node.id,\n isMinimized: node.isMinimized,\n node\n }) ?? null\n ).catch(() => null)) ??\n (await Promise.resolve(captureNodePreviewImage?.(node) ?? null).catch(\n () => null\n ))\n );\n },\n [\n captureNodePreviewImage,\n context.focusedNodeId,\n externalStateRevision,\n externalStateSource,\n nodeDefinitions,\n workspaceId\n ]\n );\n\n const provideMinimizedNodePreview = useCallback(\n (node: WorkbenchMinimizedDockNode): WorkbenchDockPreviewContent | null => {\n const minimizedDock = nodeDefinitions.get(node.data.typeId)?.window\n ?.minimizedDock;\n if (minimizedDock?.kind !== \"component\") {\n return null;\n }\n\n const externalState = readWorkbenchHostExternalState({\n externalStateSource,\n node,\n workspaceId\n });\n return minimizedDock.providePreview({\n externalNodeState: externalState.externalNodeState,\n externalWorkspaceState: externalState.externalWorkspaceState,\n host,\n isFocused: context.focusedNodeId === node.id,\n isMinimized: node.isMinimized,\n node,\n previewViewport: minimizedDockPreviewViewport\n });\n },\n [\n context.focusedNodeId,\n externalStateSource,\n host,\n nodeDefinitions,\n workspaceId\n ]\n );\n\n const provideMinimizedNodePreviewForNode = useCallback(\n (node: WorkbenchMinimizedDockNode) => {\n const minimizedDock = nodeDefinitions.get(node.data.typeId)?.window\n ?.minimizedDock;\n return minimizedDock?.kind === \"component\"\n ? provideMinimizedNodePreview\n : undefined;\n },\n [nodeDefinitions, provideMinimizedNodePreview]\n );\n\n if (dockItems.length === 0 && presentDockItems.length === 0) {\n return null;\n }\n\n const closePopup = () => {\n clearHoverPanelCloseTimer();\n clearHoverPanelOpenTimer();\n clearLabelTooltipOpenTimer();\n hoverPanelRestTargetRef.current = null;\n setDockHoverPanelOpen(false);\n setActivePopup(null);\n setActiveHoverPanel(null);\n closeLabelTooltipImmediate();\n setActiveMinimizedStackPopup(null);\n };\n\n const scrollDockItems = (direction: WorkbenchHostDockScrollDirection) => {\n const element = dockItemsRef.current;\n if (!element) {\n return;\n }\n\n resetDockMagnification();\n closeHoverPanelImmediate();\n closeLabelTooltipImmediate();\n hoverPanelRestTargetRef.current = null;\n\n const isVertical = dockPlacement === \"left\";\n const viewportSize = isVertical\n ? element.clientHeight\n : element.clientWidth;\n const delta =\n Math.max(DOCK_ICON_PEAK_SIZE * 2, viewportSize * 0.72) *\n (direction === \"forward\" ? 1 : -1);\n\n element.scrollBy({\n behavior: \"smooth\",\n left: isVertical ? 0 : delta,\n top: isVertical ? delta : 0\n });\n };\n\n const registerDockSlot = useCallback((anchorKey: string) => {\n const existing = dockSlotRefCallbacksRef.current.get(anchorKey);\n if (existing) {\n return existing;\n }\n\n const callback = (element: HTMLElement | null) => {\n if (element) {\n slotRefs.current.set(anchorKey, element);\n wallpaperToneElementRefs.current.set(anchorKey, element);\n } else {\n slotRefs.current.delete(anchorKey);\n wallpaperToneElementRefs.current.delete(anchorKey);\n if (!dockMeasureRef.current?.hasAttribute(\"data-dock-pointer-active\")) {\n clearSlotMagnificationRef.current(anchorKey);\n }\n }\n registerDockAnchorRef.current(anchorKey, element);\n };\n dockSlotRefCallbacksRef.current.set(anchorKey, callback);\n return callback;\n }, []);\n\n const runDockEntryAction = useCallback(\n (entryId: string, actionId: string) => {\n const actionKey = dockActionKey(entryId, actionId);\n if (pendingActionKeys.has(actionKey)) {\n return;\n }\n setPendingActionKeys((current) => {\n const next = new Set(current);\n next.add(actionKey);\n return next;\n });\n void (async () => {\n try {\n await onDockEntryAction?.({\n actionId,\n entryId,\n host\n });\n } catch {\n // Keep dock action failures contained.\n } finally {\n setPendingActionKeys((current) => {\n if (!current.has(actionKey)) {\n return current;\n }\n const next = new Set(current);\n next.delete(actionKey);\n return next;\n });\n }\n })();\n },\n [host, onDockEntryAction, pendingActionKeys]\n );\n\n const popupEntry =\n activePopup === null\n ? null\n : (resolvedEntries.find(\n (entry) => entry.entry.id === activePopup.entryId\n ) ?? null);\n const activeMinimizedStackSlot =\n activeMinimizedStackPopup === null\n ? null\n : (minimizedDockSlots.find(\n (\n slot\n ): slot is Extract<WorkbenchMinimizedDockSlot, { kind: \"stack\" }> =>\n slot.kind === \"stack\"\n ) ?? null);\n const openDockContextMenuNodeIds =\n popupEntry?.matchedNodes.map((node) => node.id) ?? [];\n const dockContextMenuInstanceMode =\n popupEntry === null\n ? undefined\n : resolveDockEntryInstanceMode(popupEntry.entry, nodeDefinitions);\n const canShowAllWindowsFromDockContextMenu =\n onMissionControlRequestOpen !== undefined &&\n dockContextMenuInstanceMode === \"multi\" &&\n openDockContextMenuNodeIds.length > 1;\n const fullscreenNodeFromDockContextMenu =\n popupEntry === null\n ? null\n : resolveDockContextMenuFullscreenNode({\n focusedNodeId: context.focusedNodeId,\n minimizedNodeIDs,\n nodeDefinitions,\n nodes: popupEntry.matchedNodes\n });\n const canOpenFromDockContextMenu =\n popupEntry !== null &&\n popupEntry.matchedNodes.length === 0 &&\n resolveWorkbenchDockEntryClick({\n entry: popupEntry.entry,\n instanceMode: dockContextMenuInstanceMode,\n matchedNodes: popupEntry.matchedNodes\n }).kind === \"launch\";\n\n return (\n <div\n className=\"flex justify-center pointer-events-none\"\n data-dock-placement={dockPlacement}\n >\n <div\n className=\"desktop-dock-plate\"\n style={\n dockFrameSize === null\n ? undefined\n : ({\n \"--desktop-dock-frame-size\": `${dockFrameSize}px`\n } as WorkbenchHostDockPlateStyle)\n }\n >\n <div\n ref={dockMeasureRef}\n aria-label={i18n.t(\"dockLabel\")}\n className=\"desktop-dock\"\n data-dock-placement={dockPlacement}\n data-desktop-dock-root=\"true\"\n data-scroll-overflow={\n dockScrollState.hasOverflow ? \"true\" : undefined\n }\n data-scroll-backward={\n dockScrollState.canScrollBackward ? \"true\" : undefined\n }\n data-scroll-forward={\n dockScrollState.canScrollForward ? \"true\" : undefined\n }\n onPointerLeave={() => {\n hoverPanelRestTargetRef.current = null;\n clearHoverPanelOpenTimer();\n clearLabelTooltipOpenTimer();\n closeLabelTooltipImmediate();\n closeHoverPanelImmediate();\n handleDockPointerLeave();\n flushPendingDockStateRefresh();\n }}\n onPointerMoveCapture={(event) => {\n handleDockPointerTravel(event.clientX, event.clientY);\n }}\n role=\"toolbar\"\n style={\n dockPlacement === \"left\"\n ? { height: dockWidth }\n : { width: dockWidth }\n }\n >\n <span\n className=\"desktop-dock__pointer-rail\"\n data-desktop-dock-pointer-rail=\"true\"\n aria-hidden\n />\n <button\n aria-label={i18n.t(\n dockPlacement === \"left\" ? \"scrollDockUp\" : \"scrollDockLeft\"\n )}\n className=\"desktop-dock__scroll-button desktop-dock__scroll-button--backward\"\n data-scroll-button=\"backward\"\n disabled={!dockScrollState.canScrollBackward}\n onClick={() => scrollDockItems(\"backward\")}\n type=\"button\"\n >\n {dockPlacement === \"left\" ? (\n <ChevronUpIcon size={16} />\n ) : (\n <ArrowLeftIcon size={16} />\n )}\n </button>\n <div ref={dockItemsRef} className=\"desktop-dock__items\">\n {presentDockItems.map((dockItem) => {\n if (dockItem.item.kind === \"separator\") {\n return (\n <span\n ref={registerWallpaperToneElement(dockItem.key)}\n className=\"desktop-dock__separator\"\n aria-hidden=\"true\"\n data-presence={dockItem.presence}\n data-wallpaper-tone={wallpaperTones.get(dockItem.key)}\n key={dockItem.key}\n />\n );\n }\n\n if (dockItem.item.kind === \"entry\") {\n const resolvedEntry = dockItem.item.resolvedEntry;\n const { anchorKey, entry } = resolvedEntry;\n const currentPopup =\n activePopup?.entryId === entry.id ? activePopup : null;\n const instanceMode = resolveDockEntryInstanceMode(\n entry,\n nodeDefinitions\n );\n const clickResolution = resolveWorkbenchDockEntryClick({\n entry,\n instanceMode,\n matchedNodes: resolvedEntry.matchedNodes\n });\n const hasHoverPanel = dockEntryHasHoverPanel(entry);\n const labelTooltipTarget = hasHoverPanel\n ? null\n : dockLabelTooltipTarget(`entry:${entry.id}`, entry.label);\n const dockButton = (\n <button\n aria-expanded={currentPopup ? true : undefined}\n aria-haspopup={\n clickResolution.kind === \"open-popup\"\n ? \"dialog\"\n : undefined\n }\n aria-label={i18n.t(\"launch\", { title: entry.label })}\n aria-disabled={\n clickResolution.kind === \"blocked\" ? true : undefined\n }\n className=\"desktop-dock__btn\"\n data-interactive={\n clickResolution.kind === \"blocked\" ? \"false\" : \"true\"\n }\n type=\"button\"\n onPointerDown={(event) => {\n if (event.button !== 0) {\n return;\n }\n if (clickResolution.kind === \"blocked\") {\n return;\n }\n if (isDockEntryClickThrottled(anchorKey)) {\n return;\n }\n beginDockIconInteraction(anchorKey);\n }}\n onClick={(event) => {\n if (clickResolution.kind === \"blocked\") {\n return;\n }\n if (isDockEntryClickThrottled(anchorKey)) {\n return;\n }\n claimDockEntryClick(anchorKey);\n logWorkbenchDockDebug(\"dock.click\", debugDiagnostics, {\n anchorKey,\n clickResolution,\n dockDiagnostics: entry.diagnostics ?? null,\n dockNodeState: resolvedEntry.dockNodeState,\n entryId: entry.id,\n entryLaunchBehavior: entry.launchBehavior ?? \"enabled\",\n entryOrder: entry.order ?? null,\n entryState: entry.state ?? { kind: \"enabled\" },\n entryVisibility: entry.visibility ?? \"always\",\n hoverActions:\n entry.hoverActions?.map((action) => ({\n disabled: action.disabled === true,\n id: action.id,\n pending: Boolean(action.pendingLabel)\n })) ?? [],\n instanceMode: instanceMode ?? null,\n matchedNodeCount: resolvedEntry.matchedNodes.length,\n matchedNodeIds: resolvedEntry.matchedNodes.map(\n (node) => node.id\n ),\n typeId: entry.typeId,\n workspaceId\n });\n switch (clickResolution.kind) {\n case \"focus-node\":\n closePopup();\n void (async () => {\n try {\n await onDockEntryClick?.({\n entryId: entry.id,\n host,\n nodeId: clickResolution.nodeId\n });\n } catch {\n // Keep dock click failures contained.\n }\n })();\n context.genie.launchNodeFromAnchor(\n anchorKey,\n clickResolution.nodeId,\n () => {\n host.focusNode(clickResolution.nodeId);\n }\n );\n return;\n case \"open-popup\": {\n const rect =\n event.currentTarget.getBoundingClientRect();\n logWorkbenchDockDebug(\n \"dock.popup.toggle\",\n debugDiagnostics,\n {\n anchorKey,\n entryId: entry.id,\n matchedNodeCount:\n resolvedEntry.matchedNodes.length,\n nextOpen: currentPopup === null,\n typeId: entry.typeId,\n workspaceId\n }\n );\n setActivePopup((current) =>\n current?.entryId === entry.id\n ? null\n : {\n anchorRect: {\n height: rect.height,\n left: rect.left,\n top: rect.top,\n width: rect.width\n },\n kind: \"preview\",\n entryId: entry.id\n }\n );\n return;\n }\n case \"action\":\n closePopup();\n void (async () => {\n try {\n await onDockEntryAction?.({\n actionId: clickResolution.actionId,\n entryId: entry.id,\n host\n });\n } catch {\n // Keep dock action failures contained.\n }\n })();\n return;\n case \"launch\":\n closePopup();\n context.genie.launchNodeFromAnchor(\n anchorKey,\n entry.id,\n () =>\n host.launchNode({\n dockEntryId: entry.id,\n payload: entry.launchPayload,\n reason: \"dock\",\n typeId: entry.typeId\n })\n );\n return;\n }\n }}\n onContextMenu={(event) => {\n if (\n clickResolution.kind === \"blocked\" ||\n !dockEntryHasContextMenu(entry, resolvedEntry)\n ) {\n return;\n }\n event.preventDefault();\n const rect = event.currentTarget.getBoundingClientRect();\n logWorkbenchDockDebug(\n \"dock.popup.context_menu\",\n debugDiagnostics,\n {\n anchorKey,\n entryId: entry.id,\n matchedNodeCount: resolvedEntry.matchedNodes.length,\n typeId: entry.typeId,\n workspaceId\n }\n );\n setActivePopup({\n anchorRect: {\n height: rect.height,\n left: rect.left,\n top: rect.top,\n width: rect.width\n },\n kind: \"context-menu\",\n entryId: entry.id\n });\n }}\n >\n <span\n className=\"desktop-dock__icon-shell\"\n data-desktop-dock-icon-shell=\"true\"\n data-entry-state={entry.state?.kind ?? \"enabled\"}\n aria-hidden\n >\n <span className=\"desktop-dock__icon-content\">\n {entry.icon}\n </span>\n {renderDockBadge(\n entry,\n resolvedEntry.matchedNodes.length\n )}\n </span>\n </button>\n );\n\n return (\n <span\n key={dockItem.key}\n ref={registerDockSlot(anchorKey)}\n className=\"desktop-dock__slot\"\n data-attention-active={\n activeAttentionEntryIds.has(entry.id) ? \"true\" : undefined\n }\n data-desktop-dock-anchor-key={anchorKey}\n data-desktop-dock-slot=\"true\"\n data-entry-state={entry.state?.kind ?? \"enabled\"}\n data-dock-hover-panel-entry-id={\n hasHoverPanel ? entry.id : undefined\n }\n data-dock-label-tooltip-key={labelTooltipTarget?.key}\n data-dock-label-tooltip-label={labelTooltipTarget?.label}\n data-icon-size={entry.iconSize ?? \"default\"}\n data-node-state={resolvedEntry.dockNodeState}\n data-popup-active={currentPopup ? \"true\" : undefined}\n data-presence={dockItem.presence}\n data-section-id={entry.sectionId}\n data-wallpaper-tone={wallpaperTones.get(anchorKey)}\n onBlur={(event) => {\n if (\n hasHoverPanel &&\n !event.currentTarget.contains(event.relatedTarget)\n ) {\n closeHoverPanelImmediate(entry.id);\n }\n if (\n labelTooltipTarget &&\n !event.currentTarget.contains(event.relatedTarget)\n ) {\n closeLabelTooltipImmediate(labelTooltipTarget.key);\n }\n }}\n onFocus={(event) => {\n if (hasHoverPanel) {\n showHoverPanel(\n entry.id,\n anchorKey,\n event.currentTarget\n );\n return;\n }\n if (labelTooltipTarget) {\n showLabelTooltip(\n labelTooltipTarget,\n anchorKey,\n event.currentTarget\n );\n }\n }}\n onPointerEnter={() => {\n if (hasHoverPanel) {\n scheduleHoverPanelAfterRest(entry.id, anchorKey);\n return;\n }\n if (labelTooltipTarget) {\n scheduleLabelTooltipAfterRest(\n labelTooltipTarget,\n anchorKey\n );\n }\n }}\n onPointerLeave={(event) => {\n if (!hasHoverPanel) {\n if (labelTooltipTarget) {\n clearLabelTooltipOpenTimer();\n closeLabelTooltipImmediate(labelTooltipTarget.key);\n const relatedTarget = event.relatedTarget;\n if (\n relatedTarget instanceof Node &&\n dockMeasureRef.current?.contains(relatedTarget)\n ) {\n scheduleLabelTooltipAtPointAfterRest(\n event.clientX,\n event.clientY\n );\n }\n }\n return;\n }\n const relatedTarget = event.relatedTarget;\n if (\n relatedTarget instanceof Node &&\n hoverPanelRef.current?.contains(relatedTarget)\n ) {\n return;\n }\n if (\n relatedTarget instanceof Node &&\n dockMeasureRef.current?.contains(relatedTarget)\n ) {\n scheduleHoverPanelAtPointAfterRest(\n event.clientX,\n event.clientY\n );\n return;\n }\n if (\n hoverPanelRestTargetRef.current?.anchorKey === anchorKey\n ) {\n hoverPanelRestTargetRef.current = null;\n }\n clearHoverPanelOpenTimer();\n closeHoverPanelImmediate(entry.id);\n handleDockPointerLeave();\n }}\n >\n {dockButton}\n </span>\n );\n }\n\n const slot = dockItem.item.slot;\n if (slot.kind === \"stack\") {\n const stackPopupActive =\n activeMinimizedStackPopup !== null ? true : undefined;\n const stackLabel = i18n.t(\"minimizedWindows\");\n const labelTooltipTarget = dockLabelTooltipTarget(\n `minimized-stack:${slot.anchorKey}`,\n stackLabel\n );\n const stackButton = (\n <span\n aria-expanded={stackPopupActive}\n aria-haspopup=\"dialog\"\n aria-label={stackLabel}\n className=\"desktop-dock__btn desktop-dock__minimized-btn\"\n data-interactive=\"true\"\n role=\"button\"\n tabIndex={0}\n onKeyDown={activateDockButtonFromKeyboard}\n onPointerDown={(event) => {\n if (event.button !== 0) {\n return;\n }\n beginDockMinimizedInteraction();\n }}\n onClick={(event) => {\n setActivePopup(null);\n const rect = event.currentTarget.getBoundingClientRect();\n const dockRect =\n dockMeasureRef.current?.getBoundingClientRect();\n setActiveMinimizedStackPopup((current) =>\n current\n ? null\n : {\n dockRight: Math.max(\n rect.right,\n dockRect?.right ?? rect.right\n ),\n height: rect.height,\n left: rect.left,\n top: rect.top,\n width: rect.width\n }\n );\n }}\n >\n <span\n className=\"desktop-dock__minimized-stack-icon\"\n data-desktop-dock-icon-shell=\"true\"\n data-stack-folded={\n slot.nodes.length > 1 ? \"true\" : undefined\n }\n aria-hidden\n >\n {Array.from(\n {\n length:\n slot.nodes.length > 1\n ? 3\n : Math.min(slot.nodes.length, 1)\n },\n (_, index) => {\n const node = slot.nodes[index];\n if (index === 0 && node) {\n return (\n <WorkbenchHostDockMinimizedNodePreview\n key={minimizedDockPreviewFreezeKey(node)}\n capturePreview={captureMinimizedNodePreview}\n className={`desktop-dock__minimized-stack-layer desktop-dock__minimized-stack-layer--${index}`}\n dockPreviewCache={dockPreviewCache}\n node={node}\n providePreview={provideMinimizedNodePreviewForNode(\n node\n )}\n workspaceId={workspaceId}\n />\n );\n }\n return (\n <span\n key={`${slot.anchorKey}-stack-back-${index}`}\n aria-hidden=\"true\"\n className={`desktop-dock__minimized-preview desktop-dock__minimized-stack-layer desktop-dock__minimized-stack-layer--${index} desktop-dock__minimized-stack-layer-back`}\n />\n );\n }\n )}\n <span className=\"desktop-dock__count-badge\">\n {slot.nodes.length}\n </span>\n </span>\n </span>\n );\n\n return (\n <span\n key={dockItem.key}\n ref={registerDockSlot(slot.anchorKey)}\n className=\"desktop-dock__slot desktop-dock__slot--minimized\"\n data-desktop-dock-anchor-key={slot.anchorKey}\n data-desktop-dock-slot=\"true\"\n data-dock-label-tooltip-key={labelTooltipTarget.key}\n data-dock-label-tooltip-label={labelTooltipTarget.label}\n data-node-state=\"minimized\"\n data-popup-active={stackPopupActive}\n data-presence={dockItem.presence}\n data-section-id=\"minimized\"\n data-stack-dispatching={\n stackDispatching ? \"true\" : undefined\n }\n onBlur={(event) => {\n if (!event.currentTarget.contains(event.relatedTarget)) {\n closeLabelTooltipImmediate(labelTooltipTarget.key);\n }\n }}\n onFocus={(event) => {\n showLabelTooltip(\n labelTooltipTarget,\n slot.anchorKey,\n event.currentTarget\n );\n }}\n onPointerEnter={() => {\n scheduleLabelTooltipAfterRest(\n labelTooltipTarget,\n slot.anchorKey\n );\n }}\n onPointerLeave={(event) => {\n clearLabelTooltipOpenTimer();\n closeLabelTooltipImmediate(labelTooltipTarget.key);\n const relatedTarget = event.relatedTarget;\n if (\n relatedTarget instanceof Node &&\n dockMeasureRef.current?.contains(relatedTarget)\n ) {\n scheduleLabelTooltipAtPointAfterRest(\n event.clientX,\n event.clientY\n );\n }\n }}\n >\n {stackButton}\n </span>\n );\n }\n\n const node = slot.node;\n const isPendingMinimizedNode =\n context.genie.isPendingMinimizedDockNode(node.id);\n const labelTooltipTarget = dockLabelTooltipTarget(\n `minimized-node:${node.id}`,\n node.title\n );\n const dockButton = (\n <span\n aria-label={i18n.t(\"launch\", { title: node.title })}\n aria-disabled={isPendingMinimizedNode ? true : undefined}\n className=\"desktop-dock__btn desktop-dock__minimized-btn\"\n data-interactive={isPendingMinimizedNode ? \"false\" : \"true\"}\n role=\"button\"\n tabIndex={isPendingMinimizedNode ? -1 : 0}\n onKeyDown={(event) =>\n activateDockButtonFromKeyboard(\n event,\n isPendingMinimizedNode\n )\n }\n onPointerDown={(event) => {\n if (event.button !== 0 || isPendingMinimizedNode) {\n return;\n }\n const restoreIntent =\n resolveWorkbenchMinimizedDockRestoreIntent({\n nodeId: node.id,\n slots: minimizedDockSlots,\n source: {\n anchorKey: slot.anchorKey,\n kind: \"node-slot\"\n }\n });\n if (restoreIntent?.kind !== \"node-slot\") {\n clearCollapsingMinimizedLaunch(slot.anchorKey);\n return;\n }\n beginDockMinimizedInteraction();\n }}\n onClick={() => {\n if (isPendingMinimizedNode) {\n return;\n }\n const restoreIntent =\n resolveWorkbenchMinimizedDockRestoreIntent({\n nodeId: node.id,\n slots: minimizedDockSlots,\n source: {\n anchorKey: slot.anchorKey,\n kind: \"node-slot\"\n }\n });\n if (restoreIntent?.kind !== \"node-slot\") {\n clearCollapsingMinimizedLaunch(slot.anchorKey);\n return;\n }\n closePopup();\n runDockMinimizedLaunchAfterCollapse(\n restoreIntent,\n (intent) => {\n context.genie.launchNodeFromAnchor(\n intent.anchorKey,\n intent.nodeId,\n () => {\n host.focusNode(intent.nodeId);\n }\n );\n }\n );\n }}\n >\n <WorkbenchHostDockMinimizedNodePreview\n key={minimizedDockPreviewFreezeKey(node)}\n capturePreview={\n isPendingMinimizedNode\n ? undefined\n : captureMinimizedNodePreview\n }\n deferPreview={isPendingMinimizedNode}\n dockPreviewCache={\n isPendingMinimizedNode ? undefined : dockPreviewCache\n }\n node={node}\n providePreview={\n isPendingMinimizedNode\n ? undefined\n : provideMinimizedNodePreviewForNode(node)\n }\n workspaceId={workspaceId}\n />\n </span>\n );\n\n return (\n <span\n key={dockItem.key}\n ref={registerDockSlot(slot.anchorKey)}\n className=\"desktop-dock__slot desktop-dock__slot--minimized\"\n data-collapsing={\n collapsingMinimizedLaunchAnchorKeys.has(slot.anchorKey)\n ? \"true\"\n : undefined\n }\n data-desktop-dock-anchor-key={slot.anchorKey}\n data-desktop-dock-slot=\"true\"\n data-dock-label-tooltip-key={labelTooltipTarget.key}\n data-dock-label-tooltip-label={labelTooltipTarget.label}\n data-node-state=\"minimized\"\n data-pending-minimize={\n isPendingMinimizedNode ? \"true\" : undefined\n }\n data-presence={dockItem.presence}\n data-promoted-from-stack={\n promotedNodeId === node.id ? \"true\" : undefined\n }\n data-section-id=\"minimized\"\n onBlur={(event) => {\n if (!event.currentTarget.contains(event.relatedTarget)) {\n closeLabelTooltipImmediate(labelTooltipTarget.key);\n }\n }}\n onFocus={(event) => {\n showLabelTooltip(\n labelTooltipTarget,\n slot.anchorKey,\n event.currentTarget\n );\n }}\n onPointerEnter={() => {\n scheduleLabelTooltipAfterRest(\n labelTooltipTarget,\n slot.anchorKey\n );\n }}\n onPointerLeave={(event) => {\n clearLabelTooltipOpenTimer();\n closeLabelTooltipImmediate(labelTooltipTarget.key);\n const relatedTarget = event.relatedTarget;\n if (\n relatedTarget instanceof Node &&\n dockMeasureRef.current?.contains(relatedTarget)\n ) {\n scheduleLabelTooltipAtPointAfterRest(\n event.clientX,\n event.clientY\n );\n }\n }}\n >\n {dockButton}\n </span>\n );\n })}\n </div>\n <button\n aria-label={i18n.t(\n dockPlacement === \"left\" ? \"scrollDockDown\" : \"scrollDockRight\"\n )}\n className=\"desktop-dock__scroll-button desktop-dock__scroll-button--forward\"\n data-scroll-button=\"forward\"\n disabled={!dockScrollState.canScrollForward}\n onClick={() => scrollDockItems(\"forward\")}\n type=\"button\"\n >\n {dockPlacement === \"left\" ? (\n <ChevronDownIcon size={16} />\n ) : (\n <ArrowRightIcon size={16} />\n )}\n </button>\n {activeHoverPanel ? (\n <WorkbenchHostDockHoverPanel\n entry={\n resolvedEntries.find(\n (entry) => entry.entry.id === activeHoverPanel.entryId\n )?.entry ?? null\n }\n host={host}\n onDockEntryAction={onDockEntryAction}\n pendingActionKeys={pendingActionKeys}\n placement={dockPlacement}\n hoverPanelRef={hoverPanelRef}\n setPendingActionKeys={setPendingActionKeys}\n state={activeHoverPanel}\n onBlur={(event) => {\n if (!event.currentTarget.contains(event.relatedTarget)) {\n closeHoverPanelImmediate(activeHoverPanel.entryId);\n }\n }}\n onFocus={clearHoverPanelCloseTimer}\n onPointerEnter={clearHoverPanelCloseTimer}\n onPointerLeave={(event) => {\n const relatedTarget = event.relatedTarget;\n const anchorSlot = slotRefs.current.get(\n activeHoverPanel.anchorKey\n );\n if (\n relatedTarget instanceof Node &&\n anchorSlot?.contains(relatedTarget)\n ) {\n return;\n }\n scheduleHoverPanelClose(activeHoverPanel.entryId);\n handleDockPointerLeave();\n }}\n />\n ) : null}\n {activeLabelTooltip ? (\n <WorkbenchHostDockLabelTooltip\n placement={dockPlacement}\n state={activeLabelTooltip}\n />\n ) : null}\n </div>\n </div>\n {popupEntry && activePopup ? (\n <WorkbenchHostDockPopup\n anchorRect={activePopup.anchorRect}\n placement={dockPlacement}\n canEnterFullscreen={fullscreenNodeFromDockContextMenu !== null}\n canShowAllWindows={canShowAllWindowsFromDockContextMenu}\n debugDiagnostics={debugDiagnostics}\n dockRetention={\n popupEntry.entry.dockRetention\n ? {\n checked: popupEntry.entry.dockRetention.retained,\n disabled:\n popupEntry.entry.dockRetention.disabled === true ||\n pendingActionKeys.has(\n dockActionKey(\n popupEntry.entry.id,\n popupEntry.entry.dockRetention.actionId\n )\n ),\n label: i18n.t(\n popupEntry.entry.dockRetention.retained\n ? \"dockContextMenu.removeFromDock\"\n : \"dockContextMenu.keepInDock\"\n ),\n pendingLabel: pendingActionKeys.has(\n dockActionKey(\n popupEntry.entry.id,\n popupEntry.entry.dockRetention.actionId\n )\n )\n ? popupEntry.entry.dockRetention.pendingLabel\n : undefined\n }\n : null\n }\n capturePreview={\n popupEntry.entry.capturePopupItemPreview\n ? async (item) => {\n const previewImageUrl = await Promise.resolve(\n popupEntry.entry.capturePopupItemPreview?.(item) ?? null\n ).catch(() => null);\n return previewImageUrl\n ? {\n kind: \"image\",\n revision: item.previewRevision ?? undefined,\n src: previewImageUrl\n }\n : null;\n }\n : undefined\n }\n dockPreviewCache={dockPreviewCache}\n items={popupEntry.matchedNodes\n .map((node) => {\n const externalState = readWorkbenchHostExternalState({\n externalStateSource,\n node,\n workspaceId\n });\n const item = {\n externalNodeState: externalState.externalNodeState,\n externalWorkspaceState: externalState.externalWorkspaceState,\n host,\n isFocused: context.focusedNodeId === node.id,\n isMinimized: minimizedNodeIDs.has(node.id),\n node\n };\n const descriptor =\n popupEntry.entry.resolvePopupItem?.(item) ?? {};\n const descriptorPreviewImageUrl =\n descriptor.previewImageUrl ?? null;\n const descriptorPreview =\n descriptor.preview ??\n (descriptorPreviewImageUrl\n ? ({\n kind: \"image\",\n revision: descriptor.revision ?? null,\n src: descriptorPreviewImageUrl\n } as const)\n : (popupEntry.entry.providePopupItemPreview?.(item) ?? null));\n return {\n ...item,\n preview: descriptorPreview,\n previewRevision:\n previewRevision(descriptorPreview) ??\n descriptor.revision ??\n null,\n subtitle:\n descriptor.subtitle === undefined\n ? (node.data.instanceKey ?? node.data.instanceId)\n : descriptor.subtitle,\n title:\n descriptor.title === undefined\n ? node.title\n : descriptor.title?.trim() || null\n };\n })\n .sort((left, right) => {\n if (left.isFocused !== right.isFocused) {\n return left.isFocused ? -1 : 1;\n }\n return left.node.id.localeCompare(right.node.id);\n })}\n label={popupEntry.entry.label}\n labelMode={popupEntry.entry.popupCardLabelMode}\n newWindowLabel={i18n.t(\"newWindow\")}\n openLabel={i18n.t(\"dockContextMenu.open\")}\n closeWindowLabel={(title) => i18n.t(\"closeWindow\", { title })}\n fullscreenLabel={i18n.t(\"dockContextMenu.fullscreen\")}\n hideLabel={i18n.t(\"dockContextMenu.hide\")}\n onClose={() => {\n logWorkbenchDockDebug(\n \"dock.popup.close_requested\",\n debugDiagnostics,\n {\n entryId: popupEntry.entry.id,\n itemCount: popupEntry.matchedNodes.length,\n workspaceId\n }\n );\n closePopup();\n }}\n onCloseNode={(nodeId) => {\n host.requestNodeClose(nodeId);\n const hasRemainingItems = popupEntry.matchedNodes.some(\n (node) => node.id !== nodeId\n );\n if (!hasRemainingItems) {\n closePopup();\n }\n }}\n onCreateNew={() => {\n closePopup();\n context.genie.launchNodeFromAnchor(\n anchorKeyFromPopupEntry(popupEntry),\n popupEntry.entry.id,\n () =>\n host.launchNode({\n dockEntryId: popupEntry.entry.id,\n payload: popupEntry.entry.launchPayload,\n reason: \"dock\",\n typeId: popupEntry.entry.typeId\n })\n );\n }}\n onEnterFullscreen={() => {\n if (!fullscreenNodeFromDockContextMenu) {\n return;\n }\n context.controller.commands.enterFullscreen(\n fullscreenNodeFromDockContextMenu.id\n );\n closePopup();\n }}\n onHide={() => {\n for (const node of popupEntry.matchedNodes) {\n if (!minimizedNodeIDs.has(node.id)) {\n host.minimizeNode(node.id);\n }\n }\n closePopup();\n }}\n onRunDockRetentionAction={\n popupEntry.entry.dockRetention\n ? () => {\n const dockRetention = popupEntry.entry.dockRetention;\n if (!dockRetention || dockRetention.disabled === true) {\n return;\n }\n runDockEntryAction(\n popupEntry.entry.id,\n dockRetention.actionId\n );\n closePopup();\n }\n : undefined\n }\n onSelectNode={(nodeId) => {\n closePopup();\n void (async () => {\n try {\n await onDockEntryClick?.({\n entryId: popupEntry.entry.id,\n host,\n nodeId\n });\n } catch {\n // Keep dock click failures contained.\n }\n })();\n context.genie.launchNodeFromAnchor(\n anchorKeyFromPopupEntry(popupEntry),\n nodeId,\n () => {\n host.focusNode(nodeId);\n }\n );\n }}\n onShowAllWindows={() => {\n closePopup();\n for (const node of popupEntry.matchedNodes) {\n if (minimizedNodeIDs.has(node.id)) {\n context.controller.commands.restoreNode(node.id);\n }\n }\n window.requestAnimationFrame(() => {\n onMissionControlRequestOpen?.(\"activate\", {\n nodeIds: openDockContextMenuNodeIds,\n trigger: \"dock-context-menu\"\n });\n });\n }}\n onQuit={() => {\n for (const node of popupEntry.matchedNodes) {\n host.requestNodeClose(node.id);\n }\n closePopup();\n }}\n quitLabel={i18n.t(\"dockContextMenu.quit\")}\n showCreateNew={canCreateNewWindow(\n popupEntry.entry,\n dockContextMenuInstanceMode\n )}\n showOpen={canOpenFromDockContextMenu}\n showAllWindowsLabel={i18n.t(\"dockContextMenu.showAllWindows\")}\n resolveDockPreviewCacheKey={(node) =>\n resolveDockPreviewCacheKey(workspaceId, node)\n }\n variant={\n activePopup.kind === \"context-menu\" ? \"context-menu\" : \"default\"\n }\n />\n ) : null}\n {activeMinimizedStackSlot && activeMinimizedStackPopup ? (\n <WorkbenchHostDockPopup\n anchorRect={activeMinimizedStackPopup}\n placement={dockPlacement}\n debugDiagnostics={debugDiagnostics}\n capturePreview={async (item) => {\n const src = await captureMinimizedNodePreview(item.node);\n return src ? { kind: \"image\", src } : null;\n }}\n dockPreviewCache={dockPreviewCache}\n items={activeMinimizedStackSlot.nodes.map((node) => {\n const externalState = readWorkbenchHostExternalState({\n externalStateSource,\n node,\n workspaceId\n });\n const minimizedDock = nodeDefinitions.get(node.data.typeId)?.window\n ?.minimizedDock;\n return {\n externalNodeState: externalState.externalNodeState,\n externalWorkspaceState: externalState.externalWorkspaceState,\n host,\n isFocused: context.focusedNodeId === node.id,\n isMinimized: true,\n node,\n preview:\n minimizedDock?.kind === \"component\"\n ? (provideMinimizedNodePreview(node) ?? null)\n : minimizedDock?.kind === \"snapshot\" &&\n minimizedDock.capturePreview\n ? null\n : (() => {\n const previewImageUrl =\n readCachedWorkbenchNodePreviewImage(node.id);\n return previewImageUrl\n ? ({ kind: \"image\", src: previewImageUrl } as const)\n : null;\n })(),\n previewRevision: null,\n subtitle: node.data.instanceKey ?? node.data.instanceId,\n title: node.title\n };\n })}\n label={i18n.t(\"minimizedWindows\")}\n newWindowLabel={i18n.t(\"newWindow\")}\n closeWindowLabel={(title) => i18n.t(\"closeWindow\", { title })}\n onClose={() => {\n logWorkbenchDockDebug(\n \"dock.popup.close_requested\",\n debugDiagnostics,\n {\n entryId: \"minimized-stack\",\n itemCount: activeMinimizedStackSlot.nodes.length,\n workspaceId\n }\n );\n closePopup();\n }}\n onCloseNode={(nodeId) => {\n host.requestNodeClose(nodeId);\n const hasRemainingItems = activeMinimizedStackSlot.nodes.some(\n (node) => node.id !== nodeId\n );\n if (!hasRemainingItems) {\n closePopup();\n }\n }}\n onCreateNew={() => undefined}\n onSelectNode={(nodeId) => {\n const restoreIntent = resolveWorkbenchMinimizedDockRestoreIntent({\n nodeId,\n slots: minimizedDockSlots,\n source: {\n kind: \"stack-popup-card\",\n stackAnchorKey: activeMinimizedStackSlot.anchorKey\n }\n });\n if (restoreIntent?.kind !== \"stack-popup-card\") {\n return;\n }\n closePopup();\n runDockMinimizedStackLaunch(restoreIntent, (intent) => {\n context.genie.launchNodeFromAnchor(\n intent.anchorKey,\n intent.nodeId,\n () => {\n host.focusNode(intent.nodeId);\n }\n );\n });\n }}\n showCreateNew={false}\n resolveDockPreviewCacheKey={(node) =>\n resolveDockPreviewCacheKey(workspaceId, node)\n }\n variant=\"minimized-stack\"\n />\n ) : null}\n </div>\n );\n}\n\nfunction WorkbenchHostDockMinimizedNodePreview({\n capturePreview,\n className,\n deferPreview = false,\n dockPreviewCache,\n node,\n providePreview,\n workspaceId\n}: {\n capturePreview?: (\n node: WorkbenchMinimizedDockNode\n ) => Promise<string | null> | string | null;\n className?: string;\n deferPreview?: boolean;\n dockPreviewCache?: WorkbenchDockPreviewCache;\n node: WorkbenchMinimizedDockNode;\n providePreview?: (\n node: WorkbenchMinimizedDockNode\n ) => WorkbenchDockPreviewContent | null;\n workspaceId: string;\n}) {\n const [componentPreview, setComponentPreview] = useState<\n WorkbenchDockPreviewContent | null | undefined\n >(undefined);\n const [previewImageUrl, setPreviewImageUrl] = useState<string | null>(() =>\n deferPreview || providePreview\n ? null\n : readCachedWorkbenchNodePreviewImage(node.id)\n );\n\n useEffect(() => {\n if (deferPreview || !providePreview || componentPreview !== undefined) {\n return undefined;\n }\n\n let cancelled = false;\n let frameId: number | null = null;\n let idleId: number | null = null;\n let timeoutId: ReturnType<typeof globalThis.setTimeout> | null = null;\n const setDeferredComponentPreview = () => {\n if (cancelled) {\n return;\n }\n setComponentPreview(providePreview(node) ?? null);\n };\n const scheduler = globalThis as typeof globalThis & {\n cancelIdleCallback?: (id: number) => void;\n cancelAnimationFrame?: (id: number) => void;\n requestIdleCallback?: (\n callback: () => void,\n options?: { timeout?: number }\n ) => number;\n requestAnimationFrame?: (callback: () => void) => number;\n };\n\n if (typeof scheduler.requestIdleCallback === \"function\") {\n idleId = scheduler.requestIdleCallback(setDeferredComponentPreview, {\n timeout: 250\n });\n } else if (typeof scheduler.requestAnimationFrame === \"function\") {\n frameId = scheduler.requestAnimationFrame(() => {\n frameId = null;\n timeoutId = globalThis.setTimeout(setDeferredComponentPreview, 0);\n });\n } else {\n timeoutId = globalThis.setTimeout(setDeferredComponentPreview, 0);\n }\n\n return () => {\n cancelled = true;\n if (\n idleId !== null &&\n typeof scheduler.cancelIdleCallback === \"function\"\n ) {\n scheduler.cancelIdleCallback(idleId);\n }\n if (\n frameId !== null &&\n typeof scheduler.cancelAnimationFrame === \"function\"\n ) {\n scheduler.cancelAnimationFrame(frameId);\n }\n if (timeoutId !== null) {\n globalThis.clearTimeout(timeoutId);\n }\n };\n }, [\n componentPreview,\n deferPreview,\n node.data.instanceId,\n node.data.instanceKey,\n node.data.typeId,\n node.id,\n node.minimizedAtUnixMs,\n providePreview\n ]);\n\n useEffect(() => {\n if (deferPreview || providePreview) {\n return undefined;\n }\n\n let cancelled = false;\n const cachedPreviewImageUrl = readCachedWorkbenchNodePreviewImage(node.id);\n setPreviewImageUrl(cachedPreviewImageUrl);\n const cacheKey = resolveDockPreviewCacheKey(workspaceId, node);\n if (!cachedPreviewImageUrl && dockPreviewCache) {\n void dockPreviewCache\n .read(cacheKey)\n .catch(() => null)\n .then((persistedPreview) => {\n if (cancelled || !persistedPreview) {\n return;\n }\n writeCachedWorkbenchNodePreviewImage(node.id, persistedPreview);\n setPreviewImageUrl(persistedPreview);\n });\n }\n if (capturePreview) {\n void Promise.resolve(capturePreview(node))\n .catch(() => null)\n .then((nextPreview) => {\n if (cancelled || !nextPreview) {\n return;\n }\n writeCachedWorkbenchNodePreviewImage(node.id, nextPreview);\n dockPreviewCache?.write({\n key: cacheKey,\n previewImageUrl: nextPreview\n });\n setPreviewImageUrl(nextPreview);\n });\n }\n if (cachedPreviewImageUrl || node.isMinimized || capturePreview) {\n return () => {\n cancelled = true;\n };\n }\n void captureWorkbenchNodePreviewImage(node.id).then((nextPreview) => {\n if (!cancelled) {\n setPreviewImageUrl(nextPreview);\n }\n });\n return () => {\n cancelled = true;\n };\n }, [\n capturePreview,\n deferPreview,\n dockPreviewCache,\n node.data.instanceId,\n node.data.instanceKey,\n node.data.typeId,\n node.id,\n node.minimizedAtUnixMs,\n providePreview,\n workspaceId\n ]);\n\n if (deferPreview) {\n return renderMinimizedDockPreviewPlaceholder(className);\n }\n\n if (componentPreview) {\n return renderMinimizedDockPreviewContent(componentPreview, className);\n }\n\n if (previewImageUrl) {\n return (\n <span\n className={[\n \"desktop-dock__minimized-preview\",\n \"desktop-dock__minimized-preview--snapshot\",\n className\n ]\n .filter(Boolean)\n .join(\" \")}\n aria-hidden=\"true\"\n >\n <img\n alt=\"\"\n className=\"desktop-dock__minimized-preview-image\"\n draggable={false}\n src={previewImageUrl}\n />\n </span>\n );\n }\n\n return renderMinimizedDockPreviewPlaceholder(className);\n}\n\nfunction renderMinimizedDockPreviewPlaceholder(className?: string) {\n return (\n <span\n className={[\"desktop-dock__minimized-preview\", className]\n .filter(Boolean)\n .join(\" \")}\n aria-hidden=\"true\"\n >\n <span className=\"desktop-dock__minimized-preview-line\" />\n <span className=\"desktop-dock__minimized-preview-line desktop-dock__minimized-preview-line--short\" />\n <span className=\"desktop-dock__minimized-preview-line desktop-dock__minimized-preview-line--accent\" />\n </span>\n );\n}\n\nexport function renderMinimizedDockPreviewContent(\n preview: WorkbenchDockPreviewContent,\n className?: string\n) {\n if (preview.kind === \"image\") {\n return (\n <span\n className={[\n \"desktop-dock__minimized-preview\",\n \"desktop-dock__minimized-preview--snapshot\",\n className\n ]\n .filter(Boolean)\n .join(\" \")}\n aria-hidden=\"true\"\n >\n <img\n alt=\"\"\n className=\"desktop-dock__minimized-preview-image\"\n draggable={false}\n src={preview.src}\n />\n </span>\n );\n }\n\n return (\n <WorkbenchHostDockFrozenComponentPreview\n className={className}\n preview={preview}\n />\n );\n}\n\nfunction WorkbenchHostDockFrozenComponentPreview({\n className,\n preview\n}: {\n className?: string;\n preview: Extract<WorkbenchDockPreviewContent, { kind: \"component\" }>;\n}) {\n const sourceRef = useRef<HTMLSpanElement | null>(null);\n const [frozenMarkup, setFrozenMarkup] = useState<string | null>(null);\n\n useLayoutEffect(() => {\n if (frozenMarkup !== null) {\n return;\n }\n setFrozenMarkup(sourceRef.current?.innerHTML ?? \"\");\n }, [frozenMarkup]);\n\n return (\n <span\n className={[\n \"desktop-dock__minimized-preview\",\n \"desktop-dock__minimized-preview--component\",\n className\n ]\n .filter(Boolean)\n .join(\" \")}\n aria-hidden=\"true\"\n >\n {frozenMarkup === null ? (\n <span\n ref={sourceRef}\n className=\"desktop-dock__minimized-preview-freeze-source\"\n >\n {preview.element}\n </span>\n ) : (\n <span\n className=\"desktop-dock__minimized-preview-frozen-content\"\n dangerouslySetInnerHTML={{ __html: frozenMarkup }}\n />\n )}\n </span>\n );\n}\n\nfunction minimizedDockPreviewFreezeKey(\n node: WorkbenchMinimizedDockNode\n): string {\n return `${node.id}:${node.minimizedAtUnixMs ?? \"pending\"}`;\n}\n\nfunction dockEntryHasHoverPanel(entry: WorkbenchHostDockEntry): boolean {\n return (\n Boolean(entry.state?.reason?.trim()) ||\n (entry.hoverActions?.length ?? 0) > 0\n );\n}\n\nfunction dockEntryHasContextMenu(\n entry: WorkbenchHostDockEntry,\n resolvedEntry: ResolvedWorkbenchHostDockEntry\n): boolean {\n if (resolvedEntry.matchedNodes.length > 0 || entry.dockRetention) {\n return true;\n }\n return entry.clickActionId === undefined;\n}\n\nfunction resolveDockContextMenuFullscreenNode({\n focusedNodeId,\n minimizedNodeIDs,\n nodeDefinitions,\n nodes\n}: {\n focusedNodeId: string | null;\n minimizedNodeIDs: ReadonlySet<string>;\n nodeDefinitions: ReadonlyMap<string, WorkbenchHostNodeDefinition>;\n nodes: readonly WorkbenchMinimizedDockNode[];\n}) {\n const candidates = nodes.filter((node) => {\n if (node.displayMode === \"fullscreen\" || minimizedNodeIDs.has(node.id)) {\n return false;\n }\n return (\n nodeDefinitions.get(node.data.typeId)?.window?.fullscreenable !== false\n );\n });\n return (\n candidates.find((node) => node.id === focusedNodeId) ??\n candidates[0] ??\n null\n );\n}\n\nfunction dockLabelTooltipTarget(\n key: string,\n label: string\n): WorkbenchHostDockLabelTooltipTarget {\n return { key, label: label.trim() };\n}\n\nfunction resolveDockLabelTooltipAnchorRect({\n dockPlacement,\n slotElement\n}: {\n dockPlacement: WorkbenchHostProps[\"dockPlacement\"];\n slotElement: HTMLElement;\n}): {\n height: number;\n left: number;\n top: number;\n width: number;\n} {\n const slotRect = slotElement.getBoundingClientRect();\n if (dockPlacement === \"left\") {\n return {\n height: DOCK_ICON_BASE_SIZE,\n left: slotRect.left,\n top: slotRect.top + (slotRect.height - DOCK_ICON_BASE_SIZE) / 2,\n width: DOCK_ICON_BASE_SIZE\n };\n }\n\n return {\n height: DOCK_ICON_BASE_SIZE,\n left: slotRect.left + (slotRect.width - DOCK_ICON_BASE_SIZE) / 2,\n top: slotRect.bottom - DOCK_ICON_BASE_SIZE,\n width: DOCK_ICON_BASE_SIZE\n };\n}\n\nfunction renderDockBadge(\n entry: WorkbenchHostDockEntry,\n matchedNodeCount: number\n) {\n const badge =\n entry.badge ??\n (matchedNodeCount > 1\n ? ({\n kind: \"count\",\n value: matchedNodeCount\n } as const)\n : null);\n if (!badge) {\n return null;\n }\n if (badge.kind === \"count\") {\n return <span className=\"desktop-dock__count-badge\">{badge.value}</span>;\n }\n if (badge.kind === \"custom\") {\n return <span className=\"desktop-dock__custom-badge\">{badge.content}</span>;\n }\n return (\n <span className=\"desktop-dock__status-badge\" data-status={badge.status} />\n );\n}\n\nfunction WorkbenchHostDockLabelTooltip({\n placement,\n state\n}: {\n placement: WorkbenchHostProps[\"dockPlacement\"];\n state: WorkbenchHostDockLabelTooltipState;\n}) {\n return (\n <div\n className=\"desktop-dock__label-tooltip\"\n data-dock-placement={placement}\n role=\"tooltip\"\n style={\n {\n \"--desktop-dock-label-tooltip-anchor-height\": `${state.anchorRect.height}px`,\n \"--desktop-dock-label-tooltip-anchor-left\": `${state.anchorRect.left}px`,\n \"--desktop-dock-label-tooltip-anchor-top\": `${state.anchorRect.top}px`,\n \"--desktop-dock-label-tooltip-anchor-width\": `${state.anchorRect.width}px`\n } as WorkbenchHostDockLabelTooltipStyle\n }\n >\n {state.label}\n </div>\n );\n}\n\nfunction WorkbenchHostDockHoverPanel({\n entry,\n host,\n hoverPanelRef,\n onBlur,\n onDockEntryAction,\n onFocus,\n onPointerEnter,\n onPointerLeave,\n pendingActionKeys,\n placement,\n setPendingActionKeys,\n state\n}: {\n entry: WorkbenchHostDockEntry | null;\n host: WorkbenchHostHandle;\n hoverPanelRef: RefObject<HTMLDivElement | null>;\n onDockEntryAction?: (input: {\n actionId: string;\n entryId: string;\n host: WorkbenchHostHandle;\n }) => Promise<void> | void;\n onBlur?: (event: ReactFocusEvent<HTMLDivElement>) => void;\n onFocus?: () => void;\n onPointerEnter?: () => void;\n onPointerLeave?: (event: ReactPointerEvent<HTMLDivElement>) => void;\n pendingActionKeys: Set<string>;\n placement: WorkbenchHostProps[\"dockPlacement\"];\n setPendingActionKeys: Dispatch<SetStateAction<Set<string>>>;\n state: WorkbenchHostDockHoverPanelState;\n}) {\n if (!entry) {\n return null;\n }\n\n return (\n <div\n ref={hoverPanelRef}\n className=\"desktop-dock__hover-panel\"\n data-dock-placement={placement}\n role=\"group\"\n aria-label={entry.label}\n onBlur={onBlur}\n onFocus={onFocus}\n onPointerEnter={onPointerEnter}\n onPointerLeave={onPointerLeave}\n style={\n {\n \"--desktop-dock-hover-panel-anchor-height\": `${state.anchorRect.height}px`,\n \"--desktop-dock-hover-panel-anchor-left\": `${state.anchorRect.left}px`,\n \"--desktop-dock-hover-panel-anchor-top\": `${state.anchorRect.top}px`,\n \"--desktop-dock-hover-panel-anchor-width\": `${state.anchorRect.width}px`\n } as WorkbenchHostDockHoverPanelStyle\n }\n >\n <div className=\"desktop-dock__hover-panel-title\">{entry.label}</div>\n {entry.state?.reason ? (\n <div className=\"desktop-dock__hover-panel-description\">\n {stripDockDescriptionTerminalPunctuation(entry.state.reason)}\n </div>\n ) : null}\n {entry.hoverActions?.length ? (\n <div className=\"desktop-dock__hover-actions\">\n {entry.hoverActions.map((action) => {\n const actionKey = dockActionKey(entry.id, action.id);\n const isLocallyPending = pendingActionKeys.has(actionKey);\n const isPending =\n isLocallyPending ||\n (action.disabled === true && action.pendingLabel !== undefined);\n return (\n <Button\n key={action.id}\n aria-busy={isPending ? true : undefined}\n className=\"desktop-dock__hover-action\"\n disabled={action.disabled || isLocallyPending}\n type=\"button\"\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n if (\n action.disabled === true ||\n pendingActionKeys.has(actionKey)\n ) {\n return;\n }\n setPendingActionKeys((current) => {\n const next = new Set(current);\n next.add(actionKey);\n return next;\n });\n void (async () => {\n try {\n await onDockEntryAction?.({\n actionId: action.id,\n entryId: entry.id,\n host\n });\n } catch {\n // Keep dock action failures contained.\n } finally {\n setPendingActionKeys((current) => {\n if (!current.has(actionKey)) {\n return current;\n }\n const next = new Set(current);\n next.delete(actionKey);\n return next;\n });\n }\n })();\n }}\n >\n {isPending\n ? (action.pendingLabel ?? action.label)\n : action.label}\n </Button>\n );\n })}\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction resolveDockEntryInstanceMode(\n entry: WorkbenchHostDockEntry,\n nodeDefinitions: ReadonlyMap<string, WorkbenchHostNodeDefinition>\n): WorkbenchHostNodeInstanceStrategy[\"mode\"] | undefined {\n return (\n entry.instanceMode ?? nodeDefinitions.get(entry.typeId)?.instance?.mode\n );\n}\n\nfunction canCreateNewWindow(\n entry: WorkbenchHostDockEntry,\n instanceMode: WorkbenchHostNodeInstanceStrategy[\"mode\"] | undefined\n): boolean {\n const stateKind = entry.state?.kind ?? \"enabled\";\n return (\n instanceMode === \"multi\" &&\n (entry.launchBehavior ?? \"enabled\") === \"enabled\" &&\n stateKind !== \"disabled\" &&\n stateKind !== \"loading\" &&\n stateKind !== \"unavailable\"\n );\n}\n\nfunction anchorKeyFromPopupEntry(\n entry: ResolvedWorkbenchHostDockEntry\n): string {\n return entry.anchorKey;\n}\n\nfunction previewRevision(\n preview: WorkbenchDockPreviewContent | null | undefined\n): string | null {\n return preview?.revision ?? null;\n}\n\nfunction logWorkbenchDockDebug(\n event: string,\n debugDiagnostics: WorkbenchHostProps[\"debugDiagnostics\"],\n details: Record<string, unknown>\n): void {\n if (!debugDiagnostics?.log) {\n return;\n }\n void Promise.resolve(\n debugDiagnostics.log({\n details,\n event,\n level: \"info\",\n source: \"workbench-dock\",\n workspaceId:\n typeof details.workspaceId === \"string\" ? details.workspaceId : null\n })\n ).catch(() => undefined);\n}\n\nfunction minimizedDockSlotNodes(\n slot: WorkbenchMinimizedDockSlot\n): readonly WorkbenchMinimizedDockNode[] {\n return slot.kind === \"stack\" ? slot.nodes : [slot.node];\n}\n\nfunction resolveDockPreviewCacheKey(\n workspaceId: string,\n node: WorkbenchMinimizedDockNode\n): WorkbenchDockPreviewCacheKey {\n return {\n instanceId: node.data.instanceId,\n instanceKey: node.data.instanceKey ?? null,\n nodeId: node.id,\n typeId: node.data.typeId,\n workspaceId\n };\n}\n\nfunction dockActionKey(entryId: string, actionId: string): string {\n return `${entryId}:${actionId}`;\n}\n\nfunction createWorkbenchHostDockItems({\n minimizedDockSlots,\n resolvedEntries\n}: {\n minimizedDockSlots: readonly WorkbenchMinimizedDockSlot[];\n resolvedEntries: readonly ResolvedWorkbenchHostDockEntry[];\n}): WorkbenchHostDockItem[] {\n const items: WorkbenchHostDockItem[] = [];\n\n for (const resolvedEntry of resolvedEntries) {\n if (resolvedEntry.sectionBreakBefore) {\n items.push({\n key: `separator:before:${resolvedEntry.entry.id}`,\n kind: \"separator\"\n });\n }\n items.push({\n key: `entry:${resolvedEntry.entry.id}`,\n kind: \"entry\",\n resolvedEntry\n });\n if (resolvedEntry.entry.separatorAfter) {\n items.push({\n key: `separator:after:${resolvedEntry.entry.id}`,\n kind: \"separator\"\n });\n }\n }\n\n if (minimizedDockSlots.length > 0 && resolvedEntries.length > 0) {\n items.push({\n key: \"separator:minimized\",\n kind: \"separator\"\n });\n }\n\n for (const slot of minimizedDockSlots) {\n items.push({\n key: `minimized:${slot.anchorKey}`,\n kind: \"minimized\",\n slot\n });\n }\n\n return items;\n}\n\nfunction resolveMinimizedDockItemNodeId(\n item: WorkbenchHostDockItem\n): string | null {\n if (item.kind !== \"minimized\" || item.slot.kind !== \"node\") {\n return null;\n }\n return item.slot.node.id;\n}\n\nfunction resolveNextDockItemPresence(\n item: WorkbenchHostDockItem,\n initialized: boolean,\n previousPresence: WorkbenchHostDockPresence | undefined,\n shouldAnimateMinimizedDockEnter: (nodeId: string) => boolean\n): WorkbenchHostDockPresence {\n if (!initialized) {\n return \"present\";\n }\n\n if (item.key === \"separator:minimized\") {\n return \"present\";\n }\n\n if (item.kind === \"minimized\") {\n const nodeId = resolveMinimizedDockItemNodeId(item);\n if (nodeId && shouldAnimateMinimizedDockEnter(nodeId)) {\n if (previousPresence === \"exiting\") {\n return \"entering\";\n }\n return previousPresence ?? \"entering\";\n }\n return \"present\";\n }\n\n if (previousPresence === \"exiting\") {\n return \"entering\";\n }\n\n return previousPresence ?? \"entering\";\n}\n\nfunction resolveDockPresenceItems(input: {\n current: readonly WorkbenchHostPresentDockItem[];\n initialized: boolean;\n nextSourceItems: readonly WorkbenchHostDockItem[];\n shouldAnimateMinimizedDockEnter: (nodeId: string) => boolean;\n}): WorkbenchHostPresentDockItem[] {\n const currentByKey = new Map(input.current.map((item) => [item.key, item]));\n const currentIndexByKey = new Map(\n input.current.map((item, index) => [item.key, index])\n );\n const nextByKey = new Map(\n input.nextSourceItems.map((item) => [item.key, item])\n );\n const nextKeys = new Set(input.nextSourceItems.map((item) => item.key));\n const currentVisibleItemCount = input.current.filter(\n (item) => item.presence !== \"exiting\"\n ).length;\n const shouldRetainExitingItems =\n input.nextSourceItems.length < currentVisibleItemCount;\n const emittedKeys = new Set<string>();\n const nextItems: WorkbenchHostPresentDockItem[] = [];\n let currentIndex = 0;\n\n const emitExitingUntil = (nextCurrentIndex: number) => {\n while (currentIndex < nextCurrentIndex) {\n const currentItem = input.current[currentIndex];\n currentIndex += 1;\n if (\n shouldRetainExitingItems &&\n currentItem &&\n !nextKeys.has(currentItem.key) &&\n !emittedKeys.has(currentItem.key)\n ) {\n emittedKeys.add(currentItem.key);\n nextItems.push({\n ...currentItem,\n presence: \"exiting\"\n });\n }\n }\n };\n\n for (const item of input.nextSourceItems) {\n const previousIndex = currentIndexByKey.get(item.key);\n if (previousIndex !== undefined) {\n emitExitingUntil(previousIndex);\n currentIndex = Math.max(currentIndex, previousIndex + 1);\n }\n emittedKeys.add(item.key);\n nextItems.push({\n item,\n key: item.key,\n presence: resolveNextDockItemPresence(\n item,\n input.initialized,\n currentByKey.get(item.key)?.presence,\n input.shouldAnimateMinimizedDockEnter\n )\n });\n }\n\n for (const currentItem of input.current) {\n if (shouldRetainExitingItems && !nextKeys.has(currentItem.key)) {\n if (emittedKeys.has(currentItem.key)) {\n continue;\n }\n emittedKeys.add(currentItem.key);\n nextItems.push({\n ...currentItem,\n presence: \"exiting\"\n });\n }\n }\n\n return nextItems.filter(\n (item) => nextByKey.has(item.key) || item.presence === \"exiting\"\n );\n}\n\nfunction resolveDockPresenceSettleMs(\n items: readonly WorkbenchHostPresentDockItem[]\n): number {\n if (\n items.some(\n (item) =>\n item.item.kind === \"minimized\" &&\n (item.presence === \"entering\" || item.presence === \"exiting\")\n )\n ) {\n return minimizedDockSlotLayoutAnimationMs;\n }\n return dockPresenceAnimationMs;\n}\n\nfunction useDockPresenceItems(\n items: readonly WorkbenchHostDockItem[],\n shouldAnimateMinimizedDockEnter: (nodeId: string) => boolean\n): WorkbenchHostPresentDockItem[] {\n const latestItemsByKey = useRef(new Map<string, WorkbenchHostDockItem>());\n const shouldAnimateMinimizedDockEnterRef = useRef(\n shouldAnimateMinimizedDockEnter\n );\n latestItemsByKey.current = new Map(items.map((item) => [item.key, item]));\n shouldAnimateMinimizedDockEnterRef.current = shouldAnimateMinimizedDockEnter;\n const itemKeys = items.map((item) => item.key).join(\"\\u0000\");\n const [presentItems, setPresentItems] = useState<\n WorkbenchHostPresentDockItem[]\n >(() =>\n items.map((item) => ({\n item,\n key: item.key,\n presence: \"present\" as const\n }))\n );\n const initialized = useRef(false);\n\n useEffect(() => {\n let nextSettleMs = dockPresenceAnimationMs;\n\n setPresentItems((current) => {\n const filteredItems = resolveDockPresenceItems({\n current,\n initialized: initialized.current,\n nextSourceItems: [...latestItemsByKey.current.values()],\n shouldAnimateMinimizedDockEnter:\n shouldAnimateMinimizedDockEnterRef.current\n });\n nextSettleMs = resolveDockPresenceSettleMs(filteredItems);\n return filteredItems;\n });\n initialized.current = true;\n\n const timeout = globalThis.setTimeout(() => {\n setPresentItems((current) =>\n current\n .filter((item) => item.presence !== \"exiting\")\n .map((item) =>\n item.presence === \"entering\"\n ? { ...item, presence: \"present\" as const }\n : item\n )\n );\n }, nextSettleMs);\n\n return () => globalThis.clearTimeout(timeout);\n }, [itemKeys]);\n\n const renderedPresentItems = resolveDockPresenceItems({\n current: presentItems,\n initialized: initialized.current,\n nextSourceItems: [...latestItemsByKey.current.values()],\n shouldAnimateMinimizedDockEnter\n });\n\n return renderedPresentItems.map((presentItem) => {\n const latestItem = latestItemsByKey.current.get(presentItem.key);\n return latestItem ? { ...presentItem, item: latestItem } : presentItem;\n });\n}\n\nfunction useDockWallpaperTones({\n dockItemsRef,\n elementRefs,\n itemKeys\n}: {\n dockItemsRef: RefObject<HTMLElement | null>;\n elementRefs: RefObject<Map<string, HTMLElement>>;\n itemKeys: string;\n}): ReadonlyMap<string, WorkbenchDockWallpaperTone> {\n const [tones, setTones] = useState<Map<string, WorkbenchDockWallpaperTone>>(\n () => new Map()\n );\n\n useLayoutEffect(() => {\n if (typeof window === \"undefined\") {\n return undefined;\n }\n\n let canceled = false;\n let frameId: number | null = null;\n\n const updateTones = () => {\n frameId = null;\n void resolveDockWallpaperTones({\n dockItemsElement: dockItemsRef.current,\n elements: elementRefs.current\n }).then((nextTones) => {\n if (canceled) {\n return;\n }\n setTones((current) =>\n dockWallpaperToneMapsEqual(current, nextTones) ? current : nextTones\n );\n });\n };\n\n const scheduleUpdate = () => {\n if (frameId !== null) {\n return;\n }\n frameId = window.requestAnimationFrame(updateTones);\n };\n\n scheduleUpdate();\n window.addEventListener(\"resize\", scheduleUpdate);\n\n const resizeObserver =\n typeof ResizeObserver === \"undefined\"\n ? null\n : new ResizeObserver(scheduleUpdate);\n if (dockItemsRef.current) {\n resizeObserver?.observe(dockItemsRef.current);\n }\n const wallpaperElement = dockItemsRef.current\n ?.closest(\".workbench-surface\")\n ?.querySelector(\".workbench-surface__wallpaper\");\n if (wallpaperElement instanceof HTMLElement) {\n resizeObserver?.observe(wallpaperElement);\n }\n\n return () => {\n canceled = true;\n if (frameId !== null) {\n window.cancelAnimationFrame(frameId);\n }\n resizeObserver?.disconnect();\n window.removeEventListener(\"resize\", scheduleUpdate);\n };\n }, [dockItemsRef, elementRefs, itemKeys]);\n\n return tones;\n}\n\nasync function resolveDockWallpaperTones({\n dockItemsElement,\n elements\n}: {\n dockItemsElement: HTMLElement | null;\n elements: ReadonlyMap<string, HTMLElement>;\n}): Promise<Map<string, WorkbenchDockWallpaperTone>> {\n const wallpaperElement = dockItemsElement\n ?.closest(\".workbench-surface\")\n ?.querySelector(\".workbench-surface__wallpaper\");\n if (!(wallpaperElement instanceof HTMLElement)) {\n return new Map();\n }\n\n const wallpaperStyle = window.getComputedStyle(wallpaperElement);\n const wallpaperUrl = parseDockWallpaperCssUrl(wallpaperStyle.backgroundImage);\n if (!wallpaperUrl) {\n return new Map();\n }\n\n const wallpaperImage = await loadDockWallpaperImage(wallpaperUrl);\n if (!wallpaperImage) {\n return new Map();\n }\n\n const sampleCanvas = createDockWallpaperSampleCanvas(wallpaperImage);\n if (!sampleCanvas) {\n return new Map();\n }\n\n const wallpaperRect = wallpaperElement.getBoundingClientRect();\n const renderedImageRect = resolveDockWallpaperRenderedImageRect({\n containerHeight: wallpaperRect.height,\n containerWidth: wallpaperRect.width,\n imageHeight: wallpaperImage.naturalHeight,\n imageWidth: wallpaperImage.naturalWidth,\n positionX: wallpaperStyle.backgroundPositionX,\n positionY: wallpaperStyle.backgroundPositionY,\n size: wallpaperStyle.backgroundSize\n });\n const nextTones = new Map<string, WorkbenchDockWallpaperTone>();\n\n for (const [key, element] of elements) {\n const luminance = sampleDockWallpaperLuminanceAtElement({\n elementRect: element.getBoundingClientRect(),\n renderedImageRect,\n sampleCanvas,\n wallpaperRect\n });\n if (luminance === null) {\n continue;\n }\n nextTones.set(\n key,\n luminance < dockWallpaperDarkLuminanceThreshold ? \"dark\" : \"light\"\n );\n }\n\n return nextTones;\n}\n\nfunction parseDockWallpaperCssUrl(backgroundImage: string): string | null {\n const match = /^url\\((['\"]?)(.*)\\1\\)$/u.exec(backgroundImage.trim());\n return match?.[2] ? match[2] : null;\n}\n\nconst dockWallpaperImageCache = new Map<\n string,\n Promise<HTMLImageElement | null>\n>();\n\nfunction loadDockWallpaperImage(url: string): Promise<HTMLImageElement | null> {\n const cached = dockWallpaperImageCache.get(url);\n if (cached) {\n return cached;\n }\n const promise = new Promise<HTMLImageElement | null>((resolve) => {\n const image = new Image();\n image.decoding = \"async\";\n image.onload = () => resolve(image);\n image.onerror = () => resolve(null);\n image.src = url;\n });\n dockWallpaperImageCache.set(url, promise);\n return promise;\n}\n\nfunction createDockWallpaperSampleCanvas(\n image: HTMLImageElement\n): HTMLCanvasElement | null {\n if (image.naturalWidth <= 0 || image.naturalHeight <= 0) {\n return null;\n }\n const canvas = document.createElement(\"canvas\");\n const scale =\n dockWallpaperSampleCanvasMaxSizePx /\n Math.max(image.naturalWidth, image.naturalHeight);\n canvas.width = Math.max(1, Math.round(image.naturalWidth * scale));\n canvas.height = Math.max(1, Math.round(image.naturalHeight * scale));\n const context = canvas.getContext(\"2d\", { willReadFrequently: true });\n if (!context) {\n return null;\n }\n try {\n context.drawImage(image, 0, 0, canvas.width, canvas.height);\n context.getImageData(0, 0, 1, 1);\n } catch {\n return null;\n }\n return canvas;\n}\n\nfunction resolveDockWallpaperRenderedImageRect({\n containerHeight,\n containerWidth,\n imageHeight,\n imageWidth,\n positionX,\n positionY,\n size\n}: {\n containerHeight: number;\n containerWidth: number;\n imageHeight: number;\n imageWidth: number;\n positionX: string;\n positionY: string;\n size: string;\n}): { height: number; left: number; top: number; width: number } {\n const imageAspect = imageWidth / imageHeight;\n const containerAspect = containerWidth / containerHeight;\n let width = containerWidth;\n let height = containerHeight;\n\n if (size === \"cover\") {\n if (containerAspect > imageAspect) {\n height = containerWidth / imageAspect;\n } else {\n width = containerHeight * imageAspect;\n }\n } else if (size === \"contain\") {\n if (containerAspect > imageAspect) {\n width = containerHeight * imageAspect;\n } else {\n height = containerWidth / imageAspect;\n }\n } else if (size !== \"100% 100%\") {\n width = imageWidth;\n height = imageHeight;\n }\n\n return {\n height,\n left: resolveDockWallpaperPositionOffset(positionX, containerWidth - width),\n top: resolveDockWallpaperPositionOffset(\n positionY,\n containerHeight - height\n ),\n width\n };\n}\n\nfunction resolveDockWallpaperPositionOffset(\n value: string,\n availableSpace: number\n): number {\n const trimmed = value.trim();\n if (trimmed.endsWith(\"%\")) {\n const percentage = Number.parseFloat(trimmed);\n return Number.isFinite(percentage)\n ? (availableSpace * percentage) / 100\n : availableSpace / 2;\n }\n if (trimmed.endsWith(\"px\")) {\n const px = Number.parseFloat(trimmed);\n return Number.isFinite(px) ? px : availableSpace / 2;\n }\n if (trimmed === \"left\" || trimmed === \"top\") {\n return 0;\n }\n if (trimmed === \"right\" || trimmed === \"bottom\") {\n return availableSpace;\n }\n return availableSpace / 2;\n}\n\nfunction sampleDockWallpaperLuminanceAtElement({\n elementRect,\n renderedImageRect,\n sampleCanvas,\n wallpaperRect\n}: {\n elementRect: DOMRect;\n renderedImageRect: {\n height: number;\n left: number;\n top: number;\n width: number;\n };\n sampleCanvas: HTMLCanvasElement;\n wallpaperRect: DOMRect;\n}): number | null {\n const context = sampleCanvas.getContext(\"2d\", { willReadFrequently: true });\n if (!context) {\n return null;\n }\n const isVerticalElement = elementRect.height >= elementRect.width;\n let luminanceSum = 0;\n let samples = 0;\n\n for (let index = 0; index < dockWallpaperToneSampleCount; index += 1) {\n const ratio = index / (dockWallpaperToneSampleCount - 1);\n const clientX = isVerticalElement\n ? elementRect.left + elementRect.width / 2\n : elementRect.left + elementRect.width * ratio;\n const clientY = isVerticalElement\n ? elementRect.top + elementRect.height * ratio\n : elementRect.top + elementRect.height / 2;\n const imageX =\n (clientX - wallpaperRect.left - renderedImageRect.left) /\n renderedImageRect.width;\n const imageY =\n (clientY - wallpaperRect.top - renderedImageRect.top) /\n renderedImageRect.height;\n if (imageX < 0 || imageX > 1 || imageY < 0 || imageY > 1) {\n continue;\n }\n const canvasX = Math.min(\n sampleCanvas.width - 1,\n Math.max(0, Math.round(imageX * (sampleCanvas.width - 1)))\n );\n const canvasY = Math.min(\n sampleCanvas.height - 1,\n Math.max(0, Math.round(imageY * (sampleCanvas.height - 1)))\n );\n const pixel = context.getImageData(canvasX, canvasY, 1, 1).data;\n const red = pixel[0] ?? 0;\n const green = pixel[1] ?? 0;\n const blue = pixel[2] ?? 0;\n luminanceSum += 0.2126 * red + 0.7152 * green + 0.0722 * blue;\n samples += 1;\n }\n\n return samples > 0 ? luminanceSum / samples : null;\n}\n\nfunction dockWallpaperToneMapsEqual(\n left: ReadonlyMap<string, WorkbenchDockWallpaperTone>,\n right: ReadonlyMap<string, WorkbenchDockWallpaperTone>\n): boolean {\n if (left.size !== right.size) {\n return false;\n }\n for (const [key, value] of left) {\n if (right.get(key) !== value) {\n return false;\n }\n }\n return true;\n}\n\nconst DOCK_BOUNCE_MS = 600;\nconst DOCK_ENTRY_CLICK_THROTTLE_MS = DOCK_BOUNCE_MS;\n\nfunction useDockBounce(slotRefs: RefObject<Map<string, HTMLElement>>) {\n const timeoutsRef = useRef(new Map<string, ReturnType<typeof setTimeout>>());\n\n const clearDockBounce = useCallback(\n (anchorKey: string): boolean => {\n const timeout = timeoutsRef.current.get(anchorKey);\n const slotElement = slotRefs.current.get(anchorKey);\n const wasBouncing = slotElement?.hasAttribute(\"data-bouncing\") === true;\n if (timeout) {\n clearTimeout(timeout);\n timeoutsRef.current.delete(anchorKey);\n }\n slotElement?.removeAttribute(\"data-bouncing\");\n return wasBouncing;\n },\n [slotRefs]\n );\n\n useEffect(\n () => () => {\n for (const anchorKey of timeoutsRef.current.keys()) {\n clearDockBounce(anchorKey);\n }\n timeoutsRef.current.clear();\n },\n [clearDockBounce]\n );\n\n const triggerDockBounce = useCallback(\n (anchorKey: string) => {\n const shouldRestartAnimation = clearDockBounce(anchorKey);\n\n const slotElement = slotRefs.current.get(anchorKey);\n if (!slotElement) {\n return;\n }\n\n if (shouldRestartAnimation) {\n // Restart the CSS keyframes without scheduling a React render.\n void slotElement.offsetWidth;\n }\n slotElement.setAttribute(\"data-bouncing\", \"true\");\n timeoutsRef.current.set(\n anchorKey,\n setTimeout(() => {\n clearDockBounce(anchorKey);\n }, DOCK_BOUNCE_MS)\n );\n },\n [clearDockBounce, slotRefs]\n );\n\n return { triggerDockBounce };\n}\n\nfunction resolveWorkbenchHostDockItemsWidth(\n items: readonly WorkbenchHostDockItem[]\n): number {\n if (items.length === 0) {\n return dockItemsHorizontalPaddingPx;\n }\n\n const itemWidth = items.reduce(\n (sum, item) =>\n sum +\n (item.kind === \"separator\" ? dockSeparatorOuterWidthPx : dockSlotWidthPx),\n 0\n );\n const gapWidth = Math.max(0, items.length - 1) * dockItemsGapPx;\n return itemWidth + gapWidth + dockItemsHorizontalPaddingPx;\n}\n\nconst dockHoverPanelOpenDelayMs = 450;\nconst dockHoverPanelCloseDelayMs = 160;\nconst dockHoverPanelHitSlopPx = 12;\nconst dockHoverPanelBridgeSlopPx = 6;\nconst dockHoverPanelPointerRestTolerancePx = 4;\nconst dockWallpaperSampleCanvasMaxSizePx = 192;\nconst dockWallpaperToneSampleCount = 7;\nconst dockWallpaperDarkLuminanceThreshold = 132;\n\nfunction rectContainsPoint(\n rect: DOMRect,\n clientX: number,\n clientY: number,\n slopPx = 0\n): boolean {\n return (\n clientX >= rect.left - slopPx &&\n clientX <= rect.right + slopPx &&\n clientY >= rect.top - slopPx &&\n clientY <= rect.bottom + slopPx\n );\n}\n\nfunction createHoverPanelBridgeRect(anchor: DOMRect, panel: DOMRect): DOMRect {\n if (anchor.right <= panel.left || panel.right <= anchor.left) {\n const left = Math.min(anchor.right, panel.right);\n const right = Math.max(anchor.left, panel.left);\n const top = Math.max(anchor.top, panel.top);\n const bottom = Math.min(anchor.bottom, panel.bottom);\n return new DOMRect(left, top, right - left, Math.max(0, bottom - top));\n }\n\n const left = Math.max(anchor.left, panel.left);\n const right = Math.min(anchor.right, panel.right);\n const top = Math.min(anchor.bottom, panel.bottom);\n const bottom = Math.max(anchor.top, panel.top);\n return new DOMRect(left, top, Math.max(0, right - left), bottom - top);\n}\nconst dockPresenceAnimationMs = 300;\nconst minimizedDockSlotLayoutAnimationMs = 720;\nconst dockItemsGapPx = 10.8;\nconst dockItemsHorizontalPaddingPx = 12.6;\nconst dockSeparatorOuterWidthPx = 8.1;\nconst dockSlotWidthPx = 43.2;\nconst desktopDockPlateChromeWidth = 15.3;\n\ninterface WorkbenchHostDockPlateStyle extends CSSProperties {\n \"--desktop-dock-frame-size\"?: string;\n}\n\ninterface WorkbenchHostDockHoverPanelStyle extends CSSProperties {\n \"--desktop-dock-hover-panel-anchor-height\"?: string;\n \"--desktop-dock-hover-panel-anchor-left\"?: string;\n \"--desktop-dock-hover-panel-anchor-top\"?: string;\n \"--desktop-dock-hover-panel-anchor-width\"?: string;\n}\n\ninterface WorkbenchHostDockLabelTooltipStyle extends CSSProperties {\n \"--desktop-dock-label-tooltip-anchor-height\"?: string;\n \"--desktop-dock-label-tooltip-anchor-left\"?: string;\n \"--desktop-dock-label-tooltip-anchor-top\"?: string;\n \"--desktop-dock-label-tooltip-anchor-width\"?: string;\n}\n\ntype WorkbenchHostDockPresence = \"entering\" | \"exiting\" | \"present\";\ntype WorkbenchHostDockScrollDirection = \"backward\" | \"forward\";\n\ninterface WorkbenchHostDockLabelTooltipTarget {\n key: string;\n label: string;\n}\n\ninterface WorkbenchHostDockLabelTooltipState extends WorkbenchHostDockLabelTooltipTarget {\n anchorKey: string;\n anchorRect: {\n height: number;\n left: number;\n top: number;\n width: number;\n };\n}\n\ninterface WorkbenchHostDockHoverPanelState {\n anchorKey: string;\n anchorRect: {\n height: number;\n left: number;\n top: number;\n width: number;\n };\n entryId: string;\n}\n\ntype WorkbenchHostDockItem =\n | {\n key: string;\n kind: \"entry\";\n resolvedEntry: ResolvedWorkbenchHostDockEntry;\n }\n | {\n key: string;\n kind: \"minimized\";\n slot: WorkbenchMinimizedDockSlot;\n }\n | {\n key: string;\n kind: \"separator\";\n };\n\ninterface WorkbenchHostPresentDockItem {\n item: WorkbenchHostDockItem;\n key: string;\n presence: WorkbenchHostDockPresence;\n}\n","import type { WorkbenchNode } from \"../core/types.ts\";\nimport type {\n WorkbenchHostDockEntry,\n WorkbenchHostNodeData,\n WorkbenchHostNodeInstanceStrategy\n} from \"./types.ts\";\n\nexport type WorkbenchHostDockNodeState = \"closed\" | \"minimized\" | \"open\";\n\nexport interface ResolvedWorkbenchHostDockEntry {\n anchorKey: string;\n dockNodeState: WorkbenchHostDockNodeState;\n entry: WorkbenchHostDockEntry;\n hasMatchingNodes: boolean;\n matchedNodes: WorkbenchNode<WorkbenchHostNodeData>[];\n sectionBreakBefore: boolean;\n}\n\nexport type WorkbenchHostDockClickResolution =\n | { actionId: string; kind: \"action\" }\n | { kind: \"blocked\" }\n | { kind: \"focus-node\"; nodeId: string }\n | { kind: \"launch\" }\n | { kind: \"open-popup\" };\n\nexport function matchWorkbenchDockEntryNode(\n entry: WorkbenchHostDockEntry,\n node: WorkbenchNode<WorkbenchHostNodeData>\n): boolean {\n if (typeof node.data.dockEntryId === \"string\") {\n return node.data.dockEntryId === entry.id;\n }\n return entry.matchNode?.(node) ?? false;\n}\n\nexport function resolveWorkbenchDockEntryAnchorKey(\n entry: WorkbenchHostDockEntry\n): string {\n return entry.anchorKey ?? entry.id;\n}\n\nexport function resolveWorkbenchDockEntries(input: {\n dockEntries: readonly WorkbenchHostDockEntry[];\n minimizedNodeIds: ReadonlySet<string>;\n nodes: readonly WorkbenchNode<WorkbenchHostNodeData>[];\n}): ResolvedWorkbenchHostDockEntry[] {\n const sectionOrder = new Map<string, number>();\n let nextSectionIndex = 0;\n const sortedEntries = [...input.dockEntries]\n .map((entry, index) => {\n const sectionId = entry.sectionId ?? \"\";\n if (!sectionOrder.has(sectionId)) {\n sectionOrder.set(sectionId, nextSectionIndex++);\n }\n return {\n entry,\n index,\n sectionId\n };\n })\n .sort((left, right) => {\n const sectionOrderDelta =\n (sectionOrder.get(left.sectionId) ?? 0) -\n (sectionOrder.get(right.sectionId) ?? 0);\n if (sectionOrderDelta !== 0) {\n return sectionOrderDelta;\n }\n const orderDelta = (left.entry.order ?? 0) - (right.entry.order ?? 0);\n if (orderDelta !== 0) {\n return orderDelta;\n }\n return left.index - right.index;\n });\n\n let previousSectionId: string | null = null;\n const resolvedEntries: ResolvedWorkbenchHostDockEntry[] = [];\n\n for (const { entry, sectionId } of sortedEntries) {\n const matchedNodes = input.nodes.filter((node) =>\n matchWorkbenchDockEntryNode(entry, node)\n );\n const hasMatchingNodes = matchedNodes.length > 0;\n const visibility = entry.visibility ?? \"always\";\n if (\n visibility === \"never\" ||\n (visibility === \"when-open\" && !hasMatchingNodes)\n ) {\n continue;\n }\n\n const hasOpenNode = matchedNodes.some(\n (node) => !input.minimizedNodeIds.has(node.id)\n );\n const hasMinimizedNode = matchedNodes.some((node) =>\n input.minimizedNodeIds.has(node.id)\n );\n\n resolvedEntries.push({\n anchorKey: resolveWorkbenchDockEntryAnchorKey(entry),\n dockNodeState: hasMinimizedNode\n ? \"minimized\"\n : hasOpenNode\n ? \"open\"\n : \"closed\",\n entry,\n hasMatchingNodes,\n matchedNodes,\n sectionBreakBefore:\n previousSectionId !== null && previousSectionId !== sectionId\n });\n previousSectionId = sectionId;\n }\n\n return resolvedEntries;\n}\n\nexport function resolveWorkbenchDockEntryClick(input: {\n entry: WorkbenchHostDockEntry;\n instanceMode?: WorkbenchHostNodeInstanceStrategy[\"mode\"];\n matchedNodes: readonly WorkbenchNode<WorkbenchHostNodeData>[];\n}): WorkbenchHostDockClickResolution {\n if (input.entry.clickActionId) {\n if (isWorkbenchDockEntryBlocked(input.entry)) {\n return { kind: \"blocked\" };\n }\n return { actionId: input.entry.clickActionId, kind: \"action\" };\n }\n if (isWorkbenchDockEntryBlocked(input.entry)) {\n return { kind: \"blocked\" };\n }\n if (input.instanceMode === \"multi\" && input.matchedNodes.length > 0) {\n return { kind: \"open-popup\" };\n }\n if (input.matchedNodes.length === 1) {\n return { kind: \"focus-node\", nodeId: input.matchedNodes[0]!.id };\n }\n if (input.matchedNodes.length > 1) {\n return { kind: \"open-popup\" };\n }\n return { kind: \"launch\" };\n}\n\nfunction isWorkbenchDockEntryBlocked(entry: WorkbenchHostDockEntry): boolean {\n const stateKind = entry.state?.kind ?? \"enabled\";\n return (\n stateKind === \"disabled\" ||\n stateKind === \"loading\" ||\n stateKind === \"unavailable\" ||\n (entry.launchBehavior ?? \"enabled\") !== \"enabled\"\n );\n}\n","import { useCallback, useEffect, useRef, type RefObject } from \"react\";\n\nexport const DOCK_ICON_BASE_SIZE = 43.2;\nexport const DOCK_ICON_PEAK_SIZE = DOCK_ICON_BASE_SIZE * 1.7;\nexport const DOCK_MAGNIFICATION_HALF_RANGE = DOCK_ICON_BASE_SIZE * 2.4;\n\nconst DOCK_MAGNIFICATION_SPRING_MASS = 0.1;\nconst DOCK_MAGNIFICATION_SPRING_STIFFNESS = 200;\nconst DOCK_MAGNIFICATION_SPRING_DAMPING = 14;\nconst MAGNIFICATION_SETTLE_EPSILON = 0.2;\nconst MAGNIFICATION_SIZE_EPSILON = 0.2;\nconst MAX_MAGNIFICATION_STEP_SECONDS = 1 / 30;\nconst MAGNIFICATION_INFLUENCE_PADDING = 8;\nconst DOCK_MAGNIFICATION_ENTRY_RAMP_MS = 90;\nconst DOCK_MAGNIFICATION_CROSS_AXIS_PADDING = 8;\n\ninterface DockMagnificationSpring {\n value: number;\n velocity: number;\n}\n\ninterface DockMagnificationAppliedStyle {\n size: number;\n}\n\nexport interface DockMagnificationSlotRect {\n bottom: number;\n left: number;\n right: number;\n top: number;\n}\n\ninterface DockMagnificationHitBounds {\n crossEnd: number;\n crossStart: number;\n mainEnd: number;\n mainStart: number;\n}\n\nconst dockMagnificationShellBySlot = new WeakMap<\n HTMLElement,\n HTMLElement | null\n>();\n\nexport function mapDistanceToTargetSize(\n distance: number,\n baseSize = DOCK_ICON_BASE_SIZE,\n peakSize = DOCK_ICON_PEAK_SIZE,\n halfRange = DOCK_MAGNIFICATION_HALF_RANGE\n): number {\n const absoluteDistance = Math.abs(distance);\n if (absoluteDistance >= halfRange) {\n return baseSize;\n }\n\n const influence = 1 - absoluteDistance / halfRange;\n return baseSize + (peakSize - baseSize) * influence;\n}\n\nexport function applyDockMagnificationEntryRamp(\n targetSize: number,\n baseSize: number,\n progress: number\n): number {\n const clampedProgress = Math.min(1, Math.max(0, progress));\n return baseSize + (targetSize - baseSize) * clampedProgress;\n}\n\nexport function resolveDockMagnificationHitBounds(\n slotRects: readonly DockMagnificationSlotRect[],\n dockPlacement: \"bottom\" | \"left\",\n crossAxisPadding = DOCK_MAGNIFICATION_CROSS_AXIS_PADDING\n): DockMagnificationHitBounds | null {\n if (slotRects.length === 0) {\n return null;\n }\n\n let mainStart = Number.POSITIVE_INFINITY;\n let mainEnd = Number.NEGATIVE_INFINITY;\n let crossStart = Number.POSITIVE_INFINITY;\n let crossEnd = Number.NEGATIVE_INFINITY;\n\n for (const rect of slotRects) {\n if (dockPlacement === \"left\") {\n mainStart = Math.min(mainStart, rect.top);\n mainEnd = Math.max(mainEnd, rect.bottom);\n crossStart = Math.min(crossStart, rect.left);\n crossEnd = Math.max(crossEnd, rect.right);\n } else {\n mainStart = Math.min(mainStart, rect.left);\n mainEnd = Math.max(mainEnd, rect.right);\n crossStart = Math.min(crossStart, rect.top);\n crossEnd = Math.max(crossEnd, rect.bottom);\n }\n }\n\n const effectiveCrossAxisEndPadding =\n dockPlacement === \"left\"\n ? crossAxisPadding + (DOCK_ICON_PEAK_SIZE - DOCK_ICON_BASE_SIZE)\n : crossAxisPadding;\n\n return {\n crossEnd: crossEnd + effectiveCrossAxisEndPadding,\n crossStart: crossStart - crossAxisPadding,\n mainEnd,\n mainStart\n };\n}\n\nfunction isDockMagnificationPointInsideHitBounds({\n clientX,\n clientY,\n dockPlacement,\n hitBounds\n}: {\n clientX: number;\n clientY: number;\n dockPlacement: \"bottom\" | \"left\";\n hitBounds: DockMagnificationHitBounds | null;\n}): boolean {\n if (!hitBounds) {\n return false;\n }\n\n const mainAxis = dockPlacement === \"left\" ? clientY : clientX;\n const crossAxis = dockPlacement === \"left\" ? clientX : clientY;\n return (\n mainAxis >= hitBounds.mainStart &&\n mainAxis <= hitBounds.mainEnd &&\n crossAxis >= hitBounds.crossStart &&\n crossAxis <= hitBounds.crossEnd\n );\n}\n\nexport function resolveDockMagnificationSlotCenter(\n rect: DockMagnificationSlotRect,\n dockPlacement: \"bottom\" | \"left\",\n baseSize = DOCK_ICON_BASE_SIZE\n): number {\n return dockPlacement === \"left\"\n ? rect.top + baseSize / 2\n : rect.left + baseSize / 2;\n}\n\nconst DOCK_MAGNIFICATION_SPRING_SUBSTEPS = 8;\n\nexport function advanceDockMagnificationSpring(\n current: DockMagnificationSpring,\n target: number,\n deltaSeconds: number\n): DockMagnificationSpring {\n const subDeltaSeconds = deltaSeconds / DOCK_MAGNIFICATION_SPRING_SUBSTEPS;\n let { value, velocity } = current;\n\n for (let step = 0; step < DOCK_MAGNIFICATION_SPRING_SUBSTEPS; step += 1) {\n const force =\n -DOCK_MAGNIFICATION_SPRING_STIFFNESS * (value - target) -\n DOCK_MAGNIFICATION_SPRING_DAMPING * velocity;\n const acceleration = force / DOCK_MAGNIFICATION_SPRING_MASS;\n velocity += acceleration * subDeltaSeconds;\n value += velocity * subDeltaSeconds;\n }\n\n return { value, velocity };\n}\n\nexport function isDockMagnificationSpringSettled(\n spring: DockMagnificationSpring,\n target: number\n): boolean {\n return (\n Math.abs(spring.value - target) <= MAGNIFICATION_SETTLE_EPSILON &&\n Math.abs(spring.velocity) <= MAGNIFICATION_SETTLE_EPSILON\n );\n}\n\nfunction roundDockMagnificationSize(size: number): number {\n return Math.round(size * 10) / 10;\n}\n\nfunction hasAppliedSizeChanged(\n previous: DockMagnificationAppliedStyle | undefined,\n next: DockMagnificationAppliedStyle\n): boolean {\n if (!previous) {\n return true;\n }\n\n return Math.abs(previous.size - next.size) > MAGNIFICATION_SIZE_EPSILON;\n}\n\nexport function resolveDockMagnificationSlotLayoutSize({\n size\n}: {\n size: number;\n}): { height: number; width: number } {\n return { height: size, width: size };\n}\n\nexport function isDockMagnificationSlotLayoutLocked(\n slotElement: HTMLElement\n): boolean {\n return (\n slotElement.dataset.collapsing === \"true\" ||\n slotElement.dataset.presence === \"entering\" ||\n slotElement.dataset.presence === \"exiting\"\n );\n}\n\nfunction resolveDockMagnificationShell(\n slotElement: HTMLElement\n): HTMLElement | null {\n const cachedShell = dockMagnificationShellBySlot.get(slotElement);\n if (\n cachedShell !== undefined &&\n (cachedShell === null || slotElement.contains(cachedShell))\n ) {\n return cachedShell;\n }\n\n const shell =\n slotElement.querySelector<HTMLElement>(\"[data-desktop-dock-icon-shell]\") ??\n slotElement.querySelector<HTMLElement>(\n \".desktop-dock__minimized-preview\"\n ) ??\n slotElement.querySelector<HTMLElement>(\n \".desktop-dock__minimized-stack-icon\"\n );\n dockMagnificationShellBySlot.set(slotElement, shell);\n return shell;\n}\n\nfunction applyDockSlotMagnification(\n slotElement: HTMLElement,\n size: number,\n baseSize: number,\n appliedStylesRef: Map<string, DockMagnificationAppliedStyle>\n): void {\n const anchorKey = slotElement.dataset.desktopDockAnchorKey;\n if (!anchorKey) {\n return;\n }\n\n const shell = resolveDockMagnificationShell(slotElement);\n if (!shell) {\n return;\n }\n\n const nextStyle = {\n size: roundDockMagnificationSize(size)\n };\n\n if (!hasAppliedSizeChanged(appliedStylesRef.get(anchorKey), nextStyle)) {\n return;\n }\n\n appliedStylesRef.set(anchorKey, nextStyle);\n\n if (Math.abs(nextStyle.size - baseSize) <= MAGNIFICATION_SIZE_EPSILON) {\n slotElement.style.removeProperty(\"width\");\n slotElement.style.removeProperty(\"height\");\n shell.style.removeProperty(\"transform\");\n return;\n }\n\n const scale = nextStyle.size / baseSize;\n const layoutSize = resolveDockMagnificationSlotLayoutSize({\n size: nextStyle.size\n });\n slotElement.style.width = `${layoutSize.width}px`;\n slotElement.style.height = `${layoutSize.height}px`;\n shell.style.transform = `scale(${scale})`;\n}\n\nfunction clearDockSlotMagnification(\n slotElement: HTMLElement,\n appliedStylesRef: Map<string, DockMagnificationAppliedStyle>\n): void {\n const anchorKey = slotElement.dataset.desktopDockAnchorKey;\n if (anchorKey) {\n appliedStylesRef.delete(anchorKey);\n }\n slotElement.style.removeProperty(\"width\");\n slotElement.style.removeProperty(\"height\");\n const shell = resolveDockMagnificationShell(slotElement);\n shell?.style.removeProperty(\"transform\");\n}\n\nexport function useDockMagnification({\n dockPlacement,\n dockRootRef,\n slotRefs\n}: {\n dockPlacement: \"bottom\" | \"left\";\n dockRootRef: RefObject<HTMLElement | null>;\n slotRefs: RefObject<Map<string, HTMLElement>>;\n}) {\n const pointerAxisRef = useRef<number | null>(null);\n const pendingPointerAxisRef = useRef<number | null>(null);\n const springsRef = useRef(new Map<string, DockMagnificationSpring>());\n const appliedStylesRef = useRef(\n new Map<string, DockMagnificationAppliedStyle>()\n );\n const animationFrameRef = useRef<number | null>(null);\n const lastFrameTimeRef = useRef<number | null>(null);\n const entryRampStartedAtRef = useRef<number | null>(null);\n const restCentersRef = useRef<Map<string, number> | null>(null);\n const hitBoundsRef = useRef<DockMagnificationHitBounds | null>(null);\n const slotOrderRef = useRef<string[]>([]);\n const magnifyActiveRef = useRef(false);\n\n const setMagnifyActive = useCallback(\n (active: boolean) => {\n if (magnifyActiveRef.current === active) {\n return;\n }\n magnifyActiveRef.current = active;\n if (active) {\n dockRootRef.current?.setAttribute(\"data-dock-pointer-active\", \"true\");\n } else {\n dockRootRef.current?.removeAttribute(\"data-dock-pointer-active\");\n }\n },\n [dockRootRef]\n );\n\n const stopAnimation = useCallback(() => {\n if (animationFrameRef.current !== null) {\n cancelAnimationFrame(animationFrameRef.current);\n animationFrameRef.current = null;\n }\n lastFrameTimeRef.current = null;\n }, []);\n\n const captureRestCenters = useCallback(() => {\n const slots = slotRefs.current;\n const centers = new Map<string, number>();\n const slotRects: DockMagnificationSlotRect[] = [];\n const order: string[] = [];\n for (const [anchorKey, slotElement] of slots) {\n order.push(anchorKey);\n const rect = slotElement.getBoundingClientRect();\n slotRects.push({\n bottom: rect.bottom,\n left: rect.left,\n right: rect.right,\n top: rect.top\n });\n const center = resolveDockMagnificationSlotCenter(rect, dockPlacement);\n centers.set(anchorKey, center);\n }\n slotOrderRef.current = order;\n hitBoundsRef.current = resolveDockMagnificationHitBounds(\n slotRects,\n dockPlacement\n );\n restCentersRef.current = centers;\n }, [dockPlacement, slotRefs]);\n\n const runAnimationFrame = useCallback(\n (frameTime: number) => {\n if (pendingPointerAxisRef.current !== null) {\n pointerAxisRef.current = pendingPointerAxisRef.current;\n }\n\n const pointerAxis = pointerAxisRef.current;\n if (pointerAxis !== null) {\n captureRestCenters();\n entryRampStartedAtRef.current ??= frameTime;\n }\n const slots = slotRefs.current;\n const order = slotOrderRef.current;\n const previousFrameTime = lastFrameTimeRef.current;\n lastFrameTimeRef.current = frameTime;\n const deltaSeconds =\n previousFrameTime === null\n ? 1 / 60\n : Math.min(\n (frameTime - previousFrameTime) / 1000,\n MAX_MAGNIFICATION_STEP_SECONDS\n );\n\n let shouldContinue = false;\n let allSettled = true;\n const influenceRadius =\n DOCK_MAGNIFICATION_HALF_RANGE + MAGNIFICATION_INFLUENCE_PADDING;\n const entryRampProgress =\n pointerAxis === null || entryRampStartedAtRef.current === null\n ? 1\n : (frameTime - entryRampStartedAtRef.current) /\n DOCK_MAGNIFICATION_ENTRY_RAMP_MS;\n\n for (let index = 0; index < order.length; index += 1) {\n const anchorKey = order[index];\n if (!anchorKey) {\n continue;\n }\n\n const center = restCentersRef.current?.get(anchorKey);\n if (center === undefined) {\n continue;\n }\n\n const distance =\n pointerAxis === null\n ? DOCK_MAGNIFICATION_HALF_RANGE\n : pointerAxis - center;\n const absoluteDistance = Math.abs(distance);\n const inRange = absoluteDistance < influenceRadius;\n const targetSize = inRange\n ? applyDockMagnificationEntryRamp(\n mapDistanceToTargetSize(distance),\n DOCK_ICON_BASE_SIZE,\n entryRampProgress\n )\n : DOCK_ICON_BASE_SIZE;\n\n const currentSpring = springsRef.current.get(anchorKey) ?? {\n value: DOCK_ICON_BASE_SIZE,\n velocity: 0\n };\n const nextSpring =\n inRange ||\n !isDockMagnificationSpringSettled(currentSpring, DOCK_ICON_BASE_SIZE)\n ? advanceDockMagnificationSpring(\n currentSpring,\n targetSize,\n deltaSeconds\n )\n : currentSpring;\n\n if (\n !inRange &&\n isDockMagnificationSpringSettled(nextSpring, DOCK_ICON_BASE_SIZE)\n ) {\n springsRef.current.delete(anchorKey);\n const slotElement = slots.get(anchorKey);\n if (slotElement) {\n clearDockSlotMagnification(slotElement, appliedStylesRef.current);\n }\n continue;\n }\n\n springsRef.current.set(anchorKey, nextSpring);\n\n const settled = isDockMagnificationSpringSettled(\n nextSpring,\n targetSize\n );\n if (!settled) {\n shouldContinue = true;\n }\n if (\n !isDockMagnificationSpringSettled(nextSpring, DOCK_ICON_BASE_SIZE)\n ) {\n allSettled = false;\n }\n\n const slotElement = slots.get(anchorKey);\n if (!slotElement) {\n continue;\n }\n\n if (isDockMagnificationSlotLayoutLocked(slotElement)) {\n springsRef.current.delete(anchorKey);\n clearDockSlotMagnification(slotElement, appliedStylesRef.current);\n continue;\n }\n\n if (\n pointerAxis === null &&\n isDockMagnificationSpringSettled(nextSpring, DOCK_ICON_BASE_SIZE)\n ) {\n springsRef.current.delete(anchorKey);\n clearDockSlotMagnification(slotElement, appliedStylesRef.current);\n continue;\n }\n\n applyDockSlotMagnification(\n slotElement,\n nextSpring.value,\n DOCK_ICON_BASE_SIZE,\n appliedStylesRef.current\n );\n }\n\n if (pointerAxis !== null) {\n shouldContinue = true;\n } else if (!allSettled) {\n shouldContinue = true;\n }\n\n if (pointerAxis === null && allSettled) {\n entryRampStartedAtRef.current = null;\n restCentersRef.current = null;\n hitBoundsRef.current = null;\n slotOrderRef.current = [];\n setMagnifyActive(false);\n }\n\n if (shouldContinue) {\n animationFrameRef.current = requestAnimationFrame(runAnimationFrame);\n return;\n }\n\n animationFrameRef.current = null;\n lastFrameTimeRef.current = null;\n },\n [captureRestCenters, setMagnifyActive, slotRefs]\n );\n\n const scheduleAnimation = useCallback(() => {\n if (animationFrameRef.current !== null) {\n return;\n }\n animationFrameRef.current = requestAnimationFrame(runAnimationFrame);\n }, [runAnimationFrame]);\n\n const handlePointerMove = useCallback(\n (clientX: number, clientY: number) => {\n if (restCentersRef.current === null) {\n captureRestCenters();\n }\n\n if (\n !isDockMagnificationPointInsideHitBounds({\n clientX,\n clientY,\n dockPlacement,\n hitBounds: hitBoundsRef.current\n })\n ) {\n pendingPointerAxisRef.current = null;\n pointerAxisRef.current = null;\n entryRampStartedAtRef.current = null;\n scheduleAnimation();\n return;\n }\n\n pendingPointerAxisRef.current =\n dockPlacement === \"left\" ? clientY : clientX;\n if (!magnifyActiveRef.current) {\n setMagnifyActive(true);\n }\n scheduleAnimation();\n },\n [captureRestCenters, dockPlacement, scheduleAnimation, setMagnifyActive]\n );\n\n const handlePointerLeave = useCallback(() => {\n pendingPointerAxisRef.current = null;\n pointerAxisRef.current = null;\n scheduleAnimation();\n }, [scheduleAnimation]);\n\n const clearSlotMagnification = useCallback(\n (anchorKey: string) => {\n springsRef.current.delete(anchorKey);\n restCentersRef.current?.delete(anchorKey);\n appliedStylesRef.current.delete(anchorKey);\n hitBoundsRef.current = null;\n slotOrderRef.current = slotOrderRef.current.filter(\n (key) => key !== anchorKey\n );\n const slotElement = slotRefs.current.get(anchorKey);\n if (slotElement) {\n clearDockSlotMagnification(slotElement, appliedStylesRef.current);\n }\n },\n [slotRefs]\n );\n\n const pauseMagnification = useCallback(() => {\n stopAnimation();\n pendingPointerAxisRef.current = null;\n pointerAxisRef.current = null;\n entryRampStartedAtRef.current = null;\n lastFrameTimeRef.current = null;\n }, [stopAnimation]);\n\n const resetMagnification = useCallback(() => {\n stopAnimation();\n for (const slotElement of slotRefs.current.values()) {\n clearDockSlotMagnification(slotElement, appliedStylesRef.current);\n }\n springsRef.current.clear();\n appliedStylesRef.current.clear();\n restCentersRef.current = null;\n hitBoundsRef.current = null;\n slotOrderRef.current = [];\n pointerAxisRef.current = null;\n pendingPointerAxisRef.current = null;\n entryRampStartedAtRef.current = null;\n setMagnifyActive(false);\n }, [setMagnifyActive, slotRefs, stopAnimation]);\n\n useEffect(\n () => () => {\n resetMagnification();\n },\n [resetMagnification]\n );\n\n return {\n clearSlotMagnification,\n handlePointerLeave,\n handlePointerMove,\n pauseMagnification,\n resetMagnification\n };\n}\n","export interface WorkbenchHostDockScrollState {\n canScrollBackward: boolean;\n canScrollForward: boolean;\n hasOverflow: boolean;\n}\n\nexport interface ResolveWorkbenchHostDockScrollStateInput {\n contentSize: number;\n scrollOffset: number;\n scrollSize: number;\n viewportSize: number;\n}\n\nconst dockScrollOverflowEpsilonPx = 1;\n\nexport function resolveWorkbenchHostDockScrollState({\n contentSize,\n scrollOffset,\n scrollSize,\n viewportSize\n}: ResolveWorkbenchHostDockScrollStateInput): WorkbenchHostDockScrollState {\n const hasOverflow = contentSize > viewportSize + dockScrollOverflowEpsilonPx;\n if (!hasOverflow) {\n return {\n canScrollBackward: false,\n canScrollForward: false,\n hasOverflow: false\n };\n }\n\n const maxScrollOffset = Math.max(\n 0,\n Math.max(scrollSize, contentSize) - viewportSize\n );\n\n return {\n canScrollBackward: scrollOffset > dockScrollOverflowEpsilonPx,\n canScrollForward:\n scrollOffset < maxScrollOffset - dockScrollOverflowEpsilonPx,\n hasOverflow\n };\n}\n","import type { WorkbenchNode } from \"../core/types.ts\";\nimport type {\n WorkbenchHostNodeData,\n WorkbenchHostNodeDefinition\n} from \"./types.ts\";\n\nexport const workbenchMinimizedDockVisibleSlotLimit = 5;\nexport const workbenchMinimizedDockStackedVisibleNodeCount = 4;\nexport const workbenchMinimizedDockStackAnchorKey = \"minimized-stack\";\n\nexport type WorkbenchMinimizedDockNode = WorkbenchNode<WorkbenchHostNodeData>;\n\nexport type WorkbenchMinimizedDockSlot =\n | {\n anchorKey: string;\n kind: \"node\";\n node: WorkbenchMinimizedDockNode;\n }\n | {\n anchorKey: string;\n kind: \"stack\";\n nodes: WorkbenchMinimizedDockNode[];\n };\n\nexport function resolveWorkbenchMinimizedDockNodeAnchorKey(\n nodeId: string\n): string {\n return `minimized:${nodeId}`;\n}\n\nexport function resolveWorkbenchMinimizedDockSlots(input: {\n nodeDefinitions: ReadonlyMap<string, WorkbenchHostNodeDefinition>;\n nodes: readonly WorkbenchMinimizedDockNode[];\n}): WorkbenchMinimizedDockSlot[] {\n const minimizedNodes = orderWorkbenchMinimizedDockNodes(input);\n if (minimizedNodes.length === 0) {\n return [];\n }\n if (minimizedNodes.length <= workbenchMinimizedDockVisibleSlotLimit) {\n return minimizedNodes.map((node) => ({\n anchorKey: resolveWorkbenchMinimizedDockNodeAnchorKey(node.id),\n kind: \"node\",\n node\n }));\n }\n\n return [\n ...minimizedNodes\n .slice(0, workbenchMinimizedDockStackedVisibleNodeCount)\n .map((node) => ({\n anchorKey: resolveWorkbenchMinimizedDockNodeAnchorKey(node.id),\n kind: \"node\" as const,\n node\n })),\n {\n anchorKey: workbenchMinimizedDockStackAnchorKey,\n kind: \"stack\",\n nodes: minimizedNodes.slice(workbenchMinimizedDockStackedVisibleNodeCount)\n }\n ];\n}\n\nexport function resolveWorkbenchMinimizedDockAnchorKeyForNode(input: {\n nodeId: string;\n slots: readonly WorkbenchMinimizedDockSlot[];\n}): string | null {\n for (const slot of input.slots) {\n if (slot.kind === \"node\" && slot.node.id === input.nodeId) {\n return slot.anchorKey;\n }\n if (\n slot.kind === \"stack\" &&\n slot.nodes.some((node) => node.id === input.nodeId)\n ) {\n return slot.anchorKey;\n }\n }\n return null;\n}\n\nexport function isWorkbenchMinimizedDockEligibleNode(input: {\n node: WorkbenchMinimizedDockNode;\n nodeDefinitions: ReadonlyMap<string, WorkbenchHostNodeDefinition>;\n}): boolean {\n const definition = input.nodeDefinitions.get(input.node.data.typeId);\n return definition?.window?.minimizedDock !== undefined;\n}\n\nfunction orderWorkbenchMinimizedDockNodes(input: {\n nodeDefinitions: ReadonlyMap<string, WorkbenchHostNodeDefinition>;\n nodes: readonly WorkbenchMinimizedDockNode[];\n}): WorkbenchMinimizedDockNode[] {\n return input.nodes\n .map((node, index) => ({ index, node }))\n .filter(\n ({ node }) =>\n node.isMinimized &&\n isWorkbenchMinimizedDockEligibleNode({\n node,\n nodeDefinitions: input.nodeDefinitions\n })\n )\n .sort((left, right) => {\n const leftTime = left.node.minimizedAtUnixMs ?? 0;\n const rightTime = right.node.minimizedAtUnixMs ?? 0;\n if (leftTime !== rightTime) {\n return rightTime - leftTime;\n }\n return right.index - left.index;\n })\n .map(({ node }) => node);\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport type { WorkbenchMinimizedDockSlot } from \"./minimizedDockSlots.ts\";\n\nexport const minimizedDockStackPromotionDurationMs = 520;\n\nexport function detectMinimizedDockStackPromotion(\n previous: readonly WorkbenchMinimizedDockSlot[],\n next: readonly WorkbenchMinimizedDockSlot[]\n): string | null {\n const previousVisibleNodeIds = new Set(\n previous\n .filter(\n (slot): slot is Extract<WorkbenchMinimizedDockSlot, { kind: \"node\" }> =>\n slot.kind === \"node\"\n )\n .map((slot) => slot.node.id)\n );\n const previousStackNodeIds =\n previous\n .find((slot) => slot.kind === \"stack\")\n ?.nodes.map((node) => node.id) ?? [];\n\n for (const slot of next) {\n if (slot.kind !== \"node\") {\n continue;\n }\n if (\n !previousVisibleNodeIds.has(slot.node.id) &&\n previousStackNodeIds.includes(slot.node.id)\n ) {\n return slot.node.id;\n }\n }\n\n return null;\n}\n\nexport function useMinimizedDockStackPromotion(\n slots: readonly WorkbenchMinimizedDockSlot[]\n) {\n const previousSlotsRef = useRef(slots);\n const promotionTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const [promotedNodeId, setPromotedNodeId] = useState<string | null>(null);\n const [stackDispatching, setStackDispatching] = useState(false);\n\n useEffect(() => {\n const promotedNodeId = detectMinimizedDockStackPromotion(\n previousSlotsRef.current,\n slots\n );\n previousSlotsRef.current = slots;\n\n if (!promotedNodeId) {\n return undefined;\n }\n\n setPromotedNodeId(promotedNodeId);\n setStackDispatching(true);\n if (promotionTimerRef.current !== null) {\n clearTimeout(promotionTimerRef.current);\n }\n promotionTimerRef.current = setTimeout(() => {\n promotionTimerRef.current = null;\n setPromotedNodeId(null);\n setStackDispatching(false);\n }, minimizedDockStackPromotionDurationMs);\n\n return () => {\n if (promotionTimerRef.current !== null) {\n clearTimeout(promotionTimerRef.current);\n promotionTimerRef.current = null;\n }\n };\n }, [slots]);\n\n return { promotedNodeId, stackDispatching };\n}\n","import type { WorkbenchMinimizedDockSlot } from \"./minimizedDockSlots.ts\";\n\nexport type WorkbenchMinimizedDockRestoreIntent =\n | {\n anchorKey: string;\n kind: \"node-slot\";\n nodeId: string;\n }\n | {\n anchorKey: string;\n kind: \"stack-popup-card\";\n nodeId: string;\n stackAnchorKey: string;\n };\n\nexport type WorkbenchMinimizedDockRestoreSource =\n | {\n anchorKey: string;\n kind: \"node-slot\";\n }\n | {\n kind: \"stack-popup-card\";\n stackAnchorKey: string;\n };\n\nexport function resolveWorkbenchMinimizedDockRestoreIntent(input: {\n nodeId: string;\n slots: readonly WorkbenchMinimizedDockSlot[];\n source: WorkbenchMinimizedDockRestoreSource;\n}): WorkbenchMinimizedDockRestoreIntent | null {\n const { source } = input;\n switch (source.kind) {\n case \"node-slot\": {\n const slot = input.slots.find(\n (slot) => slot.anchorKey === source.anchorKey\n );\n if (slot?.kind !== \"node\" || slot.node.id !== input.nodeId) {\n return null;\n }\n return {\n anchorKey: slot.anchorKey,\n kind: \"node-slot\",\n nodeId: input.nodeId\n };\n }\n\n case \"stack-popup-card\": {\n const slot = input.slots.find(\n (slot) => slot.anchorKey === source.stackAnchorKey\n );\n if (\n slot?.kind !== \"stack\" ||\n !slot.nodes.some((node) => node.id === input.nodeId)\n ) {\n return null;\n }\n return {\n anchorKey: slot.anchorKey,\n kind: \"stack-popup-card\",\n nodeId: input.nodeId,\n stackAnchorKey: slot.anchorKey\n };\n }\n }\n}\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type CSSProperties,\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactNode\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n Button,\n CheckIcon,\n CloseIcon,\n FileCreateIcon,\n MaximizeIcon,\n MinimizeIcon,\n OverviewLayoutIcon,\n PinFilledIcon,\n PinIcon,\n cn\n} from \"@tutti-os/ui-system\";\nimport type { WorkbenchNode } from \"../core/types.ts\";\nimport {\n captureWorkbenchNodePreviewImage,\n writeCachedWorkbenchNodePreviewImage\n} from \"../react/useWorkbenchGenieAnimation.tsx\";\nimport type {\n WorkbenchDockPreviewContent,\n WorkbenchHostDockPopupCardLabelMode,\n WorkbenchHostHandle,\n WorkbenchHostNodeData,\n WorkbenchHostProps\n} from \"./types.ts\";\nimport type { WorkbenchDockPlacement } from \"../react/types.ts\";\nimport {\n resolveInitialMinimizedStackScrollOffset,\n resolveMinimizedStackLeftGutterPx,\n resolveMinimizedStackPanelWidthPx,\n resolveMinimizedStackPopupLeftPx,\n resolveMinimizedStackPopupTopPx,\n resolveMinimizedStackTrackHeightPx,\n resolveMinimizedStackTrackTranslateXPx,\n resolveMinimizedStackViewportHeightPx\n} from \"./minimizedStackScroll.ts\";\nimport type {\n WorkbenchDockPreviewCache,\n WorkbenchDockPreviewCacheKey,\n WorkbenchDockPreviewCacheKeyResolver\n} from \"../react/dockPreviewCache.ts\";\n\nconst dockPopupCardWidthPx = 165;\nconst dockPopupGridGapPx = 8;\nconst dockPopupPanelPaddingInlinePx = 12;\nconst dockPopupPanelBorderInlinePx = 2;\nconst dockPopupPlacementGapPx = 14;\nconst dockPopupMinimizedStackLaunchDisappearMs = 0;\nconst dockPopupMinimizedStackPopupZIndex = 100300;\nconst dockPopupPreviewCacheMaxEntries = 64;\nconst dockPopupPreviewByMemoryKey = new Map<\n string,\n WorkbenchHostDockPopupCapturedPreview\n>();\nconst pendingDockPopupPreviewMemoryKeys = new Set<string>();\n\ntype WorkbenchHostDockPopupCapturedPreview = {\n preview: WorkbenchDockPreviewContent | null;\n revision: string | null;\n};\n\ntype WorkbenchHostDockPopupPreviewState =\n | {\n preview: WorkbenchDockPreviewContent;\n status: \"ready\";\n }\n | {\n status: \"loading\" | \"fallback\";\n };\n\nexport interface WorkbenchHostDockPopupAnchorRect {\n dockRight?: number;\n height: number;\n left: number;\n top: number;\n width: number;\n}\n\nexport interface WorkbenchHostDockPopupState {\n anchorRect: WorkbenchHostDockPopupAnchorRect;\n entryId: string;\n kind: \"context-menu\" | \"preview\";\n}\n\nexport interface WorkbenchHostDockPopupItem {\n externalNodeState?: unknown;\n externalWorkspaceState?: unknown;\n host: WorkbenchHostHandle;\n isFocused: boolean;\n isMinimized: boolean;\n node: WorkbenchNode<WorkbenchHostNodeData>;\n preview: WorkbenchDockPreviewContent | null;\n previewRevision: string | null;\n subtitle: string | null;\n title: string | null;\n}\n\nexport type WorkbenchHostDockPopupVariant =\n | \"context-menu\"\n | \"default\"\n | \"minimized-stack\";\n\nexport interface WorkbenchHostDockPopupRetentionAction {\n checked: boolean;\n disabled?: boolean;\n label: string;\n pendingLabel?: string;\n}\n\ninterface WorkbenchHostDockPopupCardStyle extends CSSProperties {\n \"--desktop-dock-popup-card-lift\"?: string;\n \"--desktop-dock-popup-card-scale\"?: string;\n \"--desktop-dock-popup-card-z-index\"?: string;\n \"--desktop-dock-popup-fan-delay\"?: string;\n \"--desktop-dock-popup-fan-rotate\"?: string;\n \"--desktop-dock-popup-fan-x\"?: string;\n \"--desktop-dock-popup-fan-y\"?: string;\n}\n\ninterface WorkbenchHostDockPopupRootStyle extends CSSProperties {\n \"--desktop-dock-minimized-stack-width\"?: string;\n \"--desktop-dock-popup-columns\": string;\n \"--desktop-dock-popup-width\": string;\n}\n\nconst popupCardMagnificationRange = 160;\nconst popupCardMaxScale = 1.16;\nconst popupCardMaxLiftPx = 10;\n\nfunction resolvePopupCardMagnificationStyle(\n pointer: { x: number; y: number } | null,\n element: HTMLElement | null\n): WorkbenchHostDockPopupCardStyle | undefined {\n if (!pointer || !element) {\n return undefined;\n }\n\n const rect = element.getBoundingClientRect();\n const centerX = rect.left + rect.width / 2;\n const centerY = rect.top + rect.height / 2;\n const distance = Math.hypot(pointer.x - centerX, pointer.y - centerY);\n const influence = Math.max(0, 1 - distance / popupCardMagnificationRange);\n if (influence <= 0) {\n return undefined;\n }\n\n const eased = influence * influence * (3 - 2 * influence);\n const scale = 1 + (popupCardMaxScale - 1) * eased;\n const lift = -popupCardMaxLiftPx * eased;\n return {\n \"--desktop-dock-popup-card-lift\": `${Math.round(lift * 10) / 10}px`,\n \"--desktop-dock-popup-card-scale\": `${Math.round(scale * 1000) / 1000}`,\n \"--desktop-dock-popup-card-z-index\": `${Math.round(1 + influence * 20)}`\n };\n}\n\nfunction resolvePopupFanCardStyle(\n index: number,\n count: number,\n placement: WorkbenchDockPlacement\n): WorkbenchHostDockPopupCardStyle {\n const safeCount = Math.max(1, count);\n const cappedIndex = Math.min(index, safeCount - 1);\n const arcDirection = placement === \"left\" ? -1 : 1;\n const arcX = cappedIndex * 6 * arcDirection;\n const arcY = -18 - cappedIndex * 78;\n const rotateDeg = (-2 + cappedIndex * 0.8) * arcDirection;\n\n return {\n \"--desktop-dock-popup-fan-delay\": `${index * 22}ms`,\n \"--desktop-dock-popup-fan-rotate\": `${Math.round(rotateDeg * 10) / 10}deg`,\n \"--desktop-dock-popup-fan-x\": `${Math.round(arcX)}px`,\n \"--desktop-dock-popup-fan-y\": `${Math.round(arcY)}px`\n };\n}\n\nfunction readDockPopupPreviewImage(\n memoryKey: string\n): WorkbenchHostDockPopupCapturedPreview | undefined {\n return dockPopupPreviewByMemoryKey.get(memoryKey);\n}\n\nfunction writeDockPopupPreviewImage(\n memoryKey: string,\n preview: WorkbenchDockPreviewContent | null,\n revision: string | null\n): void {\n dockPopupPreviewByMemoryKey.delete(memoryKey);\n dockPopupPreviewByMemoryKey.set(memoryKey, { preview, revision });\n while (dockPopupPreviewByMemoryKey.size > dockPopupPreviewCacheMaxEntries) {\n const oldestMemoryKey = dockPopupPreviewByMemoryKey.keys().next().value;\n if (typeof oldestMemoryKey !== \"string\") {\n break;\n }\n dockPopupPreviewByMemoryKey.delete(oldestMemoryKey);\n }\n}\n\nexport function WorkbenchHostDockPopup({\n anchorRect,\n canEnterFullscreen,\n canShowAllWindows,\n capturePreview,\n debugDiagnostics,\n dockRetention,\n dockPreviewCache,\n fullscreenLabel,\n hideLabel,\n items,\n label,\n labelMode,\n newWindowLabel,\n closeWindowLabel,\n onClose,\n onCloseNode,\n onCreateNew,\n onEnterFullscreen,\n onHide,\n onRunDockRetentionAction,\n onSelectNode,\n onShowAllWindows,\n openLabel,\n onQuit,\n placement = \"bottom\",\n quitLabel,\n resolveDockPreviewCacheKey,\n showAllWindowsLabel,\n showCreateNew,\n showOpen,\n variant\n}: {\n anchorRect: WorkbenchHostDockPopupState[\"anchorRect\"];\n canEnterFullscreen?: boolean;\n canShowAllWindows?: boolean;\n capturePreview?: (\n item: WorkbenchHostDockPopupItem\n ) =>\n | Promise<WorkbenchDockPreviewContent | string | null>\n | WorkbenchDockPreviewContent\n | string\n | null;\n debugDiagnostics?: WorkbenchHostProps[\"debugDiagnostics\"];\n dockRetention?: WorkbenchHostDockPopupRetentionAction | null;\n dockPreviewCache?: WorkbenchDockPreviewCache;\n fullscreenLabel?: string;\n hideLabel?: string;\n items: WorkbenchHostDockPopupItem[];\n label: string;\n labelMode?: WorkbenchHostDockPopupCardLabelMode;\n newWindowLabel: string;\n closeWindowLabel: (title: string) => string;\n onClose: () => void;\n onCloseNode: (nodeId: string) => void;\n onCreateNew: () => void;\n onEnterFullscreen?: () => void;\n onHide?: () => void;\n onRunDockRetentionAction?: () => void;\n onSelectNode: (nodeId: string) => void;\n onShowAllWindows?: () => void;\n openLabel?: string;\n onQuit?: () => void;\n placement?: WorkbenchDockPlacement;\n quitLabel?: string;\n resolveDockPreviewCacheKey?: WorkbenchDockPreviewCacheKeyResolver<WorkbenchHostNodeData>;\n showAllWindowsLabel?: string;\n showCreateNew?: boolean;\n showOpen?: boolean;\n variant?: WorkbenchHostDockPopupVariant;\n}) {\n const resolvedLabelMode = labelMode ?? \"hover-overlay\";\n const resolvedVariant = variant ?? \"default\";\n const isMinimizedStack = resolvedVariant === \"minimized-stack\";\n const isContextMenu = resolvedVariant === \"context-menu\";\n const createCardCount = showCreateNew === false ? 0 : 1;\n const cardElementsRef = useRef(new Map<string, HTMLElement>());\n const cardRefCallbacksRef = useRef(\n new Map<string, (element: HTMLElement | null) => void>()\n );\n const popupRootRef = useRef<HTMLDivElement | null>(null);\n const minimizedStackViewportRef = useRef<HTMLDivElement | null>(null);\n const [pointer, setPointer] = useState<{ x: number; y: number } | null>(null);\n const [minimizedStackScrollOffset, setMinimizedStackScrollOffset] =\n useState(0);\n const [capturedPreviewByMemoryKey, setCapturedPreviewByMemoryKey] = useState<\n Record<string, WorkbenchHostDockPopupCapturedPreview | undefined>\n >({});\n const columnCount = isContextMenu\n ? 1\n : Math.min(Math.max(items.length + createCardCount, 1), 3);\n const popupWidthPx = isContextMenu\n ? 268\n : columnCount * dockPopupCardWidthPx +\n Math.max(0, columnCount - 1) * dockPopupGridGapPx +\n dockPopupPanelPaddingInlinePx * 2 +\n dockPopupPanelBorderInlinePx;\n const popupCenterY = anchorRect.top + anchorRect.height / 2;\n const isLeftMinimizedStack = placement === \"left\" && isMinimizedStack;\n const minimizedStackTrackHeightPx = resolveMinimizedStackTrackHeightPx(\n items.length\n );\n const minimizedStackViewportHeightPx = isMinimizedStack\n ? resolveMinimizedStackViewportHeightPx({\n anchorCenterY: popupCenterY,\n placement,\n trackHeightPx: minimizedStackTrackHeightPx\n })\n : minimizedStackTrackHeightPx;\n const minimizedStackTrackTranslateXPx = isMinimizedStack\n ? resolveMinimizedStackTrackTranslateXPx({\n itemCount: items.length,\n placement,\n scrollOffset: minimizedStackScrollOffset,\n trackHeightPx: minimizedStackTrackHeightPx,\n viewportHeightPx: minimizedStackViewportHeightPx\n })\n : 0;\n const minimizedStackLeftGutterPx = isLeftMinimizedStack\n ? resolveMinimizedStackLeftGutterPx({\n itemCount: items.length,\n placement,\n scrollOffset: minimizedStackScrollOffset,\n trackHeightPx: minimizedStackTrackHeightPx,\n viewportHeightPx: minimizedStackViewportHeightPx,\n trackTranslateXPx: minimizedStackTrackTranslateXPx\n })\n : 0;\n const minimizedStackPanelWidthPx = isLeftMinimizedStack\n ? resolveMinimizedStackPanelWidthPx(items.length, placement, {\n leftGutterPx: minimizedStackLeftGutterPx\n })\n : null;\n const popupStyle: WorkbenchHostDockPopupRootStyle = {\n \"--desktop-dock-popup-columns\": String(columnCount),\n \"--desktop-dock-popup-width\":\n minimizedStackPanelWidthPx != null\n ? `${minimizedStackPanelWidthPx}px`\n : `${popupWidthPx}px`,\n ...(minimizedStackPanelWidthPx != null\n ? {\n \"--desktop-dock-minimized-stack-width\": `${minimizedStackPanelWidthPx}px`,\n minWidth: minimizedStackPanelWidthPx,\n width: minimizedStackPanelWidthPx\n }\n : {}),\n left: isLeftMinimizedStack\n ? resolveMinimizedStackPopupLeftPx({\n anchorLeft: anchorRect.left,\n anchorWidth: anchorRect.width,\n dockRightPx: anchorRect.dockRight,\n leftGutterPx: minimizedStackLeftGutterPx\n })\n : placement === \"left\"\n ? anchorRect.left + anchorRect.width + dockPopupPlacementGapPx\n : anchorRect.left + anchorRect.width / 2,\n top: isLeftMinimizedStack\n ? resolveMinimizedStackPopupTopPx({ anchorTop: anchorRect.top })\n : placement === \"left\"\n ? popupCenterY\n : anchorRect.top - dockPopupPlacementGapPx,\n ...(isLeftMinimizedStack\n ? { zIndex: dockPopupMinimizedStackPopupZIndex }\n : {})\n };\n const minimizedStackMaxScrollOffset = Math.max(\n 0,\n minimizedStackTrackHeightPx - minimizedStackViewportHeightPx\n );\n const initialMinimizedStackScrollOffset =\n resolveInitialMinimizedStackScrollOffset({\n maxScrollOffset: minimizedStackMaxScrollOffset\n });\n const panelStyle: CSSProperties = {\n \"--desktop-dock-popup-columns\": String(columnCount),\n \"--desktop-dock-popup-item-count\": String(Math.max(1, items.length)),\n ...(isMinimizedStack\n ? {\n height: minimizedStackViewportHeightPx,\n minHeight: minimizedStackViewportHeightPx,\n ...(isLeftMinimizedStack && minimizedStackPanelWidthPx != null\n ? {\n width: minimizedStackPanelWidthPx,\n minWidth: minimizedStackPanelWidthPx,\n \"--desktop-dock-minimized-stack-left-gutter\": `${minimizedStackLeftGutterPx}px`\n }\n : {})\n }\n : {})\n } as CSSProperties;\n const popupDiagnosticKey = items.map((item) => item.node.id).join(\"|\");\n\n useEffect(() => {\n logWorkbenchDockPopupDebug(\"dock.popup.rendered\", debugDiagnostics, {\n hasCapturePreview: Boolean(capturePreview),\n itemCount: popupDiagnosticKey ? popupDiagnosticKey.split(\"|\").length : 0,\n nodeIds: popupDiagnosticKey ? popupDiagnosticKey.split(\"|\") : [],\n placement,\n variant: resolvedVariant\n });\n }, [\n capturePreview,\n debugDiagnostics,\n placement,\n popupDiagnosticKey,\n resolvedVariant\n ]);\n\n useLayoutEffect(() => {\n const rootElement = popupRootRef.current;\n const panelElement =\n rootElement?.querySelector<HTMLElement>(\n \"[data-desktop-dock-popup-panel]\"\n ) ?? null;\n logWorkbenchDockPopupDebug(\"dock.popup.layout\", debugDiagnostics, {\n panelRect: panelElement ? rectToDiagnostic(panelElement) : null,\n rootRect: rootElement ? rectToDiagnostic(rootElement) : null,\n rootStyle: rootElement ? styleToDiagnostic(rootElement) : null,\n viewportHeight: window.innerHeight,\n viewportWidth: window.innerWidth\n });\n }, [debugDiagnostics, popupDiagnosticKey]);\n\n const registerCard = useCallback((nodeId: string) => {\n const existing = cardRefCallbacksRef.current.get(nodeId);\n if (existing) {\n return existing;\n }\n\n const callback = (element: HTMLElement | null) => {\n if (element) {\n cardElementsRef.current.set(nodeId, element);\n } else {\n cardElementsRef.current.delete(nodeId);\n }\n };\n cardRefCallbacksRef.current.set(nodeId, callback);\n return callback;\n }, []);\n\n useEffect(() => {\n if (!isLeftMinimizedStack) {\n return;\n }\n document.body.setAttribute(\n \"data-desktop-dock-minimized-stack-open\",\n \"true\"\n );\n return () => {\n document.body.removeAttribute(\"data-desktop-dock-minimized-stack-open\");\n };\n }, [isLeftMinimizedStack]);\n\n useEffect(() => {\n const handlePointerDown = (event: PointerEvent) => {\n if (!(event.target instanceof Element)) {\n onClose();\n return;\n }\n if (\n event.target.closest(\"[data-desktop-dock-slot]\") ||\n event.target.closest(\"[data-desktop-dock-popup-card]\") ||\n event.target.closest(\n '.desktop-dock-popup-root:not([data-popup-variant=\"minimized-stack\"])'\n )\n ) {\n return;\n }\n onClose();\n };\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n onClose();\n }\n };\n\n window.addEventListener(\"pointerdown\", handlePointerDown, true);\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n window.removeEventListener(\"pointerdown\", handlePointerDown, true);\n window.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [onClose]);\n\n const previewCaptureKey = items\n .map(\n (item) =>\n `${item.node.id}:${previewCacheToken(item.preview)}:${item.previewRevision ?? \"\"}`\n )\n .join(\"|\");\n\n useEffect(() => {\n if (!isMinimizedStack) {\n return;\n }\n setMinimizedStackScrollOffset(initialMinimizedStackScrollOffset);\n }, [initialMinimizedStackScrollOffset, isMinimizedStack, items.length]);\n\n useEffect(() => {\n if (!isMinimizedStack) {\n return;\n }\n const viewport = minimizedStackViewportRef.current;\n if (!viewport) {\n return;\n }\n const handleWheel = (event: WheelEvent) => {\n event.preventDefault();\n event.stopPropagation();\n setMinimizedStackScrollOffset((current) =>\n Math.min(\n minimizedStackMaxScrollOffset,\n Math.max(0, current + event.deltaY)\n )\n );\n };\n viewport.addEventListener(\"wheel\", handleWheel, { passive: false });\n return () => viewport.removeEventListener(\"wheel\", handleWheel);\n }, [isMinimizedStack, minimizedStackMaxScrollOffset]);\n\n useEffect(() => {\n if (!capturePreview || isContextMenu) {\n return;\n }\n let cancelled = false;\n const missingItems = items.filter((item) => {\n const revision = item.previewRevision;\n const previewMemoryKey = resolveDockPopupPreviewMemoryKey(\n item.node,\n resolveDockPreviewCacheKey?.(item.node) ?? null\n );\n const capturedPreview =\n capturedPreviewByMemoryKey[previewMemoryKey] ??\n readDockPopupPreviewImage(previewMemoryKey);\n const hasCapturedPreview =\n capturedPreview !== undefined && capturedPreview.revision === revision;\n const shouldCaptureMissingPreview = !item.preview && !hasCapturedPreview;\n return (\n shouldCaptureMissingPreview &&\n !pendingDockPopupPreviewMemoryKeys.has(previewMemoryKey)\n );\n });\n if (missingItems.length === 0) {\n logWorkbenchDockPopupDebug(\n \"dock.popup.preview_capture.batch\",\n debugDiagnostics,\n {\n itemCount: items.length,\n missingNodeIds: []\n }\n );\n return () => {\n cancelled = true;\n };\n }\n logWorkbenchDockPopupDebug(\n \"dock.popup.preview_capture.batch\",\n debugDiagnostics,\n {\n itemCount: items.length,\n missingNodeIds: missingItems.map((item) => item.node.id)\n }\n );\n\n for (const item of missingItems) {\n pendingDockPopupPreviewMemoryKeys.add(\n resolveDockPopupPreviewMemoryKey(\n item.node,\n resolveDockPreviewCacheKey?.(item.node) ?? null\n )\n );\n }\n\n void (async () => {\n for (const item of missingItems) {\n if (cancelled) {\n break;\n }\n\n const revision = item.previewRevision;\n logWorkbenchDockPopupDebug(\n \"dock.popup.preview_capture.started\",\n debugDiagnostics,\n {\n isMinimized: item.isMinimized,\n nodeId: item.node.id,\n revision\n }\n );\n const previewMemoryKey = resolveDockPopupPreviewMemoryKey(\n item.node,\n resolveDockPreviewCacheKey?.(item.node) ?? null\n );\n const cacheKey = resolveDockPopupPreviewCacheKey(\n resolveDockPreviewCacheKey?.(item.node) ?? null,\n revision\n );\n if (item.isMinimized && cacheKey) {\n const minimizedPersistedPreview = await readPersistedDockPreview(\n dockPreviewCache,\n cacheKey\n );\n if (cancelled) {\n break;\n }\n if (minimizedPersistedPreview) {\n const persistedPreview: WorkbenchDockPreviewContent = {\n kind: \"image\",\n src: minimizedPersistedPreview\n };\n writeCachedWorkbenchNodePreviewImage(\n item.node.id,\n minimizedPersistedPreview\n );\n writeDockPopupPreviewImage(\n previewMemoryKey,\n persistedPreview,\n revision\n );\n setCapturedPreviewByMemoryKey((current) => ({\n ...current,\n [previewMemoryKey]: {\n preview: persistedPreview,\n revision\n }\n }));\n pendingDockPopupPreviewMemoryKeys.delete(previewMemoryKey);\n continue;\n }\n }\n\n const preview = normalizeDockPopupPreviewContentResult(\n item.isMinimized\n ? ((await capturePreview?.(item)) ??\n (await captureWorkbenchNodePreviewImage(item.node.id, {\n bypassCache: false\n })))\n : await Promise.resolve(capturePreview?.(item) ?? null).catch(\n () => null\n ),\n revision\n );\n if (cancelled) {\n break;\n }\n logWorkbenchDockPopupDebug(\n \"dock.popup.preview_capture.resolved\",\n debugDiagnostics,\n {\n hasPreview: Boolean(preview),\n nodeId: item.node.id,\n providerRevision: preview?.revision ?? null,\n revision\n }\n );\n if (preview) {\n if (preview.kind === \"image\") {\n writeCachedWorkbenchNodePreviewImage(item.node.id, preview.src);\n }\n writeDockPopupPreviewImage(previewMemoryKey, preview, revision);\n if (cacheKey && preview.kind === \"image\") {\n dockPreviewCache?.write({\n key: cacheKey,\n previewImageUrl: preview.src\n });\n }\n setCapturedPreviewByMemoryKey((current) => ({\n ...current,\n [previewMemoryKey]: { preview, revision }\n }));\n pendingDockPopupPreviewMemoryKeys.delete(previewMemoryKey);\n continue;\n }\n\n const fallbackPersistedPreview =\n !item.isMinimized && cacheKey\n ? await readPersistedDockPreview(dockPreviewCache, cacheKey)\n : null;\n if (cancelled) {\n break;\n }\n if (fallbackPersistedPreview) {\n writeCachedWorkbenchNodePreviewImage(\n item.node.id,\n fallbackPersistedPreview\n );\n }\n if (fallbackPersistedPreview || item.isMinimized) {\n const fallbackPreview: WorkbenchDockPreviewContent | null =\n fallbackPersistedPreview\n ? { kind: \"image\", src: fallbackPersistedPreview }\n : null;\n writeDockPopupPreviewImage(\n previewMemoryKey,\n fallbackPreview,\n revision\n );\n }\n if (!cancelled) {\n const fallbackPreview: WorkbenchDockPreviewContent | null =\n fallbackPersistedPreview\n ? { kind: \"image\", src: fallbackPersistedPreview }\n : null;\n setCapturedPreviewByMemoryKey((current) => ({\n ...current,\n [previewMemoryKey]: { preview: fallbackPreview, revision }\n }));\n }\n pendingDockPopupPreviewMemoryKeys.delete(previewMemoryKey);\n }\n })().catch(() => {\n for (const item of missingItems) {\n const previewMemoryKey = resolveDockPopupPreviewMemoryKey(\n item.node,\n resolveDockPreviewCacheKey?.(item.node) ?? null\n );\n writeDockPopupPreviewImage(\n previewMemoryKey,\n null,\n item.previewRevision\n );\n pendingDockPopupPreviewMemoryKeys.delete(previewMemoryKey);\n }\n if (!cancelled) {\n setCapturedPreviewByMemoryKey((current) => ({\n ...current,\n ...Object.fromEntries(\n missingItems.map((item) => {\n const previewMemoryKey = resolveDockPopupPreviewMemoryKey(\n item.node,\n resolveDockPreviewCacheKey?.(item.node) ?? null\n );\n return [\n previewMemoryKey,\n { preview: null, revision: item.previewRevision }\n ];\n })\n )\n }));\n }\n });\n\n return () => {\n cancelled = true;\n for (const item of missingItems) {\n pendingDockPopupPreviewMemoryKeys.delete(\n resolveDockPopupPreviewMemoryKey(\n item.node,\n resolveDockPreviewCacheKey?.(item.node) ?? null\n )\n );\n }\n };\n }, [\n capturePreview,\n dockPreviewCache,\n isContextMenu,\n items,\n previewCaptureKey,\n resolveDockPreviewCacheKey\n ]);\n\n const content = (\n <div\n ref={popupRootRef}\n className=\"desktop-dock-popup-root\"\n data-dock-placement={placement}\n data-desktop-dock-popup-root=\"true\"\n data-popup-variant={resolvedVariant}\n style={popupStyle}\n >\n <div\n aria-label={label}\n className={cn(\n \"desktop-dock-popup relative origin-bottom rounded-lg border border-[var(--border-1)] bg-background-fronted text-[var(--text-primary)] shadow-panel motion-safe:animate-in motion-safe:fade-in-0 motion-safe:zoom-in-95 motion-safe:slide-in-from-bottom-2 motion-safe:duration-[175ms] motion-safe:ease-[cubic-bezier(0.22,1,0.36,1)] motion-reduce:animate-none\",\n isContextMenu ? \"p-1\" : \"p-3\",\n isLeftMinimizedStack\n ? \"w-full min-w-0 max-w-none\"\n : \"w-[min(var(--desktop-dock-popup-width,366px),calc(100vw-32px))]\"\n )}\n data-desktop-dock-popup-panel=\"true\"\n data-popup-variant={resolvedVariant}\n onPointerDown={(event) => event.stopPropagation()}\n onPointerMove={\n isMinimizedStack\n ? (event) => setPointer({ x: event.clientX, y: event.clientY })\n : undefined\n }\n onPointerLeave={isMinimizedStack ? () => setPointer(null) : undefined}\n role=\"dialog\"\n style={panelStyle}\n >\n {isContextMenu ? (\n <WorkbenchHostDockContextMenu\n canCreateNew={showCreateNew !== false}\n canEnterFullscreen={canEnterFullscreen === true}\n canShowAllWindows={canShowAllWindows === true}\n dockRetention={dockRetention}\n fullscreenLabel={fullscreenLabel}\n hideLabel={hideLabel}\n items={items}\n newWindowLabel={newWindowLabel}\n onCreateNew={onCreateNew}\n onEnterFullscreen={onEnterFullscreen}\n onHide={onHide}\n onQuit={onQuit}\n onRunDockRetentionAction={onRunDockRetentionAction}\n onSelectNode={onSelectNode}\n onShowAllWindows={onShowAllWindows}\n openLabel={openLabel}\n quitLabel={quitLabel}\n showAllWindowsLabel={showAllWindowsLabel}\n showOpen={showOpen === true}\n />\n ) : (\n <>\n <div className=\"mb-2.5 flex items-center justify-between\">\n <span className=\"min-w-0 truncate text-sm font-semibold\">\n {label}\n </span>\n </div>\n {isMinimizedStack ? (\n <div\n ref={minimizedStackViewportRef}\n className=\"desktop-dock-popup__minimized-stack-viewport\"\n style={{\n height: minimizedStackViewportHeightPx,\n ...(isLeftMinimizedStack\n ? { paddingLeft: minimizedStackLeftGutterPx }\n : {})\n }}\n >\n <div\n className=\"desktop-dock-popup__minimized-stack-track\"\n style={{\n minHeight: minimizedStackTrackHeightPx,\n transform: `translate(${minimizedStackTrackTranslateXPx}px, ${-minimizedStackScrollOffset}px)`\n }}\n >\n {items.map((item, index) => {\n const previewMemoryKey = resolveDockPopupPreviewMemoryKey(\n item.node,\n resolveDockPreviewCacheKey?.(item.node) ?? null\n );\n const capturedPreview =\n capturedPreviewByMemoryKey[previewMemoryKey] !== undefined\n ? capturedPreviewByMemoryKey[previewMemoryKey]\n : readDockPopupPreviewImage(previewMemoryKey);\n const previewState = resolveDockPopupItemPreviewState(\n item,\n capturedPreview,\n Boolean(capturePreview)\n );\n return (\n <WorkbenchHostDockPopupCard\n key={item.node.id}\n ref={registerCard(item.node.id)}\n closeWindowLabel={closeWindowLabel}\n item={item}\n labelMode={resolvedLabelMode}\n onCloseNode={onCloseNode}\n onSelectNode={onSelectNode}\n previewState={previewState}\n style={{\n ...resolvePopupFanCardStyle(\n index,\n items.length,\n placement\n ),\n ...resolvePopupCardMagnificationStyle(\n pointer,\n cardElementsRef.current.get(item.node.id) ?? null\n )\n }}\n variant={resolvedVariant}\n />\n );\n })}\n </div>\n </div>\n ) : (\n <div className=\"grid max-h-[min(52vh,420px)] grid-cols-[repeat(var(--desktop-dock-popup-columns,2),165px)] gap-2 overflow-auto overscroll-contain\">\n {items.map((item) => {\n const previewMemoryKey = resolveDockPopupPreviewMemoryKey(\n item.node,\n resolveDockPreviewCacheKey?.(item.node) ?? null\n );\n const capturedPreview =\n capturedPreviewByMemoryKey[previewMemoryKey] !== undefined\n ? capturedPreviewByMemoryKey[previewMemoryKey]\n : readDockPopupPreviewImage(previewMemoryKey);\n const previewState = resolveDockPopupItemPreviewState(\n item,\n capturedPreview,\n Boolean(capturePreview)\n );\n return (\n <WorkbenchHostDockPopupCard\n key={item.node.id}\n ref={registerCard(item.node.id)}\n closeWindowLabel={closeWindowLabel}\n item={item}\n labelMode={resolvedLabelMode}\n onCloseNode={onCloseNode}\n onSelectNode={onSelectNode}\n previewState={previewState}\n variant={resolvedVariant}\n />\n );\n })}\n {showCreateNew !== false ? (\n <button\n className=\"flex h-[103px] w-[165px] min-w-0 flex-col items-center justify-center gap-2 rounded-[8px] border border-dashed border-[var(--border-1)] bg-transparency-block text-center text-[var(--text-secondary)] transition-colors hover:bg-transparency-hover hover:text-[var(--text-primary)]\"\n type=\"button\"\n onClick={onCreateNew}\n >\n <FileCreateIcon\n aria-hidden=\"true\"\n className=\"text-[var(--text-primary)]\"\n size={28}\n />\n <span className=\"text-xs font-semibold text-[var(--text-primary)]\">\n {newWindowLabel}\n </span>\n </button>\n ) : null}\n </div>\n )}\n </>\n )}\n </div>\n </div>\n );\n\n if (typeof document === \"undefined\" || !document.body) {\n return content;\n }\n return createPortal(content, document.body);\n}\n\nfunction WorkbenchHostDockContextMenu({\n canCreateNew,\n canEnterFullscreen,\n canShowAllWindows,\n dockRetention,\n fullscreenLabel,\n hideLabel,\n items,\n newWindowLabel,\n onCreateNew,\n onEnterFullscreen,\n onHide,\n onQuit,\n onRunDockRetentionAction,\n onSelectNode,\n onShowAllWindows,\n openLabel,\n quitLabel,\n showAllWindowsLabel,\n showOpen\n}: {\n canCreateNew: boolean;\n canEnterFullscreen: boolean;\n canShowAllWindows: boolean;\n dockRetention?: WorkbenchHostDockPopupRetentionAction | null;\n fullscreenLabel?: string;\n hideLabel?: string;\n items: WorkbenchHostDockPopupItem[];\n newWindowLabel: string;\n onCreateNew: () => void;\n onEnterFullscreen?: () => void;\n onHide?: () => void;\n onQuit?: () => void;\n onRunDockRetentionAction?: () => void;\n onSelectNode: (nodeId: string) => void;\n onShowAllWindows?: () => void;\n openLabel?: string;\n quitLabel?: string;\n showAllWindowsLabel?: string;\n showOpen: boolean;\n}) {\n const hasOpenWindows = items.length > 0;\n const hasNewWindowCommand = hasOpenWindows && canCreateNew;\n const hasOpenCommand = !hasOpenWindows;\n const hasDockActionGroup =\n Boolean(dockRetention) || hasNewWindowCommand || hasOpenCommand;\n const hasWindowActionGroup = hasOpenWindows;\n\n return (\n <div\n className=\"flex min-w-0 flex-col gap-1\"\n data-desktop-dock-context-menu=\"true\"\n role=\"menu\"\n >\n {hasOpenWindows ? (\n <>\n <div className=\"max-h-48 min-w-0 overflow-auto overscroll-contain\">\n {items.map((item) => (\n <WorkbenchHostDockContextMenuItem\n key={item.node.id}\n checked={!item.isMinimized}\n label={item.title?.trim() || item.node.title}\n onSelect={() => onSelectNode(item.node.id)}\n />\n ))}\n </div>\n </>\n ) : null}\n {hasOpenWindows && (hasDockActionGroup || hasWindowActionGroup) ? (\n <WorkbenchHostDockContextMenuSeparator />\n ) : null}\n {dockRetention ? (\n <WorkbenchHostDockContextMenuItem\n checked={dockRetention.checked}\n checkedIcon={\n <PinFilledIcon\n aria-hidden=\"true\"\n className=\"size-4 text-[var(--tutti-purple)]\"\n />\n }\n disabled={dockRetention.disabled}\n icon={<PinIcon aria-hidden=\"true\" className=\"size-4\" />}\n label={dockRetention.pendingLabel ?? dockRetention.label}\n onSelect={onRunDockRetentionAction}\n />\n ) : null}\n {hasNewWindowCommand ? (\n <WorkbenchHostDockContextMenuItem\n icon={<FileCreateIcon aria-hidden=\"true\" className=\"size-4\" />}\n label={newWindowLabel}\n onSelect={onCreateNew}\n />\n ) : null}\n {hasOpenCommand ? (\n <WorkbenchHostDockContextMenuItem\n disabled={!showOpen}\n icon={<FileCreateIcon aria-hidden=\"true\" className=\"size-4\" />}\n label={openLabel}\n onSelect={onCreateNew}\n />\n ) : null}\n {hasOpenWindows ? (\n <>\n {hasDockActionGroup ? (\n <WorkbenchHostDockContextMenuSeparator />\n ) : null}\n {canShowAllWindows && onShowAllWindows ? (\n <WorkbenchHostDockContextMenuItem\n icon={\n <OverviewLayoutIcon aria-hidden=\"true\" className=\"size-4\" />\n }\n label={showAllWindowsLabel}\n onSelect={onShowAllWindows}\n />\n ) : null}\n <WorkbenchHostDockContextMenuItem\n disabled={!canEnterFullscreen || !onEnterFullscreen}\n icon={<MaximizeIcon aria-hidden=\"true\" className=\"size-4\" />}\n label={fullscreenLabel}\n onSelect={onEnterFullscreen}\n />\n <WorkbenchHostDockContextMenuItem\n disabled={!onHide}\n icon={<MinimizeIcon aria-hidden=\"true\" className=\"size-4\" />}\n label={hideLabel}\n onSelect={onHide}\n />\n <WorkbenchHostDockContextMenuItem\n disabled={!onQuit}\n icon={<CloseIcon aria-hidden=\"true\" className=\"size-4\" />}\n label={quitLabel}\n onSelect={onQuit}\n />\n </>\n ) : null}\n </div>\n );\n}\n\nfunction WorkbenchHostDockContextMenuItem({\n checked,\n checkedIcon,\n disabled,\n icon,\n label,\n onSelect\n}: {\n checked?: boolean;\n checkedIcon?: ReactNode;\n disabled?: boolean;\n icon?: ReactNode;\n label?: string;\n onSelect?: () => void;\n}) {\n return (\n <button\n className={cn(\n \"flex h-8 w-full min-w-0 items-center gap-2 rounded-md px-2 text-left text-sm text-[var(--text-primary)] transition-colors\",\n disabled\n ? \"cursor-default opacity-45\"\n : \"hover:bg-transparency-hover focus-visible:bg-transparency-hover focus-visible:outline-none\"\n )}\n disabled={disabled}\n role=\"menuitem\"\n type=\"button\"\n onClick={() => {\n if (disabled || !onSelect) {\n return;\n }\n onSelect();\n }}\n >\n <span className=\"flex size-4 shrink-0 items-center justify-center text-[var(--text-secondary)]\">\n {checked && checkedIcon ? (\n checkedIcon\n ) : checked ? (\n <CheckIcon\n aria-hidden=\"true\"\n className=\"size-4 text-[var(--tutti-purple)]\"\n />\n ) : (\n (icon ?? null)\n )}\n </span>\n <span className=\"min-w-0 truncate\">{label}</span>\n </button>\n );\n}\n\nfunction WorkbenchHostDockContextMenuSeparator() {\n return (\n <div\n aria-hidden=\"true\"\n className=\"mx-2 my-1 h-px bg-[var(--border-1)]\"\n role=\"separator\"\n />\n );\n}\n\nfunction readPersistedDockPreview(\n dockPreviewCache: WorkbenchDockPreviewCache | undefined,\n cacheKey: WorkbenchDockPreviewCacheKey | null\n): Promise<string | null> {\n if (!cacheKey) {\n return Promise.resolve(null);\n }\n return (\n dockPreviewCache?.read(cacheKey).catch(() => null) ?? Promise.resolve(null)\n );\n}\n\nfunction resolveDockPopupPreviewCacheKey(\n cacheKey: WorkbenchDockPreviewCacheKey | null,\n revision: string | null\n): WorkbenchDockPreviewCacheKey | null {\n return cacheKey ? { ...cacheKey, revision } : null;\n}\n\nfunction resolveDockPopupPreviewMemoryKey(\n node: WorkbenchNode<WorkbenchHostNodeData>,\n cacheKey: WorkbenchDockPreviewCacheKey | null\n): string {\n if (!cacheKey) {\n return `node:${node.id}`;\n }\n return `cache:${JSON.stringify({\n instanceId: cacheKey.instanceId,\n instanceKey: cacheKey.instanceKey ?? null,\n nodeId: cacheKey.nodeId,\n typeId: cacheKey.typeId,\n workspaceId: cacheKey.workspaceId\n })}`;\n}\n\nfunction normalizeDockPopupPreviewContentResult(\n preview: WorkbenchDockPreviewContent | string | null | undefined,\n revision: string | null\n): WorkbenchDockPreviewContent | null {\n if (!preview) {\n return null;\n }\n if (typeof preview === \"string\") {\n return { kind: \"image\", revision: revision ?? undefined, src: preview };\n }\n return {\n ...preview,\n revision: preview.revision ?? revision ?? undefined\n };\n}\n\nfunction resolveDockPopupItemPreviewState(\n item: WorkbenchHostDockPopupItem,\n capturedPreview: WorkbenchHostDockPopupCapturedPreview | undefined,\n hasPreviewProvider: boolean\n): WorkbenchHostDockPopupPreviewState {\n const revision = item.previewRevision;\n if (item.preview) {\n return { preview: item.preview, status: \"ready\" };\n }\n if (\n capturedPreview &&\n capturedPreview.revision === revision &&\n capturedPreview.preview\n ) {\n return { preview: capturedPreview.preview, status: \"ready\" };\n }\n if (\n (capturedPreview !== undefined && capturedPreview.revision === revision) ||\n !hasPreviewProvider\n ) {\n return { status: \"fallback\" };\n }\n return { status: \"loading\" };\n}\n\nfunction previewCacheToken(\n preview: WorkbenchDockPreviewContent | null | undefined\n): string {\n if (!preview) {\n return \"\";\n }\n switch (preview.kind) {\n case \"component\":\n return `component:${preview.revision ?? \"\"}`;\n case \"image\":\n return `image:${preview.revision ?? \"\"}:${preview.src}`;\n }\n}\n\nfunction logWorkbenchDockPopupDebug(\n event: string,\n debugDiagnostics: WorkbenchHostProps[\"debugDiagnostics\"],\n details: Record<string, unknown>\n): void {\n if (!debugDiagnostics?.log) {\n return;\n }\n void Promise.resolve(\n debugDiagnostics.log({\n details,\n event,\n level: \"info\",\n source: \"workbench-dock\"\n })\n ).catch(() => undefined);\n}\n\nfunction rectToDiagnostic(element: HTMLElement): Record<string, number> {\n const rect = element.getBoundingClientRect();\n return {\n bottom: Math.round(rect.bottom),\n height: Math.round(rect.height),\n left: Math.round(rect.left),\n right: Math.round(rect.right),\n top: Math.round(rect.top),\n width: Math.round(rect.width)\n };\n}\n\nfunction styleToDiagnostic(element: HTMLElement): Record<string, string> {\n const style = window.getComputedStyle(element);\n return {\n display: style.display,\n opacity: style.opacity,\n pointerEvents: style.pointerEvents,\n position: style.position,\n transform: style.transform,\n visibility: style.visibility,\n zIndex: style.zIndex\n };\n}\n\ninterface WorkbenchHostDockPopupCardProps {\n closeWindowLabel: (title: string) => string;\n item: WorkbenchHostDockPopupItem;\n labelMode?: WorkbenchHostDockPopupCardLabelMode;\n onCloseNode: (nodeId: string) => void;\n onSelectNode: (nodeId: string) => void;\n previewState: WorkbenchHostDockPopupPreviewState;\n style?: CSSProperties;\n variant?: WorkbenchHostDockPopupVariant;\n}\n\nconst WorkbenchHostDockPopupCard = forwardRef<\n HTMLDivElement,\n WorkbenchHostDockPopupCardProps\n>(function WorkbenchHostDockPopupCard(\n {\n closeWindowLabel,\n item,\n labelMode,\n onCloseNode,\n onSelectNode,\n previewState,\n style,\n variant\n },\n ref\n) {\n const title = item.title?.trim() || item.node.title;\n const isMinimizedStack = variant === \"minimized-stack\";\n const [isLaunching, setIsLaunching] = useState(false);\n const launchTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(\n () => () => {\n if (launchTimerRef.current !== null) {\n clearTimeout(launchTimerRef.current);\n }\n },\n []\n );\n\n const handleSelect = useCallback(() => {\n if (!isMinimizedStack) {\n onSelectNode(item.node.id);\n return;\n }\n if (launchTimerRef.current !== null) {\n return;\n }\n setIsLaunching(true);\n launchTimerRef.current = setTimeout(() => {\n launchTimerRef.current = null;\n onSelectNode(item.node.id);\n }, dockPopupMinimizedStackLaunchDisappearMs);\n }, [isMinimizedStack, item.node.id, onSelectNode]);\n const handleSelectKeyDown = useCallback(\n (event: ReactKeyboardEvent<HTMLDivElement>) => {\n if (event.key !== \"Enter\" && event.key !== \" \") {\n return;\n }\n event.preventDefault();\n handleSelect();\n },\n [handleSelect]\n );\n const hasReadyPreview = previewState.status === \"ready\";\n\n return (\n <div\n ref={ref}\n className={cn(\n \"group/dock-popup-card relative flex h-[103px] w-[165px] min-w-0 flex-col overflow-hidden rounded-[8px] border border-[var(--border-1)] bg-background-fronted text-left text-[var(--text-primary)] transition-[border-color,color] duration-150\",\n item.isMinimized && \"text-[var(--text-secondary)]\"\n )}\n data-active={item.isFocused ? \"true\" : undefined}\n data-desktop-dock-popup-card=\"true\"\n data-fan-card={isMinimizedStack ? \"true\" : undefined}\n data-launching={isLaunching ? \"true\" : undefined}\n data-minimized={item.isMinimized ? \"true\" : undefined}\n style={style}\n >\n <div\n aria-label={title}\n data-active={item.isFocused ? \"true\" : undefined}\n className={cn(\n \"relative flex min-h-0 min-w-0 flex-1 cursor-pointer flex-col overflow-hidden rounded-md bg-transparent text-inherit\",\n hasReadyPreview ? \"p-0\" : \"p-1\"\n )}\n role=\"button\"\n tabIndex={0}\n onClick={handleSelect}\n onKeyDown={handleSelectKeyDown}\n >\n <WorkbenchHostDockPopupCardPreview previewState={previewState} />\n {labelMode === \"hover-overlay\" && item.title?.trim() ? (\n <WorkbenchHostDockPopupCardLabel title={item.title} />\n ) : null}\n </div>\n <Button\n aria-label={closeWindowLabel(title)}\n className=\"absolute top-1.5 right-1.5 z-[2] rounded-full bg-[var(--background-fronted)] opacity-0 transition-[background-color,opacity] duration-150 hover:bg-[var(--background-fronted)] focus-visible:bg-[var(--background-fronted)] group-hover/dock-popup-card:opacity-100 group-focus-within/dock-popup-card:opacity-100 focus-visible:opacity-100\"\n size=\"icon-sm\"\n title={closeWindowLabel(title)}\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n onCloseNode(item.node.id);\n }}\n >\n <CloseIcon className=\"size-3.5\" />\n </Button>\n {item.isFocused ? (\n <span\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute inset-0 z-[3] rounded-md shadow-[inset_0_0_0_2px_var(--border-focus)]\"\n data-desktop-dock-popup-card-active-overlay=\"true\"\n />\n ) : null}\n {isMinimizedStack ? (\n <span className=\"desktop-dock-popup__fan-title-tip\" title={title}>\n {title}\n </span>\n ) : null}\n </div>\n );\n});\n\nfunction WorkbenchHostDockPopupCardPreview({\n previewState\n}: {\n previewState: WorkbenchHostDockPopupPreviewState;\n}) {\n if (previewState.status !== \"ready\") {\n return (\n <span\n className=\"flex min-h-0 min-w-0 flex-1 flex-col justify-center gap-[7px] rounded-md border border-[var(--border-1)] bg-transparency-block px-3 py-[11px]\"\n aria-hidden=\"true\"\n data-preview-state={previewState.status}\n >\n <span className=\"block h-[7px] w-[72%] rounded-full bg-transparency-hover\" />\n <span className=\"block h-[7px] w-[58%] rounded-full bg-transparency-hover\" />\n <span className=\"block h-[7px] w-[34%] rounded-full bg-transparency-hover\" />\n </span>\n );\n }\n\n const preview = previewState.preview;\n if (preview.kind === \"component\") {\n return (\n <span\n className=\"block min-h-0 min-w-0 flex-1 overflow-hidden rounded-md\"\n aria-hidden=\"true\"\n data-preview-kind={preview.kind}\n data-preview-state={previewState.status}\n >\n {preview.element}\n </span>\n );\n }\n\n return (\n <span\n className=\"block min-h-0 min-w-0 flex-1 overflow-hidden rounded-md\"\n aria-hidden=\"true\"\n data-preview-kind={preview.kind}\n data-preview-state={previewState.status}\n >\n <img\n alt=\"\"\n className=\"block h-full max-h-full w-full max-w-full object-contain object-center\"\n draggable={false}\n src={preview.src}\n />\n </span>\n );\n}\n\nfunction WorkbenchHostDockPopupCardLabel({ title }: { title: string }) {\n return (\n <span\n className=\"pointer-events-none absolute inset-x-0 bottom-0 z-[1] flex h-[30px] items-end px-[10px] pb-0.5 text-[var(--white-stationary)] opacity-0 transition-opacity duration-150 [text-shadow:0_1px_2px_rgb(0_0_0_/_20%)] group-hover/dock-popup-card:opacity-100 group-focus-within/dock-popup-card:opacity-100\"\n style={{\n background:\n \"linear-gradient(180deg, transparent 0%, color-mix(in srgb, hsl(var(--card)) 28%, transparent) 18%, color-mix(in srgb, hsl(var(--card)) 82%, transparent) 56%, color-mix(in srgb, hsl(var(--card)) 98%, transparent) 100%)\"\n }}\n title={title}\n >\n <span className=\"desktop-dock-popup__title-viewport block min-w-0 flex-1 overflow-hidden whitespace-nowrap\">\n <span className=\"desktop-dock-popup__title-marquee inline-block max-w-full overflow-hidden text-[12px] font-semibold leading-5 text-ellipsis whitespace-nowrap\">\n {title}\n </span>\n </span>\n </span>\n );\n}\n","import type { WorkbenchDockPlacement } from \"../react/types.ts\";\n\nconst minimizedStackViewportMarginPx = 56;\nconst minimizedStackViewportCapPx = 112;\nexport const minimizedStackCardWidthPx = 118;\nexport const minimizedStackLeftPlacementGapPx = 4;\nexport const minimizedStackLeftDockClearancePx = 2;\nexport const workbenchLeftDockLeftInsetPx = 4;\nexport const workbenchLeftDockViewportWidthPx = 124;\nexport const minimizedStackLeftGutterMinPx = 4;\nexport const minimizedStackLeftPopupNudgeLeftPx = 60;\nexport const minimizedStackLeftPopupNudgeDownPx = 32;\nconst minimizedStackLeftGutterBufferPx = 8;\nexport const minimizedStackTitleTipGapPx = 12;\nexport const minimizedStackTitleTipMaxWidthPx = 220;\nexport const minimizedStackFanStepXPx = 6;\nexport const minimizedStackFanStepYPx = 78;\nexport const minimizedStackFanBaseOffsetYPx = 18;\nexport const minimizedStackStackPaddingPx = 96;\n\nexport function resolveMinimizedStackCardHeightPx(): number {\n return Math.round((minimizedStackCardWidthPx * 10) / 16);\n}\n\nexport function resolveMinimizedStackTrackHeightPx(itemCount: number): number {\n const safeCount = Math.max(1, itemCount);\n return (\n minimizedStackFanBaseOffsetYPx +\n Math.max(0, safeCount - 1) * minimizedStackFanStepYPx +\n resolveMinimizedStackCardHeightPx() +\n minimizedStackStackPaddingPx\n );\n}\n\nexport function resolveMaxMinimizedStackTrackTranslateXPx(\n itemCount: number,\n placement: WorkbenchDockPlacement\n): number {\n if (placement !== \"left\" || itemCount <= 1) {\n return 0;\n }\n return (itemCount - 1) * minimizedStackFanStepXPx;\n}\n\nexport function resolveMinimizedStackLeftGutterPx(input: {\n itemCount: number;\n placement: WorkbenchDockPlacement;\n scrollOffset?: number;\n trackHeightPx?: number;\n viewportHeightPx?: number;\n trackTranslateXPx?: number;\n}): number {\n if (input.placement !== \"left\" || input.itemCount <= 0) {\n return 0;\n }\n\n if (\n input.scrollOffset === undefined ||\n input.trackHeightPx === undefined ||\n input.viewportHeightPx === undefined ||\n input.trackTranslateXPx === undefined\n ) {\n return (\n minimizedStackLeftGutterMinPx +\n resolveMaxMinimizedStackTrackTranslateXPx(\n input.itemCount,\n input.placement\n ) +\n minimizedStackLeftGutterBufferPx\n );\n }\n\n const cardHeightPx = resolveMinimizedStackCardHeightPx();\n const visibleTop = input.scrollOffset;\n const visibleBottom = input.scrollOffset + input.viewportHeightPx;\n let minCardLeftPx = 0;\n\n for (let index = 0; index < input.itemCount; index += 1) {\n const cappedIndex = Math.min(index, Math.max(0, input.itemCount - 1));\n const fanYPx =\n -minimizedStackFanBaseOffsetYPx - index * minimizedStackFanStepYPx;\n const cardTop = input.trackHeightPx + fanYPx - cardHeightPx;\n const cardBottom = input.trackHeightPx + fanYPx;\n if (cardBottom < visibleTop || cardTop > visibleBottom) {\n continue;\n }\n\n const fanXPx = -cappedIndex * minimizedStackFanStepXPx;\n const cardLeftPx = input.trackTranslateXPx + fanXPx;\n minCardLeftPx = Math.min(minCardLeftPx, cardLeftPx);\n }\n\n return Math.max(\n minimizedStackLeftGutterMinPx,\n -minCardLeftPx + minimizedStackLeftGutterBufferPx\n );\n}\n\nexport function resolveMinimizedStackPanelWidthPx(\n itemCount: number,\n placement: WorkbenchDockPlacement,\n options?: { leftGutterPx?: number }\n): number {\n const leftGutterPx =\n options?.leftGutterPx ??\n resolveMinimizedStackLeftGutterPx({ itemCount, placement });\n return (\n leftGutterPx +\n minimizedStackCardWidthPx +\n minimizedStackTitleTipGapPx +\n minimizedStackTitleTipMaxWidthPx\n );\n}\n\nexport function resolveMinimizedStackPopupLeftPx(input: {\n anchorLeft: number;\n anchorWidth: number;\n dockRightPx?: number;\n leftGutterPx?: number;\n}): number {\n const fromAnchor =\n input.anchorLeft + input.anchorWidth + minimizedStackLeftPlacementGapPx;\n const dockRight =\n input.dockRightPx ??\n workbenchLeftDockLeftInsetPx + workbenchLeftDockViewportWidthPx;\n const fromDock = dockRight + minimizedStackLeftDockClearancePx;\n const baseLeft = Math.max(fromAnchor, fromDock);\n const leftGutterPx = input.leftGutterPx ?? minimizedStackLeftGutterMinPx;\n return (\n baseLeft -\n Math.max(0, leftGutterPx - minimizedStackLeftGutterMinPx) -\n minimizedStackLeftPopupNudgeLeftPx\n );\n}\n\nexport function resolveMinimizedStackPopupTopPx(input: {\n anchorTop: number;\n}): number {\n return input.anchorTop + minimizedStackLeftPopupNudgeDownPx;\n}\n\nexport function resolveMinimizedStackViewportHeightPx(input: {\n anchorCenterY: number;\n placement: WorkbenchDockPlacement;\n trackHeightPx: number;\n viewportHeightPx?: number;\n}): number {\n const viewportCap =\n input.viewportHeightPx ??\n (typeof window === \"undefined\"\n ? input.trackHeightPx\n : window.innerHeight - minimizedStackViewportCapPx);\n\n if (input.placement === \"left\") {\n const availableAbove = Math.max(\n 160,\n input.anchorCenterY - minimizedStackViewportMarginPx\n );\n return Math.min(input.trackHeightPx, availableAbove, viewportCap);\n }\n\n return Math.min(input.trackHeightPx, viewportCap);\n}\n\nexport function resolveInitialMinimizedStackScrollOffset(input: {\n maxScrollOffset: number;\n}): number {\n return input.maxScrollOffset;\n}\n\nexport function resolveMinimizedStackFocalCardIndex(input: {\n itemCount: number;\n scrollOffset: number;\n trackHeightPx: number;\n viewportHeightPx: number;\n}): number {\n if (input.itemCount <= 1) {\n return 0;\n }\n\n const cardHeightPx = resolveMinimizedStackCardHeightPx();\n const viewportCenterY = input.scrollOffset + input.viewportHeightPx / 2;\n const rawIndex =\n (input.trackHeightPx -\n minimizedStackFanBaseOffsetYPx -\n cardHeightPx / 2 -\n viewportCenterY) /\n minimizedStackFanStepYPx;\n\n return Math.min(input.itemCount - 1, Math.max(0, rawIndex));\n}\n\nexport function resolveMinimizedStackFanXPx(input: {\n focalIndex: number;\n itemCount: number;\n placement: WorkbenchDockPlacement;\n}): number {\n if (input.itemCount <= 0) {\n return 0;\n }\n\n const cappedIndex = Math.min(\n input.focalIndex,\n Math.max(0, input.itemCount - 1)\n );\n const fanDirection = input.placement === \"left\" ? -1 : 1;\n return cappedIndex * minimizedStackFanStepXPx * fanDirection;\n}\n\nexport function resolveMinimizedStackTrackTranslateXPx(input: {\n itemCount: number;\n placement: WorkbenchDockPlacement;\n scrollOffset: number;\n trackHeightPx: number;\n viewportHeightPx: number;\n}): number {\n if (input.itemCount <= 0) {\n return 0;\n }\n\n const focalIndex = resolveMinimizedStackFocalCardIndex({\n itemCount: input.itemCount,\n scrollOffset: input.scrollOffset,\n trackHeightPx: input.trackHeightPx,\n viewportHeightPx: input.viewportHeightPx\n });\n const fanXPx = resolveMinimizedStackFanXPx({\n focalIndex,\n itemCount: input.itemCount,\n placement: input.placement\n });\n\n return -fanXPx;\n}\n","import type { WorkbenchRenderWindowHeader } from \"../react/types.ts\";\nimport type {\n WorkbenchHostNodeData,\n WorkbenchHostNodeHeaderContext\n} from \"./types.ts\";\n\nexport function createWorkbenchHostNodeHeaderWindowActions(\n context: Parameters<WorkbenchRenderWindowHeader<WorkbenchHostNodeData>>[0],\n input: {\n requestNodeClose?: (nodeId: string) => void;\n } = {}\n): WorkbenchHostNodeHeaderContext[\"windowActions\"] {\n return {\n applyQuickLayout(target) {\n context.controller.commands.applyQuickLayout(context.node.id, target);\n },\n close() {\n if (input.requestNodeClose) {\n input.requestNodeClose(context.node.id);\n return;\n }\n context.controller.commands.closeNode(context.node.id);\n },\n focus() {\n context.controller.commands.focusNode(context.node.id);\n },\n minimize() {\n context.genie.minimizeNodeToAnchor(context.node.id, () =>\n context.controller.commands.minimizeNode(context.node.id)\n );\n },\n resize(frame) {\n context.controller.commands.resizeNode(context.node.id, frame);\n },\n toggleDisplayMode() {\n if (context.node.displayMode === \"fullscreen\") {\n context.controller.commands.exitFullscreen(context.node.id);\n return;\n }\n context.controller.commands.enterFullscreen(context.node.id);\n }\n };\n}\n","import { selectFocusedWorkbenchNode } from \"../core/selectors.ts\";\nimport type {\n WorkbenchRenderNodeContext,\n WorkbenchRenderWindowHeader\n} from \"../react/types.ts\";\nimport { readWorkbenchHostExternalState } from \"./externalState.ts\";\nimport { createWorkbenchHostNodeHeaderWindowActions } from \"./windowActions.ts\";\nimport type {\n WorkbenchHostExternalStateSource,\n WorkbenchHostHandle,\n WorkbenchHostNodeBodyContext,\n WorkbenchHostNodeData,\n WorkbenchHostNodeDefinition,\n WorkbenchHostNodeHeaderContext\n} from \"./types.ts\";\n\nexport function createWorkbenchHostNodeBodyContext<\n TExternalNodeState,\n TExternalWorkspaceState\n>({\n context,\n externalStateSource,\n host,\n workspaceId\n}: {\n context: WorkbenchRenderNodeContext<WorkbenchHostNodeData>;\n definition: WorkbenchHostNodeDefinition<\n TExternalNodeState,\n TExternalWorkspaceState\n >;\n externalStateSource?: WorkbenchHostExternalStateSource;\n host: WorkbenchHostHandle;\n workspaceId: string;\n}): WorkbenchHostNodeBodyContext<TExternalNodeState, TExternalWorkspaceState> {\n const externalState = readWorkbenchHostExternalState({\n externalStateSource,\n node: context.node,\n workspaceId\n });\n\n return {\n activation: context.node.data.activation ?? null,\n displayMode: context.node.displayMode,\n externalNodeState: externalState.externalNodeState as TExternalNodeState,\n externalWorkspaceState:\n externalState.externalWorkspaceState as TExternalWorkspaceState,\n focus() {\n host.focusNode(context.node.id);\n },\n host,\n instanceId: context.node.data.instanceId,\n instanceKey: context.node.data.instanceKey ?? null,\n isFocused:\n selectFocusedWorkbenchNode(host.getSnapshot())?.id === context.node.id,\n node: context.node,\n setNodeRuntimeState(state) {\n host.setNodeRuntimeState(context.node.id, state);\n },\n setSnapshotNodeState(state) {\n host.setSnapshotNodeState(context.node.id, state);\n }\n };\n}\n\nexport function createWorkbenchHostNodeHeaderContext<\n TExternalNodeState,\n TExternalWorkspaceState\n>({\n context,\n externalStateSource,\n host,\n workspaceId\n}: {\n context: Parameters<WorkbenchRenderWindowHeader<WorkbenchHostNodeData>>[0];\n definition: WorkbenchHostNodeDefinition<\n TExternalNodeState,\n TExternalWorkspaceState\n >;\n externalStateSource?: WorkbenchHostExternalStateSource;\n host: WorkbenchHostHandle;\n workspaceId: string;\n}): WorkbenchHostNodeHeaderContext<\n TExternalNodeState,\n TExternalWorkspaceState\n> {\n const externalState = readWorkbenchHostExternalState({\n externalStateSource,\n node: context.node,\n workspaceId\n });\n\n return {\n activation: context.node.data.activation ?? null,\n defaultActions: context.defaultActions,\n displayMode: context.node.displayMode,\n dragHandleProps: context.dragHandleProps,\n externalNodeState: externalState.externalNodeState as TExternalNodeState,\n externalWorkspaceState:\n externalState.externalWorkspaceState as TExternalWorkspaceState,\n instanceId: context.node.data.instanceId,\n instanceKey: context.node.data.instanceKey ?? null,\n isFocused:\n selectFocusedWorkbenchNode(host.getSnapshot())?.id === context.node.id,\n node: context.node,\n surfaceSize: context.surfaceSize,\n windowActions: createWorkbenchHostNodeHeaderWindowActions(context, {\n requestNodeClose: (nodeId) => host.requestNodeClose(nodeId)\n })\n };\n}\n","import { Button, CloseIcon, MinimizeIcon } from \"@tutti-os/ui-system\";\nimport type { WorkbenchWindowActionContext } from \"../react/types.ts\";\nimport type {\n WorkbenchHostHandle,\n WorkbenchHostNodeData,\n WorkbenchHostNodeDefinition\n} from \"./types.ts\";\nimport type { WorkbenchHostI18nRuntime } from \"./workbenchHostI18n.ts\";\n\nexport function WorkbenchHostWindowActions({\n context,\n host,\n i18n,\n nodeDefinitions\n}: {\n context: WorkbenchWindowActionContext<WorkbenchHostNodeData>;\n host: WorkbenchHostHandle;\n i18n: WorkbenchHostI18nRuntime;\n nodeDefinitions: Map<string, WorkbenchHostNodeDefinition>;\n}) {\n const definition = nodeDefinitions.get(context.node.data.typeId);\n if (!definition) {\n return null;\n }\n\n const minimizable = definition.window?.minimizable !== false;\n const closable = definition.window?.closable !== false;\n\n return (\n <>\n {minimizable ? (\n <Button\n aria-label={i18n.t(\"actions.minimize\")}\n className=\"order-1 rounded-md\"\n data-workbench-action=\"minimize\"\n size=\"icon-sm\"\n type=\"button\"\n variant=\"chrome\"\n onClick={() => {\n context.genie.minimizeNodeToAnchor(context.node.id, () =>\n context.controller.commands.minimizeNode(context.node.id)\n );\n }}\n >\n <MinimizeIcon className=\"size-3.5\" />\n </Button>\n ) : null}\n {closable ? (\n <Button\n aria-label={i18n.t(\"actions.close\")}\n className=\"order-3 rounded-md\"\n data-workbench-action=\"close\"\n size=\"icon-sm\"\n type=\"button\"\n variant=\"chrome\"\n onClick={() => {\n host.requestNodeClose(context.node.id);\n }}\n >\n <CloseIcon className=\"size-3.5\" />\n </Button>\n ) : null}\n </>\n );\n}\n"],"mappings":";;;;;;;;;;AAyCO,SAAS,wBACd,OAC0B;AAC1B,SAAO;AAAA,IACL,aAAa,OAAO;AAClB,YAAM,SAAS,EAAE,MAAM,gBAAgB,MAAM,CAAC;AAAA,IAChD;AAAA,IACA,aAAa,OAAO;AAClB,YAAM,SAAS,EAAE,MAAM,gBAAgB,MAAM,CAAC;AAAA,IAChD;AAAA,IACA,SAAS,MAAM;AACb,YAAM,SAAS,EAAE,MAAM,YAAY,KAAK,CAAC;AAAA,IAC3C;AAAA,IACA,UAAU,QAAQ;AAChB,YAAM,SAAS,EAAE,MAAM,aAAa,OAAO,CAAC;AAAA,IAC9C;AAAA,IACA,UAAU,QAAQ;AAChB,YAAM,SAAS,EAAE,MAAM,aAAa,OAAO,CAAC;AAAA,IAC9C;AAAA,IACA,aAAa,QAAQ;AACnB,YAAM,SAAS,EAAE,MAAM,gBAAgB,OAAO,CAAC;AAAA,IACjD;AAAA,IACA,YAAY,QAAQ;AAClB,YAAM,SAAS,EAAE,MAAM,eAAe,OAAO,CAAC;AAAA,IAChD;AAAA,IACA,gBAAgB,QAAQ;AACtB,YAAM,SAAS,EAAE,MAAM,mBAAmB,OAAO,CAAC;AAAA,IACpD;AAAA,IACA,eAAe,QAAQ;AACrB,YAAM,SAAS,EAAE,MAAM,kBAAkB,OAAO,CAAC;AAAA,IACnD;AAAA,IACA,iBAAiB,QAAQ,QAAQ;AAC/B,YAAM,SAAS,EAAE,MAAM,oBAAoB,QAAQ,OAAO,CAAC;AAAA,IAC7D;AAAA,IACA,kBAAkB,SAAS,QAAQ;AACjC,YAAM,SAAS,EAAE,MAAM,qBAAqB,SAAS,OAAO,CAAC;AAAA,IAC/D;AAAA,IACA,sBAAsB,QAAQ;AAC5B,YAAM,SAAS,EAAE,MAAM,yBAAyB,OAAO,CAAC;AAAA,IAC1D;AAAA,IACA,gBAAgB,QAAQ,YAAY;AAClC,YAAM,SAAS,EAAE,MAAM,mBAAmB,QAAQ,WAAW,CAAC;AAAA,IAChE;AAAA,IACA,SAAS,QAAQ,OAAO;AACtB,YAAM,SAAS,EAAE,MAAM,YAAY,QAAQ,MAAM,CAAC;AAAA,IACpD;AAAA,IACA,SAAS,QAAQ,OAAO;AACtB,YAAM,SAAS,EAAE,MAAM,YAAY,QAAQ,MAAM,CAAC;AAAA,IACpD;AAAA,IACA,WAAW,QAAQ,OAAO;AACxB,YAAM,SAAS,EAAE,MAAM,cAAc,QAAQ,MAAM,CAAC;AAAA,IACtD;AAAA,IACA,kBAAkB,QAAQ;AACxB,YAAM,SAAS,EAAE,MAAM,qBAAqB,OAAO,CAAC;AAAA,IACtD;AAAA,IACA,oBAAoB,QAAQ;AAC1B,YAAM,SAAS,EAAE,MAAM,uBAAuB,OAAO,CAAC;AAAA,IACxD;AAAA,IACA,oBAAoB,YAAY;AAC9B,YAAM,SAAS,EAAE,MAAM,uBAAuB,WAAW,CAAC;AAAA,IAC5D;AAAA,IACA,eAAe,MAAM;AACnB,YAAM,SAAS,EAAE,MAAM,kBAAkB,KAAK,CAAC;AAAA,IACjD;AAAA,IACA,qBAAqB,aAAa;AAChC,YAAM,SAAS,EAAE,MAAM,wBAAwB,YAAY,CAAC;AAAA,IAC9D;AAAA,IACA,uBAAuB,QAAQ,iBAAiB;AAC9C,YAAM,SAAS;AAAA,QACb,MAAM;AAAA,QACN;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;ACvCO,IAAM,2BAA8C;AAAA,EACzD,KAAK;AAAA,EACL,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AACR;AAEO,IAAM,oCAAgE;AAAA,EAC3E,UAAU;AAAA,EACV,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,UAAU;AACZ;AAEO,IAAM,8BAA6C;AAAA,EACxD,OAAO;AAAA,EACP,QAAQ;AACV;;;ACjFO,IAAM,2BAA2B;AACjC,IAAM,iCAAiC;AAEvC,SAAS,oCACd,cAA+C,CAAC,GACpB;AAC5B,SAAO;AAAA,IACL,UACE,YAAY,YAAY,kCAAkC;AAAA,IAC5D,WACE,YAAY,aAAa,kCAAkC;AAAA,IAC7D,gBACE,YAAY,kBACZ,kCAAkC;AAAA,IACpC,UAAU,2BAA2B,YAAY,QAAQ;AAAA,EAC3D;AACF;AAEO,SAAS,2BACd,WAAuC,CAAC,GACrB;AACnB,SAAO;AAAA,IACL,KAAK,KAAK,IAAI,GAAG,SAAS,OAAO,CAAC;AAAA,IAClC,OAAO,KAAK,IAAI,GAAG,SAAS,SAAS,CAAC;AAAA,IACtC,QAAQ,KAAK,IAAI,GAAG,SAAS,UAAU,CAAC;AAAA,IACxC,MAAM,KAAK,IAAI,GAAG,SAAS,QAAQ,CAAC;AAAA,EACtC;AACF;AAEO,SAAS,wBACd,aACA,cAA0C,mCAC1B;AAChB,QAAM,aAAa,oCAAoC,WAAW;AAClE,QAAM,QAAQ,KAAK;AAAA,IACjB,WAAW;AAAA,IACX,YAAY,QAAQ,WAAW,SAAS,OAAO,WAAW,SAAS;AAAA,EACrE;AACA,QAAM,SAAS,KAAK;AAAA,IAClB,WAAW;AAAA,IACX,YAAY,SAAS,WAAW,SAAS,MAAM,WAAW,SAAS;AAAA,EACrE;AAEA,SAAO;AAAA,IACL,GAAG,WAAW,SAAS;AAAA,IACvB,GAAG,WAAW,SAAS;AAAA,IACvB;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,mBACd,MACA,aACA,cAA0C,mCAC1C,iBACgB;AAChB,QAAM,aAAa;AAAA,IACjB;AAAA,IACA;AAAA,EACF;AACA,QAAM,QAAQ,wBAAwB,aAAa,UAAU;AAC7D,QAAM,QAAQ;AAAA,IACZ,KAAK;AAAA,IACL,WAAW;AAAA,IACX,KAAK,IAAI,WAAW,UAAU,MAAM,QAAQ,WAAW,iBAAiB,CAAC;AAAA,EAC3E;AACA,QAAM,SAAS;AAAA,IACb,KAAK;AAAA,IACL,WAAW;AAAA,IACX,KAAK,IAAI,WAAW,WAAW,MAAM,SAAS,WAAW,iBAAiB,CAAC;AAAA,EAC7E;AACA,QAAM,OAAO,KAAK;AAAA,IAChB,MAAM,IAAI,WAAW;AAAA,IACrB,MAAM,IAAI,MAAM,QAAQ,QAAQ,WAAW;AAAA,EAC7C;AACA,QAAM,OAAO,KAAK;AAAA,IAChB,MAAM,IAAI,WAAW;AAAA,IACrB,MAAM,IAAI,MAAM,SAAS,SAAS,WAAW;AAAA,EAC/C;AAEA,SAAO;AAAA,IACL,GAAG,MAAM,KAAK,GAAG,MAAM,IAAI,WAAW,gBAAgB,IAAI;AAAA,IAC1D,GAAG,MAAM,KAAK,GAAG,MAAM,IAAI,WAAW,gBAAgB,IAAI;AAAA,IAC1D;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,gCACd,MACA,aACA,cAA0C,mCAC1C,eAAe,0BACf,iBACgB;AAChB,QAAM,aAAa;AAAA,IACjB;AAAA,IACA;AAAA,EACF;AACA,QAAM,eAAe,2BAA2B,aAAa,UAAU;AACvE,QAAM,YAAY;AAAA,IAChB;AAAA,MACE,GAAG;AAAA,MACH,GAAG,aAAa;AAAA,MAChB,GAAG,aAAa;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,cAAc,KAAK,IAAI,cAAc,aAAa,KAAK;AAC7D,QAAM,cAAc,KAAK,IAAI,cAAc,aAAa,MAAM;AAC9D,QAAM,OAAO,aAAa,IAAI,cAAc,UAAU;AACtD,QAAM,OAAO,aAAa,IAAI,aAAa,QAAQ;AACnD,QAAM,OAAO,aAAa,IAAI,cAAc,UAAU;AACtD,QAAM,OAAO,aAAa,IAAI,aAAa,SAAS;AAEpD,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG,KAAK,MAAM,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC;AAAA,IACvC,GAAG,KAAK,MAAM,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC;AAAA,EACzC;AACF;AAEO,SAAS,uBACd,MACA,aACA,cAA0C,mCAC1C,iBACgB;AAChB,QAAM,aAAa;AAAA,IACjB;AAAA,IACA;AAAA,EACF;AACA,QAAM,cAAc,wBAAwB,aAAa,UAAU;AACnE,QAAM,cAAc;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG,KAAK,IAAI,YAAY,IAAI,WAAW,gBAAgB,YAAY,CAAC;AAAA,EACtE;AACF;AAEO,SAAS,2BACd,aACA,cAA0C,mCAC1C,iBACgB;AAChB,QAAM,aAAa;AAAA,IACjB;AAAA,IACA;AAAA,EACF;AACA,QAAM,qBAAqB;AAAA,IACzB,GAAG,WAAW;AAAA,IACd,QAAQ;AAAA,IACR,MAAM;AAAA,EACR;AACA,SAAO;AAAA,IACL,GAAG,mBAAmB,OAAO,WAAW;AAAA,IACxC,GAAG,mBAAmB,MAAM,WAAW;AAAA,IACvC,OAAO,KAAK;AAAA,MACV,WAAW;AAAA,MACX,YAAY,QACV,mBAAmB,OACnB,mBAAmB,QACnB,WAAW,iBAAiB;AAAA,IAChC;AAAA,IACA,QAAQ,KAAK;AAAA,MACX,WAAW;AAAA,MACX,YAAY,SACV,mBAAmB,MACnB,mBAAmB,SACnB,WAAW,iBAAiB;AAAA,IAChC;AAAA,EACF;AACF;AAEO,SAAS,qBACd,YACA,aACA,cAA0C,mCAC1C,iBACuB;AACvB,QAAM,aAAa;AAAA,IACjB;AAAA,IACA;AAAA,EACF;AACA,QAAM,OAAO,2BAA2B,aAAa,UAAU;AAC/D,QAAM,gBAAgB,CAAC,SACrB,mBAAmB,MAAM,aAAa,UAAU;AAClD,MAAI,eAAe,QAAQ;AACzB,WAAO,cAAc,EAAE,GAAG,MAAM,OAAO,KAAK,MAAM,KAAK,QAAQ,CAAC,EAAE,CAAC;AAAA,EACrE;AACA,MAAI,eAAe,SAAS;AAC1B,UAAM,QAAQ,KAAK,MAAM,KAAK,QAAQ,CAAC;AACvC,WAAO,cAAc,EAAE,GAAG,MAAM,GAAG,KAAK,IAAI,KAAK,QAAQ,OAAO,MAAM,CAAC;AAAA,EACzE;AACA,MAAI,eAAe,OAAO;AACxB,WAAO,cAAc,IAAI;AAAA,EAC3B;AACA,SAAO;AACT;AAEO,SAAS,4BACd,QACA,aACA,cAA0C,mCAC1C,iBACgB;AAChB,QAAM,aAAa;AAAA,IACjB;AAAA,IACA;AAAA,EACF;AACA,QAAM,OAAO,2BAA2B,aAAa,UAAU;AAC/D,QAAM,uBAAuB,CAAC,SAC5B,mBAAmB,MAAM,aAAa,UAAU;AAElD,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO,qBAAqB;AAAA,QAC1B,GAAG;AAAA,QACH,OAAO,KAAK,MAAM,KAAK,QAAQ,CAAC;AAAA,MAClC,CAAC;AAAA,IACH,KAAK,SAAS;AACZ,YAAM,QAAQ,KAAK,MAAM,KAAK,QAAQ,CAAC;AACvC,aAAO,qBAAqB;AAAA,QAC1B,GAAG;AAAA,QACH,GAAG,KAAK,IAAI,KAAK,QAAQ;AAAA,QACzB;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,KAAK;AACH,aAAO,qBAAqB;AAAA,QAC1B,GAAG;AAAA,QACH,QAAQ,KAAK,MAAM,KAAK,SAAS,CAAC;AAAA,MACpC,CAAC;AAAA,IACH,KAAK,UAAU;AACb,YAAM,SAAS,KAAK,MAAM,KAAK,SAAS,CAAC;AACzC,aAAO,qBAAqB;AAAA,QAC1B,GAAG;AAAA,QACH,GAAG,KAAK,IAAI,KAAK,SAAS;AAAA,QAC1B;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,SAAS,gCACP,cAA0C,mCAC1C,iBAC4B;AAC5B,QAAM,aAAa,oCAAoC,WAAW;AAClE,SAAO;AAAA,IACL,GAAG;AAAA,IACH,WAAW,KAAK;AAAA,MACd,WAAW;AAAA,MACX,qBAAqB,iBAAiB,SAAS;AAAA,IACjD;AAAA,IACA,UAAU,KAAK;AAAA,MACb,WAAW;AAAA,MACX,qBAAqB,iBAAiB,QAAQ;AAAA,IAChD;AAAA,EACF;AACF;AAEA,SAAS,qBAAqB,OAAmC;AAC/D,SAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,KAAK,QAAQ,IAClE,QACA;AACN;AAEO,SAAS,+BACd,WACA,QACA,aACA,cAA0C,mCACjB;AACzB,MAAI,aAAa,GAAG;AAClB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,aAAa,oCAAoC,WAAW;AAClE,QAAM,QAAQ,2BAA2B,aAAa,UAAU;AAChE,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aAAO,wBAAwB,WAAW,OAAO,UAAU;AAAA,IAC7D,KAAK;AACH,aAAO,oBAAoB,WAAW,WAAW,OAAO,UAAU;AAAA,IACpE,KAAK;AACH,aAAO,4BAA4B,WAAW,OAAO,UAAU;AAAA,EACnE;AACF;AAEA,SAAS,2BACP,aACA,cAA0C,mCAC1B;AAChB,QAAM,aAAa,oCAAoC,WAAW;AAClE,QAAM,QAAQ,wBAAwB,aAAa,UAAU;AAC7D,SAAO;AAAA,IACL,GAAG,MAAM,IAAI,WAAW;AAAA,IACxB,GAAG,MAAM,IAAI,WAAW;AAAA,IACxB,OAAO,KAAK;AAAA,MACV,WAAW;AAAA,MACX,MAAM,QAAQ,WAAW,iBAAiB;AAAA,IAC5C;AAAA,IACA,QAAQ,KAAK;AAAA,MACX,WAAW;AAAA,MACX,MAAM,SAAS,WAAW,iBAAiB;AAAA,IAC7C;AAAA,EACF;AACF;AAEO,SAAS,yBACd,WACA,aACA,YAAY,GACZ,cAA0C,mCACrB;AACrB,QAAM,QAAQ,wBAAwB,aAAa,WAAW;AAC9D,QAAM,kBAAkB,MAAM,IAAI;AAClC,MACE,UAAU,IAAI,mBACb,oBAAoB,KAAK,UAAU,KAAK,GACzC;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,SAAS,WACd,MACA,OACS;AACT,SACE,KAAK,MAAM,MAAM,KACjB,KAAK,MAAM,MAAM,KACjB,KAAK,UAAU,MAAM,SACrB,KAAK,WAAW,MAAM;AAE1B;AAEA,SAAS,MAAM,OAAe,KAAa,KAAqB;AAC9D,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,CAAC;AAC3C;AAEA,SAAS,oBACP,WACA,SACA,OACA,aACyB;AACzB,QAAM,OAAO,KAAK,KAAK,YAAY,OAAO;AAC1C,QAAM,gBACJ,iCAAiC,KAAK,IAAI,GAAG,UAAU,CAAC;AAC1D,QAAM,cAAc,iCAAiC,KAAK,IAAI,GAAG,OAAO,CAAC;AACzE,QAAM,YAAY,KAAK,OAAO,MAAM,QAAQ,iBAAiB,OAAO;AACpE,QAAM,aAAa,KAAK,OAAO,MAAM,SAAS,eAAe,IAAI;AAEjE,MAAI,YAAY,YAAY,YAAY,aAAa,YAAY,WAAW;AAC1E,WAAO;AAAA,EACT;AAEA,QAAM,gBACJ,OAAO,cAAc,OAAO,KAAK;AACnC,MAAI,QAAQ;AACZ,QAAM,SAA2B,CAAC;AAElC,WAAS,WAAW,GAAG,WAAW,MAAM,YAAY,GAAG;AACrD,UAAM,YAAY,YAAY;AAC9B,UAAM,aAAa,KAAK,IAAI,SAAS,SAAS;AAC9C,UAAM,WACJ,aAAa,YACb,KAAK,IAAI,GAAG,aAAa,CAAC,IAAI;AAChC,UAAM,OAAO,MAAM,IAAI,KAAK,OAAO,MAAM,QAAQ,YAAY,CAAC;AAC9D,UAAM,OACJ,MAAM,IACN,KAAK,OAAO,MAAM,SAAS,iBAAiB,CAAC,IAC7C,YAAY,aAAa;AAE3B,aAAS,cAAc,GAAG,cAAc,YAAY,eAAe,GAAG;AACpE,aAAO,KAAK;AAAA,QACV,GAAG,OAAO,eAAe,YAAY;AAAA,QACrC,GAAG;AAAA,QACH,OAAO;AAAA,QACP,QAAQ;AAAA,MACV,CAAC;AACD,eAAS;AAAA,IACX;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,wBACP,WACA,OACA,aACyB;AACzB,MAAI,cAAc,GAAG;AACnB,WAAO,CAAC,KAAK;AAAA,EACf;AAEA,MAAI,cAAc,GAAG;AACnB,WAAO,oBAAoB,WAAW,GAAG,OAAO,WAAW;AAAA,EAC7D;AAEA,MAAI,aAAa,GAAG;AAClB,WAAO,gCAAgC,WAAW,OAAO,WAAW;AAAA,EACtE;AAEA,QAAM,MAAM;AACZ,QAAM,eAAe,KAAK,OAAO,MAAM,QAAQ,OAAO,IAAI;AAC1D,QAAM,iBAAiB,MAAM,QAAQ,MAAM;AAE3C,MACE,eAAe,YAAY,YAC3B,iBAAiB,YAAY,UAC7B;AACA,WAAO;AAAA,EACT;AAEA,QAAM,iBAAiB,YAAY;AACnC,QAAM,cACJ,iCAAiC,KAAK,IAAI,GAAG,iBAAiB,CAAC;AACjE,QAAM,kBAAkB,KAAK;AAAA,KAC1B,MAAM,SAAS,eAAe;AAAA,EACjC;AAEA,MAAI,kBAAkB,YAAY,WAAW;AAC3C,WAAO;AAAA,EACT;AAEA,QAAM,SAA2B;AAAA,IAC/B;AAAA,MACE,GAAG,MAAM;AAAA,MACT,GAAG,MAAM;AAAA,MACT,OAAO;AAAA,MACP,QAAQ,MAAM;AAAA,IAChB;AAAA,EACF;AAEA,QAAM,aAAa,MAAM,IAAI,eAAe;AAC5C,WAAS,QAAQ,GAAG,QAAQ,gBAAgB,SAAS,GAAG;AACtD,WAAO,KAAK;AAAA,MACV,GAAG;AAAA,MACH,GAAG,MAAM,IAAI,SAAS,kBAAkB;AAAA,MACxC,OAAO;AAAA,MACP,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,gCACP,WACA,OACA,aACyB;AACzB,MAAI,OAKO;AAEX,WAAS,UAAU,GAAG,WAAW,WAAW,WAAW,GAAG;AACxD,UAAM,OAAO,KAAK,KAAK,YAAY,OAAO;AAC1C,UAAM,SAAS,oBAAoB,WAAW,SAAS,OAAO,WAAW;AACzE,QAAI,CAAC,QAAQ;AACX;AAAA,IACF;AAEA,UAAM,YAAY;AAAA,MAChB;AAAA,MACA,YAAY,OAAO,UAAU;AAAA,MAC7B;AAAA,MACA,eAAe,KAAK,IAAI,UAAU,IAAI;AAAA,IACxC;AAEA,QACE,CAAC,QACD,UAAU,gBAAgB,KAAK,iBAC9B,UAAU,kBAAkB,KAAK,iBAChC,UAAU,aAAa,KAAK,cAC7B,UAAU,kBAAkB,KAAK,iBAChC,UAAU,eAAe,KAAK,cAC9B,UAAU,UAAU,KAAK,SAC3B;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO,MAAM,UAAU;AACzB;AAEA,SAAS,4BACP,WACA,OACA,aACyB;AACzB,QAAM,cACJ,iCAAiC,KAAK,IAAI,GAAG,YAAY,CAAC;AAC5D,QAAM,aAAa,KAAK,OAAO,MAAM,SAAS,eAAe,SAAS;AAEtE,MAAI,aAAa,YAAY,WAAW;AACtC,WAAO;AAAA,EACT;AAEA,QAAM,SAA2B,CAAC;AAClC,WAAS,QAAQ,GAAG,QAAQ,WAAW,SAAS,GAAG;AACjD,WAAO,KAAK;AAAA,MACV,GAAG,MAAM;AAAA,MACT,GAAG,MAAM,IAAI,SAAS,aAAa;AAAA,MACnC,OAAO,MAAM;AAAA,MACb,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AAEA,SAAO;AACT;;;ACzhBO,SAAS,wBACd,OACA,OACU;AACV,QAAM,UAAU,IAAI,IAAI,MAAM,IAAI,CAAC,SAAS,KAAK,EAAE,CAAC;AACpD,QAAM,aAAa,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,EAAE,OAAO,CAAC,OAAO,QAAQ,IAAI,EAAE,CAAC;AAE5E,aAAW,QAAQ,OAAO;AACxB,QAAI,CAAC,WAAW,SAAS,KAAK,EAAE,GAAG;AACjC,iBAAW,KAAK,KAAK,EAAE;AAAA,IACzB;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,oBACd,OACA,QACU;AACV,SAAO,CAAC,GAAG,MAAM,OAAO,CAAC,OAAO,OAAO,MAAM,GAAG,MAAM;AACxD;AAEO,SAAS,yBACd,OACA,QACU;AACV,SAAO,MAAM,OAAO,CAAC,OAAO,OAAO,MAAM;AAC3C;;;ACNO,SAAS,4BACd,UAA0C,CAAC,GACpB;AACvB,QAAM,QAAQ,QAAQ,SAAS,CAAC;AAChC,SAAO;AAAA,IACL;AAAA,IACA,WAAW,wBAAwB,OAAO,QAAQ,aAAa,CAAC,CAAC;AAAA,IACjE,kBAAkB,QAAQ,oBAAoB;AAAA,IAC9C,oBAAoB,QAAQ,sBAAsB;AAAA,IAClD,kBAAkB,QAAQ,oBAAoB;AAAA,IAC9C,aAAa,QAAQ,eAAe;AAAA,IACpC,mBAAmB;AAAA,MACjB,QAAQ,qBAAqB;AAAA,IAC/B;AAAA,EACF;AACF;AAEO,SAAS,qBACd,OACA,QACuB;AACvB,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK,gBAAgB;AACnB,YAAM,YAAY,4BAA4B;AAAA,QAC5C,GAAG;AAAA,QACH,GAAG,OAAO;AAAA,MACZ,CAAC;AACD,UACE,MAAM,UAAU,UAAU,SAC1B,MAAM,cAAc,UAAU,aAC9B,MAAM,qBAAqB,UAAU,oBACrC,MAAM,uBAAuB,UAAU,sBACvC,MAAM,qBAAqB,UAAU,oBACrC,MAAM,gBAAgB,UAAU,eAChC;AAAA,QACE,MAAM;AAAA,QACN,UAAU;AAAA,MACZ,GACA;AACA,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AAAA,IAEA,KAAK,gBAAgB;AACnB,YAAM,YAAY,wBAAwB,OAAO,OAAO,MAAM,SAAS;AACvE,UAAI,MAAM,UAAU,OAAO,SAAS,MAAM,cAAc,WAAW;AACjE,eAAO;AAAA,MACT;AACA,aAAO,EAAE,GAAG,OAAO,OAAO,OAAO,OAAO,UAAU;AAAA,IACpD;AAAA,IAEA,KAAK,YAAY;AACf,YAAM,WAAW,MAAM,MAAM,KAAK,CAAC,SAAS,KAAK,OAAO,OAAO,KAAK,EAAE;AACtE,YAAM,QAAQ,WACV,MAAM,MAAM;AAAA,QAAI,CAAC,SACf,KAAK,OAAO,OAAO,KAAK,KAAK,OAAO,OAAO;AAAA,MAC7C,IACA,CAAC,GAAG,MAAM,OAAO,OAAO,IAAI;AAChC,aAAO;AAAA,QACL,GAAG;AAAA,QACH;AAAA,QACA,WAAW;AAAA,UACT,wBAAwB,OAAO,MAAM,SAAS;AAAA,UAC9C,OAAO,KAAK;AAAA,QACd;AAAA,MACF;AAAA,IACF;AAAA,IAEA,KAAK;AACH,UAAI,CAAC,MAAM,MAAM,KAAK,CAAC,SAAS,KAAK,OAAO,OAAO,MAAM,GAAG;AAC1D,eAAO;AAAA,MACT;AACA,aAAO;AAAA,QACL,GAAG;AAAA,QACH,OAAO,MAAM,MAAM,OAAO,CAAC,SAAS,KAAK,OAAO,OAAO,MAAM;AAAA,QAC7D,WAAW,yBAAyB,MAAM,WAAW,OAAO,MAAM;AAAA,MACpE;AAAA,IAEF,KAAK;AACH,UAAI,CAAC,MAAM,MAAM,KAAK,CAAC,SAAS,KAAK,OAAO,OAAO,MAAM,GAAG;AAC1D,eAAO;AAAA,MACT;AACA,aAAO;AAAA,QACL,GAAG;AAAA,QACH,OAAO,MAAM,MAAM;AAAA,UAAI,CAAC,SACtB,KAAK,OAAO,OAAO,SACf,EAAE,GAAG,MAAM,aAAa,OAAO,mBAAmB,KAAK,IACvD;AAAA,QACN;AAAA,QACA,WAAW,oBAAoB,MAAM,WAAW,OAAO,MAAM;AAAA,MAC/D;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QAAW;AAAA,QAAO,OAAO;AAAA,QAAQ,CAAC,SACvC,KAAK,cACD,OACA;AAAA,UACE,GAAG;AAAA,UACH,aAAa;AAAA,UACb,mBAAmB,KAAK,IAAI;AAAA,QAC9B;AAAA,MACN;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QAAW;AAAA,QAAO,OAAO;AAAA,QAAQ,CAAC,SACvC,KAAK,cACD,EAAE,GAAG,MAAM,aAAa,OAAO,mBAAmB,KAAK,IACvD;AAAA,MACN;AAAA,IAEF,KAAK;AACH,aAAO,WAAW,OAAO,OAAO,QAAQ,CAAC,SAAS;AAChD,YAAI,KAAK,gBAAgB,cAAc;AACrC,iBAAO;AAAA,QACT;AACA,eAAO;AAAA,UACL,GAAG;AAAA,UACH,aAAa;AAAA,UACb,cAAc,KAAK;AAAA,UACnB,aAAa;AAAA,UACb,mBAAmB;AAAA,UACnB,OAAO;AAAA,YACL,MAAM;AAAA,YACN,MAAM;AAAA,YACN,KAAK;AAAA,UACP;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IAEH,KAAK;AACH,aAAO,WAAW,OAAO,OAAO,QAAQ,CAAC,SAAS;AAChD,YAAI,KAAK,gBAAgB,cAAc;AACrC,iBAAO;AAAA,QACT;AACA,eAAO;AAAA,UACL,GAAG;AAAA,UACH,aAAa;AAAA,UACb,OAAO,KAAK,gBAAgB,KAAK;AAAA,UACjC,cAAc;AAAA,QAChB;AAAA,MACF,CAAC;AAAA,IAEH,KAAK;AACH,aAAO,WAAW,OAAO,OAAO,QAAQ,CAAC,SAAS;AAChD,cAAM,QAAQ;AAAA,UACZ,OAAO;AAAA,UACP,MAAM;AAAA,UACN,MAAM;AAAA,UACN,KAAK;AAAA,QACP;AACA,YACE,KAAK,gBAAgB,cACrB,CAAC,KAAK,eACN,KAAK,iBAAiB,QACtB,WAAW,KAAK,OAAO,KAAK,GAC5B;AACA,iBAAO;AAAA,QACT;AACA,eAAO;AAAA,UACL,GAAG;AAAA,UACH;AAAA,UACA,aAAa;AAAA,UACb,cAAc;AAAA,UACd,aAAa;AAAA,UACb,mBAAmB;AAAA,QACrB;AAAA,MACF,CAAC;AAAA,IAEH,KAAK,qBAAqB;AACxB,YAAM,UAAU,mBAAmB,MAAM,OAAO,OAAO,OAAO;AAC9D,UAAI,QAAQ,WAAW,GAAG;AACxB,eAAO;AAAA,MACT;AAEA,YAAM,SAAS;AAAA,QACb,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AACA,UAAI,CAAC,QAAQ;AACX,eAAO;AAAA,MACT;AAEA,YAAM,gBAAgB,IAAI;AAAA,QACxB,QAAQ,IAAI,CAAC,QAAQ,UAAU,CAAC,QAAQ,OAAO,KAAK,CAAC,CAAU;AAAA,MACjE;AACA,YAAM,QAAgC,MAAM,MAAM,IAAI,CAAC,SAAS;AAC9D,cAAM,QAAQ,cAAc,IAAI,KAAK,EAAE;AACvC,YAAI,CAAC,OAAO;AACV,iBAAO;AAAA,QACT;AACA,cAAM,YAAY;AAAA,UAChB;AAAA,UACA,MAAM;AAAA,UACN,MAAM;AAAA,UACN,KAAK;AAAA,QACP;AACA,eAAO;AAAA,UACL,GAAG;AAAA,UACH,OAAO;AAAA,UACP,aAAa;AAAA,UACb,cAAc;AAAA,UACd,aAAa;AAAA,UACb,mBAAmB;AAAA,QACrB;AAAA,MACF,CAAC;AAED,UAAI,YAAY,MAAM;AACtB,iBAAW,UAAU,SAAS;AAC5B,oBAAY,oBAAoB,WAAW,MAAM;AAAA,MACnD;AAEA,aAAO,EAAE,GAAG,OAAO,OAAO,UAAU;AAAA,IACtC;AAAA,IAEA,KAAK;AAAA,IACL,KAAK;AACH,aAAO,WAAW,OAAO,OAAO,QAAQ,CAAC,SAAS;AAChD,cAAM,QAAQ;AAAA,UACZ,OAAO,SAAS,oBACZ,OAAO,aACP,MAAM;AAAA,UACV,MAAM;AAAA,UACN,MAAM;AAAA,UACN,KAAK;AAAA,QACP;AACA,YAAI,CAAC,OAAO;AACV,iBAAO;AAAA,QACT;AACA,YACE,KAAK,gBAAgB,cACrB,CAAC,KAAK,eACN,KAAK,iBAAiB,QACtB,WAAW,KAAK,OAAO,KAAK,GAC5B;AACA,iBAAO;AAAA,QACT;AACA,eAAO;AAAA,UACL,GAAG;AAAA,UACH;AAAA,UACA,aAAa;AAAA,UACb,cAAc;AAAA,UACd,aAAa;AAAA,UACb,mBAAmB;AAAA,QACrB;AAAA,MACF,CAAC;AAAA,IAEH,KAAK;AACH,aAAO,WAAW,OAAO,OAAO,QAAQ,CAAC,SAAS;AAChD,cAAM,QAAQ;AAAA,UACZ,OAAO;AAAA,UACP,MAAM;AAAA,UACN,MAAM;AAAA,UACN,KAAK;AAAA,QACP;AACA,YAAI,WAAW,KAAK,OAAO,KAAK,GAAG;AACjC,iBAAO;AAAA,QACT;AACA,eAAO;AAAA,UACL,GAAG;AAAA,UACH;AAAA,UACA,aAAa;AAAA,UACb,cACE,KAAK,gBAAgB,eAAe,KAAK,eAAe;AAAA,QAC5D;AAAA,MACF,CAAC;AAAA,IAEH,KAAK;AAAA,IACL,KAAK;AACH,aAAO,WAAW,OAAO,OAAO,QAAQ,CAAC,SAAS;AAChD,cAAM,QAAQ;AAAA,UACZ,OAAO;AAAA,UACP,MAAM;AAAA,UACN,MAAM;AAAA,UACN,KAAK;AAAA,QACP;AACA,YAAI,WAAW,KAAK,OAAO,KAAK,GAAG;AACjC,iBAAO;AAAA,QACT;AACA,eAAO;AAAA,UACL,GAAG;AAAA,UACH;AAAA,UACA,aAAa;AAAA,UACb,cACE,KAAK,gBAAgB,eAAe,KAAK,eAAe;AAAA,QAC5D;AAAA,MACF,CAAC;AAAA,IAEH,KAAK;AACH,UAAI,MAAM,qBAAqB,OAAO,QAAQ;AAC5C,eAAO;AAAA,MACT;AACA,aAAO,EAAE,GAAG,OAAO,kBAAkB,OAAO,OAAO;AAAA,IAErD,KAAK;AACH,UAAI,MAAM,uBAAuB,OAAO,QAAQ;AAC9C,eAAO;AAAA,MACT;AACA,aAAO,EAAE,GAAG,OAAO,oBAAoB,OAAO,OAAO;AAAA,IAEvD,KAAK;AACH,UAAI,MAAM,qBAAqB,OAAO,YAAY;AAChD,eAAO;AAAA,MACT;AACA,aAAO,EAAE,GAAG,OAAO,kBAAkB,OAAO,WAAW;AAAA,IAEzD,KAAK;AACH,UACE,MAAM,YAAY,UAAU,OAAO,KAAK,SACxC,MAAM,YAAY,WAAW,OAAO,KAAK,QACzC;AACA,eAAO;AAAA,MACT;AACA,aAAO;AAAA,QACL,GAAG;AAAA,QACH,aAAa,OAAO;AAAA,QACpB,OAAO,MAAM,MAAM;AAAA,UAAI,CAAC,SACtB,KAAK,gBAAgB,eACjB;AAAA,YACE,GAAG;AAAA,YACH,OAAO;AAAA,cACL,OAAO;AAAA,cACP,MAAM;AAAA,cACN,KAAK;AAAA,YACP;AAAA,UACF,IACA;AAAA,YACE,GAAG;AAAA,YACH,OAAO;AAAA,cACL,KAAK;AAAA,cACL,OAAO;AAAA,cACP,MAAM;AAAA,cACN;AAAA,cACA,KAAK;AAAA,YACP;AAAA,UACF;AAAA,QACN;AAAA,MACF;AAAA,IAEF,KAAK,wBAAwB;AAC3B,YAAM,cAAc,oCAAoC;AAAA,QACtD,GAAG,MAAM;AAAA,QACT,GAAG,OAAO;AAAA,QACV,UAAU;AAAA,UACR,GAAG,MAAM,kBAAkB;AAAA,UAC3B,GAAG,OAAO,YAAY;AAAA,QACxB;AAAA,MACF,CAAC;AACD,UACE,MAAM,kBAAkB,aAAa,YAAY,YACjD,MAAM,kBAAkB,cAAc,YAAY,aAClD,MAAM,kBAAkB,mBAAmB,YAAY,kBACvD,MAAM,kBAAkB,SAAS,QAAQ,YAAY,SAAS,OAC9D,MAAM,kBAAkB,SAAS,UAAU,YAAY,SAAS,SAChE,MAAM,kBAAkB,SAAS,WAC/B,YAAY,SAAS,UACvB,MAAM,kBAAkB,SAAS,SAAS,YAAY,SAAS,MAC/D;AACA,eAAO;AAAA,MACT;AACA,aAAO;AAAA,QACL,GAAG;AAAA,QACH,mBAAmB;AAAA,QACnB,OAAO,MAAM,MAAM;AAAA,UAAI,CAAC,SACtB,KAAK,gBAAgB,eACjB;AAAA,YACE,GAAG;AAAA,YACH,OAAO;AAAA,cACL,MAAM;AAAA,cACN;AAAA,cACA,KAAK;AAAA,YACP;AAAA,UACF,IACA;AAAA,YACE,GAAG;AAAA,YACH,OAAO;AAAA,cACL,KAAK;AAAA,cACL,MAAM;AAAA,cACN;AAAA,cACA;AAAA,cACA,KAAK;AAAA,YACP;AAAA,YACA,cAAc,KAAK,eACf;AAAA,cACE,KAAK;AAAA,cACL,MAAM;AAAA,cACN;AAAA,cACA;AAAA,cACA,KAAK;AAAA,YACP,IACA;AAAA,UACN;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAAA,IAEA,KAAK;AACH,aAAO,WAAW,OAAO,OAAO,QAAQ,CAAC,SAAS;AAChD,YACE,qBAAqB,KAAK,iBAAiB,OAAO,eAAe,GACjE;AACA,iBAAO;AAAA,QACT;AACA,cAAM,QACJ,KAAK,gBAAgB,eACjB;AAAA,UACE,MAAM;AAAA,UACN,MAAM;AAAA,UACN,OAAO;AAAA,QACT,IACA;AAAA,UACE,KAAK;AAAA,UACL,MAAM;AAAA,UACN,MAAM;AAAA,UACN;AAAA,UACA,OAAO;AAAA,QACT;AACN,cAAM,eAAe,KAAK,eACtB;AAAA,UACE,KAAK;AAAA,UACL,MAAM;AAAA,UACN,MAAM;AAAA,UACN;AAAA,UACA,OAAO;AAAA,QACT,IACA;AACJ,eAAO;AAAA,UACL,GAAG;AAAA,UACH;AAAA,UACA;AAAA,UACA,iBAAiB,OAAO;AAAA,QAC1B;AAAA,MACF,CAAC;AAAA,EACL;AACF;AAEA,SAAS,uBACP,MACA,OACS;AACT,SACE,KAAK,aAAa,MAAM,YACxB,KAAK,cAAc,MAAM,aACzB,KAAK,mBAAmB,MAAM,kBAC9B,KAAK,SAAS,QAAQ,MAAM,SAAS,OACrC,KAAK,SAAS,UAAU,MAAM,SAAS,SACvC,KAAK,SAAS,WAAW,MAAM,SAAS,UACxC,KAAK,SAAS,SAAS,MAAM,SAAS;AAE1C;AAEA,SAAS,qBACP,MACA,OACS;AACT,UACG,MAAM,YAAY,WAAW,OAAO,YAAY,UAChD,MAAM,aAAa,WAAW,OAAO,aAAa;AAEvD;AAEA,SAAS,WACP,OACA,QACA,QACuB;AACvB,MAAI,UAAU;AACd,QAAM,QAAQ,MAAM,MAAM,IAAI,CAAC,SAAS;AACtC,QAAI,KAAK,OAAO,QAAQ;AACtB,aAAO;AAAA,IACT;AAEA,UAAM,WAAW,OAAO,IAAI;AAC5B,cAAU,WAAW,aAAa;AAClC,WAAO;AAAA,EACT,CAAC;AAED,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA,WAAW,oBAAoB,MAAM,WAAW,MAAM;AAAA,EACxD;AACF;AAEA,SAAS,mBACP,OACA,SACU;AACV,QAAM,eAAe,IAAI,IAAI,MAAM,IAAI,CAAC,SAAS,KAAK,EAAE,CAAC;AACzD,QAAM,iBAA2B,CAAC;AAElC,aAAW,UAAU,SAAS;AAC5B,QAAI,CAAC,aAAa,IAAI,MAAM,KAAK,eAAe,SAAS,MAAM,GAAG;AAChE;AAAA,IACF;AACA,mBAAe,KAAK,MAAM;AAAA,EAC5B;AAEA,SAAO;AACT;;;AC/gBO,SAAS,iCAAiC;AAC/C,QAAM,YAAY,oBAAI,IAAuB;AAE7C,SAAO;AAAA,IACL,UAAU,UAAmD;AAC3D,gBAAU,IAAI,QAAQ;AACtB,aAAO,MAAM;AACX,kBAAU,OAAO,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,IACA,SAAe;AACb,iBAAW,YAAY,WAAW;AAChC,iBAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AACF;;;ACTO,SAAS,qBACd,eAA+C,CAAC,GAChD,UAA4D,CAAC,GACtC;AACvB,MAAI,QAAQ,4BAA4B,YAAY;AACpD,QAAM,gBAAgB,+BAA+B;AAErD,SAAO;AAAA,IACL,cAAc;AACZ,aAAO;AAAA,IACT;AAAA,IACA,UAAU,UAAU;AAClB,aAAO,cAAc,UAAU,QAAQ;AAAA,IACzC;AAAA,IACA,SAAS,QAAgC;AACvC,YAAM,YAAY,qBAAqB,OAAO,MAAM;AACpD,UAAI,cAAc,OAAO;AACvB;AAAA,MACF;AAEA,+BAAyB,QAAQ,OAAO,WAAW,OAAO;AAC1D,cAAQ;AACR,oBAAc,OAAO;AAAA,IACvB;AAAA,EACF;AACF;AAEA,SAAS,yBACP,QACA,eACA,WACA,SACM;AACN,MAAI,CAAC,QAAQ,kBAAkB,UAAU,GAAG;AAC1C;AAAA,EACF;AAEA,QAAM,oBAAoB,IAAI;AAAA,IAC5B,cAAc,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,IAAI,CAAC;AAAA,EACnD;AACA,QAAM,UAAU,UAAU,MACvB,IAAI,CAAC,SAAS;AACb,UAAM,eAAe,kBAAkB,IAAI,KAAK,EAAE;AAClD,QAAI,CAAC,cAAc;AACjB,aAAO;AAAA,QACL,IAAI,KAAK;AAAA,QACT,MAAM;AAAA,QACN,WAAW,KAAK;AAAA,MAClB;AAAA,IACF;AACA,QACE,aAAa,MAAM,MAAM,KAAK,MAAM,KACpC,aAAa,MAAM,MAAM,KAAK,MAAM,KACpC,aAAa,MAAM,UAAU,KAAK,MAAM,SACxC,aAAa,MAAM,WAAW,KAAK,MAAM,QACzC;AACA,aAAO;AAAA,IACT;AACA,WAAO;AAAA,MACL,IAAI,KAAK;AAAA,MACT,MAAM;AAAA,MACN,WAAW,KAAK;AAAA,MAChB,eAAe,aAAa;AAAA,IAC9B;AAAA,EACF,CAAC,EACA,OAAO,CAAC,WAAiD,WAAW,IAAI;AAE3E,MAAI,QAAQ,WAAW,GAAG;AACxB;AAAA,EACF;AAEA,UAAQ,KAAK,qBAAqB;AAAA,IAChC,QAAQ,yBAAyB,MAAM;AAAA,IACvC;AAAA,IACA,iBAAiB,UAAU;AAAA,IAC3B,qBAAqB,cAAc;AAAA,EACrC,CAAC;AACD,OAAK,QAAQ;AAAA,IACX,QAAQ,iBAAiB,MAAM;AAAA,MAC7B,SAAS;AAAA,QACP,QAAQ,yBAAyB,MAAM;AAAA,QACvC;AAAA,QACA,iBAAiB,UAAU;AAAA,QAC3B,qBAAqB,cAAc;AAAA,MACrC;AAAA,MACA,OAAO;AAAA,MACP,OAAO;AAAA,MACP,QAAQ;AAAA,IACV,CAAC;AAAA,EACH,EAAE,MAAM,MAAM,MAAS;AACzB;AAEA,SAAS,yBACP,QACyB;AACzB,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aAAO;AAAA,QACL,MAAM,OAAO;AAAA,QACb,WAAW,OAAO,MAAM,OAAO;AAAA,QAC/B,WAAW,OAAO,MAAM;AAAA,QACxB,aAAa,OAAO,MAAM;AAAA,MAC5B;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM,OAAO;AAAA,QACb,SAAS,OAAO,MAAM,IAAI,CAAC,SAAS,KAAK,EAAE;AAAA,MAC7C;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM,OAAO;AAAA,QACb,OAAO,OAAO,KAAK;AAAA,QACnB,QAAQ,OAAO,KAAK;AAAA,MACtB;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,QACL,MAAM,OAAO;AAAA,QACb,OAAO,OAAO;AAAA,QACd,QAAQ,OAAO;AAAA,MACjB;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM,OAAO;AAAA,QACb,MAAM,OAAO;AAAA,MACf;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM,OAAO;AAAA,QACb,aAAa,OAAO;AAAA,MACtB;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM,OAAO;AAAA,QACb,QAAQ,OAAO;AAAA,QACf,QAAQ,OAAO;AAAA,MACjB;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM,OAAO;AAAA,QACb,SAAS,OAAO;AAAA,QAChB,QAAQ,OAAO;AAAA,MACjB;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM,OAAO;AAAA,QACb,QAAQ,OAAO;AAAA,QACf,YAAY,OAAO;AAAA,MACrB;AAAA,IACF;AACE,aAAO,YAAY,SACf,EAAE,MAAM,OAAO,MAAM,QAAQ,OAAO,OAAO,IAC3C,EAAE,MAAM,OAAO,KAAK;AAAA,EAC5B;AACF;;;AC5JO,SAAS,0BACd,eAA+C,CAAC,GAChD,UAA4D,CAAC,GACjC;AAC5B,QAAM,QAAQ,qBAAqB,cAAc,OAAO;AAExD,SAAO;AAAA,IACL,GAAG;AAAA,IACH,UAAU,wBAAwB,KAAK;AAAA,EACzC;AACF;;;AClBA,SAAS,WAAAA,gBAAe;;;ACAxB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;;;ACXA,SAAS,4CACd,eACS;AACT,SAAO,gBAAgB;AACzB;AAEO,SAAS,0DACd,eACA,iBACS;AACT,SAAO,iBAAiB,KAAK,CAAC;AAChC;AAEO,SAAS,8CACd,eACA,QACS;AACT,MAAI,kBAAkB,GAAG;AACvB,WAAO,OAAO,SAAS;AAAA,EACzB;AAEA,MAAI,iBAAiB,GAAG;AACtB,WAAO,OAAO,SAAS;AAAA,EACzB;AAEA,SAAO;AACT;;;ADOI;AANG,SAAS,gCAAgC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AACF,GAAyC;AACvC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW;AAAA,MACX,WAAW,CAAC,sCAAsC,SAAS,EACxD,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,MACX,cAAY;AAAA,MACZ,iBAAiB,CAAC,UAA2C;AAC3D,YACE,UAAU,aACV,MAAM,WAAW,MAAM,iBACvB,MAAM,iBAAiB,WACvB;AACA;AAAA,QACF;AACA,mCAA2B;AAAA,MAC7B;AAAA;AAAA,EACF;AAEJ;AAQO,SAAS,+BAA+B;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AACF,GAAwC;AACtC,QAAM,uBAAuB,OAA8B,IAAI;AAC/D,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAAwB,IAAI;AAC1E,QAAM,gBAKD;AAAA,IACH;AAAA,MACE,MAAM;AAAA,MACN,KAAK;AAAA,MACL,OAAO,KAAK,EAAE,kBAAkB;AAAA,MAChC,QAAQ,EAAE,MAAM,WAAW;AAAA,IAC7B;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,KAAK;AAAA,MACL,OAAO,KAAK,EAAE,aAAa;AAAA,MAC3B,QAAQ,EAAE,MAAM,MAAM;AAAA,IACxB;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,KAAK;AAAA,MACL,OAAO,KAAK,EAAE,gBAAgB;AAAA,MAC9B,QAAQ,EAAE,MAAM,SAAS;AAAA,IAC3B;AAAA,EACF,EAAE;AAAA,IAAO,CAAC,WACR;AAAA,MACE,MAAM;AAAA,MACN,OAAO;AAAA,IACT;AAAA,EACF;AACA,QAAM,0BAA0B;AAAA,IAC9B,MAAM;AAAA,EACR;AACA,QAAM,wBAAwB,cAAc;AAAA,IAAK,CAAC,WAChD,MAAM,aAAa,OAAO,MAAM;AAAA,EAClC;AACA,QAAM,+BACJ;AAAA,IACE,MAAM;AAAA,IACN;AAAA,EACF;AAEF,kBAAgB,MAAM;AACpB,UAAM,UAAU,qBAAqB;AACrC,QAAI,CAAC,SAAS;AACZ;AAAA,IACF;AACA,UAAM,gBAAgB,OAAO,iBAAiB,QAAQ,aAAc;AACpE,UAAM,mBACJ,OAAO,WAAW,cAAc,WAAW,IAC3C,OAAO,WAAW,cAAc,YAAY,IAC5C,OAAO,WAAW,cAAc,eAAe,IAC/C,OAAO,WAAW,cAAc,gBAAgB;AAClD,uBAAmB,QAAQ,cAAc,gBAAgB;AAAA,EAC3D,GAAG;AAAA,IACD;AAAA,IACA,cAAc;AAAA,IACd;AAAA,IACA;AAAA,IACA,MAAM;AAAA,EACR,CAAC;AAED,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,cAAY;AAAA,MAEX,gBAAM,SAAS,WACd,oBAAC,SAAI,WAAU,yHACb;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,OACE,oBAAoB,OAAO,SAAY,EAAE,OAAO,gBAAgB;AAAA,UAElE,SAAS,CAAC,UAAU,MAAM,gBAAgB;AAAA,UAE1C;AAAA,YAAC;AAAA;AAAA,cACC,KAAK;AAAA,cACL,WAAU;AAAA,cAET,oCACC,oBAAC,UAAK,WAAU,0CACb,eAAK,EAAE,qBAAqB,GAC/B,IACE,+BACF,oBAAC,UAAK,WAAU,0CACb,eAAK,EAAE,mBAAmB,GAC7B,IAEA,oBAAC,SAAI,WAAU,wBACZ,wBAAc,IAAI,CAAC,WAAW;AAC7B,sBAAM,WAAW,MAAM,eAAe,OAAO,MAAM;AACnD,sBAAM,aAAa,OAAO;AAE1B,uBACE;AAAA,kBAAC;AAAA;AAAA,oBAEC,cAAY,OAAO;AAAA,oBACnB,WAAU;AAAA,oBACV,mBAAiB,OAAO;AAAA,oBACxB,UAAU,CAAC;AAAA,oBACX,MAAK;AAAA,oBACL,OAAO,OAAO;AAAA,oBACd,MAAK;AAAA,oBACL,SAAQ;AAAA,oBACR,SAAS,MAAM,MAAM,YAAY,OAAO,MAAM;AAAA,oBAE9C;AAAA,sBAAC;AAAA;AAAA,wBACC,eAAW;AAAA,wBACX,WAAU;AAAA;AAAA,oBACZ;AAAA;AAAA,kBAdK,OAAO;AAAA,gBAed;AAAA,cAEJ,CAAC,GACH;AAAA;AAAA,UAEJ;AAAA;AAAA,MACF,GACF,IACE;AAAA;AAAA,EACN;AAEJ;;;AE9LA,SAAS,aAAa,mBAAAC,kBAAiB,UAAAC,SAAQ,YAAAC,iBAAgB;AAexD,SAAS,mCACd,OACiC;AACjC,QAAM,CAAC,eAAe,gBAAgB,IACpCA,UAA8C,KAAK;AACrD,QAAM,CAAC,OAAO,QAAQ,IAAIA;AAAA,IACxB,QAAQ,SAAS;AAAA,EACnB;AACA,QAAM,WAAWD;AAAA,IACf,QAAQ,SAAS;AAAA,EACnB;AACA,QAAM,gBAAgBA,QAAsB,IAAI;AAChD,QAAM,mBAAmB;AAAA,IACvB,CAAC,cAA4C;AAC3C,eAAS,UAAU;AACnB,eAAS,SAAS;AAAA,IACpB;AAAA,IACA,CAAC;AAAA,EACH;AACA,QAAM,yBAAyB,YAAY,MAAM;AAC/C,QAAI,SAAS,YAAY,WAAW;AAClC;AAAA,IACF;AACA,qBAAiB,IAAI;AACrB,qBAAiB,QAAQ;AAAA,EAC3B,GAAG,CAAC,gBAAgB,CAAC;AAErB,EAAAD,iBAAgB,MAAM;AACpB,QAAI,cAAc,YAAY,MAAM;AAClC,aAAO,qBAAqB,cAAc,OAAO;AACjD,oBAAc,UAAU;AAAA,IAC1B;AAEA,QAAI,OAAO;AACT,uBAAiB,KAAK;AACtB,UAAI,SAAS,YAAY,YAAY,SAAS,YAAY,WAAW;AACnE,yBAAiB,UAAU;AAAA,MAC7B;AACA,oBAAc,UAAU,OAAO,sBAAsB,MAAM;AACzD,yBAAiB,MAAM;AACvB,sBAAc,UAAU;AAAA,MAC1B,CAAC;AAED,aAAO,MAAM;AACX,YAAI,cAAc,YAAY,MAAM;AAClC,iBAAO,qBAAqB,cAAc,OAAO;AACjD,wBAAc,UAAU;AAAA,QAC1B;AAAA,MACF;AAAA,IACF;AAEA,QAAI,kBAAkB,MAAM;AAC1B,uBAAiB,QAAQ;AACzB,aAAO;AAAA,IACT;AAEA,qBAAiB,SAAS;AAC1B,WAAO;AAAA,EACT,GAAG,CAAC,eAAe,kBAAkB,KAAK,CAAC;AAE3C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,OAAO;AAAA,EACT;AACF;;;AChFA,SAAS,eAAAG,cAAa,WAAW,SAAS,YAAAC,iBAAgB;AAC1D;AAAA,EACE;AAAA,OAEK;;;ACFA,IAAM,mCAAmC;AAOzC,SAAS,qCACd,OACwB;AACxB,SAAO,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,MAAM,UAAU;AACtC,UAAM,WAAW,KAAK,MAAM,IAAI,MAAM,MAAM;AAC5C,QAAI,KAAK,IAAI,QAAQ,IAAI,IAAI;AAC3B,aAAO;AAAA,IACT;AAEA,UAAM,YAAY,KAAK,MAAM,IAAI,MAAM,MAAM;AAC7C,QAAI,cAAc,GAAG;AACnB,aAAO;AAAA,IACT;AAEA,WAAO,KAAK,GAAG,cAAc,MAAM,EAAE;AAAA,EACvC,CAAC;AACH;AAEO,SAAS,4CAAmD,OAIb;AACpD,QAAM,QAAQ,qCAAqC,MAAM,KAAK;AAC9D,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,MAAM,MAAM,OAAO;AACzB,QAAM,YAAY,MAAM;AACxB,QAAM,QAAQ,wBAAwB,OAAO,WAAW,GAAG;AAC3D,MAAI,SAAS,GAAG;AACd,WAAO,CAAC;AAAA,EACV;AACA,QAAM,OAAO,kBAAkB,OAAO,UAAU,OAAO,KAAK,KAAK;AACjE,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,cACJ,KAAK,OAAO,CAAC,KAAK,QAAQ,MAAM,IAAI,QAAQ,CAAC,IAC7C,KAAK,IAAI,GAAG,KAAK,SAAS,CAAC,IAAI;AACjC,QAAM,SAAS,UAAU,KAAK,UAAU,SAAS,eAAe;AAChE,QAAM,SAA4D,CAAC;AACnE,MAAI,UAAU;AAEd,OAAK,QAAQ,CAAC,QAAQ;AACpB,QAAI,UAAU,UAAU,KAAK,UAAU,QAAQ,IAAI,SAAS;AAE5D,QAAI,MAAM,QAAQ,CAAC,SAAS;AAC1B,aAAO,KAAK;AAAA,QACV,OAAO;AAAA,UACL,GAAG;AAAA,UACH,GAAG,WAAW,IAAI,SAAS,KAAK,UAAU;AAAA,UAC1C,OAAO,KAAK;AAAA,UACZ,QAAQ,KAAK;AAAA,QACf;AAAA,QACA,MAAM,KAAK;AAAA,MACb,CAAC;AACD,iBAAW,KAAK,QAAQ;AAAA,IAC1B,CAAC;AAED,eAAW,IAAI,SAAS;AAAA,EAC1B,CAAC;AAED,SAAO;AACT;AAEA,SAAS,wBACP,OACA,WACA,KACQ;AACR,MAAI,UAAU,SAAS,KAAK,UAAU,UAAU,GAAG;AACjD,WAAO;AAAA,EACT;AAEA,MAAI,aAAa;AACjB,MAAI,aAAa;AAEjB,SACE;AAAA,IACE;AAAA,IACA,UAAU;AAAA,IACV,UAAU;AAAA,IACV;AAAA,IACA;AAAA,EACF,GACA;AACA,iBAAa;AACb,kBAAc;AAEd,QAAI,aAAa,IAAI;AACnB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,WAAS,YAAY,GAAG,YAAY,IAAI,aAAa,GAAG;AACtD,UAAM,QAAQ,aAAa,cAAc;AAEzC,QACE;AAAA,MACE;AAAA,MACA,UAAU;AAAA,MACV,UAAU;AAAA,MACV;AAAA,MACA;AAAA,IACF,GACA;AACA,mBAAa;AAAA,IACf,OAAO;AACL,mBAAa;AAAA,IACf;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,yBACP,OACA,gBACA,iBACA,KACA,OACS;AACT,MAAI,SAAS,GAAG;AACd,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,kBAAkB,OAAO,gBAAgB,KAAK,KAAK;AAChE,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO;AAAA,EACT;AAEA,QAAM,cACJ,KAAK,OAAO,CAAC,KAAK,QAAQ,MAAM,IAAI,QAAQ,CAAC,IAC7C,KAAK,IAAI,GAAG,KAAK,SAAS,CAAC,IAAI;AACjC,SAAO,eAAe;AACxB;AAEA,SAAS,kBACP,OACA,gBACA,KACA,OAC2B;AAC3B,QAAM,OAAkC,CAAC;AACzC,MAAI,aAA6C;AAEjD,QAAM,mBAAmB,MAAM;AAC7B,QAAI,cAAc,WAAW,MAAM,SAAS,GAAG;AAC7C,WAAK,KAAK,UAAU;AAAA,IACtB;AAAA,EACF;AAEA,aAAW,QAAQ,OAAO;AACxB,UAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,KAAK;AAClD,UAAM,SAAS,KAAK,IAAI,GAAG,KAAK,MAAM,SAAS,KAAK;AAEpD,QAAI,QAAQ,gBAAgB;AAC1B,aAAO,CAAC;AAAA,IACV;AAEA,QAAI,CAAC,YAAY;AACf,mBAAa;AAAA,QACX;AAAA,QACA,OAAO,CAAC,EAAE,QAAQ,MAAM,MAAM,CAAC;AAAA,QAC/B;AAAA,MACF;AACA;AAAA,IACF;AAEA,UAAM,YAAY,WAAW,QAAQ,MAAM;AAC3C,QAAI,YAAY,gBAAgB;AAC9B,uBAAiB;AACjB,mBAAa;AAAA,QACX;AAAA,QACA,OAAO,CAAC,EAAE,QAAQ,MAAM,MAAM,CAAC;AAAA,QAC/B;AAAA,MACF;AACA;AAAA,IACF;AAEA,eAAW,MAAM,KAAK,EAAE,QAAQ,MAAM,MAAM,CAAC;AAC7C,eAAW,QAAQ;AACnB,eAAW,SAAS,KAAK,IAAI,WAAW,QAAQ,MAAM;AAAA,EACxD;AAEA,mBAAiB;AAEjB,SAAO;AACT;;;ADhLA,IAAM,8BAA8B;AACpC,IAAM,yBAAyB;AAC/B,IAAM,4BAA4B;AAClC,IAAM,uCACJ;AAAA,EACE,cAAc;AACZ,WAAO;AAAA,EACT;AAAA,EACA,YAAY;AACV,WAAO,MAAM;AAAA,IAAC;AAAA,EAChB;AACF;AAWK,SAAS,gCAAuC;AAAA,EACrD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKwC;AACtC,QAAM,WAAW,SAAS,QAAQ,YAAY;AAC9C,QAAM,WAAW;AAAA,IACf,WACI;AAAA,MACE,cAAc;AACZ,eAAO,QAAQ,YAAY;AAAA,MAC7B;AAAA,MACA,UAAU,UAAU;AAClB,eAAO,QAAQ,UAAU,QAAQ;AAAA,MACnC;AAAA,IACF,IACA;AAAA,EACN;AACA,QAAM,oBACJ,UAAU,qBAAqB;AACjC,QAAM,cACJ,UAAU,eAAe;AAC3B,QAAM,kBAAkB;AAAA,IACtB,MAAO,YAAY,SAAY,OAAO,IAAI,IAAI,OAAO;AAAA,IACrD,CAAC,OAAO;AAAA,EACV;AACA,QAAM,eAAe,QAAQ,MAAM;AACjC,UAAM,mBAAmB,UAAU,gBAAgB,CAAC;AACpD,QAAI,oBAAoB,MAAM;AAC5B,aAAO;AAAA,IACT;AACA,WAAO,iBAAiB,OAAO,CAAC,SAAS,gBAAgB,IAAI,KAAK,EAAE,CAAC;AAAA,EACvE,GAAG,CAAC,iBAAiB,UAAU,YAAY,CAAC;AAC5C,QAAM,CAAC,iBAAiB,kBAAkB,IAAIC,UAAmB,CAAC,CAAC;AAEnE,YAAU,MAAM;AACd,QAAI,SAAS,MAAM;AACjB;AAAA,IACF;AACA,uBAAmB,CAAC,CAAC;AAAA,EACvB,GAAG,CAAC,IAAI,CAAC;AAET,YAAU,MAAM;AACd,QAAI,SAAS,QAAQ,aAAa,WAAW,GAAG;AAC9C,qBAAe;AAAA,IACjB;AAAA,EACF,GAAG,CAAC,MAAM,gBAAgB,aAAa,MAAM,CAAC;AAE9C,QAAM,eAAe;AAAA,IACnB,MAAO,WAAW,qCAAqC,YAAY,IAAI,CAAC;AAAA,IACxE,CAAC,UAAU,YAAY;AAAA,EACzB;AACA,QAAM,yBAAyB;AAAA,IAC7B,MACE,aACG,IAAI,CAAC,SAAS,KAAK,EAAE,EACrB,OAAO,CAAC,WAAW,gBAAgB,SAAS,MAAM,CAAC;AAAA,IACxD,CAAC,cAAc,eAAe;AAAA,EAChC;AAEA,QAAM,eAAe;AAAA,IACnB,MACE,WACI;AAAA,MACE,GAAG;AAAA,MACH,GAAG;AAAA,MACH,OAAO,KAAK;AAAA,QACV;AAAA,QACA,YAAY,QAAQ,8BAA8B;AAAA,MACpD;AAAA,MACA,QAAQ,KAAK;AAAA,QACX;AAAA,QACA,YAAY,SACV,yBACA;AAAA,MACJ;AAAA,IACF,IACA;AAAA,MACE,GAAG;AAAA,MACH,GAAG;AAAA,MACH,OAAO;AAAA,MACP,QAAQ;AAAA,IACV;AAAA,IACN,CAAC,UAAU,WAAW;AAAA,EACxB;AACA,QAAM,eAAe;AAAA,IACnB,MACE,WACI,4CAA4C;AAAA,MAC1C,WAAW;AAAA,MACX,OAAO;AAAA,IACT,CAAC,IACD,CAAC;AAAA,IACP,CAAC,UAAU,cAAc,YAAY;AAAA,EACvC;AACA,QAAM,eAAeC;AAAA,IACnB,CAAC,eACC,uBAAuB,SAAS,IAC5B,OACA;AAAA,MACE,uBAAuB;AAAA,MACvB;AAAA,MACA;AAAA,MACA;AAAA,IACF,MAAM;AAAA,IACZ,CAAC,mBAAmB,uBAAuB,QAAQ,WAAW;AAAA,EAChE;AACA,QAAM,iBAAiBA;AAAA,IACrB,CAAC,eACC,SAAS,YACT,uBAAuB,UAAU,KACjC,aAAa,UAAU;AAAA,IACzB,CAAC,cAAc,MAAM,uBAAuB,MAAM;AAAA,EACpD;AACA,QAAM,0BAA0BA;AAAA,IAC9B,CAAC,WAAmB;AAClB,YAAM,cAAc;AACpB,UAAI,CAAC,aAAa;AAChB;AAAA,MACF;AACA,YAAM,eAAe,YAAY,YAAY;AAC7C,UAAI,CAAC,aAAa,aAAa,KAAK,CAAC,SAAS,KAAK,OAAO,MAAM,GAAG;AACjE;AAAA,MACF;AACA,qBAAe;AACf,aAAO,sBAAsB,MAAM;AACjC,oBAAY,UAAU,MAAM;AAAA,MAC9B,CAAC;AAAA,IACH;AAAA,IACA,CAAC,SAAS,cAAc;AAAA,EAC1B;AACA,QAAM,sBAAsBA;AAAA,IAC1B,CAACC,UAAmB,eAAsC;AACxD,UAAI,CAAC,WAAWA,SAAQ,SAAS,GAAG;AAClC;AAAA,MACF;AACA,qBAAe;AACf,aAAO,sBAAsB,MAAM;AACjC,gBAAQ,kBAAkBA,UAAS,UAAU;AAAA,MAC/C,CAAC;AAAA,IACH;AAAA,IACA,CAAC,SAAS,cAAc;AAAA,EAC1B;AACA,QAAM,iBAAiBD;AAAA,IACrB,CAAC,WAAmB;AAClB,UAAI,SAAS,MAAM;AACjB;AAAA,MACF;AACA,UAAI,SAAS,YAAY;AACvB,gCAAwB,MAAM;AAC9B;AAAA,MACF;AAEA;AAAA,QAAmB,CAAC,YAClB,QAAQ,SAAS,MAAM,IACnB,QAAQ,OAAO,CAAC,UAAU,UAAU,MAAM,IAC1C,CAAC,GAAG,SAAS,MAAM;AAAA,MACzB;AAAA,IACF;AAAA,IACA,CAAC,yBAAyB,IAAI;AAAA,EAChC;AACA,QAAM,oBAAoB;AAAA,IACxB,MAAM,IAAI,IAAI,eAAe;AAAA,IAC7B,CAAC,eAAe;AAAA,EAClB;AACA,QAAM,cAAcA;AAAA,IAClB,CAAC,eAAsC;AACrC,UAAI,CAAC,eAAe,UAAU,GAAG;AAC/B;AAAA,MACF;AACA,0BAAoB,wBAAwB,UAAU;AAAA,IACxD;AAAA,IACA,CAAC,qBAAqB,gBAAgB,sBAAsB;AAAA,EAC9D;AAEA,QAAM,eAAe;AAAA,IACnB,MACE,SAAS,OACL,OACA;AAAA,MACE,eAAe,IAAI;AAAA,QACjB,aAAa,IAAI,CAAC,SAAS,CAAC,KAAK,KAAK,IAAI,KAAK,KAAK,CAAC;AAAA,MACvD;AAAA,MACA,aAAa;AAAA,QACX;AAAA,QACA,iBAAiB;AAAA,QACjB,aAAa;AAAA,QACb,iBAAiB;AAAA,MACnB;AAAA,MACA,MAAM;AAAA,MACN,gBAAgB,IAAI,IAAI,aAAa,IAAI,CAAC,SAAS,KAAK,EAAE,CAAC;AAAA,IAC7D;AAAA,IACN;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,YAAU,MAAM;AACd,QAAI,SAAS,MAAM;AACjB,aAAO;AAAA,IACT;AAEA,UAAM,YAAY,CAAC,UAAyB;AAC1C,UAAI,MAAM,QAAQ,UAAU;AAC1B,cAAM,eAAe;AACrB,uBAAe;AAAA,MACjB;AAAA,IACF;AAEA,WAAO,iBAAiB,WAAW,WAAW,IAAI;AAClD,WAAO,MAAM;AACX,aAAO,oBAAoB,WAAW,WAAW,IAAI;AAAA,IACvD;AAAA,EACF,GAAG,CAAC,MAAM,cAAc,CAAC;AAEzB,MAAI,SAAS,QAAQ,iBAAiB,MAAM;AAC1C,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAe,uBAAuB;AAAA,EACxC;AACF;;;AE5RA;AAAA,EACE,eAAAE;AAAA,EACA,aAAAC;AAAA,OAGK;;;ACLP,SAAS,WAAAC,gBAA+B;;;ACIjC,SAAS,4BACd,OACwB;AACxB,SAAO,MAAM,MAAM,OAAO,CAAC,SAAS,CAAC,KAAK,WAAW;AACvD;AAEO,SAAS,2BACd,OAC6B;AAC7B,QAAM,YAAY,MAAM,UAAU,GAAG,EAAE;AACvC,SAAO,MAAM,MAAM,KAAK,CAAC,SAAS,KAAK,OAAO,SAAS,KAAK;AAC9D;AAEO,SAAS,2CACd,OACA,cAC6B;AAC7B,QAAM,WAAW,IAAI,IAAI,MAAM,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC;AACnE,QAAM,0BAA0B,CAC9B,SACiC;AACjC,WACE,SAAS,UACT,KAAK,gBAAgB,gBACrB,CAAC,KAAK;AAAA,EAEV;AAEA,MAAI;AACJ,WAAS,QAAQ,MAAM,UAAU,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG;AACnE,UAAM,cAAc,SAAS,IAAI,MAAM,UAAU,KAAK,KAAK,EAAE;AAC7D,QAAI,wBAAwB,WAAW,GAAG;AACxC,eAAS;AACT;AAAA,IACF;AAAA,EACF;AACA,aAAW,MAAM,MAAM,KAAK,uBAAuB;AAEnD,MAAI,CAAC,UAAU,OAAO,OAAO,cAAc;AACzC,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAWO,SAAS,0BACd,OACA,QACQ;AACR,QAAM,QAAQ,MAAM,UAAU,QAAQ,MAAM;AAC5C,SAAO,QAAQ,IAAI,IAAI,QAAQ;AACjC;AAEO,SAAS,+BACd,OACuB;AACvB,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AACF;;;ACzEA,SAAS,eAAe,kBAA0C;AAgB9D,gBAAAC,YAAA;AAbJ,IAAM,mBAAmB,cAA0C,IAAI;AAQhE,SAAS,kBAAyB;AAAA,EACvC;AAAA,EACA;AACF,GAAkC;AAChC,SACE,gBAAAA,KAAC,iBAAiB,UAAjB,EAA0B,OAAO,YAC/B,UACH;AAEJ;AAEO,SAAS,yBAEgB;AAC9B,QAAM,aAAa,WAAW,gBAAgB;AAC9C,MAAI,CAAC,YAAY;AACf,UAAM,IAAI,MAAM,+BAA+B;AAAA,EACjD;AACA,SAAO;AACT;;;AC5BO,SAAS,mCAEqB;AACnC,MAAI,gBAAwD;AAE5D,SAAO,CAAC,UAAU;AAChB,QACE,iBACA,2BAA2B,eAAe,MAAM,KAAK,GACrD;AACA,aAAO;AAAA,IACT;AAEA,oBAAgB,MAAM;AACtB,WAAO,MAAM;AAAA,EACf;AACF;AAEA,SAAS,2BACP,eACA,WACS;AACT,MAAI,cAAc,WAAW,UAAU,QAAQ;AAC7C,WAAO;AAAA,EACT;AAEA,SAAO,cAAc,MAAM,CAAC,cAAc,UAAU;AAClD,UAAM,WAAW,UAAU,KAAK;AAChC,WACE,aAAa,UACb,aAAa,OAAO,SAAS,MAC7B,aAAa,SAAS,SAAS,QAC/B,aAAa,UAAU,SAAS,SAChC,aAAa,gBAAgB,SAAS,eACtC,aAAa,gBAAgB,SAAS,eACtC,aAAa,sBAAsB,SAAS,qBAC5C,aAAa,MAAM,UAAU,SAAS,MAAM,SAC5C,aAAa,MAAM,WAAW,SAAS,MAAM,UAC7C,aAAa,SAAS,SAAS;AAAA,EAEnC,CAAC;AACH;;;AC3CA,SAAS,gCAAgC;AAIlC,SAAS,qBACd,UACS;AACT,QAAM,aAAa,uBAA8B;AACjD,SAAO,yBAAyB,YAAY,QAAQ;AACtD;;;AJkDI,mBAEI,OAAAC,MAFJ;AAxCG,SAAS,mBAA0B;AAAA,EACxC,gBAAgB;AAAA,EAChB;AAAA,EACA,cAAc;AAAA,EACd;AACF,GAAmC;AACjC,QAAM,aAAa,uBAA8B;AACjD,QAAM,kBAAkBC;AAAA,IACtB,MAAM,iCAAwC;AAAA,IAC9C,CAAC;AAAA,EACH;AACA,QAAM,oBAAoB;AAAA,IAAqB,CAAC,UAC9C,MAAM,MAAM;AAAA,MACV,CAAC,SAAS,KAAK,gBAAgB,gBAAgB,CAAC,KAAK;AAAA,IACvD;AAAA,EACF;AACA,QAAM,QAAQ;AAAA,IACZ;AAAA,EACF;AACA,QAAM,4BAA4BA;AAAA,IAChC,MACE;AAAA,MACE,MAAM,OAAO,CAAC,SAAS,KAAK,WAAW;AAAA,MACvC,MAAM;AAAA,IACR;AAAA,IACF,CAAC,MAAM,sBAAsB,KAAK;AAAA,EACpC;AACA,QAAM,iBAAiBA;AAAA,IACrB,MAAM,0BAA0B,OAAO,CAAC,SAAS,KAAK,WAAW;AAAA,IACjE,CAAC,yBAAyB;AAAA,EAC5B;AACA,QAAM,gBAAgB;AAAA,IACpB,CAAC,UAAU,2BAA2B,KAAK,GAAG,MAAM;AAAA,EACtD;AAEA,MAAI,CAAC,cAAc,eAAe,WAAW,GAAG;AAC9C,WAAO;AAAA,EACT;AAEA,SACE,iCACG;AAAA,wBACC,gBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,uBAAqB;AAAA,QACrB,eAAW;AAAA;AAAA,IACb,IACE;AAAA,IACJ,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,uBAAqB;AAAA,QACrB,wBAAsB,oBAAoB,WAAW;AAAA,QAEpD,uBACG,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA,OAAO;AAAA,YACL,sBAAsB,CAAC,WAAW,QAAQ,WAAW;AACnD,oBAAM,iBAAiB,cACnB;AAAA,gBACE,WAAW,YAAY;AAAA,gBACvB;AAAA,cACF,IACA;AACJ,kBAAI,gBAAgB;AAClB,2BAAW,SAAS,eAAe,eAAe,EAAE;AAAA,cACtD;AACA,oBAAM,qBAAqB,WAAW,QAAQ,MAAM;AAAA,YACtD;AAAA,YACA,oBAAoB,CAAC,WAAW,YAAY;AAC1C,oBAAM,mBAAmB,WAAW,OAAO;AAAA,YAC7C;AAAA,YACA,iCAAiC,CAAC,WAAW;AAC3C,qBAAO,MAAM,gCAAgC,MAAM;AAAA,YACrD;AAAA,YACA,4BAA4B,CAAC,WAAW;AACtC,qBAAO,MAAM,2BAA2B,MAAM;AAAA,YAChD;AAAA,UACF;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC,IACD;AAAA;AAAA,IACN;AAAA,KACF;AAEJ;AAEA,SAAS,8BACP,OACA,aACiC;AACjC,MAAI,CAAC,aAAa;AAChB,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,MAAM,KAAK,CAAC,SAAS,KAAK,OAAO,YAAY,EAAE;AACpE,MAAI,cAAc,aAAa;AAC7B,WAAO;AAAA,EACT;AAEA,SAAO,CAAC,GAAG,MAAM,OAAO,CAAC,SAAS,KAAK,OAAO,YAAY,EAAE,GAAG,WAAW;AAC5E;;;AK1HA,SAAS,MAAM,WAAAE,gBAAe;;;ACC9B,SAAS,yBAAyB;AAClC,SAAS,gBAAgB;;;ACAzB,SAAS,UAAAC,SAAQ,cAAc,mBAAmB;AA6C5C,gBAAAC,YAAA;AA1CC,SAAS,gCAAuC;AAAA,EACrD;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AACF,GAKG;AACD,QAAM,eAAe,KAAK,gBAAgB;AAC1C,QAAM,QAAQ,KAAK,EAAE,eAAe,mBAAmB,iBAAiB;AACxE,QAAM,OAAO,eAAe,cAAc;AAE1C,SACE,gBAAAA;AAAA,IAACD;AAAA,IAAA;AAAA,MACC,cAAY;AAAA,MACZ,gBAAc;AAAA,MACd,WAAU;AAAA,MACV,yBAAsB;AAAA,MACtB;AAAA,MACA,MAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAK;AAAA,MACL,SAAQ;AAAA,MACR,SAAS,CAAC,UAAU;AAClB,YAAI,UAAU;AACZ;AAAA,QACF;AAEA,mBAAW,SAAS,UAAU,KAAK,EAAE;AAErC,YAAI,cAAc;AAChB,qBAAW,SAAS,eAAe,KAAK,EAAE;AAC1C;AAAA,QACF;AAEA,cAAM,cAAc,KAAK;AACzB,mBAAW,SAAS,gBAAgB,KAAK,EAAE;AAAA,MAC7C;AAAA,MAEA,0BAAAC,KAAC,QAAK,eAAW,MAAC,WAAU,eAAc;AAAA;AAAA,EAC5C;AAEJ;;;AClDA,SAAS,eAAAC,oBAAmB;;;ACA5B,SAAS,eAAAC,oBAAmB;AAKrB,SAAS,mBAAoC;AAClD,QAAM,aAAa,uBAA8B;AAEjD,SAAOC;AAAA,IACL,CAAC,mBAAgD;AAC/C,YAAM,SAAS;AAAA,QACb,EAAE,GAAG,eAAe;AAAA,QACpB,WAAW,YAAY,EAAE;AAAA,QACzB;AAAA,QACA,WAAW,YAAY,EAAE;AAAA,MAC3B;AACA,iBAAW,SAAS,oBAAoB,MAAM;AAC9C,aAAO;AAAA,IACT;AAAA,IACA,CAAC,UAAU;AAAA,EACb;AACF;;;ADfO,SAAS,iBAAwB,MAA4B;AAClE,QAAM,aAAa,uBAA8B;AACjD,QAAM,aAAa,iBAAwB;AAE3C,SAAOC;AAAA,IACL,CAAC,UAA0C;AACzC,UAAI,MAAM,WAAW,GAAG;AACtB;AAAA,MACF;AAEA,YAAM,eAAe;AACrB,iBAAW,SAAS,UAAU,KAAK,EAAE;AAErC,YAAM,cAAc,kBAAkB,MAAM,SAAS;AACrD,iBAAW,SAAS,kBAAkB,KAAK,EAAE;AAE7C,YAAM,SAAS,EAAE,GAAG,MAAM,SAAS,GAAG,MAAM,QAAQ;AACpD,YAAM,eAAe,KAAK;AAE1B,YAAM,gBAAgB,CAAC,cAA4B;AACjD,cAAM,YAAY;AAAA,UAChB,GAAG;AAAA,UACH,GAAG,aAAa,IAAI,UAAU,UAAU,OAAO;AAAA,UAC/C,GAAG,aAAa,IAAI,UAAU,UAAU,OAAO;AAAA,QACjD;AACA,mBAAW,UAAU,OAAO;AAC5B,mBAAW,SAAS,SAAS,KAAK,IAAI,SAAS;AAAA,MACjD;AAEA,YAAM,iBAAiB,MAAM;AAC3B,mBAAW,SAAS,kBAAkB,IAAI;AAC1C,mBAAW,SAAS,oBAAoB,IAAI;AAC5C,eAAO,oBAAoB,eAAe,aAAa;AACvD,eAAO,oBAAoB,aAAa,UAAU;AAClD,eAAO,oBAAoB,iBAAiB,UAAU;AAAA,MACxD;AAEA,YAAM,aAAa,CAAC,YAA0B;AAC5C,YAAI,WAAW,QAAQ,OAAO,MAAM,MAAM;AACxC,qBAAW,SAAS,sBAAsB,KAAK,EAAE;AAAA,QACnD;AACA,uBAAe;AAAA,MACjB;AAEA,YAAM,aAAa,MAAM;AACvB,uBAAe;AAAA,MACjB;AAEA,aAAO,iBAAiB,eAAe,aAAa;AACpD,aAAO,iBAAiB,aAAa,UAAU;AAC/C,aAAO,iBAAiB,iBAAiB,UAAU;AAAA,IACrD;AAAA,IACA,CAAC,YAAY,KAAK,OAAO,KAAK,IAAI,UAAU;AAAA,EAC9C;AACF;;;AE5DA,SAAS,eAAAC,oBAAmB;AAKrB,SAAS,mBACd,MACA,QACA;AACA,QAAM,aAAa,uBAA8B;AAEjD,SAAOC;AAAA,IACL,CAAC,UAA0C;AACzC,UAAI,MAAM,WAAW,GAAG;AACtB;AAAA,MACF;AAEA,YAAM,eAAe;AACrB,YAAM,gBAAgB;AACtB,YAAM,cAAc,kBAAkB,MAAM,SAAS;AACrD,iBAAW,SAAS,UAAU,KAAK,EAAE;AACrC,iBAAW,SAAS,oBAAoB,KAAK,EAAE;AAE/C,YAAM,SAAS,EAAE,GAAG,MAAM,SAAS,GAAG,MAAM,QAAQ;AACpD,YAAM,eAAe,KAAK;AAE1B,YAAM,gBAAgB,CAAC,cAA4B;AACjD,cAAM,SAAS,UAAU,UAAU,OAAO;AAC1C,cAAM,SAAS,UAAU,UAAU,OAAO;AAC1C,mBAAW,SAAS;AAAA,UAClB,KAAK;AAAA,UACL,YAAY,cAAc,QAAQ,QAAQ,MAAM;AAAA,QAClD;AAAA,MACF;AAEA,YAAM,UAAU,MAAM;AACpB,mBAAW,SAAS,oBAAoB,IAAI;AAC5C,eAAO,oBAAoB,eAAe,aAAa;AACvD,eAAO,oBAAoB,aAAa,OAAO;AAC/C,eAAO,oBAAoB,iBAAiB,OAAO;AAAA,MACrD;AAEA,aAAO,iBAAiB,eAAe,aAAa;AACpD,aAAO,iBAAiB,aAAa,OAAO;AAC5C,aAAO,iBAAiB,iBAAiB,OAAO;AAAA,IAClD;AAAA,IACA,CAAC,YAAY,QAAQ,KAAK,OAAO,KAAK,EAAE;AAAA,EAC1C;AACF;AAEA,SAAS,YACP,OACA,QACA,QACA,QACwB;AACxB,QAAM,OAAO,EAAE,GAAG,MAAM;AACxB,MAAI,OAAO,SAAS,MAAM,GAAG;AAC3B,SAAK,SAAS;AAAA,EAChB;AACA,MAAI,OAAO,SAAS,OAAO,GAAG;AAC5B,SAAK,UAAU;AAAA,EACjB;AACA,MAAI,OAAO,SAAS,MAAM,GAAG;AAC3B,SAAK,KAAK;AACV,SAAK,SAAS;AAAA,EAChB;AACA,MAAI,OAAO,SAAS,OAAO,GAAG;AAC5B,SAAK,KAAK;AACV,SAAK,UAAU;AAAA,EACjB;AACA,SAAO;AACT;;;ACxCO,SAAS,iCAAwC;AAAA,EACtD;AAAA,EACA;AAAA,EACA;AACF,GAM8B;AAC5B,MAAI,OAAO,qBAAqB,YAAY;AAC1C,WAAO,iBAAiB,EAAE,YAAY,KAAK,CAAC;AAAA,EAC9C;AAEA,SAAO,oBAAoB;AAC7B;AAEO,SAAS,6BAAoC;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,mBAAmB;AACrB,GAAmF;AACjF,QAAM,UAA+C;AAAA,IACnD;AAAA,IACA;AAAA,IACA,iBAAiB;AAAA,MACf,8BAA8B;AAAA,MAC9B;AAAA,MACA,eAAe;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa,WAAW,YAAY,EAAE;AAAA,EACxC;AAEA,QAAM,eACJ,qBAAqB,mBAAmB,eACpC,aAAa,OAAO,IACpB;AAEN,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,kBAAkB,iBAAiB,OAAO,WAAW;AAAA,EACvD;AACF;;;AL0CI,SAqJU,YAAAC,WA5IR,OAAAC,MATF,QAAAC,aAAA;AAnFJ,IAAM,gBAAyC;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,0BAA0B;AAAA,EAC9B,kBAAkB;AAAA,IAChB,cAAc,CAAC,mCAAmC,EAAE;AAAA,EACtD,CAAC;AACH;AAEA,SAAS,iCAAiC,MAAmC;AAC3E,MACE,QACA,OAAO,SAAS,YAChB,kBAAkB,QAClB,OAAO,KAAK,iBAAiB,YAC7B,KAAK,aAAa,SAAS,GAC3B;AACA,WAAO,KAAK;AAAA,EACd;AACA,SAAO;AACT;AAEA,SAAS,2BAA2B,MAAmC;AACrE,MACE,QACA,OAAO,SAAS,YAChB,YAAY,QACZ,OAAO,KAAK,WAAW,UACvB;AACA,WAAO,KAAK;AAAA,EACd;AAEA,SAAO;AACT;AAEO,SAAS,qBAA4B;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA,mBAAmB;AAAA,EACnB;AACF,GAAqC;AACnC,QAAM,aAAa,uBAA8B;AACjD,QAAM,SAAS;AAAA,IAAqB,CAAC,UACnC,0BAA0B,OAAO,KAAK,EAAE;AAAA,EAC1C;AACA,QAAM,YAAY;AAAA,IAChB,CAAC,UAAU,2BAA2B,KAAK,GAAG,OAAO,KAAK;AAAA,EAC5D;AACA,QAAM,aAAa;AAAA,IACjB,CAAC,UAAU,MAAM,qBAAqB,KAAK;AAAA,EAC7C;AACA,QAAM,aAAa;AAAA,IACjB,CAAC,UAAU,MAAM,uBAAuB,KAAK;AAAA,EAC/C;AACA,QAAM,cAAc,iBAAiB,IAAI;AACzC,QAAM,sBAAsB,MAAM;AAChC,QAAI,CAAC,aAAa;AAChB;AAAA,IACF;AACA,eAAW,SAAS,UAAU,KAAK,EAAE;AACrC,eAAW,SAAS,gBAAgB,KAAK,IAAI,KAAK;AAAA,EACpD;AACA,QAAM,gBAAgB;AAAA,IACpB,sBAAsB,CAAC,QAAgB,aAA0B;AAC/D,YAAM,qBAAqB,QAAQ,QAAQ;AAAA,IAC7C;AAAA,EACF;AACA,QAAM,iBAAiB,cACrB,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,eAAe,CAAC,UAAU;AACxB,cAAM,gBAAgB;AAAA,MACxB;AAAA,MACA,eAAe,CAAC,UAAU;AACxB,cAAM,gBAAgB;AAAA,MACxB;AAAA,MAEA;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA,MAAM,oBAAoB;AAAA,YAC1B;AAAA;AAAA,QACF;AAAA,QACC,gBACG,cAAc;AAAA,UACZ;AAAA,UACA,OAAO;AAAA,UACP;AAAA,QACF,CAAC,IACD;AAAA;AAAA;AAAA,EACN,IACE;AACJ,QAAM,iBAAiB,6BAA6B;AAAA,IAClD;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA,eAAe;AAAA,IACf;AAAA,IACA,cAAc,cAAc,eAAe;AAAA,IAC3C;AAAA,EACF,CAAC;AACD,QAAM,2BACJ,eAAe,qBAAqB;AACtC,QAAM,+BAA+B,wBAAwB;AAC7D,QAAM,mBAAmB,cAAc,QAAQ;AAC/C,QAAM,oBAAoB,cAAc,cAAc,IAAI,KAAK,EAAE,KAAK;AACtE,QAAM,uBACJ,qBAAqB,qBACrB,CAAC,cAAc,eAAe,IAAI,KAAK,EAAE;AAC3C,QAAM,0BACJ,eACA,qBAAqB,qBACrB,CAAC,uBACI,cAAc,eAAe,OAC9B;AACN,QAAM,2BACJ,yBAAyB,gBAAgB,IAAI,KAAK,EAAE,KAAK;AAC3D,QAAM,oBACJ,qBAAqB,qBAAqB,oBACtC,KAAK;AAAA,IACH,kBAAkB,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK;AAAA,IACtD,kBAAkB,SAAS,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM;AAAA,EAC1D,IACA;AACN,QAAM,sBACJ,qBAAqB,qBAAqB,oBACtC,kBAAkB,IAClB,KAAK;AAAA,IACH;AAAA,KACC,kBAAkB,QAAQ,KAAK,MAAM,QAAQ,qBAAqB;AAAA,EACrE,IACA,KAAK,MAAM,IACX;AACN,QAAM,sBACJ,qBAAqB,qBAAqB,oBACtC,kBAAkB,IAClB,KAAK;AAAA,IACH;AAAA,KACC,kBAAkB,SAAS,KAAK,MAAM,SAAS,qBAAqB;AAAA,EACvE,IACA,KAAK,MAAM,IACX;AACN,QAAM,iBACJ,qBAAqB,qBAAqB,oBACtC,UAAU,iBAAiB,WAAW,iBAAiB,KAAK,mBAAmB,KAAK,mBAAmB,MACvG;AAEN,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,eAAa,iBAAiB,uBAAuB,OAAO;AAAA,MAC5D,WAAU;AAAA,MACV,gBAAc,YAAY,SAAS;AAAA,MACnC,qBAAmB,KAAK;AAAA,MACxB,oBAAkB,MAAM,kBAAkB,KAAK,EAAE,IAAI,WAAW;AAAA,MAChE,sBAAoB,iCAAiC,KAAK,IAAI;AAAA,MAC9D,wBAAsB,gBAAgB,WAAW;AAAA,MACjD,0BAAwB,oBAAoB;AAAA,MAC5C,gCAA8B,uBAAuB,WAAW;AAAA,MAChE,aAAU;AAAA,MACV,+BAA6B,2BAA2B,KAAK,IAAI;AAAA,MACjE,4BAA0B,KAAK;AAAA,MAC/B,0BAAwB,aAAa,aAAa;AAAA,MAClD,4BAA0B,aAAa,aAAa;AAAA,MACpD,OAAO;AAAA,QACL,QAAQ,KAAK,MAAM;AAAA,QACnB,MAAM,KAAK,MAAM;AAAA,QACjB,KAAK,KAAK,MAAM;AAAA,QAChB,WAAW;AAAA,QACX,iBAAiB;AAAA,QACjB,OAAO,KAAK,MAAM;AAAA,QAClB;AAAA,MACF;AAAA,MACA,eACE,iBACA,wBACA,CAAC,eACD,qBAAqB,oBACjB,SACA,MAAM,WAAW,SAAS,UAAU,KAAK,EAAE;AAAA,MAGjD;AAAA,wBAAAD,KAAC,SAAI,WAAU,mCACb,0BAAAC;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,gBAAc,YAAY,SAAS;AAAA,YACnC,qBAAmB,KAAK;AAAA,YACxB,+BAA6B;AAAA,YAC7B,2BAAyB,eAAe;AAAA,YACxC,iCAA8B;AAAA,YAC9B,0BAAwB,aAAa,aAAa;AAAA,YAClD,4BAA0B,aAAa,aAAa;AAAA,YAEnD;AAAA,mBAAK,gBAAgB,gBACtB,iCAAiC,WAC/B,gBAAAD,KAAC,SAAI,WAAU,wCAAuC,eAAW,MAAC,IAChE;AAAA,cACJ,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAW;AAAA,oBACT;AAAA,oBACA,2BACI,qCACA;AAAA,kBACN,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,kBACX,eACE,4BAA4B,CAAC,cACzB,SACA;AAAA,kBAEN,eACE,4BAA4B,CAAC,cAAc,SAAY;AAAA,kBAGxD,qCACC,eAAe,eAEf,gBAAAC,MAAAF,WAAA,EACE;AAAA,oCAAAC,KAAC,SAAI,WAAU,8CACZ,eAAK,OACR;AAAA,oBACC;AAAA,qBACH;AAAA;AAAA,cAEJ;AAAA,cACA,gBAAAA,KAAC,SAAI,WAAU,0BAA0B,UAAS;AAAA,cACjD,KAAK,gBAAgB,cACtB,CAAC,iBACD,qBAAqB,qBACrB,cACI,cAAc,IAAI,CAAC,WACjB,gBAAAA,KAAC,gBAA0B,QAAgB,QAAxB,MAAoC,CACxD,IACD;AAAA;AAAA;AAAA,QACN,GACF;AAAA,QACC,0BACC,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,cAAY,KAAK;AAAA,YACjB,gBACE,wBAAwB,SAAS,WAC7B,2BACA;AAAA,YAEN,WAAU;AAAA,YACV,MAAK;AAAA,YACL,SAAS,CAAC,UAAU;AAClB,oBAAM,gBAAgB;AACtB,sCAAwB,YAAY,KAAK,EAAE;AAAA,YAC7C;AAAA,YAEC,kCAAwB,SAAS,YAClC,2BACE,gBAAAA,KAAC,SAAI,WAAU,6IAA4I,IACzJ;AAAA;AAAA,QACN,IACE;AAAA,QACH,yBAAyB,SAAS,YACnC,2BACE,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,eAAY;AAAA,YACZ,SAAO;AAAA,YACP,WAAU;AAAA,YACV,UAAU;AAAA;AAAA,QACZ,IACE;AAAA;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,aAAoB;AAAA,EAC3B;AAAA,EACA;AACF,GAGG;AACD,QAAM,gBAAgB,mBAAmB,MAAM,MAAM;AACrD,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,eAAa;AAAA,MACb;AAAA;AAAA,EACF;AAEJ;;;AMnVO,SAAS,uCACd,iCAEgB,QACqC;AACrD,MAAI,cAAwC;AAE5C,SAAO,CAAC,UAAU;AAChB,UAAM,UAAU,MAAM,MACnB;AAAA,MAAO,CAAC,SACP,0BAA0B,MAAM,8BAA8B;AAAA,IAChE,EACC,IAAI,CAAC,SAAS,KAAK,EAAE;AAExB,QAAI,eAAe,kBAAkB,aAAa,OAAO,GAAG;AAC1D,aAAO;AAAA,IACT;AAEA,kBAAc;AACd,WAAO;AAAA,EACT;AACF;AAEA,SAAS,0BACP,MACA,gCAGS;AACT,SAAO,CAAC,KAAK,eAAe,iCAAiC,IAAI,MAAM;AACzE;AAEA,SAAS,kBAAkB,MAAyB,OAA0B;AAC5E,MAAI,KAAK,WAAW,MAAM,QAAQ;AAChC,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,MAAM,CAAC,OAAO,UAAU,UAAU,MAAM,KAAK,CAAC;AAC5D;;;AP0BI,SAcI,OAAAE,MAdJ,QAAAC,aAAA;AA3BG,SAAS,mBAA0B;AAAA,EACxC;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAmC;AACjC,QAAM,wBAAwBC;AAAA,IAC5B,MACE,uCAAuC,8BAA8B;AAAA,IACvE,CAAC,8BAA8B;AAAA,EACjC;AACA,QAAM,UAAU;AAAA,IACd;AAAA,EACF;AACA,QAAM,kBAAkB,qBAAqB,8BAA8B;AAC3E,QAAM,0BACJ,eAAe,cAAc,SAAS,oBACjC,aAAa,eAAe,OAC7B;AAEN,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,SACE,0BACI,CAAC,UAAU;AACT,YAAI,MAAM,WAAW,MAAM,eAAe;AACxC;AAAA,QACF;AACA,gCAAwB,gBAAgB;AAAA,MAC1C,IACA;AAAA,MAGL;AAAA,0BACC,gBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO;AAAA,cACL,QAAQ,gBAAgB;AAAA,cACxB,MAAM,gBAAgB;AAAA,cACtB,KAAK,gBAAgB;AAAA,cACrB,OAAO,gBAAgB;AAAA,YACzB;AAAA;AAAA,QACF,IACE;AAAA,QACH,QAAQ,IAAI,CAAC,WACZ,gBAAAA;AAAA,UAAC;AAAA;AAAA,YAEC,sBAAsB;AAAA,YACtB;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA;AAAA,UAVK;AAAA,QAWP,CACD;AAAA;AAAA;AAAA,EACH;AAEJ;AAiBA,SAAS,uBAA8B;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAuC;AACrC,QAAM,aAAa,uBAA8B;AACjD,QAAM,OAAO;AAAA,IACX,CAAC,UAAU,MAAM,MAAM,KAAK,CAAC,cAAc,UAAU,OAAO,MAAM,KAAK;AAAA,EACzE;AACA,QAAM,YAAY;AAAA,IAChB,CAAC,UAAU,2BAA2B,KAAK,GAAG,OAAO;AAAA,EACvD;AACA,QAAM,SAAS;AAAA,IAAqB,CAAC,UACnC,0BAA0B,OAAO,MAAM;AAAA,EACzC;AAEA,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AAEA,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,eAAe,KAAK;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,sBAAsB,uBAAuB;AAAA,QAC3C;AAAA,QACA;AAAA,MACF,CAAC;AAAA,MACD,eAAe;AAAA,MACf,cAAc;AAAA,MACd;AAAA,MACA,kBAAkB,iCAAiC;AAAA,QACjD;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,MAEA,qBAAW;AAAA,QACV;AAAA,QACA,QAAQ;AAAA,UACN,OAAO,KAAK;AAAA,UACZ;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA;AAAA,MACF,CAAC;AAAA;AAAA,EACH;AAEJ;AAEA,IAAM,iCAAiC;AAAA,EACrC;AACF;;;AQ5LA,SAAS,aAAAG,kBAAiB;AAInB,SAAS,sBAAuC,UAAU,MAAY;AAC3E,QAAM,aAAa,uBAA8B;AAEjD,EAAAC,WAAU,MAAM;AACd,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,IACT;AAEA,UAAM,YAAY,CAAC,UAAyB;AAC1C,UAAI,MAAM,QAAQ,UAAU;AAC1B;AAAA,MACF;AAEA,YAAM,cAAc,2BAA2B,WAAW,YAAY,CAAC;AACvE,UAAI,aAAa,gBAAgB,cAAc;AAC7C,mBAAW,SAAS,eAAe,YAAY,EAAE;AAAA,MACnD;AAAA,IACF;AAEA,WAAO,iBAAiB,WAAW,SAAS;AAC5C,WAAO,MAAM;AACX,aAAO,oBAAoB,WAAW,SAAS;AAAA,IACjD;AAAA,EACF,GAAG,CAAC,YAAY,OAAO,CAAC;AAC1B;;;AC5BA,SAAS,mBAAAC,kBAAiB,UAAAC,eAA8B;AAGjD,SAAS,wBACd,cAC4B;AAC5B,QAAM,MAAMA,QAAwB,IAAI;AAExC,EAAAD,iBAAgB,MAAM;AACpB,UAAM,UAAU,IAAI;AACpB,QAAI,CAAC,SAAS;AACZ;AAAA,IACF;AAEA,UAAM,UAAU,MAAM;AACpB,YAAM,OAAO,QAAQ,sBAAsB;AAC3C,mBAAa;AAAA,QACX,OAAO,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,KAAK,CAAC;AAAA,QACzC,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,MAAM,CAAC;AAAA,MAC7C,CAAC;AAAA,IACH;AAEA,YAAQ;AAER,QAAI,OAAO,mBAAmB,aAAa;AACzC,aAAO,iBAAiB,UAAU,OAAO;AACzC,aAAO,MAAM;AACX,eAAO,oBAAoB,UAAU,OAAO;AAAA,MAC9C;AAAA,IACF;AAEA,UAAM,WAAW,IAAI,eAAe,OAAO;AAC3C,aAAS,QAAQ,OAAO;AACxB,WAAO,MAAM;AACX,eAAS,WAAW;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,YAAY,CAAC;AAEjB,SAAO;AACT;;;ACvCA;AAAA,EACE,eAAAE;AAAA,EACA,aAAAC;AAAA,EACA,UAAAC;AAAA,EACA,YAAAC;AAAA,OAEK;AACP,SAAS,cAAc,iBAAiB;;;AC0BxC,IAAM,4BAA4B;AAClC,IAAM,0BAA0B;AAChC,IAAM,sBAAsB;AAC5B,IAAM,iCAAiC;AACvC,IAAM,yBAAyB;AAExB,SAAS,mBAAmB,OAAuB;AACxD,SAAO,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC;AACvC;AAEO,SAAS,eAAe,OAAuB;AACpD,QAAM,WAAW,mBAAmB,KAAK;AACzC,SAAO,WAAW,MACd,IAAI,WAAW,WAAW,WAC1B,IAAI,KAAK,IAAI,KAAK,WAAW,GAAG,CAAC,IAAI;AAC3C;AAEO,SAAS,gBAAgB,OAAuB;AACrD,QAAM,WAAW,mBAAmB,KAAK;AACzC,SAAO,WAAW;AACpB;AAEO,SAAS,iBAAiB,OAAuB;AACtD,QAAM,WAAW,mBAAmB,KAAK;AACzC,SAAO,KAAK,IAAI,aAAa,IAAI;AACnC;AAEO,SAAS,eACd,MACA,IACA,UACQ;AACR,SAAO,QAAQ,KAAK,QAAQ;AAC9B;AAEO,SAAS,wBACd,SAC4B;AAC5B,QAAM,OAAO,QAAQ,sBAAsB;AAC3C,SAAO;AAAA,IACL,QAAQ,KAAK;AAAA,IACb,MAAM,KAAK;AAAA,IACX,KAAK,KAAK;AAAA,IACV,OAAO,KAAK;AAAA,EACd;AACF;AAEO,SAAS,kBAAkB,MAA2C;AAC3E,SAAO,KAAK,QAAQ,KAAK,KAAK,SAAS;AACzC;AAEO,SAAS,oBACd,MACqB;AACrB,SAAO;AAAA,IACL,GAAG,KAAK,OAAO,KAAK,QAAQ;AAAA,IAC5B,GAAG,KAAK,MAAM,KAAK,SAAS;AAAA,EAC9B;AACF;AAEA,SAAS,2BAA2B,eAA+B;AACjE,SAAO,KAAK;AAAA,IACV;AAAA,IACA,KAAK;AAAA,MACH;AAAA,MACA,KAAK,KAAK,gBAAgB,8BAA8B;AAAA,IAC1D;AAAA,EACF;AACF;AAEA,SAAS,sBAAsB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAK+B;AAC7B,QAAM,UAAU,sBAAsB;AACtC,QAAM,OAAO,KAAK;AAAA,IAChB;AAAA,IACA,KAAK,MAAM,KAAK,IAAI,YAAY,MAAM,UAAU,CAAC,IAAI,OAAO;AAAA,EAC9D;AACA,QAAM,MAAM,KAAK;AAAA,IACf;AAAA,IACA,KAAK,MAAM,KAAK,IAAI,YAAY,KAAK,UAAU,CAAC,IAAI,OAAO;AAAA,EAC7D;AACA,QAAM,QAAQ,KAAK;AAAA,IACjB;AAAA,IACA,KAAK;AAAA,MACH,KAAK,IAAI,YAAY,OAAO,YAAY,OAAO,UAAU,CAAC,IAAI;AAAA,IAChE;AAAA,EACF;AACA,QAAM,SAAS,KAAK;AAAA,IAClB;AAAA,IACA,KAAK;AAAA,MACH,KAAK,IAAI,YAAY,MAAM,YAAY,QAAQ,UAAU,CAAC,IAAI;AAAA,IAChE;AAAA,EACF;AAEA,SAAO;AAAA,IACL,QAAQ,KAAK,IAAI,GAAG,SAAS,GAAG;AAAA,IAChC;AAAA,IACA;AAAA,IACA,OAAO,KAAK,IAAI,GAAG,QAAQ,IAAI;AAAA,EACjC;AACF;AAEA,SAAS,wBAAwB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKW;AACT,QAAM,QACJ,cAAc,cACT,IAAI,eAAe,UACpB,cAAc;AACpB,SAAO,oBAAoB,WAAW,UAAU,IAAI,MAAM;AAC5D;AAEA,SAAS,uBAAuB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAOW;AACT,QAAM,cAAc,mBAAmB,UAAU,aAAa;AAC9D,QAAM,mBAAmB,wBAAwB;AAAA,IAC/C;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,EACX,CAAC;AACD,QAAM,eAAe,gBAAgB,gBAAgB;AACrD,SAAO,cAAc,aACjB,eAAe,YAAY,MAAM,SAAS,UAAU,GAAG,YAAY,IACnE,eAAe,UAAU,GAAG,YAAY,MAAM,SAAS,YAAY;AACzE;AAEA,SAAS,uBACP,SACqC;AACrC,SACE,mBAAmB,eAClB,OAAO,eAAe,eAAe,mBAAmB;AAE7D;AAEA,SAAS,wBAAwB,UAAwC;AACvE,SACE,SAAS,YAAY,UACrB,SAAS,eAAe,YACxB,SAAS,eAAe,cACxB,OAAO,WAAW,SAAS,WAAW,GAAG,KAAK;AAElD;AAEA,SAAS,eACP,GACA,GACS;AACT,SACE,EAAE,OAAO,EAAE,OAAO,EAAE,SACpB,EAAE,OAAO,EAAE,QAAQ,EAAE,QACrB,EAAE,MAAM,EAAE,MAAM,EAAE,UAClB,EAAE,MAAM,EAAE,SAAS,EAAE;AAEzB;AAQA,SAAS,wCACP,SACA,UACA,UACwC;AACxC,MAAI,wBAAwB,QAAQ,GAAG;AACrC,WAAO;AAAA,EACT;AACA,QAAM,UAAU,QAAQ,QAAQ,YAAY;AAC5C,MAAI,YAAY,YAAY,YAAY,WAAW,YAAY,YAAY;AACzE,WAAO;AAAA,EACT;AACA,QAAM,OAAO,QAAQ,sBAAsB;AAC3C,MAAI,KAAK,SAAS,KAAK,KAAK,UAAU,GAAG;AACvC,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL;AAAA,MACE,QAAQ,KAAK;AAAA,MACb,MAAM,KAAK;AAAA,MACX,KAAK,KAAK;AAAA,MACV,OAAO,KAAK;AAAA,IACd;AAAA,IACA;AAAA,EACF,IACI,OACA;AACN;AAEA,SAAS,sBAAsB,MAAqB;AAClD,SAAO,KAAK,aAAa,KAAK,IAAI,OAAO;AAC3C;AAEA,SAAS,yBACP,QACA,UACA,QACA,eAAe,OACF;AACb,MAAI,OAAO,aAAa,KAAK,WAAW;AACtC,QAAI,CAAC,sBAAsB,MAAM,GAAG;AAClC,aAAO;AAAA,IACT;AACA,WAAO,OAAO,UAAU,KAAK;AAAA,EAC/B;AACA,MAAI,OAAO,aAAa,KAAK,cAAc;AACzC,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB;AACtB,MAAI,CAAC,uBAAuB,aAAa,GAAG;AAC1C,WAAO;AAAA,EACT;AACA,QAAM,WAAW,OAAO,iBAAiB,aAAa;AACtD,QAAM,aAAa;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,cAAc,gBAAgB,eAAe;AACnD,MAAI,CAAC,eAAe,eAAe,UAAU;AAC3C,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,cAAc,UAAU,KAAK;AAC3C,yBAAuB,eAAe,OAAO,QAAQ;AAErD,aAAW,SAAS,MAAM,KAAK,OAAO,UAAU,GAAG;AACjD,UAAM,aAAa,yBAAyB,OAAO,UAAU,MAAM;AACnE,QAAI,YAAY;AACd,YAAM,YAAY,UAAU;AAAA,IAC9B;AAAA,EACF;AAEA,MAAI,CAAC,eAAe,MAAM,WAAW,WAAW,GAAG;AACjD,WAAO;AAAA,EACT;AAEA,MAAI,yBAAyB,kBAAkB;AAC7C,UAAM,OAAO,cAAc,sBAAsB;AACjD,WAAO,KAAK;AAAA,MACV,eAAe,KAAK;AAAA,MACpB,cAAc,KAAK;AAAA,MACnB,KACE,cAAc,cACd,cAAc,OACd,cAAc,aAAa,KAAK,KAChC;AAAA,IACJ,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEA,SAAS,uBACP,QACA,OACA,WAAW,OAAO,iBAAiB,MAAM,GACnC;AACN,MAAI,CAAC,uBAAuB,MAAM,KAAK,CAAC,uBAAuB,KAAK,GAAG;AACrE;AAAA,EACF;AACA,MAAI,SAAS,SAAS;AACpB,UAAM,MAAM,UAAU,SAAS;AAAA,EACjC,OAAO;AACL,aAAS,QAAQ,GAAG,QAAQ,SAAS,QAAQ,SAAS,GAAG;AACvD,YAAM,eAAe,SAAS,KAAK,KAAK;AACxC,UAAI,CAAC,cAAc;AACjB;AAAA,MACF;AACA,YAAM,MAAM;AAAA,QACV;AAAA,QACA,SAAS,iBAAiB,YAAY;AAAA,QACtC,SAAS,oBAAoB,YAAY;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AACA,QAAM,MAAM,YAAY;AACxB,QAAM,MAAM,UAAU;AACtB,QAAM,MAAM,aAAa;AACzB,QAAM,MAAM,aAAa;AAC3B;AAEO,SAAS,4BACd,QACA,UAC6C;AAC7C,QAAM,SAA+C,CAAC;AACtD,QAAM,QAAQ,yBAAyB,QAAQ,UAAU,QAAQ,IAAI;AACrE,MAAI,EAAE,iBAAiB,cAAc;AACnC,WAAO;AAAA,EACT;AACA,SAAO,EAAE,OAAO,OAAO;AACzB;AAEO,SAAS,qBACd,SACA,eACA,gBACA,OACM;AACN,QAAM,EAAE,WAAW,WAAW,SAAS,YAAY,IAAI;AACvD,QAAM,WAAW,mBAAmB,MAAM,QAAQ;AAClD,QAAM,cAAc,KAAK,IAAI,GAAG,QAAQ,KAAK;AAC7C,QAAM,eAAe,KAAK,IAAI,GAAG,QAAQ,MAAM;AAC/C,QAAM,mBAAmB,KAAK,IAAI,GAAG,YAAY,KAAK;AACtD,QAAM,oBAAoB,KAAK,IAAI,GAAG,YAAY,MAAM;AACxD,QAAM,iBAAiB,2BAA2B,YAAY;AAC9D,QAAM,YAAY,sBAAsB;AAAA,IACtC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,UAAQ;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,EACZ;AAEA,WAAS,IAAI,GAAG,IAAI,cAAc,KAAK,gBAAgB;AACrD,UAAM,oBAAoB,KAAK,IAAI,gBAAgB,eAAe,CAAC;AACnE,UAAM,aAAa,IAAI,oBAAoB;AAC3C,UAAM,cAAc,aAAa;AACjC,UAAM,qBAAqB,wBAAwB;AAAA,MACjD;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS;AAAA,IACX,CAAC;AACD,UAAM,iBAAiB,eAAe,kBAAkB;AAExD,UAAM,OACJ,cAAc,aACV,eAAe,YAAY,MAAM,UAAU,GAAG,cAAc,IAC5D,eAAe,UAAU,GAAG,YAAY,MAAM,cAAc;AAClE,UAAM,QACJ,cAAc,aACV;AAAA,MACE,YAAY,OAAO;AAAA,MACnB,UAAU;AAAA,MACV;AAAA,IACF,IACA;AAAA,MACE,UAAU;AAAA,MACV,YAAY,OAAO;AAAA,MACnB;AAAA,IACF;AACN,UAAM,uBAAwB,IAAI,eAAgB;AAClD,UAAM,2BACF,IAAI,qBAAqB,eAAgB;AAC7C,UAAM,YAAY,uBAAuB;AAAA,MACvC;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS;AAAA,MACT,eAAe;AAAA,MACf;AAAA,IACF,CAAC;AACD,UAAM,eAAe,uBAAuB;AAAA,MAC1C;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS;AAAA,MACT,eAAe;AAAA,MACf;AAAA,IACF,CAAC;AACD,UAAM,UAAU,KAAK,IAAI,WAAW,YAAY,IAAI;AACpD,UAAM,eAAe,KAAK,IAAI,GAAG,KAAK,IAAI,eAAe,SAAS,IAAI,CAAC;AACvE,UAAM,WAAW,QAAQ;AAEzB,QAAI,WAAW,KAAK;AAClB;AAAA,IACF;AAEA,YAAQ;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,eAAe,cAAc,aAAa,WAAW,IAAI;AAC/D,MAAI,gBAAgB,MAAM;AACxB;AAAA,EACF;AAEA,QAAM,YAAY,kBAAkB,eAAe,QAAQ,IAAI,IAAI;AACnE,QAAM,WAAW,QAAQ;AAAA,IACvB,UAAU;AAAA,IACV,UAAU;AAAA,IACV;AAAA,IACA,UAAU;AAAA,IACV,UAAU;AAAA,IACV;AAAA,EACF;AACA,WAAS,aAAa,GAAG,uBAAuB,SAAS,GAAG;AAC5D,WAAS,aAAa,GAAG,wBAAwB;AACjD,UAAQ,YAAY;AACpB,UAAQ;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,EACZ;AACF;;;AD03CY,qBAAAC,WACE,OAAAC,MADF,QAAAC,aAAA;AA1zDZ,IAAM,kBAAkB;AACxB,IAAM,0BAA0B;AAChC,IAAM,2BAA2B;AACjC,IAAM,qBAAqB;AAC3B,IAAM,qCAAqC;AAC3C,IAAM,oCAAoC;AAC1C,IAAM,sCAAsC;AAC5C,IAAM,sBAAsB;AAC5B,IAAM,uBAAuB;AAC7B,IAAM,kCAAkC;AACxC,IAAM,qCAAqC;AAC3C,IAAM,2BAA2B;AACjC,IAAM,sCAAsC;AAC5C,IAAM,2BAA2B,oBAAI,IAAoB;AACzD,IAAM,2BAA2B,oBAAI,IAAoC;AAqBzE,SAAS,+BACP,eACa;AACb,SACE,cAAc;AAAA,IACZ;AAAA,EACF,KACA,cAAc,cAA2B,mBAAmB,KAC5D;AAEJ;AAEA,SAAS,4BAA2C;AAClD,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,WAAO,sBAAsB,MAAM,QAAQ,CAAC;AAAA,EAC9C,CAAC;AACH;AAEA,SAAS,uBACP,YACA,QACS;AACT,SAAO,WAAW,YAAY,EAAE,UAAU,GAAG,EAAE,MAAM;AACvD;AAEA,SAAS,oBAAoB,SAA6B;AACxD,SAAO,YAAY,QAAQ,YAAY,UAAa,YAAY;AAClE;AAEA,SAAS,4BACP,kBACA,OACA,SACA,QAAmC,QAC7B;AACN,MAAI,CAAC,kBAAkB,UAAU,KAAK,CAAC,iBAAiB,KAAK;AAC3D;AAAA,EACF;AACA,OAAK,QAAQ;AAAA,IACX,iBAAiB,IAAI;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,IACV,CAAC;AAAA,EACH,EAAE,MAAM,MAAM,MAAS;AACzB;AAEA,SAAS,kBACP,MACyB;AACzB,MAAI,CAAC,MAAM;AACT,WAAO,CAAC;AAAA,EACV;AACA,QAAM,OACJ,KAAK,QAAQ,OAAO,KAAK,SAAS,WAC7B,KAAK,OACN,CAAC;AACP,SAAO;AAAA,IACL,aAAa,KAAK;AAAA,IAClB,YAAY,OAAO,KAAK,eAAe,WAAW,KAAK,aAAa;AAAA,IACpE,aAAa,KAAK;AAAA,IAClB,mBAAmB,KAAK;AAAA,IACxB,QAAQ,KAAK;AAAA,IACb,OAAO,KAAK;AAAA,IACZ,QAAQ,OAAO,KAAK,WAAW,WAAW,KAAK,SAAS;AAAA,EAC1D;AACF;AA0BA,SAAS,qBAA8B;AACrC,SACE,OAAO,aAAa,kCAAkC,EAAE,YAAY;AAExE;AAEA,SAAS,cAAc,OAAuB;AAC5C,SAAO,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC;AACvC;AAEA,SAAS,8BACP,WACA,UACQ;AACR,SAAO,cAAc,SAAS,gBAAgB,QAAQ,IAAI;AAC5D;AAEA,SAAS,cAAc,MAA6B;AAClD,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,SAAS,IAAI,WAAW;AAC9B,WAAO,iBAAiB,QAAQ,MAAM;AACpC,UAAI,OAAO,OAAO,WAAW,UAAU;AACrC,gBAAQ,OAAO,MAAM;AACrB;AAAA,MACF;AACA,aAAO,IAAI,MAAM,gDAAgD,CAAC;AAAA,IACpE,CAAC;AACD,WAAO,iBAAiB,SAAS,MAAM;AACrC,aAAO,OAAO,SAAS,IAAI,MAAM,0BAA0B,CAAC;AAAA,IAC9D,CAAC;AACD,WAAO,cAAc,IAAI;AAAA,EAC3B,CAAC;AACH;AAEA,eAAe,yBACb,UACwB;AACxB,MAAI;AACF,UAAM,WAAW,MAAM,MAAM,QAAQ;AACrC,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,MAAM,kCAAkC,SAAS,MAAM,EAAE;AAAA,IACrE;AACA,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,WAAO,MAAM,cAAc,IAAI;AAAA,EACjC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,wBAAwB,UAA0C;AACzE,MAAI,SAAS,WAAW,OAAO,GAAG;AAChC,WAAO,QAAQ,QAAQ,QAAQ;AAAA,EACjC;AAEA,QAAM,SAAS,yBAAyB,IAAI,QAAQ;AACpD,MAAI,QAAQ;AACV,6BAAyB,OAAO,QAAQ;AACxC,6BAAyB,IAAI,UAAU,MAAM;AAC7C,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,yBAAyB,QAAQ;AACjD,2BAAyB,IAAI,UAAU,OAAO;AAC9C,SAAO,yBAAyB,OAAO,oCAAoC;AACzE,UAAM,iBAAiB,yBAAyB,KAAK,EAAE,KAAK,EAAE;AAC9D,QAAI,OAAO,mBAAmB,UAAU;AACtC;AAAA,IACF;AACA,6BAAyB,OAAO,cAAc;AAAA,EAChD;AACA,SAAO;AACT;AAEA,eAAe,0BAA0B;AAAA,EACvC;AAAA,EACA;AACF,GAGkB;AAChB,QAAM,cAAc,MAAM,KAAK,UAAU,iBAAiB,KAAK,CAAC;AAEhE,QAAM,QAAQ;AAAA,IACZ,OAAO,IAAI,OAAO,WAAW,UAAU;AACrC,YAAM,aAAa,YAAY,KAAK;AACpC,UAAI,CAAC,YAAY;AACf;AAAA,MACF;AAEA,iBAAW,gBAAgB,QAAQ;AACnC,iBAAW,gBAAgB,OAAO;AAClC,YAAM,WAAW,UAAU;AAC3B,UAAI,CAAC,UAAU;AACb;AAAA,MACF;AACA,YAAM,iBACH,MAAM,wBAAwB,QAAQ,KAAM;AAC/C,YAAM,kBAAkB,MAAM;AAAA,QAC5B;AAAA,QACA;AAAA,MACF;AACA,UAAI,mBAAmB,oBAAoB,gBAAgB;AACzD,mBAAW,MAAM;AACjB;AAAA,MACF;AACA,iBAAW,MAAM;AAAA,IACnB,CAAC;AAAA,EACH;AACF;AAEA,eAAe,iBAAiB,KAAwC;AACtE,QAAM,QAAQ,IAAI,MAAM;AACxB,QAAM,MAAM,oCAAoC,mBAAmB,GAAG,CAAC;AACvE,QAAM,MAAM,OAAO;AACnB,SAAO;AACT;AAEA,SAAS,kCAAkC;AAAA,EACzC;AAAA,EACA;AACF,GAGS;AACP,MAAI,gBAAgB,KAAK,iBAAiB,GAAG;AAC3C,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,KAAK;AAAA,IACjB,OAAO,oBAAoB;AAAA,IAC3B;AAAA,EACF;AACA,SAAO;AAAA,IACL,QAAQ,KAAK,IAAI,GAAG,KAAK,KAAK,gBAAgB,KAAK,CAAC;AAAA,IACpD,OAAO,KAAK,IAAI,GAAG,KAAK,KAAK,eAAe,KAAK,CAAC;AAAA,EACpD;AACF;AAEA,eAAe,yCACb,UACA,WACwB;AACxB,QAAM,aAAa,kCAAkC,SAAS;AAC9D,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,IAAI,MAAM;AACxB,QAAM,MAAM;AACZ,MAAI;AACF,UAAM,MAAM,OAAO;AAAA,EACrB,QAAQ;AACN,WAAO;AAAA,EACT;AACA,MACE,MAAM,gBAAgB,WAAW,SACjC,MAAM,iBAAiB,WAAW,QAClC;AACA,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,SAAO,QAAQ,WAAW;AAC1B,SAAO,SAAS,WAAW;AAC3B,QAAM,UAAU,OAAO,WAAW,IAAI;AACtC,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AACA,MAAI;AACF,YAAQ,UAAU,OAAO,GAAG,GAAG,WAAW,OAAO,WAAW,MAAM;AAClE,WAAO,OAAO,UAAU,WAAW;AAAA,EACrC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,6BACP,SACoC;AACpC,QAAM,aAAa,wBAAwB,OAAO;AAClD,MAAI,CAAC,kBAAkB,UAAU,GAAG;AAClC,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,4BAA4B,SAAS,UAAU;AACrE,MAAI,CAAC,eAAe;AAClB,WAAO;AAAA,EACT;AACA,QAAM,EAAE,OAAO,OAAO,IAAI;AAC1B,QAAM,aAAa,SAAS,8BAA8B;AAC1D,QAAM,MAAM,WAAW;AACvB,QAAM,MAAM,OAAO;AACnB,QAAM,MAAM,MAAM;AAClB,QAAM,MAAM,QAAQ,GAAG,WAAW,KAAK;AACvC,QAAM,MAAM,SAAS,GAAG,WAAW,MAAM;AACzC,QAAM,MAAM,YAAY;AACxB,QAAM,MAAM,UAAU;AACtB,QAAM,MAAM,aAAa;AACzB,QAAM,MAAM,gBAAgB;AAC5B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,MAAM;AAAA,EACR;AACF;AAEA,SAAS,2CACP,OACA,aACM;AACN,QAAM,MAAM,QAAQ,GAAG,YAAY,KAAK;AACxC,QAAM,MAAM,SAAS,GAAG,YAAY,MAAM;AAE1C,QAAM,iBAAiB,MAAM;AAAA,IAC3B;AAAA,EACF;AACA,MAAI,CAAC,gBAAgB;AACnB;AAAA,EACF;AAEA,iBAAe,MAAM,UAAU;AAC/B,iBAAe,MAAM,QAAQ,GAAG,YAAY,KAAK;AACjD,iBAAe,MAAM,SAAS,GAAG,YAAY,MAAM;AACnD,iBAAe,MAAM,UAAU;AAC/B,iBAAe,MAAM,SAAS;AAC9B,iBAAe,MAAM,eAAe;AACpC,iBAAe,MAAM,aAAa;AAClC,iBAAe,MAAM,YAAY;AACjC,iBAAe,MAAM,YAAY,cAAc,kCAAkC;AACnF;AAEA,eAAe,6BAA6B;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AACF,GAAsE;AACpE,QAAM,0BAA0B;AAAA,IAC9B,WAAW;AAAA,IACX;AAAA,EACF,CAAC;AAED,QAAM,aAAa,sBAAsB,OAAO,IAAI;AACpD,QAAM,QAAQ,MAAM,iBAAiB,UAAU;AAE/C,QAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,SAAO,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,QAAQ,kBAAkB,CAAC;AACtE,SAAO,SAAS,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,SAAS,kBAAkB,CAAC;AACxE,QAAM,UAAU,OAAO,WAAW,IAAI;AACtC,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AACA,UAAQ,wBAAwB;AAChC,UAAQ,wBAAwB;AAChC,UAAQ,UAAU,OAAO,GAAG,GAAG,OAAO,OAAO,OAAO,MAAM;AAC1D,SAAO,EAAE,QAAQ,KAAK;AACxB;AAEA,eAAe,sBACb,SACsC;AACtC,QAAM,kBAAkB,6BAA6B,OAAO;AAC5D,SAAO,kBAAkB,6BAA6B,eAAe,IAAI;AAC3E;AAEA,SAAS,yBAAyB,QAA0C;AAC1E,MAAI,OAAO,SAAS,KAAK,OAAO,UAAU,GAAG;AAC3C,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,KAAK;AAAA,IACjB;AAAA,IACA,sBAAsB,OAAO;AAAA,IAC7B,uBAAuB,OAAO;AAAA,EAChC;AACA,QAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,SAAO,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,QAAQ,KAAK,CAAC;AAC3D,SAAO,SAAS,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,SAAS,KAAK,CAAC;AAC7D,QAAM,UAAU,OAAO,WAAW,IAAI;AACtC,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AACA,UAAQ,UAAU,QAAQ,GAAG,GAAG,OAAO,OAAO,OAAO,MAAM;AAC3D,SAAO,OAAO,UAAU,WAAW;AACrC;AAEA,eAAe,0BAA0B;AAAA,EACvC;AAAA,EACA;AACF,GAGyC;AACvC,MAAI,CAAC,kBAAkB,IAAI,GAAG;AAC5B,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,IAAI,MAAM;AACxB,QAAM,MAAM;AACZ,QAAM,MAAM,OAAO;AAEnB,QAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,SAAO,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,QAAQ,kBAAkB,CAAC;AACtE,SAAO,SAAS,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,SAAS,kBAAkB,CAAC;AACxE,QAAM,UAAU,OAAO,WAAW,IAAI;AACtC,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AACA,UAAQ,wBAAwB;AAChC,UAAQ,wBAAwB;AAChC,UAAQ,UAAU,OAAO,GAAG,GAAG,OAAO,OAAO,OAAO,MAAM;AAC1D,SAAO,EAAE,QAAQ,KAAK;AACxB;AAEA,SAAS,2BAA2B,SAA8B;AAChE,QAAM,WAAW,OACd,iBAAiB,OAAO,EACxB,iBAAiB,qBAAqB;AACzC,QAAM,SAAS,OAAO,WAAW,QAAQ;AACzC,SAAO,OAAO,SAAS,MAAM,KAAK,SAAS,IACvC,SACA;AACN;AAEA,SAAS,8BACP,SAC4B;AAC5B,QAAM,OAAO,wBAAwB,OAAO;AAC5C,MACE,QAAQ,QAAQ,oBAAoB,UACpC,QAAQ,QAAQ,cAAc,aAC9B;AACA,WAAO;AAAA,EACT;AAEA,QAAM,oBACJ,QAAQ,QAAQ,aAAa,cAC7B,QAAQ,QAAQ,eAAe;AACjC,MAAI,CAAC,mBAAmB;AACtB,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,2BAA2B,OAAO;AACvD,QAAM,oBAAoB,eAAe;AACzC,SAAO;AAAA,IACL,GAAG;AAAA,IACH,QAAQ,KAAK,UAAU,oBAAoB,KAAK,SAAS;AAAA,IACzD,OAAO,KAAK,SAAS,oBAAoB,KAAK,QAAQ;AAAA,EACxD;AACF;AAEO,SAAS,qCACd,QACA,iBACM;AACN,MAAI,iBAAiB;AACnB,6BAAyB,OAAO,MAAM;AACtC,6BAAyB,IAAI,QAAQ,eAAe;AACpD,WAAO,yBAAyB,OAAO,iCAAiC;AACtE,YAAM,eAAe,yBAAyB,KAAK,EAAE,KAAK,EAAE;AAC5D,UAAI,OAAO,iBAAiB,UAAU;AACpC;AAAA,MACF;AACA,+BAAyB,OAAO,YAAY;AAAA,IAC9C;AAAA,EACF;AACF;AAEO,SAAS,oCACd,QACe;AACf,SAAO,yBAAyB,IAAI,MAAM,KAAK;AACjD;AAEA,eAAsB,iCACpB,QACA,UAAqC,CAAC,GACd;AACxB,MAAI,CAAC,QAAQ,aAAa;AACxB,UAAM,wBAAwB,oCAAoC,MAAM;AACxE,QAAI,uBAAuB;AACzB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,gBACJ,MAAM;AAAA,IACJ,SAAS,iBAA8B,4BAA4B;AAAA,EACrE,EAAE,KAAK,CAAC,cAAc,UAAU,QAAQ,sBAAsB,MAAM,KACpE;AACF,QAAM,gBAAgB,gBAClB,+BAA+B,aAAa,IAC5C;AACJ,MAAI,CAAC,eAAe;AAClB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,MAAM,sBAAsB,aAAa,EAAE,MAAM,MAAM,IAAI;AAC3E,QAAM,kBAAkB,UACpB,yBAAyB,QAAQ,MAAM,IACvC;AACJ,uCAAqC,QAAQ,eAAe;AAC5D,SAAO;AACT;AAEA,eAAe,gDACb,MACA,QAII,CAAC,GACmB;AACxB,QAAM,kBAAkB,MAAM,QAAQ;AAAA,IACpC,MAAM,0BAA0B,IAAI,KAAK;AAAA,EAC3C,EAAE,MAAM,MAAM,IAAI;AAClB,MAAI,CAAC,iBAAiB;AACpB,WAAO;AAAA,EACT;AACA,uCAAqC,KAAK,IAAI,eAAe;AAC7D,mCAAiC,MAAM,iBAAiB,KAAK;AAC7D,SAAO;AACT;AAEA,SAAS,iCACP,MACA,iBACA,OAIM;AACN,MAAI,CAAC,mBAAmB,CAAC,MAAM,kBAAkB;AAC/C;AAAA,EACF;AACA,QAAM,MAAM,MAAM,6BAA6B,IAAI,KAAK;AACxD,MAAI,CAAC,KAAK;AACR;AAAA,EACF;AACA,QAAM,iBAAiB,MAAM,EAAE,KAAK,gBAAgB,CAAC;AACvD;AAEA,SAAS,sBACP,SACA,MACQ;AACR,QAAM,eAAe;AACrB,QAAM,cAAc,SAAS,eAAe;AAAA,IAC1C;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,MAAM,YAAY;AACxB,MAAI,aAAa,SAAS,YAAY;AACtC,MAAI,aAAa,SAAS,OAAO,KAAK,KAAK,CAAC;AAC5C,MAAI,aAAa,UAAU,OAAO,KAAK,MAAM,CAAC;AAC9C,MAAI,aAAa,WAAW,OAAO,KAAK,KAAK,IAAI,KAAK,MAAM,EAAE;AAE9D,QAAM,gBAAgB,YAAY;AAAA,IAChC;AAAA,IACA;AAAA,EACF;AACA,gBAAc,aAAa,SAAS,MAAM;AAC1C,gBAAc,aAAa,UAAU,MAAM;AAC3C,gBAAc,aAAa,KAAK,GAAG;AACnC,gBAAc,aAAa,KAAK,GAAG;AACnC,gBAAc,YAAY,YAAY,WAAW,SAAS,IAAI,CAAC;AAC/D,MAAI,YAAY,aAAa;AAE7B,SAAO,IAAI,cAAc,EAAE,kBAAkB,WAAW;AAC1D;AAEO,SAAS,2BAAkC;AAAA,EAChD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,oBAAoB;AAAA,EACpB;AAAA,EACA;AAAA,EACA,4BAAAC;AAAA,EACA;AACF,GAUoC;AAClC,QAAM,wBAAwBC,QAAO,oBAAI,IAAyB,CAAC;AACnE,QAAM,YAAYA,QAAiC,IAAI;AACvD,QAAM,SAASA,QAAsB,IAAI;AACzC,QAAM,yBAAyBA,QAAO,CAAC;AACvC,QAAM,sBAAsBA,QAA4B,IAAI;AAC5D,QAAM,wCAAwCA,QAAO,oBAAI,IAAY,CAAC;AACtE,QAAM,uCAAuCA;AAAA,IAC3C,oBAAI,IAA2C;AAAA,EACjD;AACA,QAAM,mCAAmCA;AAAA,IACvC,oBAAI,IAAkC;AAAA,EACxC;AACA,QAAM,8BAA8BA,QAAO,CAAC;AAC5C,QAAM,mCAAmCA,QAA8B,IAAI;AAC3E,QAAM,mCACJA,QAAkD,IAAI;AACxD,QAAM,CAAC,gBAAgB,iBAAiB,IAAIC,UAAS,KAAK;AAC1D,QAAM,CAAC,oBAAoB,qBAAqB,IAAIA;AAAA,IAClD,MAAM,oBAAI,IAAY;AAAA,EACxB;AACA,QAAM,CAAC,sBAAsB,uBAAuB,IAClDA,UAAsC,IAAI;AAC5C,QAAM,CAAC,+BAA+B,gCAAgC,IACpEA,UAAoD,IAAI;AAE1D,QAAM,qBAAqBC;AAAA,IACzB,CAAC,WAAmB,YAAgC;AAClD,UAAI,SAAS;AACX,8BAAsB,QAAQ,IAAI,WAAW,OAAO;AACpD;AAAA,MACF;AACA,4BAAsB,QAAQ,OAAO,SAAS;AAAA,IAChD;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,wBAAwBA,aAAY,CAAC,cAAsB;AAC/D,UAAM,UAAU,sBAAsB,QAAQ,IAAI,SAAS,KAAK;AAChE,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,IACT;AACA,WAAO,8BAA8B,OAAO;AAAA,EAC9C,GAAG,CAAC,CAAC;AAEL,QAAM,mCAAmCA;AAAA,IACvC,OAAO,WAAmB,cAA6B;AACrD,UAAI,WAAW,sBAAsB,SAAS;AAC9C,eACM,QAAQ,IACX,CAAC,YAAY,CAAC,kBAAkB,QAAQ,MACzC,QAAQ,qCACR,SAAS,GACT;AACA,cAAM,0BAA0B;AAChC,YAAI,CAAC,UAAU,GAAG;AAChB,iBAAO;AAAA,QACT;AACA,mBAAW,sBAAsB,SAAS;AAAA,MAC5C;AACA,aAAO;AAAA,IACT;AAAA,IACA,CAAC,qBAAqB;AAAA,EACxB;AAEA,QAAM,qBAAqBA,aAAY,CAAC,WAAmB;AACzD,WACE,MAAM;AAAA,MACJ,SAAS,iBAA8B,4BAA4B;AAAA,IACrE,EAAE,KAAK,CAAC,cAAc,UAAU,QAAQ,sBAAsB,MAAM,KACpE;AAAA,EAEJ,GAAG,CAAC,CAAC;AAEL,QAAM,0BAA0BA;AAAA,IAC9B,CAAC,SAA+B,uBAAuB,IAAI,KAAK,KAAK;AAAA,IACrE,CAAC,oBAAoB;AAAA,EACvB;AAEA,QAAM,qCAAqCA,aAAY,CAAC,WAAmB;AACzE,UAAM,QAAQ,qCAAqC,QAAQ,IAAI,MAAM;AACrE,QAAI,OAAO;AACT,mBAAa,KAAK;AAClB,2CAAqC,QAAQ,OAAO,MAAM;AAAA,IAC5D;AACA,0CAAsC,QAAQ,OAAO,MAAM;AAAA,EAC7D,GAAG,CAAC,CAAC;AAEL,QAAM,sCAAsCA;AAAA,IAC1C,CAAC,WAAmB;AAClB,yCAAmC,MAAM;AACzC,4CAAsC,QAAQ,IAAI,MAAM;AAAA,IAC1D;AAAA,IACA,CAAC,kCAAkC;AAAA,EACrC;AAEA,QAAM,6CAA6CA;AAAA,IACjD,CAAC,QAAgB,UAAU,sCAAsC;AAC/D,YAAM,WAAW,qCAAqC,QAAQ,IAAI,MAAM;AACxE,UAAI,UAAU;AACZ,qBAAa,QAAQ;AAAA,MACvB;AACA,2CAAqC,QAAQ;AAAA,QAC3C;AAAA,QACA,WAAW,MAAM;AACf,+CAAqC,QAAQ,OAAO,MAAM;AAC1D,gDAAsC,QAAQ,OAAO,MAAM;AAAA,QAC7D,GAAG,OAAO;AAAA,MACZ;AAAA,IACF;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,kCAAkCA,aAAY,CAAC,WAAmB;AACtE,WAAO,sCAAsC,QAAQ,IAAI,MAAM;AAAA,EACjE,GAAG,CAAC,CAAC;AAEL,QAAM,4BAA4BA,aAAY,CAAC,WAAmB;AAChE,WAAO,iCAAiC,QAAQ,IAAI,MAAM,KAAK;AAAA,EACjE,GAAG,CAAC,CAAC;AAEL,QAAM,6BAA6BA;AAAA,IACjC,CAAC,QAAgB,YAAkC;AACjD,YAAM,QAAQ,iCAAiC;AAC/C,YAAM,OAAO,MAAM;AACnB,YAAM,IAAI,QAAQ,OAAO;AAAA,IAC3B;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,6BAA6BA,aAAY,CAAC,WAAmB;AACjE,qCAAiC,QAAQ,OAAO,MAAM;AAAA,EACxD,GAAG,CAAC,CAAC;AAEL,QAAM,8BAA8BA;AAAA,IAClC,CAAC,iBAA0B;AACzB,YAAM,mBAAmB,IAAI;AAAA,QAC3B,WACG,YAAY,EACZ,MAAM,OAAO,CAAC,SAAS,KAAK,gBAAgB,IAAI,EAChD,IAAI,CAAC,SAAS,KAAK,EAAE;AAAA,MAC1B;AACA,UAAI,cAAc;AAChB,yBAAiB,IAAI,YAAY;AAAA,MACnC;AACA,iBAAW,UAAU,iCAAiC,QAAQ,KAAK,GAAG;AACpE,YAAI,CAAC,iBAAiB,IAAI,MAAM,GAAG;AACjC,2CAAiC,QAAQ,OAAO,MAAM;AAAA,QACxD;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,UAAU;AAAA,EACb;AAEA,QAAM,mBAAmBA,aAAY,CAAC,WAAmB;AACvD,0BAAsB,CAAC,YAAY;AACjC,UAAI,QAAQ,IAAI,MAAM,GAAG;AACvB,eAAO;AAAA,MACT;AACA,aAAO,oBAAI,IAAI,CAAC,GAAG,SAAS,MAAM,CAAC;AAAA,IACrC,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,mBAAmBA,aAAY,CAAC,WAAmB;AACvD,0BAAsB,CAAC,YAAY;AACjC,UAAI,CAAC,QAAQ,IAAI,MAAM,GAAG;AACxB,eAAO;AAAA,MACT;AACA,YAAM,OAAO,IAAI,IAAI,OAAO;AAC5B,WAAK,OAAO,MAAM;AAClB,aAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,4BAA4BA,aAAY,CAAC,WAAmB;AAChE;AAAA,MAAwB,CAAC,YACvB,SAAS,OAAO,SAAS,OAAO;AAAA,IAClC;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,8BAA8BA,aAAY,CAAC,OAAe;AAC9D,QAAI,iCAAiC,SAAS,OAAO,IAAI;AACvD;AAAA,IACF;AACA,qCAAiC,UAAU;AAC3C,qCAAiC,UAAU;AAC3C,qCAAiC,IAAI;AAAA,EACvC,GAAG,CAAC,CAAC;AAEL,QAAM,qCAAqCA;AAAA,IACzC,OAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF,MAG4C;AAC1C,UAAI,CAAC,kBAAkB,WAAW,GAAG;AACnC,eAAO;AAAA,MACT;AAEA,YAAM,kBAAkB;AAAA,QACtB,QAAQ,YAAY;AAAA,QACpB,OAAO,YAAY;AAAA,MACrB;AACA,UAAI,UAAqB;AACzB,UAAI;AACF,kBACE,yBAAyB,MAAM;AAAA,UAC7B;AAAA,QACF,CAAC,KAAK;AAAA,MACV,QAAQ;AACN,kBAAU;AAAA,MACZ;AACA,UAAI,oBAAoB,OAAO,GAAG;AAChC,eAAO;AAAA,MACT;AACA,YAAM,YAAY,4BAA4B,UAAU;AACxD,kCAA4B,UAAU;AACtC,YAAM,iBAAqD;AAAA,QACzD,IAAI;AAAA,QACJ,QAAQ,KAAK;AAAA,QACb;AAAA,QACA,MAAM;AAAA,QACN,qBAAqB;AAAA,MACvB;AAEA,uCAAiC,UAAU;AAC3C,gBAAU,MAAM;AACd,yCAAiC,cAAc;AAAA,MACjD,CAAC;AAED,UAAI;AACF,cAAM,0BAA0B;AAChC,cAAM,0BAA0B;AAEhC,YAAI,iCAAiC,SAAS,OAAO,WAAW;AAC9D,iBAAO;AAAA,QACT;AAEA,cAAM,UAAU,iCAAiC;AACjD,YAAI,CAAC,SAAS;AACZ,iBAAO;AAAA,QACT;AAEA,cAAM,kBAAkB,6BAA6B,OAAO;AAC5D,YAAI,CAAC,iBAAiB;AACpB,iBAAO;AAAA,QACT;AAEA;AAAA,UACE,gBAAgB;AAAA,UAChB;AAAA,QACF;AACA,cAAM,UAAU,MAAM,6BAA6B;AAAA,UACjD,GAAG;AAAA,UACH,MAAM;AAAA,QACR,CAAC;AACD,eAAO;AAAA,MACT,QAAQ;AACN,eAAO;AAAA,MACT,UAAE;AACA,oCAA4B,SAAS;AAAA,MACvC;AAAA,IACF;AAAA,IACA,CAAC,6BAA6B,sBAAsB;AAAA,EACtD;AAEA,QAAM,cAAcA,aAAY,MAAM;AACpC,UAAM,SAAS,UAAU;AACzB,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,IACT;AACA,UAAM,mBAAmB,KAAK;AAAA,MAC5B,OAAO,oBAAoB;AAAA,MAC3B;AAAA,IACF;AACA,UAAM,gBAAgB,OAAO;AAC7B,UAAM,iBAAiB,OAAO;AAC9B,WAAO,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,gBAAgB,gBAAgB,CAAC;AACvE,WAAO,SAAS,KAAK,IAAI,GAAG,KAAK,MAAM,iBAAiB,gBAAgB,CAAC;AACzE,WAAO,MAAM,QAAQ,GAAG,aAAa;AACrC,WAAO,MAAM,SAAS,GAAG,cAAc;AACvC,UAAM,UAAU,OAAO,WAAW,IAAI;AACtC,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,IACT;AACA,YAAQ,aAAa,kBAAkB,GAAG,GAAG,kBAAkB,GAAG,CAAC;AACnE,WAAO,EAAE,SAAS,gBAAgB,cAAc;AAAA,EAClD,GAAG,CAAC,CAAC;AAEL,QAAM,cAAcA,aAAY,MAAM;AACpC,UAAM,SAAS,UAAU;AACzB,UAAM,UAAU,QAAQ,WAAW,IAAI,KAAK;AAC5C,QAAI,UAAU,SAAS;AACrB,cAAQ,UAAU,GAAG,GAAG,OAAO,OAAO,OAAO,MAAM;AAAA,IACrD;AACA,sBAAkB,KAAK;AAAA,EACzB,GAAG,CAAC,CAAC;AAEL,QAAM,gBAAgBA,aAAY,CAAC,aAAa,SAAS;AACvD,2BAAuB,WAAW;AAClC,QAAI,OAAO,YAAY,MAAM;AAC3B,aAAO,qBAAqB,OAAO,OAAO;AAC1C,aAAO,UAAU;AAAA,IACnB;AACA,UAAM,UAAU,oBAAoB;AACpC,wBAAoB,UAAU;AAC9B,QAAI,YAAY;AACd,gBAAU;AAAA,IACZ;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,oBAAoBA;AAAA,IACxB,CAAC;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,MAOM;AACJ,UAAI,CAAC,UAAU;AACb,sBAAc;AAAA,MAChB;AACA,YAAM,QAAQ,YAAY;AAC1B,UAAI,CAAC,OAAO;AACV,mBAAW;AACX;AAAA,MACF;AAEA,YAAM,aAAa,uBAAuB;AAC1C,YAAM,YAAY,oBAAoB,QAAQ;AAC9C,UAAI,YAA2B;AAC/B,0BAAoB,UAAU,YAAY;AAC1C,wBAAkB,IAAI;AACtB;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,QACN;AAAA,UACE;AAAA,UACA;AAAA,UACA,UAAU;AAAA,UACV,SAAS,QAAQ;AAAA,UACjB,aAAa,QAAQ;AAAA,QACvB;AAAA,MACF;AAEA,YAAM,YAAY,CAAC,cAAsB;AACvC,YAAI,eAAe,uBAAuB,SAAS;AACjD;AAAA,QACF;AACA,sBAAc;AACd,cAAM,WAAW;AAAA,WACd,YAAY,aAAa;AAAA,QAC5B;AACA,cAAM,oBAAoB;AAAA,UACxB;AAAA,UACA;AAAA,QACF;AACA;AAAA,UACE,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM;AAAA,UACN;AAAA,YACE;AAAA,YACA;AAAA,YACA,UAAU;AAAA,YACV,SAAS,QAAQ;AAAA,YACjB,aAAa,QAAQ;AAAA,UACvB;AAAA,QACF;AAEA,YAAI,WAAW,GAAG;AAChB,iBAAO,UAAU,OAAO,sBAAsB,SAAS;AACvD;AAAA,QACF;AAEA,eAAO,UAAU;AACjB,4BAAoB,UAAU;AAC9B,mBAAW;AAAA,MACb;AAEA,aAAO,UAAU,OAAO,sBAAsB,SAAS;AAAA,IACzD;AAAA,IACA,CAAC,aAAa,aAAa;AAAA,EAC7B;AAEA,QAAM,0BAA0BA;AAAA,IAC9B,CAAC;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,MAOM;AACJ,UAAI,CAAC,UAAU;AACb,sBAAc;AAAA,MAChB;AACA,YAAM,aAAa,wBAAwB,WAAW;AACtD,UAAI,CAAC,kBAAkB,UAAU,KAAK,CAAC,kBAAkB,QAAQ,GAAG;AAClE,mBAAW;AACX;AAAA,MACF;AAEA,YAAM,aAAa,uBAAuB;AAC1C,YAAM,aAAa,oBAAoB,UAAU;AACjD,YAAM,WAAW,oBAAoB,QAAQ;AAC7C,YAAM,cAAc,KAAK;AAAA,QACvB;AAAA,QACA,KAAK;AAAA,UACH;AAAA,UACA,SAAS,QAAQ,KAAK,IAAI,GAAG,WAAW,KAAK;AAAA,UAC7C,SAAS,SAAS,KAAK,IAAI,GAAG,WAAW,MAAM;AAAA,QACjD;AAAA,MACF;AACA,YAAM,wBAAwB,YAAY,MAAM;AAChD,YAAM,0BAA0B,YAAY,MAAM;AAClD,YAAM,qBAAqB,YAAY,MAAM;AAC7C,YAAM,iBAAiB,YAAY,MAAM;AACzC,kBAAY,MAAM,gBAAgB;AAClC,kBAAY,MAAM,kBAAkB;AACpC,kBAAY,MAAM,aAAa;AAC/B,kBAAY,MAAM,SAAS;AAE3B,YAAM,gBAAgB,eAAe,SAAS,IAAI,WAAW,CAAC,OAC5D,SAAS,IAAI,WAAW,CAC1B,gBAAgB,WAAW;AAC3B,YAAM,kBAAkB;AACxB,YAAM,YACJ,cAAc,SACV;AAAA,QACE;AAAA,UACE,SAAS;AAAA,UACT,WAAW;AAAA,QACb;AAAA,QACA;AAAA,UACE,SAAS;AAAA,UACT,WAAW;AAAA,QACb;AAAA,MACF,IACA;AAAA,QACE;AAAA,UACE,SAAS;AAAA,UACT,WAAW;AAAA,QACb;AAAA,QACA;AAAA,UACE,SAAS;AAAA,UACT,WAAW;AAAA,QACb;AAAA,MACF;AACN,YAAM,YAAY,YAAY,QAAQ,WAAW;AAAA,QAC/C,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,MAAM;AAAA,MACR,CAAC;AAED,YAAM,iBAAiB,MAAM;AAC3B,kBAAU,OAAO;AACjB,oBAAY,MAAM,gBAAgB;AAClC,oBAAY,MAAM,kBAAkB;AACpC,oBAAY,MAAM,aAAa;AAC/B,oBAAY,MAAM,SAAS;AAAA,MAC7B;AAEA,0BAAoB,UAAU,MAAM;AAClC,uBAAe;AACf,iBAAS;AAAA,MACX;AACA,gBAAU,SACP,KAAK,MAAM;AACV,YAAI,eAAe,uBAAuB,SAAS;AACjD;AAAA,QACF;AACA,4BAAoB,UAAU;AAC9B,uBAAe;AACf,mBAAW;AAAA,MACb,CAAC,EACA,MAAM,MAAM;AACX,YAAI,eAAe,uBAAuB,SAAS;AACjD;AAAA,QACF;AACA,4BAAoB,UAAU;AAC9B,uBAAe;AACf,mBAAW;AAAA,MACb,CAAC;AAAA,IACL;AAAA,IACA,CAAC,aAAa;AAAA,EAChB;AAEA,EAAAC,WAAU,MAAM,MAAM,cAAc,KAAK,GAAG,CAAC,aAAa,CAAC;AAE3D,QAAM,8BAA8BD;AAAA,IAClC,OACE,QACA,WACA,YACA,kBACA,kBACG;AACH,YAAM,6BAA6B,mBAAmB,IAClD,QACA;AACJ,UAAI,+BAA+B,OAAO;AACxC,4BAAoB,UAAU;AAC9B,yBAAiB,MAAM;AACvB,mCAA2B,MAAM;AACjC;AAAA,MACF;AAEA,YAAM,0BAA0B;AAChC,UAAI,eAAe,uBAAuB,SAAS;AACjD;AAAA,MACF;AACA,YAAM,mBAAmB,sBAAsB,SAAS;AACxD,YAAM,WACJ,oBAAoB,kBAAkB,gBAAgB,IAClD,mBACA;AACN,YAAM,cAAc,mBAAmB,MAAM;AAC7C,UAAI,+BAA+B,SAAS;AAC1C,YAAI,CAAC,YAAY,CAAC,eAAe,CAAC,kBAAkB,QAAQ,GAAG;AAC7D,8BAAoB,UAAU;AAC9B,2BAAiB,MAAM;AACvB,qCAA2B,MAAM;AACjC;AAAA,QACF;AACA,kBAAU,MAAM;AACd,2BAAiB,MAAM;AAAA,QACzB,CAAC;AACD,gCAAwB;AAAA,UACtB,WAAW;AAAA,UACX;AAAA,UACA;AAAA,UACA,UAAU,MAAM;AACd,sBAAU,MAAM;AACd,+BAAiB,MAAM;AAAA,YACzB,CAAC;AACD,uCAA2B,MAAM;AAAA,UACnC;AAAA,UACA,YAAY,MAAM;AAChB,sBAAU,MAAM;AACd,+BAAiB,MAAM;AAAA,YACzB,CAAC;AACD,uCAA2B,MAAM;AAAA,UACnC;AAAA,QACF,CAAC;AACD;AAAA,MACF;AAEA,UAAI,CAAC,YAAY,CAAC,kBAAkB,QAAQ,GAAG;AAC7C,4BAAoB,UAAU;AAC9B,yBAAiB,MAAM;AACvB,mCAA2B,MAAM;AACjC;AAAA,MACF;AAEA,YAAM,gBAAgB,0BAA0B,MAAM;AACtD,YAAM,qBAAqB,cACvB,wBAAwB,WAAW,IACnC;AACJ,YAAM,mCACJ,kBAAkB,SACjB,gCAAgC,aAAa,KAAK,UAAU;AAC/D,YAAM,yBACJ,iBACA,CAAC,oCACD,CAAC,sBACD,CAAC,kBAAkB,kBAAkB,IACjC,OACA,MAAM,mCAAmC;AAAA,QACvC,MAAM;AAAA,QACN,aAAa;AAAA,MACf,CAAC,EAAE,MAAM,MAAM,IAAI;AACzB,UAAI,eAAe,uBAAuB,SAAS;AACjD;AAAA,MACF;AACA,YAAM,gBACJ,iBAAiB,0BAA0B,CAAC,cACxC,OACA,+BAA+B,WAAW;AAChD,UAAI,CAAC,iBAAiB,CAAC,0BAA0B,CAAC,eAAe;AAC/D,4BAAoB,UAAU;AAC9B,yBAAiB,MAAM;AACvB,mCAA2B,MAAM;AACjC;AAAA,MACF;AAEA,YAAM,UACJ,iBACA,2BACC,gBACG,MAAM,sBAAsB,aAAa,EAAE,MAAM,MAAM,IAAI,IAC3D;AACN,UAAI,eAAe,uBAAuB,SAAS;AACjD;AAAA,MACF;AACA,UAAI,CAAC,SAAS;AACZ,4BAAoB,UAAU;AAC9B,yBAAiB,MAAM;AACvB,mCAA2B,MAAM;AACjC;AAAA,MACF;AAEA,wBAAkB;AAAA,QAChB,WAAW;AAAA,QACX;AAAA,QACA,UAAU,MAAM;AACd,oBAAU,MAAM;AACd,6BAAiB,MAAM;AAAA,UACzB,CAAC;AACD,qCAA2B,MAAM;AACjC,sBAAY;AAAA,QACd;AAAA,QACA,YAAY,MAAM;AAChB,oBAAU,MAAM;AACd,6BAAiB,MAAM;AAAA,UACzB,CAAC;AACD,qCAA2B,MAAM;AACjC,sBAAY;AAAA,QACd;AAAA,QACA,UAAU;AAAA,QACV;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,uBAAuBA;AAAA,IAC3B,CACE,WACA,QACA,WACG;AACH,YAAM,SAAS,WACZ,YAAY,EACZ,MAAM,KAAK,CAAC,SAAS,KAAK,OAAO,MAAM;AAC1C,UAAI,CAAC,QAAQ;AACX,aAAK,QAAQ,QAAQ,OAAO,CAAC,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AAC7C;AAAA,MACF;AAEA,UAAI,OAAO,gBAAgB,MAAM;AAC/B,aAAK,QAAQ,QAAQ,OAAO,CAAC,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AAC7C;AAAA,MACF;AAEA,YAAM,6BAA6B,mBAAmB,IAClD,QACA;AACJ,UAAI,+BAA+B,OAAO;AACxC,sBAAc;AACd,kBAAU,MAAM;AACd,2BAAiB,MAAM;AAAA,QACzB,CAAC;AACD,aAAK,QAAQ,QAAQ,OAAO,CAAC,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AAC7C;AAAA,MACF;AAEA,oBAAc;AACd,YAAM,mBAAmB,sBAAsB,SAAS;AACxD,uBAAiB,MAAM;AACvB,0BAAoB,UAAU,MAAM;AAClC,YAAI,OAAO,YAAY,MAAM;AAC3B,iBAAO,qBAAqB,OAAO,OAAO;AAC1C,iBAAO,UAAU;AAAA,QACnB;AACA,kBAAU,MAAM;AACd,2BAAiB,MAAM;AAAA,QACzB,CAAC;AACD,mCAA2B,MAAM;AACjC,oBAAY;AAAA,MACd;AACA,YAAM,aAAa,uBAAuB;AAC1C,aAAO,UAAU,OAAO,sBAAsB,MAAM;AAClD,eAAO,UAAU;AACjB,YAAI,eAAe,uBAAuB,SAAS;AACjD;AAAA,QACF;AACA,aAAK,QAAQ,QAAQ,OAAO,CAAC,EAC1B,MAAM,MAAM,IAAI,EAChB,KAAK,MAAM;AACV,cAAI,eAAe,uBAAuB,SAAS;AACjD;AAAA,UACF;AACA,eAAK;AAAA,YACH;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACL,CAAC;AAAA,IACH;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,uBAAuBA;AAAA,IAC3B,CAAC,QAAgB,aAA0B;AACzC,YAAM,YAAY;AAChB,oCAA4B;AAC5B,cAAM,SAAS,WACZ,YAAY,EACZ,MAAM,KAAK,CAAC,SAAS,KAAK,OAAO,MAAM;AAC1C,YAAI,CAAC,QAAQ;AACX;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,cACE,QAAQ;AAAA,cACR,QAAQ;AAAA,YACV;AAAA,YACA;AAAA,UACF;AACA;AAAA,QACF;AACA,mCAA2B,MAAM;AACjC,cAAM,cACJ,aAAa,MAAM,WAAW,SAAS,aAAa,MAAM;AAC5D,cAAM,6BAA6B,mBAAmB,IAClD,QACA;AACJ,cAAM,uBACJ,gCAAgC,MAAM,KAAK;AAC7C,YAAI,+BAA+B,OAAO;AACxC,wBAAc;AACd,cAAI,UAAyB;AAC7B,cAAI,UAAgD;AACpD,cAAIE,qBAAoB;AACxB,gBAAMC,kBAAiB,MAAM;AAC3B,gBAAID,oBAAmB;AACrB;AAAA,YACF;AACA,YAAAA,qBAAoB;AACpB,gBAAI,YAAY,MAAM;AACpB,qBAAO,qBAAqB,OAAO;AACnC,wBAAU;AAAA,YACZ;AACA,gBAAI,YAAY,MAAM;AACpB,2BAAa,OAAO;AACpB,wBAAU;AAAA,YACZ;AACA,gCAAoB,UAAU;AAC9B,sBAAU,MAAM;AACd,wCAA0B,MAAM;AAChC,+BAAiB,MAAM;AACvB,0BAAY;AAAA,YACd,CAAC;AACD,uDAA2C,MAAM;AAAA,UACnD;AACA,8BAAoB,UAAU,MAAM;AAClC,+CAAmC,MAAM;AACzC,YAAAC,gBAAe;AAAA,UACjB;AACA,8CAAoC,MAAM;AAC1C,oBAAU,MAAM;AACd,6BAAiB,MAAM;AACvB,oCAAwB;AAAA,cACtB,GAAG;AAAA,cACH,aAAa;AAAA,cACb,mBAAmB,KAAK,IAAI;AAAA,YAC9B,CAAC;AAAA,UACH,CAAC;AACD,cAAI,sBAAsB;AACxB,iBAAK,gDAAgD,QAAQ;AAAA,cAC3D;AAAA,cACA;AAAA,cACA,4BAAAN;AAAA,YACF,CAAC;AAAA,UACH;AACA,oBAAU,OAAO,sBAAsB,MAAM;AAC3C,sBAAU;AACV,sBAAU,WAAWM,iBAAgB,CAAC;AAAA,UACxC,CAAC;AACD;AAAA,QACF;AAEA,YAAI,+BAA+B,SAAS;AAC1C,wBAAc;AACd,gBAAMC,cAAa,uBAAuB;AAC1C,gBAAMC,eAAc,mBAAmB,MAAM;AAC7C,cAAI,CAACA,cAAa;AAChB;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,gBACE,GAAG,kBAAkB,MAAM;AAAA,gBAC3B,MAAM;AAAA,gBACN,QAAQ;AAAA,cACV;AAAA,cACA;AAAA,YACF;AACA,wBAAY;AACZ;AAAA,UACF;AACA,gBAAMC,wBACJ,wBAAwB,uBAAuB,YAAY,MAAM;AACnE,cAAI,wBAAwB,CAACA,uBAAsB;AACjD,sBAAU,MAAM;AACd,yBAAW,SAAS,UAAU,MAAM;AAAA,YACtC,CAAC;AACD,kBAAM,0BAA0B;AAChC,gBAAIF,gBAAe,uBAAuB,SAAS;AACjD;AAAA,YACF;AAAA,UACF;AAEA,cAAI,sBAAsB;AACxB,iBAAK,gDAAgD,QAAQ;AAAA,cAC3D;AAAA,cACA;AAAA,cACA,4BAAAP;AAAA,YACF,CAAC;AAAA,UACH;AAEA,cAAIK,qBAAoB;AACxB,gBAAMC,kBAAiB,MAAM;AAC3B,gBAAID,oBAAmB;AACrB;AAAA,YACF;AACA,YAAAA,qBAAoB;AACpB,wBAAY;AAAA,UACd;AACA,gBAAM,yBAAyB,MAAM;AACnC,+CAAmC,MAAM;AACzC,sBAAU,MAAM;AACd,wCAA0B,MAAM;AAChC,cAAAC,gBAAe;AAAA,YACjB,CAAC;AAAA,UACH;AACA,gBAAMI,wBAA6C;AAAA,YACjD,GAAG;AAAA,YACH,aAAa;AAAA,YACb,mBAAmB,KAAK,IAAI;AAAA,UAC9B;AACA,8CAAoC,MAAM;AAE1C,oBAAU,MAAM;AACd,oCAAwBA,qBAAoB;AAAA,UAC9C,CAAC;AACD,8BAAoB,UAAU;AAE9B,gBAAM,0BAA0B;AAChC,cAAIH,gBAAe,uBAAuB,SAAS;AACjD;AAAA,UACF;AAEA,gBAAMI,aAAY,wBAAwBD,qBAAoB;AAC9D,gBAAME,YAAW,MAAM;AAAA,YACrBD;AAAA,YACA,MAAMJ,gBAAe,uBAAuB;AAAA,UAC9C;AACA,cAAIA,gBAAe,uBAAuB,SAAS;AACjD;AAAA,UACF;AACA,cACE,CAACC,aAAY,eACb,CAACI,aACD,CAAC,kBAAkBA,SAAQ,GAC3B;AACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,gBACE,GAAG,kBAAkB,MAAM;AAAA,gBAC3B,WAAAD;AAAA,gBACA,UAAAC;AAAA,gBACA,MAAM;AAAA,gBACN,sBAAsBJ,aAAY;AAAA,gBAClC,0BAA0B,MAAM;AAAA,kBAC9B,sBAAsB,QAAQ,KAAK;AAAA,gBACrC,EAAE,OAAO,CAAC,QAAQ,IAAI,WAAW,YAAY,CAAC;AAAA,gBAC9C,QAAQ;AAAA,cACV;AAAA,cACA;AAAA,YACF;AACA,mCAAuB;AACvB;AAAA,UACF;AAEA,kCAAwB;AAAA,YACtB,WAAW;AAAA,YACX,UAAAI;AAAA,YACA,aAAAJ;AAAA,YACA,UAAU,MAAM;AACd,qCAAuB;AAAA,YACzB;AAAA,YACA,YAAY,MAAM;AAChB,kCAAoB,UAAU;AAC9B,wBAAU,MAAM;AACd,0CAA0B,MAAM;AAChC,gBAAAF,gBAAe;AAAA,cACjB,CAAC;AACD,yDAA2C,MAAM;AAAA,YACnD;AAAA,YACA,UAAU;AAAA,UACZ,CAAC;AACD;AAAA,QACF;AAEA,sBAAc;AACd,cAAM,aAAa,uBAAuB;AAC1C,cAAM,cAAc,mBAAmB,MAAM;AAC7C,YAAI,CAAC,aAAa;AAChB;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,cACE,GAAG,kBAAkB,MAAM;AAAA,cAC3B,MAAM;AAAA,cACN,QAAQ;AAAA,YACV;AAAA,YACA;AAAA,UACF;AACA,sBAAY;AACZ;AAAA,QACF;AACA,cAAM,aAAa,wBAAwB,WAAW;AACtD,YAAI,CAAC,kBAAkB,UAAU,GAAG;AAClC;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,cACE,GAAG,kBAAkB,MAAM;AAAA,cAC3B,MAAM;AAAA,cACN,QAAQ;AAAA,cACR;AAAA,YACF;AAAA,YACA;AAAA,UACF;AACA,sBAAY;AACZ;AAAA,QACF;AACA,cAAMI,wBAA6C;AAAA,UACjD,GAAG;AAAA,UACH,aAAa;AAAA,UACb,mBAAmB,KAAK,IAAI;AAAA,QAC9B;AACA,cAAM,0BAA0B,uBAC5B,OACA,MAAM,mCAAmC;AAAA,UACvC,MAAMA;AAAA,UACN,aAAa;AAAA,QACf,CAAC,EAAE,MAAM,MAAM,IAAI;AACvB,YAAI,eAAe,uBAAuB,SAAS;AACjD;AAAA,QACF;AACA,YAAI,CAAC,sBAAsB;AACzB,cAAI,CAAC,yBAAyB;AAC5B;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,gBACE,GAAG,kBAAkB,MAAM;AAAA,gBAC3B,MAAM;AAAA,gBACN,QAAQ;AAAA,gBACR;AAAA,gBACA;AAAA,cACF;AAAA,cACA;AAAA,YACF;AACA,wBAAY;AACZ;AAAA,UACF;AAAA,QACF;AAEA,cAAM,gBAAgB,+BAA+B,WAAW;AAChE,cAAM,kBAAkB,uBACpB,6BAA6B,aAAa,IAC1C;AACJ,YAAI,CAAC,iBAAiB;AACpB,cAAI,CAAC,yBAAyB;AAC5B;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,gBACE,GAAG,kBAAkB,MAAM;AAAA,gBAC3B,MAAM;AAAA,gBACN,QAAQ;AAAA,gBACR;AAAA,cACF;AAAA,cACA;AAAA,YACF;AACA,wBAAY;AACZ;AAAA,UACF;AAAA,QACF;AACA,cAAM,uBAAuB,uBAAuB,YAAY,MAAM;AACtE,YAAI,wBAAwB,CAAC,sBAAsB;AACjD,oBAAU,MAAM;AACd,uBAAW,SAAS,UAAU,MAAM;AAAA,UACtC,CAAC;AACD,gBAAM,0BAA0B;AAChC,cAAI,eAAe,uBAAuB,SAAS;AACjD;AAAA,UACF;AAAA,QACF;AACA,cAAM,yBAAyB,uBAC3B,QAAQ,QAAQ,0BAA0B,MAAM,KAAK,IAAI,EAAE;AAAA,UACzD,MAAM;AAAA,QACR,IACA,QAAQ,QAAQ,IAAI;AACxB,cAAM,kBAAkB,MAAM;AAC9B,cAAM,sBACJ,wBAAwB,kBACpB,MAAM,0BAA0B;AAAA,UAC9B;AAAA,UACA,MAAM;AAAA,QACR,CAAC,EAAE,MAAM,MAAM,IAAI,IACnB;AACN,cAAM,UACJ,2BACA,wBACC,kBACG,MAAM,6BAA6B,eAAe,EAAE;AAAA,UAClD,MAAM;AAAA,QACR,IACA;AACN,YAAI,eAAe,uBAAuB,SAAS;AACjD;AAAA,QACF;AACA,YAAI,CAAC,SAAS;AACZ;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,cACE,GAAG,kBAAkB,MAAM;AAAA,cAC3B,4BAA4B,QAAQ,uBAAuB;AAAA,cAC3D,uBAAuB,QAAQ,eAAe;AAAA,cAC9C,wBAAwB,QAAQ,mBAAmB;AAAA,cACnD,MAAM;AAAA,cACN,QAAQ;AAAA,cACR;AAAA,YACF;AAAA,YACA;AAAA,UACF;AACA,cAAI,iBAAiB;AACnB,iDAAqC,QAAQ,eAAe;AAC5D,6CAAiC,QAAQ,iBAAiB;AAAA,cACxD;AAAA,cACA,4BAAAV;AAAA,YACF,CAAC;AAAA,UACH;AACA,sBAAY;AACZ;AAAA,QACF;AACA,YAAI,iBAAiB;AACnB,+CAAqC,QAAQ,eAAe;AAC5D,2CAAiC,QAAQ,iBAAiB;AAAA,YACxD;AAAA,YACA,4BAAAA;AAAA,UACF,CAAC;AAAA,QACH,OAAO;AACL,gBAAM,0BAA0B;AAAA,YAC9B,QAAQ;AAAA,UACV;AACA,+CAAqC,QAAQ,uBAAuB;AACpE,2CAAiC,QAAQ,yBAAyB;AAAA,YAChE;AAAA,YACA,4BAAAA;AAAA,UACF,CAAC;AAAA,QACH;AACA,mCAA2B,QAAQ,OAAO;AAC1C,oCAA4B,MAAM;AAElC,YAAI,oBAAoB;AACxB,cAAM,iBAAiB,MAAM;AAC3B,cAAI,mBAAmB;AACrB;AAAA,UACF;AACA,8BAAoB;AACpB,sBAAY;AAAA,QACd;AACA,cAAM,8BAA8B,MAAM;AACxC,6CAAmC,MAAM;AACzC,oBAAU,MAAM;AACd,sCAA0B,MAAM;AAChC,6BAAiB,MAAM;AACvB,2BAAe;AAAA,UACjB,CAAC;AACD,sBAAY;AAAA,QACd;AACA,4BAAoB,UAAU;AAE9B,4CAAoC,MAAM;AAE1C,kBAAU,MAAM;AACd,kCAAwBU,qBAAoB;AAAA,QAC9C,CAAC;AAED,cAAM,0BAA0B;AAChC,YAAI,eAAe,uBAAuB,SAAS;AACjD;AAAA,QACF;AAEA,cAAM,YAAY,wBAAwBA,qBAAoB;AAC9D,cAAM,WAAW,MAAM;AAAA,UACrB;AAAA,UACA,MAAM,eAAe,uBAAuB;AAAA,QAC9C;AACA,YAAI,eAAe,uBAAuB,SAAS;AACjD;AAAA,QACF;AACA,YAAI,CAAC,YAAY,CAAC,kBAAkB,QAAQ,GAAG;AAC7C;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,cACE,GAAG,kBAAkB,MAAM;AAAA,cAC3B;AAAA,cACA;AAAA,cACA,MAAM;AAAA,cACN,0BAA0B,MAAM;AAAA,gBAC9B,sBAAsB,QAAQ,KAAK;AAAA,cACrC,EAAE,OAAO,CAAC,QAAQ,IAAI,WAAW,YAAY,CAAC;AAAA,cAC9C,QAAQ;AAAA,YACV;AAAA,YACA;AAAA,UACF;AACA,8BAAoB,UAAU;AAC9B,sCAA4B;AAC5B;AAAA,QACF;AAEA,0BAAkB;AAAA,UAChB,WAAW;AAAA,UACX;AAAA,UACA,UAAU,MAAM;AACd,wCAA4B;AAAA,UAC9B;AAAA,UACA,YAAY,MAAM;AAChB,uDAA2C,MAAM;AACjD,sBAAU,MAAM;AACd,wCAA0B,MAAM;AAChC,+BAAiB,MAAM;AACvB,6BAAe;AAAA,YACjB,CAAC;AACD,wBAAY;AAAA,UACd;AAAA,UACA,UAAU;AAAA,UACV;AAAA,QACF,CAAC;AACD,kBAAU,MAAM;AACd,2BAAiB,MAAM;AAAA,QACzB,CAAC;AAAA,MACH,GAAG;AAAA,IACL;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACAV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,EAAAI;AAAA,IACE,MAAM,MAAM;AACV,iBAAW,SAAS,qCAAqC,QAAQ,OAAO,GAAG;AACzE,qBAAa,KAAK;AAAA,MACpB;AACA,2CAAqC,QAAQ,MAAM;AACnD,4CAAsC,QAAQ,MAAM;AACpD,uCAAiC,QAAQ,MAAM;AAAA,IACjD;AAAA,IACA,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,YACE,OAAO,aAAa,cAChB,OACA;AAAA,MACE,gBAAAL,MAAAF,WAAA,EACE;AAAA,wBAAAC;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,WAAU;AAAA,YACV,oCACE,iBAAiB,WAAW;AAAA,YAE9B,eAAW;AAAA;AAAA,QACb;AAAA,QACC,gCACC,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,WAAU;AAAA,YACV,2CACE,8BAA8B;AAAA,YAEhC,wCACE,8BAA8B;AAAA,YAEhC,8CACE,8BAA8B,sBAC1B,SACA;AAAA,YAEN,OAAO;AAAA,cACL,QAAQ,8BAA8B,KAAK;AAAA,cAC3C,OAAO,8BAA8B,KAAK;AAAA,YAC5C;AAAA,YACA,eAAW;AAAA,YAEV,wCAA8B;AAAA;AAAA,QACjC,IACE;AAAA,SACN;AAAA,MACA,SAAS;AAAA,IACX;AAAA,IACN,mBAAmBK;AAAA,MACjB,CAAC,WAAmB,mBAAmB,IAAI,MAAM;AAAA,MACjD,CAAC,kBAAkB;AAAA,IACrB;AAAA,IACA,4BAA4BA;AAAA,MAC1B,CAAC,WAAmB,sBAAsB,OAAO;AAAA,MACjD,CAAC,oBAAoB;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AhB/wDM,gBAAAU,MAqGF,QAAAC,aArGE;AAjCC,SAAS,iBAAwB;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,4BAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAiC;AAC/B,SACE,gBAAAF,KAAC,qBAAkB,YACjB,0BAAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,4BAA4BE;AAAA,MAC5B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,EACF,GACF;AAEJ;AAEA,SAAS,sBAA6B;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,4BAAAA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAqD;AACnD,QAAM,aAAa,uBAA8B;AACjD,QAAM,eAAeC;AAAA,IACnB,CAAC,SAA4C;AAC3C,iBAAW,SAAS,eAAe,IAAI;AAAA,IACzC;AAAA,IACA,CAAC,UAAU;AAAA,EACb;AACA,QAAM,MAAM,wBAAwC,YAAY;AAChE,QAAM,QAAQ,2BAA2B;AAAA,IACvC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,4BAAAD;AAAA,IACA;AAAA,EACF,CAAC;AACD,yBAA8B,oBAAoB,SAAS,WAAW;AACtE,EAAAE,WAAU,MAAM;AACd,QAAI,CAAC,mBAAmB;AACtB;AAAA,IACF;AACA,eAAW,SAAS,qBAAqB,iBAAiB;AAAA,EAC5D,GAAG,CAAC,YAAY,iBAAiB,CAAC;AAClC,QAAM,iBAA4C,YAC9C;AAAA,IACE,iBAAiB,OAAO,KAAK,UAAU,UAAU,GAAG,CAAC;AAAA,IACrD,oBAAoB,UAAU,YAAY;AAAA,IAC1C,gBAAgB;AAAA,MACd,UAAU,OAAO;AAAA,IACnB;AAAA,EACF,IACA;AAEJ,SACE,gBAAAH;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW,CAAC,qBAAqB,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MACpE,8BAA4B,uBAAuB;AAAA,MACnD,0BAAwB,cAAc,QAAQ;AAAA,MAC9C,8BAA4B,cAAc,SAAS;AAAA,MAElD;AAAA,oBACC,gBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO;AAAA,YACP,eAAW;AAAA;AAAA,QACb,IACE;AAAA,QACH,kBACC,gBAAAA,KAAC,SAAI,WAAU,iCAAiC,0BAAgB,GAAE,IAChE;AAAA,QACH,iBAAiB,eAAe,IAAI;AAAA,QACrC,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA;AAAA,QACF;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA;AAAA,QACF;AAAA,QACC,qBACC,gBAAAA,KAAC,SAAI,WAAU,oCACZ,6BAAmB,GACtB,IACE;AAAA,QACH,gBAAgB,cAAc,IAAI;AAAA,QAClC,MAAM;AAAA;AAAA;AAAA,EACT;AAEJ;AAEA,SAAS,+CACP,KACQ;AACR,UAAQ,KAAK;AAAA,IACX,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,EACX;AACF;;;AkB7OO,SAAS,gCACd,OACmC;AACnC,QAAM,gBAAgB,MAAM,iBAAiB,CAAC;AAC9C,SAAO;AAAA,IACL,cAAc,QAAQ,CAAC,iBAAiB,aAAa,eAAe,CAAC,CAAC;AAAA,IACtE,MAAM,eAAe,CAAC;AAAA,IACtB,CAAC,UAAU,MAAM;AAAA,EACnB;AACF;AAEO,SAAS,kCACd,OAQoC;AACpC,QAAM,gBAAgB,MAAM,iBAAiB,CAAC;AAE9C,SAAO;AAAA,IACL,qBACE,MAAM,uBACN,wCAAwC,aAAa;AAAA,IACvD,OAAO;AAAA,MACL,cAAc,QAAQ,CAAC,iBAAiB,aAAa,SAAS,CAAC,CAAC;AAAA,MAChE,MAAM,SAAS,CAAC;AAAA,MAChB,CAAC,eAAe,WAAW;AAAA,IAC7B;AAAA,IACA,iBAAiB,4BAA4B;AAAA,MAC3C;AAAA,MACA,iBAAiB,MAAM;AAAA,IACzB,CAAC;AAAA,IACD,oBAAoB,+BAA+B;AAAA,MACjD;AAAA,MACA,iBAAiB,MAAM;AAAA,IACzB,CAAC;AAAA,EACH;AACF;AAEA,SAAS,WACP,mBACA,eACA,QACc;AACd,QAAM,SAAS,oBAAI,IAAe;AAClC,aAAW,QAAQ,CAAC,GAAG,mBAAmB,GAAG,aAAa,GAAG;AAC3D,UAAM,MAAM,OAAO,IAAI;AACvB,WAAO,OAAO,GAAG;AACjB,WAAO,IAAI,KAAK,IAAI;AAAA,EACtB;AACA,SAAO,CAAC,GAAG,OAAO,OAAO,CAAC;AAC5B;AAEA,SAAS,wCACP,eAC8C;AAC9C,QAAM,UAAU,cACb,IAAI,CAAC,iBAAiB,aAAa,mBAAmB,EACtD;AAAA,IAAO,CAAC,WACP,QAAQ,MAAM;AAAA,EAChB;AAEF,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,aAAa,OAAO;AAClB,iBAAW,UAAU,SAAS;AAC5B,cAAM,QAAQ,OAAO,aAAa,KAAK;AACvC,YAAI,UAAU,QAAQ,UAAU,QAAW;AACzC,iBAAO;AAAA,QACT;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,IACA,qBAAqB,OAAO;AAC1B,iBAAW,UAAU,SAAS;AAC5B,cAAM,QAAQ,OAAO,uBAAuB,KAAK;AACjD,YAAI,UAAU,QAAQ,UAAU,QAAW;AACzC,iBAAO;AAAA,QACT;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,IACA,kBAAkB,OAAO;AACvB,iBAAW,UAAU,SAAS;AAC5B,cAAM,QAAQ,OAAO,kBAAkB,KAAK;AAC5C,YAAI,UAAU,QAAQ,UAAU,QAAW;AACzC,iBAAO;AAAA,QACT;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,IACA,UAAU,UAAU;AAClB,YAAM,YAAY,QACf,IAAI,CAAC,WAAW,OAAO,YAAY,QAAQ,CAAC,EAC5C,OAAO,CAAC,YAAmC,QAAQ,OAAO,CAAC;AAC9D,aAAO,MAAM;AACX,mBAAW,WAAW,WAAW;AAC/B,kBAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,4BAA4B,OAGK;AACxC,QAAM,uBAAuB,MAAM,cAChC,IAAI,CAAC,iBAAiB,aAAa,eAAe,EAClD;AAAA,IACC,CACE,YAEA,QAAQ,OAAO;AAAA,EACnB;AAEF,MAAI,CAAC,MAAM,mBAAmB,qBAAqB,WAAW,GAAG;AAC/D,WAAO;AAAA,EACT;AAEA,SAAO,OAAO,YAAwC;AACpD,UAAM,iBAAiB,MAAM,MAAM,kBAAkB,OAAO;AAC5D,QAAI,mBAAmB,QAAQ,mBAAmB,QAAW;AAC3D,aAAO;AAAA,IACT;AAEA,eAAW,WAAW,sBAAsB;AAC1C,YAAM,SAAS,MAAM,QAAQ,OAAO;AACpC,UAAI,WAAW,QAAQ,WAAW,QAAW;AAC3C,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;AAEA,SAAS,+BAA+B,OAGK;AAC3C,QAAM,uBAAuB,MAAM,cAChC,IAAI,CAAC,iBAAiB,aAAa,kBAAkB,EACrD;AAAA,IACC,CACE,YAEA,QAAQ,OAAO;AAAA,EACnB;AAEF,MAAI,CAAC,MAAM,mBAAmB,qBAAqB,WAAW,GAAG;AAC/D,WAAO;AAAA,EACT;AAEA,SAAO,OAAO,YAA2C;AACvD,UAAM,iBAAiB,MAAM,MAAM,kBAAkB,OAAO;AAC5D,QAAI,mBAAmB,QAAW;AAChC,aAAO;AAAA,IACT;AAEA,eAAW,WAAW,sBAAsB;AAC1C,YAAM,SAAS,MAAM,QAAQ,OAAO;AACpC,UAAI,WAAW,QAAW;AACxB,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;AAEO,SAAS,iCACd,eACwC;AACxC,SAAO,yBAAyB,aAAa;AAC/C;AAEA,SAAS,yBACP,eACwC;AACxC,QAAM,YAAY,cACf,IAAI,CAAC,iBAAiB,aAAa,gBAAgB,EACnD;AAAA,IACC,CACE,YAEA,QAAQ,OAAO;AAAA,EACnB;AAEF,MAAI,UAAU,WAAW,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,SAAO,OAAO,YAAY;AACxB,eAAW,WAAW,WAAW;AAC/B,UAAI,CAAE,MAAM,QAAQ,OAAO,GAAI;AAC7B,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;;;ACjQA,SAAS,aAAAK,YAAW,WAAAC,UAAS,YAAAC,iBAAgB;;;ACAtC,SAAS,4BAAwD,OAGpD;AAClB,MAAI,uBAA+C;AACnD,MAAI,iBAAmC;AACvC,MAAI,oBAAoB;AAExB,SAAO,MAAM;AACX,UAAM,iBAAiB,MAAM,kBAAkB;AAC/C,QAAI,qBAAqB,yBAAyB,gBAAgB;AAChE,aAAO;AAAA,IACT;AAEA,UAAM,WAAW,MAAM,eAAe,cAAc;AACpD,2BAAuB;AACvB,qBAAiB;AACjB,wBAAoB;AACpB,WAAO;AAAA,EACT;AACF;;;ACpBO,IAAM,oCAAoC;;;ACU1C,SAAS,yCAAyC,OASC;AACxD,QAAM,cAAc,4BAKlB;AAAA,IACA,eAAe,oBAAoB;AACjC,aAAO;AAAA,QACL,mBAAmB,mBAAmB;AAAA,QACtC,aAAa,mBAAmB;AAAA,QAChC,cAAc,4BAA4B,kBAAkB;AAAA,MAC9D;AAAA,IACF;AAAA,IACA,oBAAoB;AAClB,aAAO,MAAM,WAAW,YAAY;AAAA,IACtC;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL,kBAAkB,SAAS,QAAQ;AACjC,YAAM,WAAW,SAAS,kBAAkB,SAAS,MAAM;AAAA,IAC7D;AAAA,IACA,UAAU,QAAQ;AAChB,UAAI,MAAM,cAAc;AACtB,cAAM;AAAA,UACJ,EAAE,OAAO;AAAA,UACT,EAAE,MAAM,kCAAkC;AAAA,QAC5C;AACA;AAAA,MACF;AACA,YAAM,WAAW,SAAS,UAAU,MAAM;AAAA,IAC5C;AAAA,IACA;AAAA,IACA,UAAU,UAAU;AAClB,aAAO,MAAM,WAAW,UAAU,QAAQ;AAAA,IAC5C;AAAA,EACF;AACF;;;ACzDA;AAAA,EACE;AAAA,EACA;AAAA,OAGK;AAsBA,SAAS,oBACd,OACsB;AACtB,SAAO;AAAA,IACL,IAAI,MAAM;AAAA,IACV,MAAM,MAAM;AAAA,IACZ,OAAO,MAAM;AAAA,IACb,OAAO,MAAM;AAAA,IACb,aAAa,MAAM,eAAe;AAAA,IAClC,cAAc,MAAM,gBAAgB;AAAA,IACpC,aAAa,MAAM,eAAe;AAAA,IAClC,mBACE,MAAM,gBAAgB,OAAQ,MAAM,qBAAqB,OAAQ;AAAA,IACnE,iBAAiB,MAAM,mBAAmB;AAAA,IAC1C,MAAM,MAAM;AAAA,EACd;AACF;AAEO,SAAS,gCACd,cACsB;AACtB,SAAO,oBAA2B;AAAA,IAChC,IAAI,aAAa;AAAA,IACjB,MAAM,aAAa;AAAA,IACnB,OAAO,aAAa;AAAA,IACpB,OAAO,aAAa;AAAA,IACpB,aAAa,aAAa;AAAA,IAC1B,cAAc,aAAa,gBAAgB;AAAA,IAC3C,aAAa,aAAa;AAAA,IAC1B,mBAAmB,aAAa,qBAAqB;AAAA,IACrD,MAAM,aAAa;AAAA,EACrB,CAAC;AACH;AAEO,SAAS,iCACd,UACoD;AACpD,QAAM,aAAa,2BAA2B,QAAQ;AACtD,QAAM,QAAQ,WAAW,MAAM;AAAA,IAAI,CAAC,SAClC,gCAAuC,IAAI;AAAA,EAC7C;AAEA,SAAO;AAAA,IACL;AAAA,IACA,WAAW,WAAW,aAAa,MAAM,IAAI,CAAC,SAAS,KAAK,EAAE;AAAA,EAChE;AACF;AAEO,SAAS,iCACd,OACA,UAAmD,CAAC,GACjC;AACnB,SAAO,2BAA2B;AAAA,IAChC,eAAe;AAAA,IACf,OAAO,MAAM,MAAM,IAAI,CAAC,UAAU;AAAA,MAChC,IAAI,KAAK;AAAA,MACT,MAAM,KAAK;AAAA,MACX,OAAO,KAAK;AAAA,MACZ,OAAO,KAAK;AAAA,MACZ,aAAa,KAAK;AAAA,MAClB,cAAc,KAAK;AAAA,MACnB,aAAa,KAAK;AAAA,MAClB,mBAAmB,KAAK;AAAA,MACxB,MAAM,KAAK;AAAA,IACb,EAAE;AAAA,IACF,WAAW,MAAM;AAAA,IACjB,cAAc,MAAM,UAAU,GAAG,EAAE,KAAK;AAAA,IACxC,QAAQ,QAAQ;AAAA,IAChB,eAAe,QAAQ;AAAA,IACvB,UAAU,QAAQ;AAAA,EACpB,CAAC;AACH;;;ACxFO,IAAM,kCAAkC;AA6BxC,SAAS,6BAAoC,OAOjC;AACjB,QAAM,aACJ,MAAM,cAAc;AAAA,IAClB,CAAC,SAAS,KAAK,OAAO,MAAM,iBAAiB,GAAG,EAAE;AAAA,EACpD,KAAK,MAAM,cAAc,GAAG,EAAE;AAEhC,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,MACL,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,MACE,GAAG,WAAW,MAAM,IAAI;AAAA,MACxB,GAAG,WAAW,MAAM,IAAI;AAAA,MACxB,OAAO,MAAM,eAAe;AAAA,MAC5B,QAAQ,MAAM,eAAe;AAAA,IAC/B;AAAA,IACA,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AACF;;;ACnEO,SAAS,mCACd,OACQ;AACR,SAAO,GAAG,MAAM,MAAM,IAAI,MAAM,UAAU;AAC5C;AAEO,SAAS,kCACd,OACQ;AACR,SAAO,MAAM,eAAe,MAAM,SAC9B,MAAM,SACN,mCAAmC,KAAK;AAC9C;;;ACcA,IAAM,0BAA0B;AAAA,EAC9B;AAAA,EACA;AACF;AACO,IAAM,iCAAiC;AACvC,IAAM,6BAA6B;AACnC,IAAM,oCACX;AACF,IAAM,kCAAkC;AAQjC,SAAS,0BACd,YACA,OAC2B;AAC3B,SAAO;AAAA,IACL,cAAc,WAAW;AAAA,IACzB,aAAa,OAAO;AAAA,IACpB,YAAY,WAAW;AAAA,IACvB,aAAa;AAAA,IACb,cAAc,OAAO,gBAAgB;AAAA,IACrC,iBAAiB,WAAW,mBAAmB;AAAA,IAC/C,OAAO,WAAW;AAAA,IAClB,QAAQ,WAAW;AAAA,EACrB;AACF;AAEO,SAAS,iCAAiC,OAIR;AACvC,SAAO,oBAA2C;AAAA,IAChD,MAAM;AAAA,MACJ,YAAY;AAAA,MACZ,aAAa,MAAM,cAAc,eAAe;AAAA,MAChD,GAAI,MAAM,cAAc,KAAK,sBAAsB,SAC/C,CAAC,IACD,EAAE,mBAAmB,MAAM,aAAa,KAAK,kBAAkB;AAAA,MACnE,YAAY,MAAM,cAAc;AAAA,MAChC,aAAa,MAAM,cAAc,eAAe;AAAA,MAChD,aAAa;AAAA,MACb,mBAAmB,MAAM,cAAc,WAAW;AAAA,MAClD,QAAQ,MAAM,WAAW;AAAA,IAC3B;AAAA,IACA,aAAa,MAAM,cAAc;AAAA,IACjC,OACE,MAAM,cAAc,SACpB,MAAM,cAAc,gBACpB,MAAM,WAAW;AAAA,IACnB,IAAI;AAAA,MACF,MAAM,WAAW;AAAA,MACjB,MAAM,cAAc;AAAA,IACtB;AAAA,IACA,aAAa,MAAM,cAAc;AAAA,IACjC,MAAM,MAAM,WAAW;AAAA,IACvB,cAAc,MAAM,cAAc;AAAA,IAClC,iBACE,MAAM,cAAc,mBACpB,MAAM,cAAc,mBACpB,MAAM,WAAW,mBACjB;AAAA,IACF,OAAO,MAAM,cAAc;AAAA,EAC7B,CAAC;AACH;AAEO,SAAS,gCAAgC,OAKP;AACvC,QAAM,iBAAiB,MAAM,OAAO,gBAAgB,MAAM,WAAW;AACrE,SAAO,oBAA2C;AAAA,IAChD,MAAM;AAAA,MACJ,YAAY,MAAM;AAAA,MAClB,aAAa,MAAM,OAAO,eAAe;AAAA,MACzC,YAAY,MAAM,OAAO;AAAA,MACzB,aAAa,MAAM,OAAO,eAAe;AAAA,MACzC,aAAa;AAAA,MACb,cAAc,MAAM,OAAO,gBAAgB;AAAA,MAC3C,mBAAmB;AAAA,MACnB,QAAQ,MAAM,WAAW;AAAA,IAC3B;AAAA,IACA,aAAa,MAAM,OAAO;AAAA,IAC1B,OAAO,MAAM;AAAA,IACb,IAAI,qBAAqB,MAAM,WAAW,QAAQ,MAAM,OAAO,UAAU;AAAA,IACzE,MAAM,MAAM,WAAW;AAAA,IACvB,cACE,MAAM,OAAO,gBAAgB,eAAe,iBAAiB;AAAA,IAC/D,iBAAiB;AAAA,MACf,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,IACA,OAAO,MAAM,OAAO,SAAS,MAAM,WAAW;AAAA,EAChD,CAAC;AACH;AAEO,SAAS,sCAAsC,OAOJ;AAChD,QAAM,iBAAiB,MAAM,OAAO,gBAAgB,MAAM,WAAW;AACrE,QAAM,kBAAkB;AAAA,IACtB,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAEA,MAAI,MAAM,OAAO,gBAAgB,cAAc;AAC7C,WAAO;AAAA,MACL,MAAM,aAAa;AAAA,MACnB,MAAM,aAAa;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,cAAc,yBAAyB,MAAM,MAAM;AAEzD,MAAI,gBAAgB,YAAY;AAC9B,WAAO;AAAA,EACT;AAEA,QAAM,2BAA2B,sCAAsC;AAAA,IACrE,aAAa,MAAM,aAAa;AAAA,IAChC;AAAA,IACA;AAAA,IACA,aAAa,MAAM,aAAa;AAAA,EAClC,CAAC;AAED,MAAI,gBAAgB,8BAA8B;AAChD,UAAM,wBAAwB,MAAM,aAAa,MAAM;AAAA,MACrD,CAAC,SAAS,KAAK,KAAK,WAAW,MAAM,OAAO;AAAA,IAC9C;AACA,UAAM,0BAA0B,IAAI;AAAA,MAClC,sBAAsB,IAAI,CAAC,SAAS,KAAK,EAAE;AAAA,IAC7C;AAEA,WAAO,6BAA6B;AAAA,MAClC,kBAAkB,MAAM,aAAa,UAAU;AAAA,QAAO,CAAC,WACrD,wBAAwB,IAAI,MAAM;AAAA,MACpC;AAAA,MACA,eAAe;AAAA,MACf,gBAAgB,uCAAuC;AAAA,QACrD,aAAa,MAAM,aAAa;AAAA,QAChC,gBAAgB;AAAA,QAChB;AAAA,QACA,aAAa,MAAM,aAAa;AAAA,MAClC,CAAC;AAAA,MACD;AAAA,MACA,aAAa,MAAM,aAAa;AAAA,MAChC,aAAa,MAAM,aAAa;AAAA,IAClC,CAAC;AAAA,EACH;AAEA,SAAO,6BAA6B;AAAA,IAClC,kBAAkB,MAAM,aAAa;AAAA,IACrC,eAAe,MAAM,aAAa;AAAA,IAClC,gBAAgB;AAAA,IAChB;AAAA,IACA,aAAa,MAAM,aAAa;AAAA,IAChC,aAAa,MAAM,aAAa;AAAA,EAClC,CAAC;AACH;AAEO,SAAS,8BAA8B,OAGnC;AACT,SAAO,KAAK,UAAU,CAAC,MAAM,QAAQ,MAAM,WAAW,CAAC;AACzD;AAEO,SAAS,iCACd,UACyC;AACzC,QAAM,QAAQ,WAAW,iCAAiC;AAC1D,MACE,CAAC,SAAS,KAAK,KACf,MAAM,YAAY,KAClB,CAAC,MAAM,QAAQ,MAAM,OAAO,GAC5B;AACA,WAAO,oBAAI,IAAI;AAAA,EACjB;AAEA,QAAM,UAAU,oBAAI,IAAwC;AAC5D,aAAW,SAAS,MAAM,QAAQ,MAAM,GAAG,+BAA+B,GAAG;AAC3E,UAAM,aAAa,oCAAoC,KAAK;AAC5D,QAAI,CAAC,YAAY;AACf;AAAA,IACF;AACA,YAAQ,IAAI,8BAA8B,UAAU,GAAG,UAAU;AAAA,EACnE;AACA,SAAO;AACT;AAEO,SAAS,kCACd,UACA,SAC+B;AAC/B,QAAM,oBAAoB,MAAM,KAAK,OAAO,EACzC,IAAI,mCAAmC,EACvC,OAAO,CAAC,UAA+C,UAAU,IAAI,EACrE,MAAM,CAAC,+BAA+B;AACzC,QAAM,eAAe,EAAE,GAAI,YAAY,CAAC,EAAG;AAC3C,MAAI,kBAAkB,WAAW,GAAG;AAClC,WAAO,aAAa,iCAAiC;AAAA,EACvD,OAAO;AACL,iBAAa,iCAAiC,IAAI;AAAA,MAChD,SAAS;AAAA,MACT,SAAS;AAAA,IACX;AAAA,EACF;AACA,SAAO,OAAO,KAAK,YAAY,EAAE,SAAS,IAAI,eAAe;AAC/D;AAEA,SAAS,oCACP,OACmC;AACnC,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,WAAO;AAAA,EACT;AACA,QAAM,SAAS,wBAAwB,MAAM,MAAM;AACnD,QAAM,cAAc,wBAAwB,MAAM,WAAW;AAC7D,QAAM,QAAQ,wBAAwB,MAAM,KAAK;AACjD,MAAI,CAAC,UAAU,CAAC,eAAe,CAAC,OAAO;AACrC,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,wBAAwB,OAAuC;AACtE,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,WAAO;AAAA,EACT;AACA,QAAM,IAAI,sBAAsB,MAAM,CAAC;AACvC,QAAM,IAAI,sBAAsB,MAAM,CAAC;AACvC,QAAM,QAAQ,sBAAsB,MAAM,KAAK;AAC/C,QAAM,SAAS,sBAAsB,MAAM,MAAM;AACjD,MAAI,MAAM,QAAQ,MAAM,QAAQ,UAAU,QAAQ,WAAW,MAAM;AACjE,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,OAAO,SAAS,KAAK;AAC/B,WAAO;AAAA,EACT;AAEA,SAAO,EAAE,QAAQ,OAAO,GAAG,EAAE;AAC/B;AAEA,SAAS,sBAAsB,OAA+B;AAC5D,MAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,GAAG;AACxD,WAAO;AAAA,EACT;AACA,SAAO,KAAK,MAAM,KAAK;AACzB;AAEA,SAAS,wBAAwB,OAA+B;AAC9D,SAAO,OAAO,UAAU,YAAY,MAAM,KAAK,IAAI,MAAM,KAAK,IAAI;AACpE;AAEA,SAAS,SAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,yBACP,QACgC;AAChC,SAAO,OAAO;AAChB;AAEA,SAAS,uCAAuC,OAK7B;AACjB,QAAM,cAAc;AAAA,IAClB,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAEA,SAAO;AAAA,IACL;AAAA,MACE,QAAQ,MAAM,eAAe;AAAA,MAC7B,OAAO,MAAM,eAAe;AAAA,MAC5B,GAAG,KAAK;AAAA,QACN,YAAY,KAAK,YAAY,QAAQ,MAAM,eAAe,SAAS;AAAA,MACrE;AAAA,MACA,GAAG,KAAK;AAAA,QACN,YAAY,KAAK,YAAY,SAAS,MAAM,eAAe,UAAU;AAAA,MACvE;AAAA,IACF;AAAA,IACA,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AACF;AAEO,SAAS,sCAAsC,OAKnC;AACjB,MAAI,CAAC,+BAA+B,MAAM,WAAW,GAAG;AACtD,WAAO,MAAM;AAAA,EACf;AAEA,QAAM,cAAc;AAAA,IAClB,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AACA,QAAM,QAAQ,KAAK;AAAA,IACjB,MAAM,eAAe,QAAQ;AAAA,EAC/B;AACA,QAAM,SAAS,KAAK;AAAA,IAClB,MAAM,eAAe,SAAS;AAAA,EAChC;AAEA,SAAO;AAAA,IACL;AAAA,MACE;AAAA,MACA;AAAA,MACA,GAAG,KAAK,MAAM,YAAY,KAAK,YAAY,QAAQ,SAAS,CAAC;AAAA,MAC7D,GAAG,KAAK,MAAM,YAAY,KAAK,YAAY,SAAS,UAAU,CAAC;AAAA,IACjE;AAAA,IACA,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AACF;AAEO,SAAS,kCAAkC,OAKP;AACzC,MAAI,CAAC,+BAA+B,MAAM,WAAW,GAAG;AACtD,WAAO,CAAC,GAAG,MAAM,KAAK;AAAA,EACxB;AAEA,SAAO,MAAM,MAAM,IAAI,CAAC,SAAS;AAC/B,UAAM,kBACJ,KAAK,mBACL,MAAM,qBAAqB,IAAI,KAAK,KAAK,MAAM,GAAG,mBAClD;AACF,QAAI,KAAK,gBAAgB,cAAc;AACrC,aAAO;AAAA,QACL,GAAG;AAAA,QACH,OAAO;AAAA,UACL,MAAM;AAAA,UACN,MAAM;AAAA,UACN;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,eACJ,MAAM,qBAAqB,IAAI,KAAK,KAAK,MAAM,GAAG,SAAS,KAAK;AAClE,UAAM,eAAe,KAAK;AAAA,MACxB,aAAa,QAAQ;AAAA,IACvB;AACA,UAAM,gBAAgB,KAAK;AAAA,MACzB,aAAa,SAAS;AAAA,IACxB;AACA,UAAM,QAAQ,KAAK,IAAI,KAAK,MAAM,OAAO,YAAY;AACrD,UAAM,SAAS,KAAK,IAAI,KAAK,MAAM,QAAQ,aAAa;AACxD,UAAM,cACJ,UAAU,KAAK,MAAM,SAAS,WAAW,KAAK,MAAM;AACtD,UAAM,cAAc;AAAA,MAClB,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AACA,UAAM,QAAQ;AAAA,MACZ,cACI;AAAA,QACE;AAAA,QACA;AAAA,QACA,GAAG,KAAK,MAAM,YAAY,KAAK,YAAY,QAAQ,SAAS,CAAC;AAAA,QAC7D,GAAG,KAAK,MAAM,YAAY,KAAK,YAAY,SAAS,UAAU,CAAC;AAAA,MACjE,IACA,KAAK;AAAA,MACT,MAAM;AAAA,MACN,MAAM;AAAA,MACN;AAAA,IACF;AAEA,WAAO,WAAW,KAAK,OAAO,KAAK,IAAI,OAAO,EAAE,GAAG,MAAM,MAAM;AAAA,EACjE,CAAC;AACH;AAEA,SAAS,+BACP,aACS;AACT,SAAO,YAAY,QAAQ;AAC7B;AAEO,SAAS,sBACd,QACA,YACQ;AACR,SAAO,mCAAmC,EAAE,YAAY,OAAO,CAAC;AAClE;AAEO,SAAS,wBACd,OACA,sBACoE;AACpE,SAAO;AAAA,IACL,WAAW,MAAM;AAAA,IACjB,OAAO,MAAM,MACV,OAAO,CAAC,SAAS;AAChB,aACE,qBAAqB,IAAI,KAAK,KAAK,MAAM,GAAG,QAAQ,aAAa;AAAA,IAErE,CAAC,EACA,IAAI,CAAC,UAAU;AAAA,MACd,GAAG;AAAA,MACH,MAAM;AAAA,QACJ,aAAa,KAAK,KAAK,eAAe;AAAA,QACtC,GAAI,KAAK,KAAK,sBAAsB,SAChC,CAAC,IACD,EAAE,mBAAmB,KAAK,KAAK,kBAAkB;AAAA,QACrD,YAAY,KAAK,KAAK;AAAA,QACtB,aAAa,KAAK,KAAK,eAAe;AAAA,QACtC,GAAI,KAAK,KAAK,gBAAgB,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;AAAA,QAC9D,QAAQ,KAAK,KAAK;AAAA,MACpB;AAAA,IACF,EAAE;AAAA,EACN;AACF;AAEO,SAAS,+BACd,UACA,iBACA,iBAAwD,CAAC,GACT;AAChD,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,MACL,4BAA4B,eAAe;AAAA,MAC3C;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,gBAAgB,iCAA0C,QAAQ;AACxE,QAAM,QAAQ,cAAc,MACzB,IAAI,CAAC,SAAS;AACb,UAAM,aAAa;AAAA,MACjB;AAAA,MACA;AAAA,IACF;AACA,QAAI,CAAC,YAAY;AACf,aAAO;AAAA,IACT;AACA,QAAI,0BAA0B,KAAK,IAAI,GAAG,gBAAgB,MAAM;AAC9D,aAAO;AAAA,IACT;AACA,WAAO,mBAAmB,YAAY,IAAI;AAAA,EAC5C,CAAC,EACA;AAAA,IACC,CAAC,SAAuD,SAAS;AAAA,EACnE,EACC,OAAO,CAAC,SAAS;AAChB,UAAM,aAAa,gBAAgB;AAAA,MACjC,CAAC,cAAc,UAAU,WAAW,KAAK,KAAK;AAAA,IAChD;AACA,WACE,YAAY,QAAQ,aAAa,SACjC,YAAY,QAAQ,kBAAkB;AAAA,EAE1C,CAAC;AAEH,MAAI,MAAM,WAAW,KAAK,CAAC,sBAAsB,QAAQ,GAAG;AAC1D,WAAO;AAAA,MACL,4BAA4B,eAAe;AAAA,MAC3C;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAU,IAAI,IAAI,MAAM,IAAI,CAAC,SAAS,KAAK,EAAE,CAAC;AACpD,QAAM,YAAY,cAAc,UAAU;AAAA,IAAO,CAAC,WAChD,QAAQ,IAAI,MAAM;AAAA,EACpB;AACA,aAAW,QAAQ,OAAO;AACxB,QAAI,CAAC,UAAU,SAAS,KAAK,EAAE,GAAG;AAChC,gBAAU,KAAK,KAAK,EAAE;AAAA,IACxB;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,MACE;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,0BACd,UACA,iBACmD;AACnD,MAAI,CAAC,UAAU;AACb,WAAO,oBAAI,IAAI;AAAA,EACjB;AAEA,QAAM,QAAQ,iCAA0C,QAAQ,EAC7D,MAAM,IAAI,CAAC,SAAS;AACnB,UAAM,aAAa;AAAA,MACjB;AAAA,MACA;AAAA,IACF;AACA,QAAI,CAAC,YAAY;AACf,aAAO;AAAA,IACT;AACA,WAAO,mBAAmB,YAAY,IAAI;AAAA,EAC5C,CAAC,EACA;AAAA,IACC,CAAC,SAAuD,SAAS;AAAA,EACnE;AAEF,SAAO,IAAI,IAAI,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC;AACrD;AAEO,SAAS,6BACd,MACA,eACA,YACsC;AACtC,QAAM,kBAAkB,cAAc,eAAe;AACrD,QAAM,cAAc,cAAc,WAAW;AAC7C,QAAM,kBAAkB,cAAc,eAAe;AACrD,QAAM,sBACJ,cAAc,mBAAmB,YAAY,mBAAmB;AAClE,MACE,KAAK,UAAU,cAAc,SAC7B,KAAK,KAAK,gBAAgB,mBAC1B,KAAK,KAAK,eAAe,cAAc,cACvC,KAAK,KAAK,gBAAgB,mBAC1B,KAAK,KAAK,gBAAgB,QAC1B,uBAAuB,KAAK,KAAK,qBAAqB,MAAM,WAAW,KACvE,KAAK,iBAAiB,aAAa,qBAAqB,YACxD,KAAK,iBAAiB,cAAc,qBAAqB,aACzD,KAAK,KAAK,WAAW,cAAc,QACnC;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,MAAM;AAAA,MACJ,aAAa;AAAA,MACb,GAAI,KAAK,KAAK,sBAAsB,SAChC,CAAC,IACD,EAAE,mBAAmB,KAAK,KAAK,kBAAkB;AAAA,MACrD,YAAY,cAAc;AAAA,MAC1B,aAAa;AAAA,MACb,YAAY,KAAK,KAAK,cAAc;AAAA,MACpC,aAAa;AAAA,MACb,mBAAmB;AAAA,MACnB,GAAI,KAAK,KAAK,qBAAqB,SAC/B,CAAC,IACD,EAAE,kBAAkB,KAAK,KAAK,iBAAiB;AAAA,MACnD,QAAQ,cAAc;AAAA,IACxB;AAAA,IACA,iBAAiB;AAAA,IACjB,OAAO,cAAc;AAAA,EACvB;AACF;AAEO,SAAS,4BAA4B,OAI/B;AACX,QAAM,UAAU,IAAI,IAAI,MAAM,UAAU,IAAI,CAAC,SAAS,KAAK,EAAE,CAAC;AAC9D,QAAM,YAAY,MAAM,iBAAiB;AAAA,IAAO,CAAC,WAC/C,QAAQ,IAAI,MAAM;AAAA,EACpB;AACA,QAAM,gBAAgB,MAAM,WACxB,iCAA0C,MAAM,QAAQ,IACxD;AACJ,aAAW,UAAU,eAAe,aAAa,CAAC,GAAG;AACnD,QAAI,QAAQ,IAAI,MAAM,KAAK,CAAC,UAAU,SAAS,MAAM,GAAG;AACtD,gBAAU,KAAK,MAAM;AAAA,IACvB;AAAA,EACF;AACA,aAAW,QAAQ,MAAM,WAAW;AAClC,QAAI,CAAC,UAAU,SAAS,KAAK,EAAE,GAAG;AAChC,gBAAU,KAAK,KAAK,EAAE;AAAA,IACxB;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,kBACd,MACA,OACS;AACT,SACE,KAAK,WAAW,MAAM,UACtB,KAAK,MAAM,CAAC,OAAO,UAAU,UAAU,MAAM,KAAK,CAAC;AAEvD;AAEO,SAAS,iBACd,MACA,OACS;AACT,SACE,KAAK,WAAW,MAAM,UACtB,KAAK,MAAM,CAAC,OAAO,UAAU,UAAU,MAAM,KAAK,CAAC;AAEvD;AAEA,SAAS,wBAAwB,OAQQ;AACvC,QAAM,WAAW,MAAM,WAAW;AAClC,QAAM,aACJ,MAAM,WAAW,eAChB,UAAU,SAAS,UAChB,GAAG,MAAM,WAAW,MAAM,cAC1B,MAAM,WAAW;AACvB,QAAM,SACJ,UAAU,SAAS,UACf,GAAG,MAAM,WAAW,MAAM,IAAI,UAAU,KACxC,MAAM,WAAW;AAEvB,SAAO,oBAA2C;AAAA,IAChD,MAAM;AAAA,MACJ,YAAY;AAAA,MACZ,aAAa;AAAA,MACb;AAAA,MACA,aAAa,MAAM,WAAW,eAAe;AAAA,MAC7C,aAAa;AAAA,MACb,mBAAmB;AAAA,MACnB,QAAQ,MAAM,WAAW;AAAA,IAC3B;AAAA,IACA,OAAO,MAAM,WAAW,SAAS,MAAM,WAAW;AAAA,IAClD,IAAI;AAAA,IACJ,MAAM,MAAM,WAAW;AAAA,IACvB,iBAAiB,MAAM,WAAW,mBAAmB;AAAA,IACrD,OAAO,MAAM,WAAW,SAAS,MAAM,WAAW;AAAA,EACpD,CAAC;AACH;AAEA,SAAS,qBAAqB,QAAgB,YAA4B;AACxE,SAAO,kCAAkC,EAAE,YAAY,OAAO,CAAC;AACjE;AAEA,SAAS,4BACP,iBACgD;AAChD,QAAM,QAAQ,gBACX,OAAO,CAAC,eAAe,WAAW,QAAQ,gBAAgB,KAAK,EAC/D,OAAO,CAAC,eAAe,WAAW,UAAU,SAAS,OAAO,EAC5D;AAAA,IAAI,CAAC,eACJ,wBAAwB;AAAA,MACtB;AAAA,MACA,YAAY;AAAA,QACV,OAAO,WAAW;AAAA,QAClB,YAAY,WAAW;AAAA,QACvB,OAAO,WAAW;AAAA,MACpB;AAAA,IACF,CAAC;AAAA,EACH;AACF,SAAO;AAAA,IACL,WAAW,MAAM,IAAI,CAAC,SAAS,KAAK,EAAE;AAAA,IACtC;AAAA,EACF;AACF;AAEA,SAAS,mBACP,YACA,MACsC;AACtC,QAAM,eAAe,0BAA0B,KAAK,IAAI;AACxD,SAAO;AAAA,IACL,GAAG;AAAA,IACH,MAAM;AAAA,MACJ,aAAa,cAAc,eAAe;AAAA,MAC1C,GAAI,cAAc,sBAAsB,SACpC,CAAC,IACD,EAAE,mBAAmB,aAAa,kBAAkB;AAAA,MACxD,YACE,cAAc,eACb,WAAW,UAAU,SAAS,UAC3B,2BAA2B,WAAW,QAAQ,KAAK,EAAE,IACrD,WAAW;AAAA,MACjB,aAAa,cAAc,eAAe;AAAA,MAC1C,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,mBAAmB;AAAA,MACnB,QAAQ,WAAW;AAAA,IACrB;AAAA,IACA,MAAM,WAAW;AAAA,IACjB,iBAAiB,WAAW,mBAAmB;AAAA,IAC/C,OAAO,WAAW,UAAU,SAAS,UAAU,KAAK,QAAQ,WAAW;AAAA,EACzE;AACF;AAEO,SAAS,wCACd,QACA,YACqC;AACrC,SAAO,OAAO,mBAAmB,WAAW,mBAAmB;AACjE;AAEA,SAAS,2BAA2B,QAAgB,QAAwB;AAC1E,QAAM,SAAS,GAAG,MAAM;AACxB,SAAO,OAAO,WAAW,MAAM,IAAI,OAAO,MAAM,OAAO,MAAM,IAAI;AACnE;AAEA,SAAS,sBAAsB,UAA6C;AAC1E,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,aAAW,OAAO,yBAAyB;AACzC,QAAI,SAAS,WAAW,GAAG,MAAM,MAAM;AACrC,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,0BACP,OAC8B;AAC9B,MAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ;AACd,MACE,OAAO,MAAM,WAAW,YACxB,OAAO,MAAM,eAAe,UAC5B;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,aACE,OAAO,MAAM,gBAAgB,YAAY,MAAM,gBAAgB,OAC3D,MAAM,cACN;AAAA,IACN,GAAI,MAAM,sBAAsB,SAC5B,CAAC,IACD,EAAE,mBAAmB,MAAM,kBAAkB;AAAA,IACjD,YAAY,MAAM;AAAA,IAClB,aACE,OAAO,MAAM,gBAAgB,YAAY,MAAM,gBAAgB,OAC3D,MAAM,cACN;AAAA,IACN,YAAY;AAAA,IACZ,aAAa,MAAM,gBAAgB;AAAA,IACnC,cAAc;AAAA,IACd,mBAAmB;AAAA,IACnB,QAAQ,MAAM;AAAA,EAChB;AACF;AAEA,SAAS,iCACP,MACA,iBACoC;AACpC,QAAM,OAAO,0BAA0B,KAAK,IAAI;AAChD,MAAI,MAAM;AACR,WACE,gBAAgB,KAAK,CAAC,eAAe,WAAW,WAAW,KAAK,MAAM,KACtE;AAAA,EAEJ;AAEA,SACE,gBAAgB,KAAK,CAAC,eAAe;AACnC,QAAI,WAAW,UAAU,SAAS,SAAS;AACzC,aAAO,KAAK,GAAG,WAAW,GAAG,WAAW,MAAM,GAAG;AAAA,IACnD;AACA,WAAO,KAAK,OAAO,WAAW;AAAA,EAChC,CAAC,KAAK;AAEV;AAEA,SAAS,6BACP,OACA,OAKgD;AAChD,MAAI,MAAM,eAAe,WAAW,GAAG;AACrC,WAAO;AAAA,EACT;AAEA,QAAM,uBAAuB,IAAI;AAAA,IAC/B,MAAM,gBAAgB,IAAI,CAAC,eAAe,CAAC,WAAW,QAAQ,UAAU,CAAC;AAAA,EAC3E;AACA,QAAM,QAAQ,MAAM,QAAQ,CAAC,GAAG,MAAM,KAAK,IAAI,CAAC;AAChD,QAAM,UAAU,IAAI,IAAI,MAAM,IAAI,CAAC,SAAS,KAAK,EAAE,CAAC;AACpD,QAAM,oBAAoB;AAAA,IACxB,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAEA,aAAW,iBAAiB,MAAM,gBAAgB;AAChD,UAAM,aAAa,qBAAqB,IAAI,cAAc,MAAM;AAChE,QAAI,CAAC,YAAY;AACf;AAAA,IACF;AACA,UAAM,SAAS;AAAA,MACb,cAAc;AAAA,MACd,cAAc;AAAA,IAChB;AACA,QAAI,QAAQ,IAAI,MAAM,GAAG;AACvB;AAAA,IACF;AAEA,UAAM,WAAW,iCAAiC;AAAA,MAChD;AAAA,MACA;AAAA,MACA,cAAc,kBAAkB,IAAI,MAAM,KAAK;AAAA,IACjD,CAAC;AACD,UAAM,KAAK,QAAQ;AACnB,YAAQ,IAAI,SAAS,EAAE;AAAA,EACzB;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,WAAW,4BAA4B;AAAA,MACrC,kBAAkB,MAAM,aAAa,CAAC;AAAA,MACtC,WAAW;AAAA,MACX,UAAU,MAAM;AAAA,IAClB,CAAC;AAAA,IACD;AAAA,EACF;AACF;AAEA,SAAS,uBACP,MACA,OACS;AACT,SAAO,MAAM,OAAO,OAAO,MAAM,MAAM,SAAS,OAAO;AACzD;;;ACh4BO,SAAS,+BAA+B,OAIhB;AAC7B,MAAI,CAAC,MAAM,qBAAqB;AAC9B,WAAO;AAAA,MACL,mBAAmB;AAAA,MACnB,wBAAwB;AAAA,IAC1B;AAAA,EACF;AAEA,QAAM,iBAAiB;AAAA,IACrB,YAAY,MAAM,KAAK,KAAK;AAAA,IAC5B,aAAa,MAAM,KAAK,KAAK,eAAe;AAAA,IAC5C,QAAQ,MAAM,KAAK;AAAA,IACnB,QAAQ,MAAM,KAAK,KAAK;AAAA,IACxB,aAAa,MAAM;AAAA,IACnB,GAAI,MAAM,KAAK,KAAK,oBAChB,EAAE,SAAS,MAAM,KAAK,KAAK,kBAAkB,IAC7C,CAAC;AAAA,EACP;AAEA,QAAM,kBACJ,MAAM,oBAAoB,aAAa,cAAc;AAEvD,SAAO;AAAA,IACL,mBACE,mBAAmB,MAAM,KAAK,KAAK,qBAAqB;AAAA,IAC1D,wBAAwB,MAAM,oBAAoB,kBAAkB;AAAA,MAClE,aAAa,MAAM;AAAA,IACrB,CAAC;AAAA,EACH;AACF;;;AC5CA;AAAA,EACE,8BAAAC;AAAA,OAIK;AAgBP,IAAM,sBAAsB;AAAA,EAC1B;AAAA,EACA;AACF;AAEO,SAAS,8BACd,UACmB;AACnB,QAAM,aAAaC,4BAA2B,QAAQ;AACtD,SAAOA,4BAA2B;AAAA,IAChC,eAAe,WAAW;AAAA,IAC1B,OAAO,WAAW,MAAM,IAAI,YAAY;AAAA,IACxC,WAAW,WAAW;AAAA,IACtB,cAAc,WAAW;AAAA,IACzB,QAAQ,WAAW,QAAQ,IAAI,aAAa;AAAA,IAC5C,eAAe,WAAW;AAAA,IAC1B,UAAU,iBAAiB,WAAW,QAAQ;AAAA,EAChD,CAAC;AACH;AAEA,SAAS,aAAa,MAAoD;AACxE,SAAO;AAAA,IACL,IAAI,KAAK;AAAA,IACT,MAAM,KAAK;AAAA,IACX,OAAO,KAAK;AAAA,IACZ,OAAO,KAAK;AAAA,IACZ,aAAa,KAAK;AAAA,IAClB,cAAc,KAAK;AAAA,IACnB,aAAa,KAAK;AAAA,IAClB,MAAM,iBAAiB,KAAK,IAAI;AAAA,EAClC;AACF;AAEA,SAAS,iBACP,OAC2C;AAC3C,MAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ;AACd,MACE,OAAO,MAAM,WAAW,YACxB,OAAO,MAAM,eAAe,UAC5B;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,aACE,OAAO,MAAM,gBAAgB,YAAY,MAAM,gBAAgB,OAC3D,MAAM,cACN;AAAA,IACN,YAAY,MAAM;AAAA,IAClB,aACE,OAAO,MAAM,gBAAgB,YAAY,MAAM,gBAAgB,OAC3D,MAAM,cACN;AAAA,IACN,GAAI,MAAM,gBAAgB,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;AAAA,IAC1D,GAAI,MAAM,sBAAsB,SAC5B,CAAC,IACD,EAAE,mBAAmB,MAAM,kBAAkB;AAAA,IACjD,QAAQ,MAAM;AAAA,EAChB;AACF;AAEA,SAAS,cACP,OAC0B;AAC1B,SAAO;AAAA,IACL,IAAI,MAAM;AAAA,IACV,MAAM,MAAM;AAAA,IACZ,SAAS,MAAM;AAAA,IACf,OAAO,MAAM;AAAA,EACf;AACF;AAEA,SAAS,iBACP,UAC+B;AAC/B,QAAM,YAAqC,CAAC;AAC5C,aAAW,OAAO,qBAAqB;AACrC,QAAI,WAAW,GAAG,MAAM,MAAM;AAC5B,gBAAU,GAAG,IAAI;AAAA,IACnB;AAAA,EACF;AACA,MAAI,WAAW,iCAAiC,MAAM,QAAW;AAC/D,WAAO;AAAA,MACL;AAAA,MACA,iCAAiC,QAAQ,EAAE,OAAO;AAAA,IACpD;AAAA,EACF;AAEA,SAAO,OAAO,KAAK,SAAS,EAAE,SAAS,IAAI,YAAY;AACzD;;;ACpEA,IAAM,yBAAyB;AAC/B,IAAM,sBAAsB;AAC5B,IAAM,gCAAgC;AAE/B,SAAS,2BAA2B,OAoBZ;AAC7B,SAAO,IAAI,+BAA+B,KAAK;AACjD;AAEA,IAAM,iCAAN,MAA2E;AAAA,EAChE;AAAA,EACQ;AAAA,EAsBA;AAAA,EACA,uBAAuB,oBAAI,IAG1C;AAAA,EACM,6BAA6B;AAAA,EAC7B,aAAa;AAAA,EACb,mBAAmB;AAAA,EACnB;AAAA,EACA,+BAA+B,oBAAI,IAGzC;AAAA,EACM,iBAAiB;AAAA,EACjB,cAAoC;AAAA,EAC3B,aAAa,oBAAI,IAA0C;AAAA,EACpE,yBAAyB;AAAA,EACzB,yCAAyC;AAAA,EACzC,yBAAyB;AAAA,EACzB,sBAEG;AAAA,EACH,qCAAqC;AAAA,EACrC;AAAA,EACA;AAAA,EACA,eAA2B;AAAA,EAC3B,YAA6D;AAAA,EAC7D,2BAAgD;AAAA,EAChD,mBAAwC;AAAA,EACxC,cAAmC;AAAA,EAE3C,YAAY,OAoBT;AACD,SAAK,QAAQ;AACb,SAAK,eAAe,IAAI,QAAQ,CAAC,YAAY;AAC3C,WAAK,eAAe;AAAA,IACtB,CAAC;AACD,SAAK,kBAAkB,MAAM;AAC7B,eAAW,cAAc,MAAM,OAAO;AACpC,WAAK,qBAAqB,IAAI,WAAW,QAAQ,UAAU;AAAA,IAC7D;AACA,SAAK,iBAAiB,KAAK,mBAAmB;AAC9C,SAAK,+BAA+B;AAAA,MAClC,KAAK,gBAAgB;AAAA,IACvB;AACA,SAAK,iBAAiB,MAAM,kBAAkB,CAAC;AAC/C,SAAK,aAAa;AAAA,MAChB;AAAA,QACE,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,MACP;AAAA,MACA,EAAE,kBAAkB,MAAM,iBAAiB;AAAA,IAC7C;AACA,SAAK,sBAAsB,KAAK,WAAW,YAAY,EAAE;AACzD,SAAK,mBAAmB,KAAK,WAAW,UAAU,MAAM;AACtD,WAAK,sBAAsB;AAC3B,WAAK,oBAAoB;AACzB,WAAK,kCAAkC;AAAA,IACzC,CAAC;AACD,SAAK,mBAAmB,KAAK,mBAAmB;AAChD,QAAI,KAAK,kBAAkB;AACzB,WAAK,kCAAkC;AACvC,WAAK,uBAAuB;AAAA,IAC9B;AAAA,EACF;AAAA,EAEA,aACE,QACA,YAIM;AACN,SAAK,aAAa,KAAK,gBAAgB,MAAM;AAC3C,WAAK,gBAAgB,QAAQ,UAAU;AAAA,IACzC,CAAC;AAAA,EACH;AAAA,EAEQ,gBACN,QACA,YAIM;AACN,QAAI,CAAC,WAAW,KAAK,KAAK,GAAG;AAC3B;AAAA,IACF;AAEA,UAAM,OAAO,KAAK,yBAAyB,MAAM;AACjD,QAAI,CAAC,MAAM;AACT;AAAA,IACF;AAEA,UAAM,WAAoC;AAAA,MACxC,UAAU,KAAK;AAAA,MACf,MAAM,WAAW;AAAA,MACjB,GAAI,WAAW,YAAY,SACvB,CAAC,IACD,EAAE,SAAS,WAAW,QAAQ;AAAA,IACpC;AACA,SAAK,oBAAoB,KAAK,EAAE;AAChC,SAAK,WAAW,SAAS,aAAa;AAAA,MACpC,OAAO,KAAK,WAAW,YAAY,EAAE,MAAM;AAAA,QAAI,CAAC,UAC9C,MAAM,OAAO,KAAK,KACd;AAAA,UACE,GAAG;AAAA,UACH,MAAM;AAAA,YACJ,GAAG,MAAM;AAAA,YACT,YAAY;AAAA,UACd;AAAA,QACF,IACA;AAAA,MACN;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,oBAAoB,QAAgB,UAAwB;AAC1D,SAAK,aAAa,KAAK,gBAAgB,MAAM;AAC3C,WAAK,uBAAuB,QAAQ,QAAQ;AAAA,IAC9C,CAAC;AAAA,EACH;AAAA,EAEQ,uBAAuB,QAAgB,UAAwB;AACrE,UAAM,WAAW,KAAK,WAAW,YAAY;AAC7C,UAAM,OAAO,SAAS,MAAM,KAAK,CAAC,UAAU,MAAM,OAAO,MAAM;AAC/D,QAAI,MAAM,KAAK,YAAY,aAAa,UAAU;AAChD;AAAA,IACF;AAEA,SAAK,WAAW,SAAS,aAAa;AAAA,MACpC,OAAO,SAAS,MAAM;AAAA,QAAI,CAAC,UACzB,MAAM,OAAO,SACT;AAAA,UACE,GAAG;AAAA,UACH,MAAM;AAAA,YACJ,GAAG,MAAM;AAAA,YACT,YAAY;AAAA,UACd;AAAA,QACF,IACA;AAAA,MACN;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,4BAEJ;AACA,UAAM,WAAW,KAAK,WAAW,YAAY;AAC7C,UAAM,UAAU,MAAM,QAAQ;AAAA,MAC5B,SAAS,MAAM,IAAI,OAAO,SAAS;AACjC,cAAM,aAAa,KAAK,qBAAqB,IAAI,KAAK,KAAK,MAAM;AACjE,YAAI,CAAC,YAAY,sBAAsB;AACrC,iBAAO;AAAA,QACT;AACA,cAAM,gBAAgB,+BAA+B;AAAA,UACnD,qBAAqB,KAAK,MAAM;AAAA,UAChC;AAAA,UACA,aAAa,KAAK,MAAM;AAAA,QAC1B,CAAC;AACD,cAAM,SAAS,MAAM,WAAW,qBAAqB;AAAA,UACnD,mBAAmB,cAAc;AAAA,UACjC,wBAAwB,cAAc;AAAA,UACtC,YAAY,KAAK,KAAK;AAAA,UACtB,aAAa,KAAK,KAAK,eAAe;AAAA,UACtC;AAAA,UACA,aAAa,KAAK,MAAM;AAAA,QAC1B,CAAC;AACD,eAAO,UAAU;AAAA,MACnB,CAAC;AAAA,IACH;AACA,WAAO,QAAQ;AAAA,MACb,CAAC,WAA+C,WAAW;AAAA,IAC7D;AAAA,EACF;AAAA,EAEA,UAAU,QAAsB;AAC9B,SAAK,aAAa,KAAK,gBAAgB,MAAM;AAC3C,WAAK,8BAA8B,MAAM;AACzC,WAAK,WAAW,SAAS,UAAU,MAAM;AAAA,IAC3C,CAAC;AAAA,EACH;AAAA,EAEA,UAAgB;AACd,SAAK,aAAa;AAClB,SAAK;AACL,SAAK,cAAc;AACnB,SAAK,UAAU;AACf,SAAK,mBAAmB;AACxB,SAAK,mBAAmB;AACxB,SAAK,cAAc;AACnB,SAAK,cAAc;AACnB,SAAK,2BAA2B;AAChC,SAAK,2BAA2B;AAChC,QAAI,KAAK,cAAc,MAAM;AAC3B,iBAAW,aAAa,KAAK,SAAS;AACtC,WAAK,YAAY;AACjB,WAAK,aAAa;AAAA,IACpB;AACA,SAAK,kBAAkB;AAAA,EACzB;AAAA,EAEA,UAAU,QAAsB;AAC9B,SAAK,aAAa,KAAK,gBAAgB,MAAM;AAC3C,WAAK,oBAAoB,MAAM;AAAA,IACjC,CAAC;AAAA,EACH;AAAA,EAEA,aAAa,QAAsB;AACjC,SAAK,aAAa,KAAK,gBAAgB,MAAM;AAC3C,WAAK,WAAW,SAAS,aAAa,MAAM;AAAA,IAC9C,CAAC;AAAA,EACH;AAAA,EAEA,mBAAmB,QAAsB;AACvC,SAAK,aAAa,KAAK,gBAAgB,MAAM;AAC3C,WAAK,WAAW,SAAS,eAAe,MAAM;AAAA,IAChD,CAAC;AAAA,EACH;AAAA,EAEA,cAEE;AACA,WAAO,KAAK,WAAW,YAAY;AAAA,EACrC;AAAA,EAEA,cAAuB;AACrB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,WAAW,OAAyD;AACxE,UAAM,aAAa,KAAK;AACxB,QAAI,CAAE,MAAM,KAAK,eAAe,UAAU,GAAI;AAC5C,aAAO;AAAA,IACT;AAEA,UAAM,aAAa,KAAK,qBAAqB,IAAI,MAAM,MAAM;AAC7D,QAAI,CAAC,YAAY;AACf,aAAO;AAAA,IACT;AAEA,UAAM,eAAe,iCAAiC,KAAK;AAC3D,UAAM,eAAe,KAAK,WAAW,YAAY;AACjD,UAAM,UAAsC;AAAA,MAC1C,GAAG;AAAA,MACH,mBAAmB,aAAa;AAAA,MAChC,aAAa,aAAa;AAAA,MAC1B,aAAa,KAAK,MAAM;AAAA,IAC1B;AACA,QAAI,iBAAiB,MAAM;AACzB,cAAQ,eAAe;AAAA,IACzB;AAEA,QAAI;AACJ,QAAI;AACF,eAAS,KAAK,MAAM,kBAChB,MAAM,KAAK,MAAM,gBAAgB,OAAO,IACxC,0BAA0B,YAAY;AAAA,QACpC,aAAa,MAAM;AAAA,QACnB;AAAA,MACF,CAAC;AAAA,IACP,SAAS,OAAO;AACd,WAAK,iBAAiB,SAAS,KAAK;AACpC,aAAO;AAAA,IACT;AACA,QAAI,KAAK,cAAc,CAAC,UAAU,eAAe,KAAK,gBAAgB;AACpE,aAAO;AAAA,IACT;AAEA,WAAO,KAAK,iBAAiB;AAAA,MAC3B,GAAG;AAAA,MACH,cAAc,OAAO,gBAAgB;AAAA,IACvC,CAAC;AAAA,EACH;AAAA,EAEQ,iBACN,SACA,OACM;AACN,SAAK,QAAQ;AAAA,MACX,KAAK,MAAM,kBAAkB,MAAM;AAAA,QACjC,SAAS;AAAA,UACP,aAAa,QAAQ,eAAe;AAAA,UACpC,OAAO,uBAAuB,KAAK;AAAA,UACnC,cAAc,QAAQ,gBAAgB;AAAA,UACtC,SAAS,uBAAuB,QAAQ,OAAO;AAAA,UAC/C,QAAQ,QAAQ;AAAA,UAChB,QAAQ,QAAQ;AAAA,QAClB;AAAA,QACA,OAAO;AAAA,QACP,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,aAAa,QAAQ;AAAA,MACvB,CAAC;AAAA,IACH,EAAE,MAAM,MAAM,MAAS;AAAA,EACzB;AAAA,EAEA,MAAM,OAAsB;AAC1B,QAAI,KAAK,eAAe,CAAC,KAAK,YAAY;AACxC,aAAO,KAAK;AAAA,IACd;AAEA,UAAM,aAAa,EAAE,KAAK;AAC1B,QAAI,CAAC,KAAK,4BAA4B;AACpC,WAAK,sBAAsB;AAAA,IAC7B;AACA,SAAK,aAAa;AAClB,SAAK,cAAc,KAAK,oBAAoB,UAAU;AACtD,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAc,oBAAoB,YAAmC;AACnE,SAAK,cAAc;AACnB,SAAK,cAAc;AACnB,SAAK,2BAA2B;AAChC,SAAK,2BAA2B;AAChC,QAAI,KAAK,cAAc,MAAM;AAC3B,iBAAW,aAAa,KAAK,SAAS;AACtC,WAAK,YAAY;AAAA,IACnB;AAEA,QAAI;AACF,YAAM,WAAW,MAAM,KAAK,MAAM,mBAAmB;AAAA,QACnD,KAAK,MAAM;AAAA,MACb;AACA,UAAI,KAAK,cAAc,eAAe,KAAK,gBAAgB;AACzD;AAAA,MACF;AAEA,WAAK,iBAAiB;AACtB,WAAK,+BAA+B;AAAA,QAClC,UAAU;AAAA,MACZ;AACA,WAAK,WAAW,SAAS;AAAA,QACvB;AAAA,UACE;AAAA,UACA,KAAK;AAAA,UACL,KAAK;AAAA,QACP;AAAA,MACF;AACA,WAAK,oBAAoB,KAAK,cAAc;AAAA,IAC9C,QAAQ;AACN,UAAI,KAAK,cAAc,eAAe,KAAK,gBAAgB;AACzD;AAAA,MACF;AACA,WAAK,iBAAiB;AACtB,WAAK,+BAA+B,oBAAI,IAAI;AAC5C,WAAK,WAAW,SAAS;AAAA,QACvB;AAAA,UACE;AAAA,UACA,KAAK;AAAA,UACL,KAAK;AAAA,QACP;AAAA,MACF;AACA,WAAK,oBAAoB,KAAK,cAAc;AAAA,IAC9C;AAEA,SAAK,oBAAoB;AACzB,SAAK,mBAAmB;AACxB,SAAK,kCAAkC;AACvC,SAAK,uBAAuB;AAC5B,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,iBAAiB,QAAsB;AACrC,UAAM,aAAa,KAAK;AACxB,SAAK,aAAa,YAAY,MAAM;AAClC,WAAK,oBAAoB,QAAQ,UAAU;AAAA,IAC7C,CAAC;AAAA,EACH;AAAA,EAEQ,oBAAoB,QAAgB,YAA0B;AACpE,UAAM,OACJ,KAAK,WACF,YAAY,EACZ,MAAM,KAAK,CAAC,UAAU,MAAM,OAAO,MAAM,KAAK;AACnD,QAAI,CAAC,MAAM;AACT;AAAA,IACF;AAEA,UAAM,UAAU;AAAA,MACd,YAAY,KAAK,KAAK;AAAA,MACtB,aAAa,KAAK,KAAK,eAAe;AAAA,MACtC,aAAa,KAAK,KAAK,gBAAgB;AAAA,MACvC,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK,KAAK,qBAAqB;AAAA,MACxC,QAAQ,KAAK,KAAK;AAAA,MAClB,aAAa,KAAK,MAAM;AAAA,IAC1B;AACA,QAAI,KAAK,KAAK,gBAAgB,QAAQ,CAAC,KAAK,MAAM,oBAAoB;AACpE;AAAA,IACF;AACA,UAAM,WAAW,KAAK,MAAM,qBAAqB,OAAO;AACxD,SAAK,QAAQ,QAAQ,QAAQ,EAAE,KAAK,CAAC,qBAAqB;AACxD,UACE,KAAK,cACL,qBAAqB,eACrB,eAAe,KAAK,gBACpB;AACA;AAAA,MACF;AACA,WAAK,8BAA8B,KAAK,EAAE;AAC1C,WAAK,WAAW,SAAS,UAAU,KAAK,EAAE;AAAA,IAC5C,GAAG,IAAI;AAAA,EACT;AAAA,EAEA,oBAAoB,QAAgB,OAAsB;AACxD,UAAM,WAAW,KAAK,WAAW,YAAY;AAC7C,QAAI,CAAC,SAAS,MAAM,KAAK,CAAC,SAAS,KAAK,OAAO,MAAM,GAAG;AACtD;AAAA,IACF;AAEA,SAAK,WAAW,SAAS,aAAa;AAAA,MACpC,OAAO,SAAS,MAAM;AAAA,QAAI,CAAC,SACzB,KAAK,OAAO,SACR;AAAA,UACE,GAAG;AAAA,UACH,MACE,UAAU,SACN,wBAAwB,KAAK,IAAI,IACjC;AAAA,YACE,GAAG,KAAK;AAAA,YACR,kBAAkB;AAAA,UACpB;AAAA,QACR,IACA;AAAA,MACN;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,uBACE,QACA,iBACM;AACN,SAAK,WAAW,SAAS;AAAA,MACvB;AAAA,MACA,mBAAmB;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,aAAa,QAAgB,OAAqB;AAChD,UAAM,YAAY,MAAM,KAAK;AAC7B,QAAI,CAAC,WAAW;AACd;AAAA,IACF;AAEA,UAAM,WAAW,KAAK,WAAW,YAAY;AAC7C,UAAM,OAAO,SAAS,MAAM,KAAK,CAAC,UAAU,MAAM,OAAO,MAAM;AAC/D,QAAI,CAAC,QAAQ,KAAK,UAAU,WAAW;AACrC;AAAA,IACF;AAEA,SAAK,WAAW,SAAS,aAAa;AAAA,MACpC,OAAO,SAAS,MAAM;AAAA,QAAI,CAAC,UACzB,MAAM,OAAO,SACT;AAAA,UACE,GAAG;AAAA,UACH,OAAO;AAAA,QACT,IACA;AAAA,MACN;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,qBAAqB,QAAgB,OAAsB;AACzD,UAAM,WAAW,KAAK,WAAW,YAAY;AAC7C,QAAI,CAAC,SAAS,MAAM,KAAK,CAAC,SAAS,KAAK,OAAO,MAAM,GAAG;AACtD;AAAA,IACF;AAEA,SAAK,WAAW,SAAS,aAAa;AAAA,MACpC,OAAO,SAAS,MAAM;AAAA,QAAI,CAAC,SACzB,KAAK,OAAO,SACR;AAAA,UACE,GAAG;AAAA,UACH,MACE,UAAU,SACN,yBAAyB,KAAK,IAAI,IAClC;AAAA,YACE,GAAG,KAAK;AAAA,YACR,mBAAmB;AAAA,UACrB;AAAA,QACR,IACA;AAAA,MACN;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,wBACE,gBACM;AACN,SAAK,iBAAiB;AACtB,QAAI,KAAK,4BAA4B;AACnC,WAAK,iCAAiC;AACtC;AAAA,IACF;AAEA,SAAK,oBAAoB,cAAc;AAAA,EACzC;AAAA,EAEQ,oBACN,gBACM;AACN,UAAM,qBAAqB,IAAI;AAAA,MAC7B,eAAe,IAAI,CAAC,SAAS;AAAA,QAC3B,sBAAsB,KAAK,QAAQ,KAAK,UAAU;AAAA,QAClD;AAAA,MACF,CAAC;AAAA,IACH;AACA,UAAM,eAAe,KAAK,WAAW,YAAY;AACjD,UAAM,oBAAoB;AAAA,MACxB,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AAEA,UAAM,YAAY,aAAa,MAC5B;AAAA,MACC,CAAC,SAAS,CAAC,KAAK,KAAK,eAAe,mBAAmB,IAAI,KAAK,EAAE;AAAA,IACpE,EACC,IAAI,CAAC,SAAS;AACb,YAAM,gBAAgB,mBAAmB,IAAI,KAAK,EAAE;AACpD,aAAO,gBACH;AAAA,QACE;AAAA,QACA;AAAA,QACA,KAAK,qBAAqB,IAAI,cAAc,MAAM;AAAA,MACpD,IACA;AAAA,IACN,CAAC;AACH,UAAM,cAAc,IAAI,IAAI,UAAU,IAAI,CAAC,SAAS,KAAK,EAAE,CAAC;AAE5D,eAAW,iBAAiB,gBAAgB;AAC1C,YAAM,SAAS;AAAA,QACb,cAAc;AAAA,QACd,cAAc;AAAA,MAChB;AACA,UAAI,YAAY,IAAI,MAAM,GAAG;AAC3B;AAAA,MACF;AAEA,YAAM,aAAa,KAAK,qBAAqB,IAAI,cAAc,MAAM;AACrE,UAAI,CAAC,YAAY;AACf;AAAA,MACF;AAEA,YAAM,WAAW,iCAAiC;AAAA,QAChD;AAAA,QACA;AAAA,QACA,cAAc,kBAAkB,IAAI,MAAM,KAAK;AAAA,MACjD,CAAC;AACD,gBAAU,KAAK,QAAQ;AACvB,kBAAY,IAAI,SAAS,EAAE;AAAA,IAC7B;AAEA,UAAM,YAAY,4BAA4B;AAAA,MAC5C,kBAAkB,aAAa;AAAA,MAC/B;AAAA,MACA,UAAU,KAAK;AAAA,IACjB,CAAC;AACD,QACE,kBAAkB,aAAa,OAAO,SAAS,KAC/C,iBAAiB,aAAa,WAAW,SAAS,GAClD;AACA;AAAA,IACF;AAEA,SAAK,WAAW,SAAS,aAAa;AAAA,MACpC;AAAA,MACA,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA,EAEQ,iBAAiB,QAAkD;AACzE,UAAM,aAAa,KAAK,qBAAqB,IAAI,OAAO,MAAM;AAC9D,QAAI,CAAC,YAAY;AACf,aAAO;AAAA,IACT;AACA,UAAM,eAAe,KAAK,2BAA2B,MAAM;AAE3D,UAAM,gBAAgB,KAAK,yBAAyB;AAAA,MAClD,YAAY,aAAa;AAAA,MACzB,QAAQ,aAAa;AAAA,IACvB,CAAC;AACD,UAAM,oBAAoB,gBACtB,OACA,KAAK,4BAA4B,YAAY;AACjD,UAAM,WAAW,iBAAiB;AAClC,QAAI,UAAU;AACZ,WAAK,WAAW,SAAS;AAAA,QACvB,SAAS;AAAA,QACT,aAAa,mBAAmB,WAAW,mBAAmB;AAAA,MAChE;AACA,UACE,iBACA,aAAa,gBAAgB,8BAC7B;AACA,cAAM,eAAe,KAAK,WAAW,YAAY;AACjD,cAAMC,iBAAgB,sCAAsC;AAAA,UAC1D,cAAc;AAAA,YACZ,GAAG;AAAA,YACH,OAAO,aAAa,MAAM,OAAO,CAAC,SAAS,KAAK,OAAO,SAAS,EAAE;AAAA,YAClE,WAAW,aAAa,UAAU;AAAA,cAChC,CAAC,WAAW,WAAW,SAAS;AAAA,YAClC;AAAA,UACF;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,QACV,CAAC;AACD,aAAK,WAAW,SAAS,WAAW,SAAS,IAAIA,cAAa;AAAA,MAChE;AACA,WAAK,oBAAoB,SAAS,EAAE;AACpC,UAAI,aAAa,YAAY;AAC3B,aAAK,gBAAgB,EAAE,QAAQ,SAAS,GAAG,GAAG,aAAa,UAAU;AAAA,MACvE;AACA,aAAO,SAAS;AAAA,IAClB;AAEA,UAAM,gBAAgB,sCAAsC;AAAA,MAC1D,cAAc,KAAK,WAAW,YAAY;AAAA,MAC1C;AAAA,MACA,QAAQ;AAAA,IACV,CAAC;AACD,UAAM,WAAW,gCAAgC;AAAA,MAC/C,YAAY,KAAK,yBAAyB,aAAa,UAAU;AAAA,MACjE;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,IACV,CAAC;AACD,SAAK,WAAW,SAAS,SAAS,QAAQ;AAC1C,SAAK,WAAW,SAAS,UAAU,SAAS,EAAE;AAC9C,WAAO,SAAS;AAAA,EAClB;AAAA,EAEQ,yBACN,YACgC;AAChC,QAAI,CAAC,YAAY,KAAK,KAAK,GAAG;AAC5B,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL,UAAU,KAAK;AAAA,MACf,MAAM,WAAW;AAAA,MACjB,GAAI,WAAW,YAAY,SACvB,CAAC,IACD,EAAE,SAAS,WAAW,QAAQ;AAAA,IACpC;AAAA,EACF;AAAA,EAEQ,yBACN,QAC6C;AAC7C,UAAM,WAAW,KAAK,WAAW,YAAY;AAC7C,QAAI,YAAY,QAAQ;AACtB,aAAO,SAAS,MAAM,KAAK,CAAC,SAAS,KAAK,OAAO,OAAO,MAAM,KAAK;AAAA,IACrE;AAEA,UAAM,aAAa,KAAK,qBAAqB,IAAI,OAAO,MAAM;AAC9D,QAAI,CAAC,YAAY;AACf,aAAO;AAAA,IACT;AACA,UAAM,QAAQ,SAAS,MAAM;AAAA,MAC3B,CAAC,SAAS,KAAK,KAAK,WAAW,WAAW;AAAA,IAC5C;AACA,QAAI,OAAO,YAAY;AACrB,aACE,MAAM,KAAK,CAAC,SAAS,KAAK,KAAK,eAAe,OAAO,UAAU,KAAK;AAAA,IAExE;AAEA,QAAI,WAAW,UAAU,SAAS,SAAS;AACzC,aAAO;AAAA,IACT;AAEA,WAAO,MAAM,CAAC,KAAK;AAAA,EACrB;AAAA,EAEQ,4BACN,QAC6C;AAC7C,UAAM,cAAc,OAAO,aAAa,KAAK;AAC7C,QAAI,CAAC,OAAO,sBAAsB,CAAC,aAAa;AAC9C,aAAO;AAAA,IACT;AAEA,UAAM,WAAW,KAAK,WAAW,YAAY;AAC7C,UAAM,YAAY,IAAI,IAAI,SAAS,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC;AACvE,aAAS,QAAQ,SAAS,UAAU,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG;AACtE,YAAM,OAAO,UAAU,IAAI,SAAS,UAAU,KAAK,KAAK,EAAE;AAC1D,UACE,MAAM,KAAK,WAAW,OAAO,UAC7B,KAAK,KAAK,gBAAgB,aAC1B;AACA,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WACE,SAAS,MAAM;AAAA,MACb,CAAC,SACC,KAAK,KAAK,WAAW,OAAO,UAC5B,KAAK,KAAK,gBAAgB;AAAA,IAC9B,KAAK;AAAA,EAET;AAAA,EAEQ,qBAA+C;AACrD,QAAI,CAAC,KAAK,MAAM,mBAAmB,YAAY,KAAK,MAAM,WAAW,GAAG;AACtE,aAAO;AAAA,IACT;AAEA,WACE,KAAK,MAAM,mBAAmB,aAAa,KAAK,MAAM,WAAW,KAAK;AAAA,EAE1E;AAAA,EAEQ,YAAkB;AACxB,QAAI,CAAC,KAAK,4BAA4B;AACpC;AAAA,IACF;AAEA,SAAK,6BAA6B;AAClC,SAAK,aAAa;AAAA,EACpB;AAAA,EAEQ,wBAA8B;AACpC,SAAK,6BAA6B;AAClC,SAAK,yCAAyC;AAC9C,SAAK,eAAe,IAAI,QAAQ,CAAC,YAAY;AAC3C,WAAK,eAAe;AAAA,IACtB,CAAC;AAAA,EACH;AAAA,EAEQ,wBAA8B;AACpC,UAAM,qBAAqB,KAAK,WAAW,YAAY,EAAE;AACzD,QACE,KAAK,wBACJ,KAAK,oBAAoB,UAAU,mBAAmB,SACrD,KAAK,oBAAoB,WAAW,mBAAmB,SACzD;AACA,WAAK,yBAAyB;AAAA,IAChC;AACA,SAAK,sBAAsB;AAAA,EAC7B;AAAA,EAEQ,oCAA0C;AAChD,QACE,KAAK,0CACL,CAAC,KAAK,oBACN,CAAC,KAAK,wBACN;AACA;AAAA,IACF;AAEA,UAAM,WAAW,KAAK,WAAW,YAAY;AAC7C,UAAM,iBAAiB,kCAAkC;AAAA,MACvD,aAAa,SAAS;AAAA,MACtB,sBAAsB,KAAK;AAAA,MAC3B,OAAO,SAAS;AAAA,MAChB,aAAa,SAAS;AAAA,IACxB,CAAC;AACD,SAAK,yCAAyC;AAC9C,QAAI,kBAAkB,SAAS,OAAO,cAAc,GAAG;AACrD;AAAA,IACF;AACA,SAAK,WAAW,SAAS,aAAa,cAAc;AAAA,EACtD;AAAA,EAEQ,mCAAyC;AAC/C,QAAI,KAAK,oCAAoC;AAC3C;AAAA,IACF;AAEA,UAAM,aAAa,KAAK;AACxB,SAAK,qCAAqC;AAC1C,SAAK,KAAK,aAAa,KAAK,MAAM;AAChC,WAAK,qCAAqC;AAC1C,UAAI,KAAK,cAAc,eAAe,KAAK,gBAAgB;AACzD;AAAA,MACF;AACA,WAAK,oBAAoB,KAAK,cAAc;AAAA,IAC9C,CAAC;AAAA,EACH;AAAA,EAEQ,aAAa,YAAoB,QAA0B;AACjE,QAAI,CAAC,KAAK,4BAA4B;AACpC,UAAI,CAAC,KAAK,cAAc,eAAe,KAAK,gBAAgB;AAC1D,eAAO;AAAA,MACT;AACA;AAAA,IACF;AAEA,SAAK,KAAK,aAAa,KAAK,MAAM;AAChC,UAAI,KAAK,cAAc,eAAe,KAAK,gBAAgB;AACzD;AAAA,MACF;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,eAAe,YAAsC;AACjE,QAAI,CAAC,KAAK,4BAA4B;AACpC,aAAO,CAAC,KAAK,cAAc,eAAe,KAAK;AAAA,IACjD;AAEA,UAAM,KAAK;AACX,WAAO,CAAC,KAAK,cAAc,eAAe,KAAK;AAAA,EACjD;AAAA,EAEQ,oBAAoB,QAAsB;AAChD,UAAM,WAAW,KAAK,WACnB,YAAY,EACZ,MAAM,KAAK,CAAC,SAAS,KAAK,OAAO,MAAM;AAC1C,QAAI,CAAC,UAAU;AACb;AAAA,IACF;AACA,QAAI,SAAS,aAAa;AACxB,WAAK,WAAW,SAAS,YAAY,SAAS,EAAE;AAAA,IAClD;AACA,SAAK,WAAW,SAAS,UAAU,SAAS,EAAE;AAAA,EAChD;AAAA,EAEQ,eAAqB;AAC3B,QAAI,CAAC,KAAK,kBAAkB;AAC1B;AAAA,IACF;AAEA,UAAM,WAAW;AAAA,MACf;AAAA,QACE,KAAK;AAAA,UACH;AAAA,YACE,KAAK,WAAW,YAAY;AAAA,YAC5B,KAAK;AAAA,UACP;AAAA,QACF;AAAA,QACA;AAAA,UACE,eAAe,KAAK,gBAAgB;AAAA,UACpC,UAAU;AAAA,YACR;AAAA,cACE,GAAI,KAAK,gBAAgB,YAAY,CAAC;AAAA,cACtC,CAAC,sBAAsB,GAAG;AAAA,YAC5B;AAAA,YACA,KAAK,6BAA6B,OAAO;AAAA,UAC3C;AAAA,UACA,QAAQ,KAAK,gBAAgB;AAAA,QAC/B;AAAA,MACF;AAAA,IACF;AACA,QAAI,yBAAyB,QAAQ,MAAM,KAAK,sBAAsB,GAAG;AACvE;AAAA,IACF;AACA,SAAK,QAAQ;AAAA,MACX,KAAK,MAAM,mBAAmB,KAAK,KAAK,MAAM,aAAa,QAAQ;AAAA,IACrE,EAAE,KAAK,CAAC,kBAAkB;AACxB,WAAK,iBAAiB;AAAA,IACxB,GAAG,IAAI;AAAA,EACT;AAAA,EAEQ,8BAA8B,QAAsB;AAC1D,UAAM,OAAO,KAAK,WACf,YAAY,EACZ,MAAM,KAAK,CAACC,WAAUA,OAAM,OAAO,MAAM;AAC5C,UAAM,cAAc,MAAM,KAAK,aAAa,KAAK;AACjD,QAAI,CAAC,QAAQ,CAAC,aAAa;AACzB;AAAA,IACF;AAEA,UAAM,QAAoC;AAAA,MACxC;AAAA,MACA,OACE,KAAK,gBAAgB,gBAAgB,KAAK,eACtC,KAAK,eACL,KAAK;AAAA,MACX,QAAQ,KAAK,KAAK;AAAA,IACpB;AACA,SAAK,6BAA6B;AAAA,MAChC,8BAA8B,KAAK;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,2BACN,QAC2B;AAC3B,UAAM,cAAc,OAAO,aAAa,KAAK;AAC7C,QAAI,CAAC,aAAa;AAChB,aAAO;AAAA,IACT;AAEA,UAAM,QAAQ,KAAK,6BAA6B;AAAA,MAC9C,8BAA8B;AAAA,QAC5B;AAAA,QACA,QAAQ,OAAO;AAAA,MACjB,CAAC;AAAA,IACH;AACA,QAAI,CAAC,OAAO;AACV,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL,GAAG;AAAA,MACH,cAAc,MAAM;AAAA,MACpB,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EAEQ,wBAAuC;AAC7C,QAAI,CAAC,KAAK,gBAAgB;AACxB,aAAO;AAAA,IACT;AACA,WAAO;AAAA,MACL,8BAA8B,KAAK,cAAc;AAAA,IACnD;AAAA,EACF;AAAA,EAEQ,iCAAuC;AAC7C,QAAI,CAAC,KAAK,oBAAoB,KAAK,YAAY;AAC7C;AAAA,IACF;AAEA,QAAI,KAAK,cAAc,MAAM;AAC3B,iBAAW,aAAa,KAAK,SAAS;AAAA,IACxC;AACA,SAAK,YAAY,WAAW,WAAW,MAAM;AAC3C,WAAK,YAAY;AACjB,WAAK,aAAa;AAAA,IACpB,GAAG,mBAAmB;AAAA,EACxB;AAAA,EAEQ,yBAA+B;AACrC,QAAI,KAAK,gBAAgB,MAAM;AAC7B;AAAA,IACF;AAEA,SAAK,cAAc,KAAK,WAAW,UAAU,MAAM;AACjD,WAAK,+BAA+B;AAAA,IACtC,CAAC;AACD,QAAI,KAAK,6BAA6B,MAAM;AAC1C,YAAM,SAAS,KAAK,MAAM;AAC1B,YAAM,2BACJ,OAAO,QAAQ,yBAAyB;AAC1C,UAAI,CAAC,0BAA0B;AAC7B;AAAA,MACF;AACA,WAAK,2BACH,QAAQ,YAAY,MAAM;AACxB,aAAK,+BAA+B;AAAA,MACtC,CAAC,KAAK;AAAA,IACV;AAAA,EACF;AAAA,EAEQ,oBAA0B;AAChC,eAAW,SAAS,KAAK,WAAW,OAAO,GAAG;AAC5C,YAAM,QAAQ;AAAA,IAChB;AACA,SAAK,WAAW,MAAM;AAAA,EACxB;AAAA,EAEQ,+BACN,OACoE;AACpE,UAAM,SAAS,KAAK,MAAM;AAC1B,UAAM,uBAAuB,QAAQ,sBAAsB,KAAK,MAAM;AACtE,QAAI,CAAC,sBAAsB;AACzB,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL,GAAG;AAAA,MACH,OAAO,MAAM,MAAM,IAAI,CAAC,SAAS;AAC/B,cAAM,cAAc;AAAA,UAClB,YAAY,KAAK,KAAK;AAAA,UACtB,aAAa,KAAK,KAAK,eAAe;AAAA,UACtC,QAAQ,KAAK;AAAA,UACb,QAAQ,KAAK,KAAK;AAAA,UAClB,aAAa,KAAK,MAAM;AAAA,UACxB,GAAI,KAAK,KAAK,oBACV,EAAE,SAAS,KAAK,KAAK,kBAAkB,IACvC,CAAC;AAAA,QACP;AACA,cAAM,oBAAoB,qBAAqB,WAAW;AAC1D,cAAM,wBACJ,qBAAqB,KAAK,KAAK;AACjC,YAAI,0BAA0B,QAAW;AACvC,iBAAO;AAAA,QACT;AACA,eAAO;AAAA,UACL,GAAG;AAAA,UACH,MAAM;AAAA,YACJ,GAAG,KAAK;AAAA,YACR,mBAAmB;AAAA,UACrB;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,sBAA4B;AAClC,UAAM,cAAc,KAAK,WAAW,YAAY,EAAE;AAClD,UAAM,cAAc,IAAI,IAAI,YAAY,IAAI,CAAC,SAAS,KAAK,EAAE,CAAC;AAE9D,eAAW,CAAC,QAAQ,KAAK,KAAK,KAAK,YAAY;AAC7C,UAAI,YAAY,IAAI,MAAM,GAAG;AAC3B;AAAA,MACF;AACA,YAAM,QAAQ;AACd,WAAK,WAAW,OAAO,MAAM;AAAA,IAC/B;AAEA,eAAW,QAAQ,aAAa;AAC9B,UAAI,KAAK,WAAW,IAAI,KAAK,EAAE,GAAG;AAChC;AAAA,MACF;AACA,YAAM,aAAa,KAAK,qBAAqB,IAAI,KAAK,KAAK,MAAM;AACjE,YAAM,QAAQ,YAAY,cAAc;AAAA,QACtC;AAAA,QACA,aAAa,KAAK,MAAM;AAAA,MAC1B,CAAC;AACD,UAAI,OAAO;AACT,aAAK,WAAW,IAAI,KAAK,IAAI,KAAK;AAAA,MACpC;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,wBACP,MACuB;AACvB,QAAM,OAAO,EAAE,GAAG,KAAK;AACvB,SAAO,KAAK;AACZ,SAAO;AACT;AAEA,SAAS,yBACP,MACuB;AACvB,QAAM,OAAO,EAAE,GAAG,KAAK;AACvB,SAAO,KAAK;AACZ,SAAO;AACT;AAEA,SAAS,yBAAyB,UAAqC;AACrE,SAAO,KAAK,UAAU,QAAQ;AAChC;AAEA,SAAS,iCACP,OACe;AACf,MAAI,MAAM,cAAc,KAAK,GAAG;AAC9B,WAAO,MAAM,aAAa,KAAK;AAAA,EACjC;AACA,UAAQ,MAAM,QAAQ;AAAA,IACpB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,EACX;AACF;AAEA,SAAS,uBAAuB,OAAyC;AACvE,MAAI,iBAAiB,OAAO;AAC1B,WAAO;AAAA,MACL,SAAS,0BAA0B,MAAM,OAAO;AAAA,MAChD,MAAM,MAAM;AAAA,MACZ,OAAO,0BAA0B,MAAM,KAAK;AAAA,IAC9C;AAAA,EACF;AACA,SAAO;AAAA,IACL,SAAS,uBAAuB,KAAK;AAAA,IACrC,MAAM,OAAO;AAAA,EACf;AACF;AAEA,SAAS,uBAAuB,OAA+B;AAC7D,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,0BAA0B,KAAK,KAAK;AAAA,EAC7C;AACA,MACE,UAAU,QACV,OAAO,UAAU,YACjB,OAAO,UAAU,WACjB;AACA,WAAO,OAAO,KAAK;AAAA,EACrB;AACA,MAAI;AACF,WAAO,0BAA0B,KAAK,UAAU,KAAK,CAAC,KAAK;AAAA,EAC7D,QAAQ;AACN,WAAO,OAAO,UAAU,SAAS,KAAK,KAAK;AAAA,EAC7C;AACF;AAEA,SAAS,0BAA0B,OAA0C;AAC3E,QAAM,UAAU,OAAO,KAAK;AAC5B,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AACA,SAAO,QAAQ,SAAS,gCACpB,GAAG,QAAQ,MAAM,GAAG,6BAA6B,CAAC,QAClD;AACN;AAEA,SAAS,OAAa;AAAC;;;AV/rChB,SAAS,wBAAwB;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAeK;AACH,QAAM,CAAC,uBAAuB,yBAAyB,IAAIC,UAAS,CAAC;AACrE,QAAM,CAAC,EAAE,qBAAqB,IAAIA,UAAS,CAAC;AAC5C,QAAM,cAAcC,SAAQ,MAAM;AAChC,0BAAsB,kBAAkB,kBAAkB;AAAA,MACxD,aAAa,MAAM,IAAI,CAAC,SAAS,KAAK,MAAM;AAAA,MAC5C,oBAAoB,gBAAgB,UAAU;AAAA,MAC9C;AAAA,IACF,CAAC;AACD,WAAO,2BAA2B;AAAA,MAChC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,gBAAgB,kBAAkB,CAAC;AAAA,MACnC;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,QAAM,WAAWA,SAAQ,MAAM,+BAA+B,IAAI,GAAG,CAAC,IAAI,CAAC;AAC3E,QAAM,qBAAqBA;AAAA,IACzB,MAAM,yCAAyC,IAAI;AAAA,IACnD,CAAC,IAAI;AAAA,EACP;AACA,QAAM,mBAAmBA;AAAA,IACvB,MAAM,uCAAuC,IAAI;AAAA,IACjD,CAAC,IAAI;AAAA,EACP;AACA,QAAM,uBAAuBA;AAAA,IAC3B,MAAM,IAAI,IAAI,MAAM,IAAI,CAAC,eAAe,CAAC,WAAW,QAAQ,UAAU,CAAC,CAAC;AAAA,IACxE,CAAC,KAAK;AAAA,EACR;AACA,QAAM,cAAc,YAAY,cAAc,KAAK;AACnD,QAAM,wBAAwBA;AAAA,IAC5B,MACE,yBAAyB,CAAC,cACtB,yCAAyC;AAAA,MACvC,cAAc,YAAY,aAAa,KAAK,WAAW;AAAA,MACvD,YAAY,YAAY;AAAA,IAC1B,CAAC,IACD;AAAA,IACN,CAAC,YAAY,YAAY,aAAa,qBAAqB;AAAA,EAC7D;AACA,QAAM,mBAAmBA;AAAA,IACvB,MACE,cACI,kCAAkC,YAAY,UAAU,IACxD,YAAY;AAAA,IAClB,CAAC,YAAY,YAAY,WAAW;AAAA,EACtC;AACA,QAAM,gBAAgBA;AAAA,IACpB,OAAO;AAAA,MACL,cAAc,YAAY,aAAa,KAAK,WAAW;AAAA,MACvD,YAAY;AAAA,MACZ,WAAW,YAAY,UAAU,KAAK,WAAW;AAAA,MACjD,YAAY,YAAY,WAAW,KAAK,WAAW;AAAA,IACrD;AAAA,IACA,CAAC,kBAAkB,WAAW;AAAA,EAChC;AAEA,EAAAC,WAAU,MAAM;AACd,QAAI,YAAY;AAChB,SAAK,YAAY,KAAK,EAAE,QAAQ,MAAM;AACpC,UAAI,WAAW;AACb,8BAAsB,CAAC,aAAa,WAAW,CAAC;AAAA,MAClD;AAAA,IACF,CAAC;AAED,WAAO,MAAM;AACX,kBAAY;AACZ,4BAAsB,mBAAmB,kBAAkB;AAAA,QACzD;AAAA,MACF,CAAC;AACD,kBAAY,QAAQ;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,kBAAkB,aAAa,WAAW,CAAC;AAE/C,EAAAA,WAAU,MAAM;AACd,oBAAgB,WAAW;AAC3B,WAAO,MAAM;AACX,sBAAgB,IAAI;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,aAAa,aAAa,CAAC;AAE/B,EAAAA,WAAU,MAAM;AACd,QAAI,CAAC,8BAA8B;AACjC,aAAO;AAAA,IACT;AAEA,iCAA6B,qBAAqB;AAClD,WAAO,MAAM;AACX,mCAA6B,IAAI;AAAA,IACnC;AAAA,EACF,GAAG,CAAC,uBAAuB,4BAA4B,CAAC;AAExD,EAAAA,WAAU,MAAM;AACd,gBAAY,wBAAwB,kBAAkB,CAAC,CAAC;AAAA,EAC1D,GAAG,CAAC,aAAa,cAAc,CAAC;AAEhC,EAAAA,WAAU,MAAM;AACd,QAAI,CAAC,qBAAqB,WAAW;AACnC,aAAO;AAAA,IACT;AAEA,WAAO,oBAAoB,UAAU,MAAM;AACzC,gCAA0B,CAAC,aAAa,WAAW,CAAC;AAAA,IACtD,CAAC;AAAA,EACH,GAAG,CAAC,qBAAqB,WAAW,CAAC;AAErC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,IAAMC,QAAO,MAAM;AAAC;AAEpB,IAAM,4BAA4B,IAAI;AAAA,EACpC,CAAC;AAAA,EACD;AAAA,IACE,KAAK,MAAMA;AAAA,EACb;AACF;AAEA,SAAS,kCACP,YAC4C;AAC5C,SAAO;AAAA,IACL,UAAU;AAAA,IACV,UAAUA;AAAA,IACV,aAAa,WAAW,YAAY,KAAK,UAAU;AAAA,IACnD,WAAW,WAAW,UAAU,KAAK,UAAU;AAAA,EACjD;AACF;AAEA,SAAS,sBACP,OACA,kBACA,SACM;AACN,MAAI,CAAC,kBAAkB,UAAU,GAAG;AAClC;AAAA,EACF;AAEA,UAAQ,KAAK,oBAAoB;AAAA,IAC/B;AAAA,IACA,GAAG;AAAA,EACL,CAAC;AACD,OAAK,QAAQ;AAAA,IACX,iBAAiB,MAAM;AAAA,MACrB,SAAS;AAAA,MACT;AAAA,MACA,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,aACE,OAAO,QAAQ,gBAAgB,WAAW,QAAQ,cAAc;AAAA,IACpE,CAAC;AAAA,EACH,EAAE,MAAM,MAAM,MAAS;AACzB;;;AWxNA,SAAS,WAAW,eAAAC,eAAa,WAAAC,gBAAe;;;ACAhD;AAAA,EACE,eAAAC;AAAA,EACA,aAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,YAAAC;AAAA,OAQK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA,UAAAC;AAAA,EACA;AAAA,EACA;AAAA,OACK;;;ACIA,SAAS,4BACd,OACA,MACS;AACT,MAAI,OAAO,KAAK,KAAK,gBAAgB,UAAU;AAC7C,WAAO,KAAK,KAAK,gBAAgB,MAAM;AAAA,EACzC;AACA,SAAO,MAAM,YAAY,IAAI,KAAK;AACpC;AAEO,SAAS,mCACd,OACQ;AACR,SAAO,MAAM,aAAa,MAAM;AAClC;AAEO,SAAS,4BAA4B,OAIP;AACnC,QAAM,eAAe,oBAAI,IAAoB;AAC7C,MAAI,mBAAmB;AACvB,QAAM,gBAAgB,CAAC,GAAG,MAAM,WAAW,EACxC,IAAI,CAAC,OAAO,UAAU;AACrB,UAAM,YAAY,MAAM,aAAa;AACrC,QAAI,CAAC,aAAa,IAAI,SAAS,GAAG;AAChC,mBAAa,IAAI,WAAW,kBAAkB;AAAA,IAChD;AACA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,CAAC,EACA,KAAK,CAAC,MAAM,UAAU;AACrB,UAAM,qBACH,aAAa,IAAI,KAAK,SAAS,KAAK,MACpC,aAAa,IAAI,MAAM,SAAS,KAAK;AACxC,QAAI,sBAAsB,GAAG;AAC3B,aAAO;AAAA,IACT;AACA,UAAM,cAAc,KAAK,MAAM,SAAS,MAAM,MAAM,MAAM,SAAS;AACnE,QAAI,eAAe,GAAG;AACpB,aAAO;AAAA,IACT;AACA,WAAO,KAAK,QAAQ,MAAM;AAAA,EAC5B,CAAC;AAEH,MAAI,oBAAmC;AACvC,QAAM,kBAAoD,CAAC;AAE3D,aAAW,EAAE,OAAO,UAAU,KAAK,eAAe;AAChD,UAAM,eAAe,MAAM,MAAM;AAAA,MAAO,CAAC,SACvC,4BAA4B,OAAO,IAAI;AAAA,IACzC;AACA,UAAM,mBAAmB,aAAa,SAAS;AAC/C,UAAM,aAAa,MAAM,cAAc;AACvC,QACE,eAAe,WACd,eAAe,eAAe,CAAC,kBAChC;AACA;AAAA,IACF;AAEA,UAAM,cAAc,aAAa;AAAA,MAC/B,CAAC,SAAS,CAAC,MAAM,iBAAiB,IAAI,KAAK,EAAE;AAAA,IAC/C;AACA,UAAM,mBAAmB,aAAa;AAAA,MAAK,CAAC,SAC1C,MAAM,iBAAiB,IAAI,KAAK,EAAE;AAAA,IACpC;AAEA,oBAAgB,KAAK;AAAA,MACnB,WAAW,mCAAmC,KAAK;AAAA,MACnD,eAAe,mBACX,cACA,cACE,SACA;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA,oBACE,sBAAsB,QAAQ,sBAAsB;AAAA,IACxD,CAAC;AACD,wBAAoB;AAAA,EACtB;AAEA,SAAO;AACT;AAEO,SAAS,+BAA+B,OAIV;AACnC,MAAI,MAAM,MAAM,eAAe;AAC7B,QAAI,4BAA4B,MAAM,KAAK,GAAG;AAC5C,aAAO,EAAE,MAAM,UAAU;AAAA,IAC3B;AACA,WAAO,EAAE,UAAU,MAAM,MAAM,eAAe,MAAM,SAAS;AAAA,EAC/D;AACA,MAAI,4BAA4B,MAAM,KAAK,GAAG;AAC5C,WAAO,EAAE,MAAM,UAAU;AAAA,EAC3B;AACA,MAAI,MAAM,iBAAiB,WAAW,MAAM,aAAa,SAAS,GAAG;AACnE,WAAO,EAAE,MAAM,aAAa;AAAA,EAC9B;AACA,MAAI,MAAM,aAAa,WAAW,GAAG;AACnC,WAAO,EAAE,MAAM,cAAc,QAAQ,MAAM,aAAa,CAAC,EAAG,GAAG;AAAA,EACjE;AACA,MAAI,MAAM,aAAa,SAAS,GAAG;AACjC,WAAO,EAAE,MAAM,aAAa;AAAA,EAC9B;AACA,SAAO,EAAE,MAAM,SAAS;AAC1B;AAEA,SAAS,4BAA4B,OAAwC;AAC3E,QAAM,YAAY,MAAM,OAAO,QAAQ;AACvC,SACE,cAAc,cACd,cAAc,aACd,cAAc,kBACb,MAAM,kBAAkB,eAAe;AAE5C;;;ACtJA,SAAS,eAAAC,cAAa,aAAAC,YAAW,UAAAC,eAA8B;AAExD,IAAM,sBAAsB;AAC5B,IAAM,sBAAsB,sBAAsB;AAClD,IAAM,gCAAgC,sBAAsB;AAEnE,IAAM,iCAAiC;AACvC,IAAM,sCAAsC;AAC5C,IAAM,oCAAoC;AAC1C,IAAM,+BAA+B;AACrC,IAAM,6BAA6B;AACnC,IAAM,iCAAiC,IAAI;AAC3C,IAAM,kCAAkC;AACxC,IAAM,mCAAmC;AACzC,IAAM,wCAAwC;AAyB9C,IAAM,+BAA+B,oBAAI,QAGvC;AAEK,SAAS,wBACd,UACA,WAAW,qBACX,WAAW,qBACX,YAAY,+BACJ;AACR,QAAM,mBAAmB,KAAK,IAAI,QAAQ;AAC1C,MAAI,oBAAoB,WAAW;AACjC,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,IAAI,mBAAmB;AACzC,SAAO,YAAY,WAAW,YAAY;AAC5C;AAEO,SAAS,gCACd,YACA,UACA,UACQ;AACR,QAAM,kBAAkB,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,QAAQ,CAAC;AACzD,SAAO,YAAY,aAAa,YAAY;AAC9C;AAEO,SAAS,kCACd,WACA,eACA,mBAAmB,uCACgB;AACnC,MAAI,UAAU,WAAW,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,MAAI,YAAY,OAAO;AACvB,MAAI,UAAU,OAAO;AACrB,MAAI,aAAa,OAAO;AACxB,MAAI,WAAW,OAAO;AAEtB,aAAW,QAAQ,WAAW;AAC5B,QAAI,kBAAkB,QAAQ;AAC5B,kBAAY,KAAK,IAAI,WAAW,KAAK,GAAG;AACxC,gBAAU,KAAK,IAAI,SAAS,KAAK,MAAM;AACvC,mBAAa,KAAK,IAAI,YAAY,KAAK,IAAI;AAC3C,iBAAW,KAAK,IAAI,UAAU,KAAK,KAAK;AAAA,IAC1C,OAAO;AACL,kBAAY,KAAK,IAAI,WAAW,KAAK,IAAI;AACzC,gBAAU,KAAK,IAAI,SAAS,KAAK,KAAK;AACtC,mBAAa,KAAK,IAAI,YAAY,KAAK,GAAG;AAC1C,iBAAW,KAAK,IAAI,UAAU,KAAK,MAAM;AAAA,IAC3C;AAAA,EACF;AAEA,QAAM,+BACJ,kBAAkB,SACd,oBAAoB,sBAAsB,uBAC1C;AAEN,SAAO;AAAA,IACL,UAAU,WAAW;AAAA,IACrB,YAAY,aAAa;AAAA,IACzB;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,wCAAwC;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKY;AACV,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,kBAAkB,SAAS,UAAU;AACtD,QAAM,YAAY,kBAAkB,SAAS,UAAU;AACvD,SACE,YAAY,UAAU,aACtB,YAAY,UAAU,WACtB,aAAa,UAAU,cACvB,aAAa,UAAU;AAE3B;AAEO,SAAS,mCACd,MACA,eACA,WAAW,qBACH;AACR,SAAO,kBAAkB,SACrB,KAAK,MAAM,WAAW,IACtB,KAAK,OAAO,WAAW;AAC7B;AAEA,IAAM,qCAAqC;AAEpC,SAAS,+BACd,SACA,QACA,cACyB;AACzB,QAAM,kBAAkB,eAAe;AACvC,MAAI,EAAE,OAAO,SAAS,IAAI;AAE1B,WAAS,OAAO,GAAG,OAAO,oCAAoC,QAAQ,GAAG;AACvE,UAAM,QACJ,CAAC,uCAAuC,QAAQ,UAChD,oCAAoC;AACtC,UAAM,eAAe,QAAQ;AAC7B,gBAAY,eAAe;AAC3B,aAAS,WAAW;AAAA,EACtB;AAEA,SAAO,EAAE,OAAO,SAAS;AAC3B;AAEO,SAAS,iCACd,QACA,QACS;AACT,SACE,KAAK,IAAI,OAAO,QAAQ,MAAM,KAAK,gCACnC,KAAK,IAAI,OAAO,QAAQ,KAAK;AAEjC;AAEA,SAAS,2BAA2B,MAAsB;AACxD,SAAO,KAAK,MAAM,OAAO,EAAE,IAAI;AACjC;AAEA,SAAS,sBACP,UACA,MACS;AACT,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,IAAI,SAAS,OAAO,KAAK,IAAI,IAAI;AAC/C;AAEO,SAAS,uCAAuC;AAAA,EACrD;AACF,GAEsC;AACpC,SAAO,EAAE,QAAQ,MAAM,OAAO,KAAK;AACrC;AAEO,SAAS,oCACd,aACS;AACT,SACE,YAAY,QAAQ,eAAe,UACnC,YAAY,QAAQ,aAAa,cACjC,YAAY,QAAQ,aAAa;AAErC;AAEA,SAAS,8BACP,aACoB;AACpB,QAAM,cAAc,6BAA6B,IAAI,WAAW;AAChE,MACE,gBAAgB,WACf,gBAAgB,QAAQ,YAAY,SAAS,WAAW,IACzD;AACA,WAAO;AAAA,EACT;AAEA,QAAM,QACJ,YAAY,cAA2B,gCAAgC,KACvE,YAAY;AAAA,IACV;AAAA,EACF,KACA,YAAY;AAAA,IACV;AAAA,EACF;AACF,+BAA6B,IAAI,aAAa,KAAK;AACnD,SAAO;AACT;AAEA,SAAS,2BACP,aACA,MACA,UACA,kBACM;AACN,QAAM,YAAY,YAAY,QAAQ;AACtC,MAAI,CAAC,WAAW;AACd;AAAA,EACF;AAEA,QAAM,QAAQ,8BAA8B,WAAW;AACvD,MAAI,CAAC,OAAO;AACV;AAAA,EACF;AAEA,QAAM,YAAY;AAAA,IAChB,MAAM,2BAA2B,IAAI;AAAA,EACvC;AAEA,MAAI,CAAC,sBAAsB,iBAAiB,IAAI,SAAS,GAAG,SAAS,GAAG;AACtE;AAAA,EACF;AAEA,mBAAiB,IAAI,WAAW,SAAS;AAEzC,MAAI,KAAK,IAAI,UAAU,OAAO,QAAQ,KAAK,4BAA4B;AACrE,gBAAY,MAAM,eAAe,OAAO;AACxC,gBAAY,MAAM,eAAe,QAAQ;AACzC,UAAM,MAAM,eAAe,WAAW;AACtC;AAAA,EACF;AAEA,QAAM,QAAQ,UAAU,OAAO;AAC/B,QAAM,aAAa,uCAAuC;AAAA,IACxD,MAAM,UAAU;AAAA,EAClB,CAAC;AACD,cAAY,MAAM,QAAQ,GAAG,WAAW,KAAK;AAC7C,cAAY,MAAM,SAAS,GAAG,WAAW,MAAM;AAC/C,QAAM,MAAM,YAAY,SAAS,KAAK;AACxC;AAEA,SAAS,2BACP,aACA,kBACM;AACN,QAAM,YAAY,YAAY,QAAQ;AACtC,MAAI,WAAW;AACb,qBAAiB,OAAO,SAAS;AAAA,EACnC;AACA,cAAY,MAAM,eAAe,OAAO;AACxC,cAAY,MAAM,eAAe,QAAQ;AACzC,QAAM,QAAQ,8BAA8B,WAAW;AACvD,SAAO,MAAM,eAAe,WAAW;AACzC;AAEO,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,iBAAiBA,QAAsB,IAAI;AACjD,QAAM,wBAAwBA,QAAsB,IAAI;AACxD,QAAM,aAAaA,QAAO,oBAAI,IAAqC,CAAC;AACpE,QAAM,mBAAmBA;AAAA,IACvB,oBAAI,IAA2C;AAAA,EACjD;AACA,QAAM,oBAAoBA,QAAsB,IAAI;AACpD,QAAM,mBAAmBA,QAAsB,IAAI;AACnD,QAAM,wBAAwBA,QAAsB,IAAI;AACxD,QAAM,iBAAiBA,QAAmC,IAAI;AAC9D,QAAM,eAAeA,QAA0C,IAAI;AACnE,QAAM,eAAeA,QAAiB,CAAC,CAAC;AACxC,QAAM,mBAAmBA,QAAO,KAAK;AAErC,QAAM,mBAAmBF;AAAA,IACvB,CAAC,WAAoB;AACnB,UAAI,iBAAiB,YAAY,QAAQ;AACvC;AAAA,MACF;AACA,uBAAiB,UAAU;AAC3B,UAAI,QAAQ;AACV,oBAAY,SAAS,aAAa,4BAA4B,MAAM;AAAA,MACtE,OAAO;AACL,oBAAY,SAAS,gBAAgB,0BAA0B;AAAA,MACjE;AAAA,IACF;AAAA,IACA,CAAC,WAAW;AAAA,EACd;AAEA,QAAM,gBAAgBA,aAAY,MAAM;AACtC,QAAI,kBAAkB,YAAY,MAAM;AACtC,2BAAqB,kBAAkB,OAAO;AAC9C,wBAAkB,UAAU;AAAA,IAC9B;AACA,qBAAiB,UAAU;AAAA,EAC7B,GAAG,CAAC,CAAC;AAEL,QAAM,qBAAqBA,aAAY,MAAM;AAC3C,UAAM,QAAQ,SAAS;AACvB,UAAM,UAAU,oBAAI,IAAoB;AACxC,UAAM,YAAyC,CAAC;AAChD,UAAM,QAAkB,CAAC;AACzB,eAAW,CAAC,WAAW,WAAW,KAAK,OAAO;AAC5C,YAAM,KAAK,SAAS;AACpB,YAAM,OAAO,YAAY,sBAAsB;AAC/C,gBAAU,KAAK;AAAA,QACb,QAAQ,KAAK;AAAA,QACb,MAAM,KAAK;AAAA,QACX,OAAO,KAAK;AAAA,QACZ,KAAK,KAAK;AAAA,MACZ,CAAC;AACD,YAAM,SAAS,mCAAmC,MAAM,aAAa;AACrE,cAAQ,IAAI,WAAW,MAAM;AAAA,IAC/B;AACA,iBAAa,UAAU;AACvB,iBAAa,UAAU;AAAA,MACrB;AAAA,MACA;AAAA,IACF;AACA,mBAAe,UAAU;AAAA,EAC3B,GAAG,CAAC,eAAe,QAAQ,CAAC;AAE5B,QAAM,oBAAoBA;AAAA,IACxB,CAAC,cAAsB;AACrB,UAAI,sBAAsB,YAAY,MAAM;AAC1C,uBAAe,UAAU,sBAAsB;AAAA,MACjD;AAEA,YAAM,cAAc,eAAe;AACnC,UAAI,gBAAgB,MAAM;AACxB,2BAAmB;AACnB,8BAAsB,YAAY;AAAA,MACpC;AACA,YAAM,QAAQ,SAAS;AACvB,YAAM,QAAQ,aAAa;AAC3B,YAAM,oBAAoB,iBAAiB;AAC3C,uBAAiB,UAAU;AAC3B,YAAM,eACJ,sBAAsB,OAClB,IAAI,KACJ,KAAK;AAAA,SACF,YAAY,qBAAqB;AAAA,QAClC;AAAA,MACF;AAEN,UAAI,iBAAiB;AACrB,UAAI,aAAa;AACjB,YAAM,kBACJ,gCAAgC;AAClC,YAAM,oBACJ,gBAAgB,QAAQ,sBAAsB,YAAY,OACtD,KACC,YAAY,sBAAsB,WACnC;AAEN,eAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,GAAG;AACpD,cAAM,YAAY,MAAM,KAAK;AAC7B,YAAI,CAAC,WAAW;AACd;AAAA,QACF;AAEA,cAAM,SAAS,eAAe,SAAS,IAAI,SAAS;AACpD,YAAI,WAAW,QAAW;AACxB;AAAA,QACF;AAEA,cAAM,WACJ,gBAAgB,OACZ,gCACA,cAAc;AACpB,cAAM,mBAAmB,KAAK,IAAI,QAAQ;AAC1C,cAAM,UAAU,mBAAmB;AACnC,cAAM,aAAa,UACf;AAAA,UACE,wBAAwB,QAAQ;AAAA,UAChC;AAAA,UACA;AAAA,QACF,IACA;AAEJ,cAAM,gBAAgB,WAAW,QAAQ,IAAI,SAAS,KAAK;AAAA,UACzD,OAAO;AAAA,UACP,UAAU;AAAA,QACZ;AACA,cAAM,aACJ,WACA,CAAC,iCAAiC,eAAe,mBAAmB,IAChE;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,QACF,IACA;AAEN,YACE,CAAC,WACD,iCAAiC,YAAY,mBAAmB,GAChE;AACA,qBAAW,QAAQ,OAAO,SAAS;AACnC,gBAAMG,eAAc,MAAM,IAAI,SAAS;AACvC,cAAIA,cAAa;AACf,uCAA2BA,cAAa,iBAAiB,OAAO;AAAA,UAClE;AACA;AAAA,QACF;AAEA,mBAAW,QAAQ,IAAI,WAAW,UAAU;AAE5C,cAAM,UAAU;AAAA,UACd;AAAA,UACA;AAAA,QACF;AACA,YAAI,CAAC,SAAS;AACZ,2BAAiB;AAAA,QACnB;AACA,YACE,CAAC,iCAAiC,YAAY,mBAAmB,GACjE;AACA,uBAAa;AAAA,QACf;AAEA,cAAM,cAAc,MAAM,IAAI,SAAS;AACvC,YAAI,CAAC,aAAa;AAChB;AAAA,QACF;AAEA,YAAI,oCAAoC,WAAW,GAAG;AACpD,qBAAW,QAAQ,OAAO,SAAS;AACnC,qCAA2B,aAAa,iBAAiB,OAAO;AAChE;AAAA,QACF;AAEA,YACE,gBAAgB,QAChB,iCAAiC,YAAY,mBAAmB,GAChE;AACA,qBAAW,QAAQ,OAAO,SAAS;AACnC,qCAA2B,aAAa,iBAAiB,OAAO;AAChE;AAAA,QACF;AAEA;AAAA,UACE;AAAA,UACA,WAAW;AAAA,UACX;AAAA,UACA,iBAAiB;AAAA,QACnB;AAAA,MACF;AAEA,UAAI,gBAAgB,MAAM;AACxB,yBAAiB;AAAA,MACnB,WAAW,CAAC,YAAY;AACtB,yBAAiB;AAAA,MACnB;AAEA,UAAI,gBAAgB,QAAQ,YAAY;AACtC,8BAAsB,UAAU;AAChC,uBAAe,UAAU;AACzB,qBAAa,UAAU;AACvB,qBAAa,UAAU,CAAC;AACxB,yBAAiB,KAAK;AAAA,MACxB;AAEA,UAAI,gBAAgB;AAClB,0BAAkB,UAAU,sBAAsB,iBAAiB;AACnE;AAAA,MACF;AAEA,wBAAkB,UAAU;AAC5B,uBAAiB,UAAU;AAAA,IAC7B;AAAA,IACA,CAAC,oBAAoB,kBAAkB,QAAQ;AAAA,EACjD;AAEA,QAAM,oBAAoBH,aAAY,MAAM;AAC1C,QAAI,kBAAkB,YAAY,MAAM;AACtC;AAAA,IACF;AACA,sBAAkB,UAAU,sBAAsB,iBAAiB;AAAA,EACrE,GAAG,CAAC,iBAAiB,CAAC;AAEtB,QAAM,oBAAoBA;AAAA,IACxB,CAAC,SAAiB,YAAoB;AACpC,UAAI,eAAe,YAAY,MAAM;AACnC,2BAAmB;AAAA,MACrB;AAEA,UACE,CAAC,wCAAwC;AAAA,QACvC;AAAA,QACA;AAAA,QACA;AAAA,QACA,WAAW,aAAa;AAAA,MAC1B,CAAC,GACD;AACA,8BAAsB,UAAU;AAChC,uBAAe,UAAU;AACzB,8BAAsB,UAAU;AAChC,0BAAkB;AAClB;AAAA,MACF;AAEA,4BAAsB,UACpB,kBAAkB,SAAS,UAAU;AACvC,UAAI,CAAC,iBAAiB,SAAS;AAC7B,yBAAiB,IAAI;AAAA,MACvB;AACA,wBAAkB;AAAA,IACpB;AAAA,IACA,CAAC,oBAAoB,eAAe,mBAAmB,gBAAgB;AAAA,EACzE;AAEA,QAAM,qBAAqBA,aAAY,MAAM;AAC3C,0BAAsB,UAAU;AAChC,mBAAe,UAAU;AACzB,sBAAkB;AAAA,EACpB,GAAG,CAAC,iBAAiB,CAAC;AAEtB,QAAM,yBAAyBA;AAAA,IAC7B,CAAC,cAAsB;AACrB,iBAAW,QAAQ,OAAO,SAAS;AACnC,qBAAe,SAAS,OAAO,SAAS;AACxC,uBAAiB,QAAQ,OAAO,SAAS;AACzC,mBAAa,UAAU;AACvB,mBAAa,UAAU,aAAa,QAAQ;AAAA,QAC1C,CAAC,QAAQ,QAAQ;AAAA,MACnB;AACA,YAAM,cAAc,SAAS,QAAQ,IAAI,SAAS;AAClD,UAAI,aAAa;AACf,mCAA2B,aAAa,iBAAiB,OAAO;AAAA,MAClE;AAAA,IACF;AAAA,IACA,CAAC,QAAQ;AAAA,EACX;AAEA,QAAM,qBAAqBA,aAAY,MAAM;AAC3C,kBAAc;AACd,0BAAsB,UAAU;AAChC,mBAAe,UAAU;AACzB,0BAAsB,UAAU;AAChC,qBAAiB,UAAU;AAAA,EAC7B,GAAG,CAAC,aAAa,CAAC;AAElB,QAAM,qBAAqBA,aAAY,MAAM;AAC3C,kBAAc;AACd,eAAW,eAAe,SAAS,QAAQ,OAAO,GAAG;AACnD,iCAA2B,aAAa,iBAAiB,OAAO;AAAA,IAClE;AACA,eAAW,QAAQ,MAAM;AACzB,qBAAiB,QAAQ,MAAM;AAC/B,mBAAe,UAAU;AACzB,iBAAa,UAAU;AACvB,iBAAa,UAAU,CAAC;AACxB,mBAAe,UAAU;AACzB,0BAAsB,UAAU;AAChC,0BAAsB,UAAU;AAChC,qBAAiB,KAAK;AAAA,EACxB,GAAG,CAAC,kBAAkB,UAAU,aAAa,CAAC;AAE9C,EAAAC;AAAA,IACE,MAAM,MAAM;AACV,yBAAmB;AAAA,IACrB;AAAA,IACA,CAAC,kBAAkB;AAAA,EACrB;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACrlBA,IAAM,8BAA8B;AAE7B,SAAS,oCAAoC;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA2E;AACzE,QAAM,cAAc,cAAc,eAAe;AACjD,MAAI,CAAC,aAAa;AAChB,WAAO;AAAA,MACL,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,aAAa;AAAA,IACf;AAAA,EACF;AAEA,QAAM,kBAAkB,KAAK;AAAA,IAC3B;AAAA,IACA,KAAK,IAAI,YAAY,WAAW,IAAI;AAAA,EACtC;AAEA,SAAO;AAAA,IACL,mBAAmB,eAAe;AAAA,IAClC,kBACE,eAAe,kBAAkB;AAAA,IACnC;AAAA,EACF;AACF;;;ACnCO,IAAM,yCAAyC;AAC/C,IAAM,gDAAgD;AACtD,IAAM,uCAAuC;AAgB7C,SAAS,2CACd,QACQ;AACR,SAAO,aAAa,MAAM;AAC5B;AAEO,SAAS,mCAAmC,OAGlB;AAC/B,QAAM,iBAAiB,iCAAiC,KAAK;AAC7D,MAAI,eAAe,WAAW,GAAG;AAC/B,WAAO,CAAC;AAAA,EACV;AACA,MAAI,eAAe,UAAU,wCAAwC;AACnE,WAAO,eAAe,IAAI,CAAC,UAAU;AAAA,MACnC,WAAW,2CAA2C,KAAK,EAAE;AAAA,MAC7D,MAAM;AAAA,MACN;AAAA,IACF,EAAE;AAAA,EACJ;AAEA,SAAO;AAAA,IACL,GAAG,eACA,MAAM,GAAG,6CAA6C,EACtD,IAAI,CAAC,UAAU;AAAA,MACd,WAAW,2CAA2C,KAAK,EAAE;AAAA,MAC7D,MAAM;AAAA,MACN;AAAA,IACF,EAAE;AAAA,IACJ;AAAA,MACE,WAAW;AAAA,MACX,MAAM;AAAA,MACN,OAAO,eAAe,MAAM,6CAA6C;AAAA,IAC3E;AAAA,EACF;AACF;AAEO,SAAS,8CAA8C,OAG5C;AAChB,aAAW,QAAQ,MAAM,OAAO;AAC9B,QAAI,KAAK,SAAS,UAAU,KAAK,KAAK,OAAO,MAAM,QAAQ;AACzD,aAAO,KAAK;AAAA,IACd;AACA,QACE,KAAK,SAAS,WACd,KAAK,MAAM,KAAK,CAAC,SAAS,KAAK,OAAO,MAAM,MAAM,GAClD;AACA,aAAO,KAAK;AAAA,IACd;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,qCAAqC,OAGzC;AACV,QAAM,aAAa,MAAM,gBAAgB,IAAI,MAAM,KAAK,KAAK,MAAM;AACnE,SAAO,YAAY,QAAQ,kBAAkB;AAC/C;AAEA,SAAS,iCAAiC,OAGT;AAC/B,SAAO,MAAM,MACV,IAAI,CAAC,MAAM,WAAW,EAAE,OAAO,KAAK,EAAE,EACtC;AAAA,IACC,CAAC,EAAE,KAAK,MACN,KAAK,eACL,qCAAqC;AAAA,MACnC;AAAA,MACA,iBAAiB,MAAM;AAAA,IACzB,CAAC;AAAA,EACL,EACC,KAAK,CAAC,MAAM,UAAU;AACrB,UAAM,WAAW,KAAK,KAAK,qBAAqB;AAChD,UAAM,YAAY,MAAM,KAAK,qBAAqB;AAClD,QAAI,aAAa,WAAW;AAC1B,aAAO,YAAY;AAAA,IACrB;AACA,WAAO,MAAM,QAAQ,KAAK;AAAA,EAC5B,CAAC,EACA,IAAI,CAAC,EAAE,KAAK,MAAM,IAAI;AAC3B;;;AC/GA,SAAS,aAAAG,YAAW,UAAAC,SAAQ,YAAAC,iBAAgB;AAGrC,IAAM,wCAAwC;AAE9C,SAAS,kCACd,UACA,MACe;AACf,QAAM,yBAAyB,IAAI;AAAA,IACjC,SACG;AAAA,MACC,CAAC,SACC,KAAK,SAAS;AAAA,IAClB,EACC,IAAI,CAAC,SAAS,KAAK,KAAK,EAAE;AAAA,EAC/B;AACA,QAAM,uBACJ,SACG,KAAK,CAAC,SAAS,KAAK,SAAS,OAAO,GACnC,MAAM,IAAI,CAAC,SAAS,KAAK,EAAE,KAAK,CAAC;AAEvC,aAAW,QAAQ,MAAM;AACvB,QAAI,KAAK,SAAS,QAAQ;AACxB;AAAA,IACF;AACA,QACE,CAAC,uBAAuB,IAAI,KAAK,KAAK,EAAE,KACxC,qBAAqB,SAAS,KAAK,KAAK,EAAE,GAC1C;AACA,aAAO,KAAK,KAAK;AAAA,IACnB;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,+BACd,OACA;AACA,QAAM,mBAAmBD,QAAO,KAAK;AACrC,QAAM,oBAAoBA,QAA6C,IAAI;AAC3E,QAAM,CAAC,gBAAgB,iBAAiB,IAAIC,UAAwB,IAAI;AACxE,QAAM,CAAC,kBAAkB,mBAAmB,IAAIA,UAAS,KAAK;AAE9D,EAAAF,WAAU,MAAM;AACd,UAAMG,kBAAiB;AAAA,MACrB,iBAAiB;AAAA,MACjB;AAAA,IACF;AACA,qBAAiB,UAAU;AAE3B,QAAI,CAACA,iBAAgB;AACnB,aAAO;AAAA,IACT;AAEA,sBAAkBA,eAAc;AAChC,wBAAoB,IAAI;AACxB,QAAI,kBAAkB,YAAY,MAAM;AACtC,mBAAa,kBAAkB,OAAO;AAAA,IACxC;AACA,sBAAkB,UAAU,WAAW,MAAM;AAC3C,wBAAkB,UAAU;AAC5B,wBAAkB,IAAI;AACtB,0BAAoB,KAAK;AAAA,IAC3B,GAAG,qCAAqC;AAExC,WAAO,MAAM;AACX,UAAI,kBAAkB,YAAY,MAAM;AACtC,qBAAa,kBAAkB,OAAO;AACtC,0BAAkB,UAAU;AAAA,MAC9B;AAAA,IACF;AAAA,EACF,GAAG,CAAC,KAAK,CAAC;AAEV,SAAO,EAAE,gBAAgB,iBAAiB;AAC5C;;;ACnDO,SAAS,2CAA2C,OAIZ;AAC7C,QAAM,EAAE,OAAO,IAAI;AACnB,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK,aAAa;AAChB,YAAM,OAAO,MAAM,MAAM;AAAA,QACvB,CAACC,UAASA,MAAK,cAAc,OAAO;AAAA,MACtC;AACA,UAAI,MAAM,SAAS,UAAU,KAAK,KAAK,OAAO,MAAM,QAAQ;AAC1D,eAAO;AAAA,MACT;AACA,aAAO;AAAA,QACL,WAAW,KAAK;AAAA,QAChB,MAAM;AAAA,QACN,QAAQ,MAAM;AAAA,MAChB;AAAA,IACF;AAAA,IAEA,KAAK,oBAAoB;AACvB,YAAM,OAAO,MAAM,MAAM;AAAA,QACvB,CAACA,UAASA,MAAK,cAAc,OAAO;AAAA,MACtC;AACA,UACE,MAAM,SAAS,WACf,CAAC,KAAK,MAAM,KAAK,CAAC,SAAS,KAAK,OAAO,MAAM,MAAM,GACnD;AACA,eAAO;AAAA,MACT;AACA,aAAO;AAAA,QACL,WAAW,KAAK;AAAA,QAChB,MAAM;AAAA,QACN,QAAQ,MAAM;AAAA,QACd,gBAAgB,KAAK;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AACF;;;AChEA;AAAA,EACE;AAAA,EACA,eAAAC;AAAA,EACA,aAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,UAAAC;AAAA,EACA,YAAAC;AAAA,OAIK;AACP,SAAS,gBAAAC,qBAAoB;AAC7B;AAAA,EACE,UAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;;;ACrBP,IAAM,iCAAiC;AACvC,IAAM,8BAA8B;AAC7B,IAAM,4BAA4B;AAClC,IAAM,mCAAmC;AACzC,IAAM,oCAAoC;AAC1C,IAAM,+BAA+B;AACrC,IAAM,mCAAmC;AACzC,IAAM,gCAAgC;AACtC,IAAM,qCAAqC;AAC3C,IAAM,qCAAqC;AAClD,IAAM,mCAAmC;AAClC,IAAM,8BAA8B;AACpC,IAAM,mCAAmC;AACzC,IAAM,2BAA2B;AACjC,IAAM,2BAA2B;AACjC,IAAM,iCAAiC;AACvC,IAAM,+BAA+B;AAErC,SAAS,oCAA4C;AAC1D,SAAO,KAAK,MAAO,4BAA4B,KAAM,EAAE;AACzD;AAEO,SAAS,mCAAmC,WAA2B;AAC5E,QAAM,YAAY,KAAK,IAAI,GAAG,SAAS;AACvC,SACE,iCACA,KAAK,IAAI,GAAG,YAAY,CAAC,IAAI,2BAC7B,kCAAkC,IAClC;AAEJ;AAEO,SAAS,0CACd,WACA,WACQ;AACR,MAAI,cAAc,UAAU,aAAa,GAAG;AAC1C,WAAO;AAAA,EACT;AACA,UAAQ,YAAY,KAAK;AAC3B;AAEO,SAAS,kCAAkC,OAOvC;AACT,MAAI,MAAM,cAAc,UAAU,MAAM,aAAa,GAAG;AACtD,WAAO;AAAA,EACT;AAEA,MACE,MAAM,iBAAiB,UACvB,MAAM,kBAAkB,UACxB,MAAM,qBAAqB,UAC3B,MAAM,sBAAsB,QAC5B;AACA,WACE,gCACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,IACR,IACA;AAAA,EAEJ;AAEA,QAAM,eAAe,kCAAkC;AACvD,QAAM,aAAa,MAAM;AACzB,QAAM,gBAAgB,MAAM,eAAe,MAAM;AACjD,MAAI,gBAAgB;AAEpB,WAAS,QAAQ,GAAG,QAAQ,MAAM,WAAW,SAAS,GAAG;AACvD,UAAM,cAAc,KAAK,IAAI,OAAO,KAAK,IAAI,GAAG,MAAM,YAAY,CAAC,CAAC;AACpE,UAAM,SACJ,CAAC,iCAAiC,QAAQ;AAC5C,UAAM,UAAU,MAAM,gBAAgB,SAAS;AAC/C,UAAM,aAAa,MAAM,gBAAgB;AACzC,QAAI,aAAa,cAAc,UAAU,eAAe;AACtD;AAAA,IACF;AAEA,UAAM,SAAS,CAAC,cAAc;AAC9B,UAAM,aAAa,MAAM,oBAAoB;AAC7C,oBAAgB,KAAK,IAAI,eAAe,UAAU;AAAA,EACpD;AAEA,SAAO,KAAK;AAAA,IACV;AAAA,IACA,CAAC,gBAAgB;AAAA,EACnB;AACF;AAEO,SAAS,kCACd,WACA,WACA,SACQ;AACR,QAAM,eACJ,SAAS,gBACT,kCAAkC,EAAE,WAAW,UAAU,CAAC;AAC5D,SACE,eACA,4BACA,8BACA;AAEJ;AAEO,SAAS,iCAAiC,OAKtC;AACT,QAAM,aACJ,MAAM,aAAa,MAAM,cAAc;AACzC,QAAM,YACJ,MAAM,eACN,+BAA+B;AACjC,QAAM,WAAW,YAAY;AAC7B,QAAM,WAAW,KAAK,IAAI,YAAY,QAAQ;AAC9C,QAAM,eAAe,MAAM,gBAAgB;AAC3C,SACE,WACA,KAAK,IAAI,GAAG,eAAe,6BAA6B,IACxD;AAEJ;AAEO,SAAS,gCAAgC,OAErC;AACT,SAAO,MAAM,YAAY;AAC3B;AAEO,SAAS,sCAAsC,OAK3C;AACT,QAAM,cACJ,MAAM,qBACL,OAAO,WAAW,cACf,MAAM,gBACN,OAAO,cAAc;AAE3B,MAAI,MAAM,cAAc,QAAQ;AAC9B,UAAM,iBAAiB,KAAK;AAAA,MAC1B;AAAA,MACA,MAAM,gBAAgB;AAAA,IACxB;AACA,WAAO,KAAK,IAAI,MAAM,eAAe,gBAAgB,WAAW;AAAA,EAClE;AAEA,SAAO,KAAK,IAAI,MAAM,eAAe,WAAW;AAClD;AAEO,SAAS,yCAAyC,OAE9C;AACT,SAAO,MAAM;AACf;AAEO,SAAS,oCAAoC,OAKzC;AACT,MAAI,MAAM,aAAa,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,kCAAkC;AACvD,QAAM,kBAAkB,MAAM,eAAe,MAAM,mBAAmB;AACtE,QAAM,YACH,MAAM,gBACL,iCACA,eAAe,IACf,mBACF;AAEF,SAAO,KAAK,IAAI,MAAM,YAAY,GAAG,KAAK,IAAI,GAAG,QAAQ,CAAC;AAC5D;AAEO,SAAS,4BAA4B,OAIjC;AACT,MAAI,MAAM,aAAa,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,KAAK;AAAA,IACvB,MAAM;AAAA,IACN,KAAK,IAAI,GAAG,MAAM,YAAY,CAAC;AAAA,EACjC;AACA,QAAM,eAAe,MAAM,cAAc,SAAS,KAAK;AACvD,SAAO,cAAc,2BAA2B;AAClD;AAEO,SAAS,uCAAuC,OAM5C;AACT,MAAI,MAAM,aAAa,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,oCAAoC;AAAA,IACrD,WAAW,MAAM;AAAA,IACjB,cAAc,MAAM;AAAA,IACpB,eAAe,MAAM;AAAA,IACrB,kBAAkB,MAAM;AAAA,EAC1B,CAAC;AACD,QAAM,SAAS,4BAA4B;AAAA,IACzC;AAAA,IACA,WAAW,MAAM;AAAA,IACjB,WAAW,MAAM;AAAA,EACnB,CAAC;AAED,SAAO,CAAC;AACV;;;ADyjBU,SAsBA,YAAAC,WAtBA,OAAAC,MAsHQ,QAAAC,aAtHR;AA7uBV,IAAM,uBAAuB;AAC7B,IAAM,qBAAqB;AAC3B,IAAM,gCAAgC;AACtC,IAAM,+BAA+B;AACrC,IAAM,0BAA0B;AAChC,IAAM,2CAA2C;AACjD,IAAM,qCAAqC;AAC3C,IAAM,kCAAkC;AACxC,IAAM,8BAA8B,oBAAI,IAGtC;AACF,IAAM,oCAAoC,oBAAI,IAAY;AAuE1D,IAAM,8BAA8B;AACpC,IAAM,oBAAoB;AAC1B,IAAM,qBAAqB;AAE3B,SAAS,mCACP,SACA,SAC6C;AAC7C,MAAI,CAAC,WAAW,CAAC,SAAS;AACxB,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,QAAQ,sBAAsB;AAC3C,QAAM,UAAU,KAAK,OAAO,KAAK,QAAQ;AACzC,QAAM,UAAU,KAAK,MAAM,KAAK,SAAS;AACzC,QAAM,WAAW,KAAK,MAAM,QAAQ,IAAI,SAAS,QAAQ,IAAI,OAAO;AACpE,QAAM,YAAY,KAAK,IAAI,GAAG,IAAI,WAAW,2BAA2B;AACxE,MAAI,aAAa,GAAG;AAClB,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,YAAY,aAAa,IAAI,IAAI;AAC/C,QAAM,QAAQ,KAAK,oBAAoB,KAAK;AAC5C,QAAM,OAAO,CAAC,qBAAqB;AACnC,SAAO;AAAA,IACL,kCAAkC,GAAG,KAAK,MAAM,OAAO,EAAE,IAAI,EAAE;AAAA,IAC/D,mCAAmC,GAAG,KAAK,MAAM,QAAQ,GAAI,IAAI,GAAI;AAAA,IACrE,qCAAqC,GAAG,KAAK,MAAM,IAAI,YAAY,EAAE,CAAC;AAAA,EACxE;AACF;AAEA,SAAS,yBACP,OACA,OACA,WACiC;AACjC,QAAM,YAAY,KAAK,IAAI,GAAG,KAAK;AACnC,QAAM,cAAc,KAAK,IAAI,OAAO,YAAY,CAAC;AACjD,QAAM,eAAe,cAAc,SAAS,KAAK;AACjD,QAAM,OAAO,cAAc,IAAI;AAC/B,QAAM,OAAO,MAAM,cAAc;AACjC,QAAM,aAAa,KAAK,cAAc,OAAO;AAE7C,SAAO;AAAA,IACL,kCAAkC,GAAG,QAAQ,EAAE;AAAA,IAC/C,mCAAmC,GAAG,KAAK,MAAM,YAAY,EAAE,IAAI,EAAE;AAAA,IACrE,8BAA8B,GAAG,KAAK,MAAM,IAAI,CAAC;AAAA,IACjD,8BAA8B,GAAG,KAAK,MAAM,IAAI,CAAC;AAAA,EACnD;AACF;AAEA,SAAS,0BACP,WACmD;AACnD,SAAO,4BAA4B,IAAI,SAAS;AAClD;AAEA,SAAS,2BACP,WACA,SACA,UACM;AACN,8BAA4B,OAAO,SAAS;AAC5C,8BAA4B,IAAI,WAAW,EAAE,SAAS,SAAS,CAAC;AAChE,SAAO,4BAA4B,OAAO,iCAAiC;AACzE,UAAM,kBAAkB,4BAA4B,KAAK,EAAE,KAAK,EAAE;AAClE,QAAI,OAAO,oBAAoB,UAAU;AACvC;AAAA,IACF;AACA,gCAA4B,OAAO,eAAe;AAAA,EACpD;AACF;AAEO,SAAS,uBAAuB;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA,4BAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAsCG;AACD,QAAM,oBAAoB,aAAa;AACvC,QAAM,kBAAkB,WAAW;AACnC,QAAM,mBAAmB,oBAAoB;AAC7C,QAAM,gBAAgB,oBAAoB;AAC1C,QAAM,kBAAkB,kBAAkB,QAAQ,IAAI;AACtD,QAAM,kBAAkBC,QAAO,oBAAI,IAAyB,CAAC;AAC7D,QAAM,sBAAsBA;AAAA,IAC1B,oBAAI,IAAmD;AAAA,EACzD;AACA,QAAM,eAAeA,QAA8B,IAAI;AACvD,QAAM,4BAA4BA,QAA8B,IAAI;AACpE,QAAM,CAAC,SAAS,UAAU,IAAIC,UAA0C,IAAI;AAC5E,QAAM,CAAC,4BAA4B,6BAA6B,IAC9DA,UAAS,CAAC;AACZ,QAAM,CAAC,4BAA4B,6BAA6B,IAAIA,UAElE,CAAC,CAAC;AACJ,QAAM,cAAc,gBAChB,IACA,KAAK,IAAI,KAAK,IAAI,MAAM,SAAS,iBAAiB,CAAC,GAAG,CAAC;AAC3D,QAAM,eAAe,gBACjB,MACA,cAAc,uBACd,KAAK,IAAI,GAAG,cAAc,CAAC,IAAI,qBAC/B,gCAAgC,IAChC;AACJ,QAAM,eAAe,WAAW,MAAM,WAAW,SAAS;AAC1D,QAAM,uBAAuB,cAAc,UAAU;AACrD,QAAM,8BAA8B;AAAA,IAClC,MAAM;AAAA,EACR;AACA,QAAM,iCAAiC,mBACnC,sCAAsC;AAAA,IACpC,eAAe;AAAA,IACf;AAAA,IACA,eAAe;AAAA,EACjB,CAAC,IACD;AACJ,QAAM,kCAAkC,mBACpC,uCAAuC;AAAA,IACrC,WAAW,MAAM;AAAA,IACjB;AAAA,IACA,cAAc;AAAA,IACd,eAAe;AAAA,IACf,kBAAkB;AAAA,EACpB,CAAC,IACD;AACJ,QAAM,6BAA6B,uBAC/B,kCAAkC;AAAA,IAChC,WAAW,MAAM;AAAA,IACjB;AAAA,IACA,cAAc;AAAA,IACd,eAAe;AAAA,IACf,kBAAkB;AAAA,IAClB,mBAAmB;AAAA,EACrB,CAAC,IACD;AACJ,QAAM,6BAA6B,uBAC/B,kCAAkC,MAAM,QAAQ,WAAW;AAAA,IACzD,cAAc;AAAA,EAChB,CAAC,IACD;AACJ,QAAM,aAA8C;AAAA,IAClD,gCAAgC,OAAO,WAAW;AAAA,IAClD,8BACE,8BAA8B,OAC1B,GAAG,0BAA0B,OAC7B,GAAG,YAAY;AAAA,IACrB,GAAI,8BAA8B,OAC9B;AAAA,MACE,wCAAwC,GAAG,0BAA0B;AAAA,MACrE,UAAU;AAAA,MACV,OAAO;AAAA,IACT,IACA,CAAC;AAAA,IACL,MAAM,uBACF,iCAAiC;AAAA,MAC/B,YAAY,WAAW;AAAA,MACvB,aAAa,WAAW;AAAA,MACxB,aAAa,WAAW;AAAA,MACxB,cAAc;AAAA,IAChB,CAAC,IACD,cAAc,SACZ,WAAW,OAAO,WAAW,QAAQ,0BACrC,WAAW,OAAO,WAAW,QAAQ;AAAA,IAC3C,KAAK,uBACD,gCAAgC,EAAE,WAAW,WAAW,IAAI,CAAC,IAC7D,cAAc,SACZ,eACA,WAAW,MAAM;AAAA,IACvB,GAAI,uBACA,EAAE,QAAQ,mCAAmC,IAC7C,CAAC;AAAA,EACP;AACA,QAAM,gCAAgC,KAAK;AAAA,IACzC;AAAA,IACA,8BAA8B;AAAA,EAChC;AACA,QAAM,oCACJ,yCAAyC;AAAA,IACvC,iBAAiB;AAAA,EACnB,CAAC;AACH,QAAM,aAA4B;AAAA,IAChC,gCAAgC,OAAO,WAAW;AAAA,IAClD,mCAAmC,OAAO,KAAK,IAAI,GAAG,MAAM,MAAM,CAAC;AAAA,IACnE,GAAI,mBACA;AAAA,MACE,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,GAAI,wBAAwB,8BAA8B,OACtD;AAAA,QACE,OAAO;AAAA,QACP,UAAU;AAAA,QACV,8CAA8C,GAAG,0BAA0B;AAAA,MAC7E,IACA,CAAC;AAAA,IACP,IACA,CAAC;AAAA,EACP;AACA,QAAM,qBAAqB,MAAM,IAAI,CAAC,SAAS,KAAK,KAAK,EAAE,EAAE,KAAK,GAAG;AAErE,EAAAC,WAAU,MAAM;AACd,+BAA2B,uBAAuB,kBAAkB;AAAA,MAClE,mBAAmB,QAAQ,cAAc;AAAA,MACzC,WAAW,qBAAqB,mBAAmB,MAAM,GAAG,EAAE,SAAS;AAAA,MACvE,SAAS,qBAAqB,mBAAmB,MAAM,GAAG,IAAI,CAAC;AAAA,MAC/D;AAAA,MACA,SAAS;AAAA,IACX,CAAC;AAAA,EACH,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,EAAAC,iBAAgB,MAAM;AACpB,UAAM,cAAc,aAAa;AACjC,UAAM,eACJ,aAAa;AAAA,MACX;AAAA,IACF,KAAK;AACP,+BAA2B,qBAAqB,kBAAkB;AAAA,MAChE,WAAW,eAAe,iBAAiB,YAAY,IAAI;AAAA,MAC3D,UAAU,cAAc,iBAAiB,WAAW,IAAI;AAAA,MACxD,WAAW,cAAc,kBAAkB,WAAW,IAAI;AAAA,MAC1D,gBAAgB,OAAO;AAAA,MACvB,eAAe,OAAO;AAAA,IACxB,CAAC;AAAA,EACH,GAAG,CAAC,kBAAkB,kBAAkB,CAAC;AAEzC,QAAM,eAAeC,aAAY,CAAC,WAAmB;AACnD,UAAM,WAAW,oBAAoB,QAAQ,IAAI,MAAM;AACvD,QAAI,UAAU;AACZ,aAAO;AAAA,IACT;AAEA,UAAM,WAAW,CAAC,YAAgC;AAChD,UAAI,SAAS;AACX,wBAAgB,QAAQ,IAAI,QAAQ,OAAO;AAAA,MAC7C,OAAO;AACL,wBAAgB,QAAQ,OAAO,MAAM;AAAA,MACvC;AAAA,IACF;AACA,wBAAoB,QAAQ,IAAI,QAAQ,QAAQ;AAChD,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AAEL,EAAAF,WAAU,MAAM;AACd,QAAI,CAAC,sBAAsB;AACzB;AAAA,IACF;AACA,aAAS,KAAK;AAAA,MACZ;AAAA,MACA;AAAA,IACF;AACA,WAAO,MAAM;AACX,eAAS,KAAK,gBAAgB,wCAAwC;AAAA,IACxE;AAAA,EACF,GAAG,CAAC,oBAAoB,CAAC;AAEzB,EAAAA,WAAU,MAAM;AACd,UAAM,oBAAoB,CAAC,UAAwB;AACjD,UAAI,EAAE,MAAM,kBAAkB,UAAU;AACtC,gBAAQ;AACR;AAAA,MACF;AACA,UACE,MAAM,OAAO,QAAQ,0BAA0B,KAC/C,MAAM,OAAO,QAAQ,gCAAgC,KACrD,MAAM,OAAO;AAAA,QACX;AAAA,MACF,GACA;AACA;AAAA,MACF;AACA,cAAQ;AAAA,IACV;AACA,UAAM,gBAAgB,CAAC,UAAyB;AAC9C,UAAI,MAAM,QAAQ,UAAU;AAC1B,gBAAQ;AAAA,MACV;AAAA,IACF;AAEA,WAAO,iBAAiB,eAAe,mBAAmB,IAAI;AAC9D,WAAO,iBAAiB,WAAW,aAAa;AAChD,WAAO,MAAM;AACX,aAAO,oBAAoB,eAAe,mBAAmB,IAAI;AACjE,aAAO,oBAAoB,WAAW,aAAa;AAAA,IACrD;AAAA,EACF,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,oBAAoB,MACvB;AAAA,IACC,CAAC,SACC,GAAG,KAAK,KAAK,EAAE,IAAI,kBAAkB,KAAK,OAAO,CAAC,IAAI,KAAK,mBAAmB,EAAE;AAAA,EACpF,EACC,KAAK,GAAG;AAEX,EAAAA,WAAU,MAAM;AACd,QAAI,CAAC,kBAAkB;AACrB;AAAA,IACF;AACA,kCAA8B,iCAAiC;AAAA,EACjE,GAAG,CAAC,mCAAmC,kBAAkB,MAAM,MAAM,CAAC;AAEtE,EAAAA,WAAU,MAAM;AACd,QAAI,CAAC,kBAAkB;AACrB;AAAA,IACF;AACA,UAAM,WAAW,0BAA0B;AAC3C,QAAI,CAAC,UAAU;AACb;AAAA,IACF;AACA,UAAM,cAAc,CAAC,UAAsB;AACzC,YAAM,eAAe;AACrB,YAAM,gBAAgB;AACtB;AAAA,QAA8B,CAAC,YAC7B,KAAK;AAAA,UACH;AAAA,UACA,KAAK,IAAI,GAAG,UAAU,MAAM,MAAM;AAAA,QACpC;AAAA,MACF;AAAA,IACF;AACA,aAAS,iBAAiB,SAAS,aAAa,EAAE,SAAS,MAAM,CAAC;AAClE,WAAO,MAAM,SAAS,oBAAoB,SAAS,WAAW;AAAA,EAChE,GAAG,CAAC,kBAAkB,6BAA6B,CAAC;AAEpD,EAAAA,WAAU,MAAM;AACd,QAAI,CAAC,kBAAkB,eAAe;AACpC;AAAA,IACF;AACA,QAAI,YAAY;AAChB,UAAM,eAAe,MAAM,OAAO,CAAC,SAAS;AAC1C,YAAM,WAAW,KAAK;AACtB,YAAM,mBAAmB;AAAA,QACvB,KAAK;AAAA,QACLH,8BAA6B,KAAK,IAAI,KAAK;AAAA,MAC7C;AACA,YAAM,kBACJ,2BAA2B,gBAAgB,KAC3C,0BAA0B,gBAAgB;AAC5C,YAAM,qBACJ,oBAAoB,UAAa,gBAAgB,aAAa;AAChE,YAAM,8BAA8B,CAAC,KAAK,WAAW,CAAC;AACtD,aACE,+BACA,CAAC,kCAAkC,IAAI,gBAAgB;AAAA,IAE3D,CAAC;AACD,QAAI,aAAa,WAAW,GAAG;AAC7B;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,UACE,WAAW,MAAM;AAAA,UACjB,gBAAgB,CAAC;AAAA,QACnB;AAAA,MACF;AACA,aAAO,MAAM;AACX,oBAAY;AAAA,MACd;AAAA,IACF;AACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,QACE,WAAW,MAAM;AAAA,QACjB,gBAAgB,aAAa,IAAI,CAAC,SAAS,KAAK,KAAK,EAAE;AAAA,MACzD;AAAA,IACF;AAEA,eAAW,QAAQ,cAAc;AAC/B,wCAAkC;AAAA,QAChC;AAAA,UACE,KAAK;AAAA,UACLA,8BAA6B,KAAK,IAAI,KAAK;AAAA,QAC7C;AAAA,MACF;AAAA,IACF;AAEA,UAAM,YAAY;AAChB,iBAAW,QAAQ,cAAc;AAC/B,YAAI,WAAW;AACb;AAAA,QACF;AAEA,cAAM,WAAW,KAAK;AACtB;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,YACE,aAAa,KAAK;AAAA,YAClB,QAAQ,KAAK,KAAK;AAAA,YAClB;AAAA,UACF;AAAA,QACF;AACA,cAAM,mBAAmB;AAAA,UACvB,KAAK;AAAA,UACLA,8BAA6B,KAAK,IAAI,KAAK;AAAA,QAC7C;AACA,cAAM,WAAW;AAAA,UACfA,8BAA6B,KAAK,IAAI,KAAK;AAAA,UAC3C;AAAA,QACF;AACA,YAAI,KAAK,eAAe,UAAU;AAChC,gBAAM,4BAA4B,MAAM;AAAA,YACtC;AAAA,YACA;AAAA,UACF;AACA,cAAI,WAAW;AACb;AAAA,UACF;AACA,cAAI,2BAA2B;AAC7B,kBAAM,mBAAgD;AAAA,cACpD,MAAM;AAAA,cACN,KAAK;AAAA,YACP;AACA;AAAA,cACE,KAAK,KAAK;AAAA,cACV;AAAA,YACF;AACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,YACF;AACA,0CAA8B,CAAC,aAAa;AAAA,cAC1C,GAAG;AAAA,cACH,CAAC,gBAAgB,GAAG;AAAA,gBAClB,SAAS;AAAA,gBACT;AAAA,cACF;AAAA,YACF,EAAE;AACF,8CAAkC,OAAO,gBAAgB;AACzD;AAAA,UACF;AAAA,QACF;AAEA,cAAM,UAAU;AAAA,UACd,KAAK,cACC,MAAM,iBAAiB,IAAI,KAC1B,MAAM,iCAAiC,KAAK,KAAK,IAAI;AAAA,YACpD,aAAa;AAAA,UACf,CAAC,IACH,MAAM,QAAQ,QAAQ,iBAAiB,IAAI,KAAK,IAAI,EAAE;AAAA,YACpD,MAAM;AAAA,UACR;AAAA,UACJ;AAAA,QACF;AACA,YAAI,WAAW;AACb;AAAA,QACF;AACA;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,YACE,YAAY,QAAQ,OAAO;AAAA,YAC3B,QAAQ,KAAK,KAAK;AAAA,YAClB,kBAAkB,SAAS,YAAY;AAAA,YACvC;AAAA,UACF;AAAA,QACF;AACA,YAAI,SAAS;AACX,cAAI,QAAQ,SAAS,SAAS;AAC5B,iDAAqC,KAAK,KAAK,IAAI,QAAQ,GAAG;AAAA,UAChE;AACA,qCAA2B,kBAAkB,SAAS,QAAQ;AAC9D,cAAI,YAAY,QAAQ,SAAS,SAAS;AACxC,8BAAkB,MAAM;AAAA,cACtB,KAAK;AAAA,cACL,iBAAiB,QAAQ;AAAA,YAC3B,CAAC;AAAA,UACH;AACA,wCAA8B,CAAC,aAAa;AAAA,YAC1C,GAAG;AAAA,YACH,CAAC,gBAAgB,GAAG,EAAE,SAAS,SAAS;AAAA,UAC1C,EAAE;AACF,4CAAkC,OAAO,gBAAgB;AACzD;AAAA,QACF;AAEA,cAAM,2BACJ,CAAC,KAAK,eAAe,WACjB,MAAM,yBAAyB,kBAAkB,QAAQ,IACzD;AACN,YAAI,WAAW;AACb;AAAA,QACF;AACA,YAAI,0BAA0B;AAC5B;AAAA,YACE,KAAK,KAAK;AAAA,YACV;AAAA,UACF;AAAA,QACF;AACA,YAAI,4BAA4B,KAAK,aAAa;AAChD,gBAAM,kBACJ,2BACI,EAAE,MAAM,SAAS,KAAK,yBAAyB,IAC/C;AACN;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AACA,YAAI,CAAC,WAAW;AACd,gBAAM,kBACJ,2BACI,EAAE,MAAM,SAAS,KAAK,yBAAyB,IAC/C;AACN,wCAA8B,CAAC,aAAa;AAAA,YAC1C,GAAG;AAAA,YACH,CAAC,gBAAgB,GAAG,EAAE,SAAS,iBAAiB,SAAS;AAAA,UAC3D,EAAE;AAAA,QACJ;AACA,0CAAkC,OAAO,gBAAgB;AAAA,MAC3D;AAAA,IACF,GAAG,EAAE,MAAM,MAAM;AACf,iBAAW,QAAQ,cAAc;AAC/B,cAAM,mBAAmB;AAAA,UACvB,KAAK;AAAA,UACLA,8BAA6B,KAAK,IAAI,KAAK;AAAA,QAC7C;AACA;AAAA,UACE;AAAA,UACA;AAAA,UACA,KAAK;AAAA,QACP;AACA,0CAAkC,OAAO,gBAAgB;AAAA,MAC3D;AACA,UAAI,CAAC,WAAW;AACd,sCAA8B,CAAC,aAAa;AAAA,UAC1C,GAAG;AAAA,UACH,GAAG,OAAO;AAAA,YACR,aAAa,IAAI,CAAC,SAAS;AACzB,oBAAM,mBAAmB;AAAA,gBACvB,KAAK;AAAA,gBACLA,8BAA6B,KAAK,IAAI,KAAK;AAAA,cAC7C;AACA,qBAAO;AAAA,gBACL;AAAA,gBACA,EAAE,SAAS,MAAM,UAAU,KAAK,gBAAgB;AAAA,cAClD;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF,EAAE;AAAA,MACJ;AAAA,IACF,CAAC;AAED,WAAO,MAAM;AACX,kBAAY;AACZ,iBAAW,QAAQ,cAAc;AAC/B,0CAAkC;AAAA,UAChC;AAAA,YACE,KAAK;AAAA,YACLA,8BAA6B,KAAK,IAAI,KAAK;AAAA,UAC7C;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACAA;AAAA,EACF,CAAC;AAED,QAAM,UACJ,gBAAAF;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,WAAU;AAAA,MACV,uBAAqB;AAAA,MACrB,gCAA6B;AAAA,MAC7B,sBAAoB;AAAA,MACpB,OAAO;AAAA,MAEP,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACC,cAAY;AAAA,UACZ,WAAW;AAAA,YACT;AAAA,YACA,gBAAgB,QAAQ;AAAA,YACxB,uBACI,8BACA;AAAA,UACN;AAAA,UACA,iCAA8B;AAAA,UAC9B,sBAAoB;AAAA,UACpB,eAAe,CAAC,UAAU,MAAM,gBAAgB;AAAA,UAChD,eACE,mBACI,CAAC,UAAU,WAAW,EAAE,GAAG,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAC5D;AAAA,UAEN,gBAAgB,mBAAmB,MAAM,WAAW,IAAI,IAAI;AAAA,UAC5D,MAAK;AAAA,UACL,OAAO;AAAA,UAEN,0BACC,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,cAAc,kBAAkB;AAAA,cAChC,oBAAoB,uBAAuB;AAAA,cAC3C,mBAAmB,sBAAsB;AAAA,cACzC;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA,UAAU,aAAa;AAAA;AAAA,UACzB,IAEA,gBAAAC,MAAAF,WAAA,EACE;AAAA,4BAAAC,KAAC,SAAI,WAAU,4CACb,0BAAAA,KAAC,UAAK,WAAU,0CACb,iBACH,GACF;AAAA,YACC,mBACC,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,KAAK;AAAA,gBACL,WAAU;AAAA,gBACV,OAAO;AAAA,kBACL,QAAQ;AAAA,kBACR,GAAI,uBACA,EAAE,aAAa,2BAA2B,IAC1C,CAAC;AAAA,gBACP;AAAA,gBAEA,0BAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAU;AAAA,oBACV,OAAO;AAAA,sBACL,WAAW;AAAA,sBACX,WAAW,aAAa,+BAA+B,OAAO,CAAC,0BAA0B;AAAA,oBAC3F;AAAA,oBAEC,gBAAM,IAAI,CAAC,MAAM,UAAU;AAC1B,4BAAM,mBAAmB;AAAA,wBACvB,KAAK;AAAA,wBACLE,8BAA6B,KAAK,IAAI,KAAK;AAAA,sBAC7C;AACA,4BAAM,kBACJ,2BAA2B,gBAAgB,MAAM,SAC7C,2BAA2B,gBAAgB,IAC3C,0BAA0B,gBAAgB;AAChD,4BAAM,eAAe;AAAA,wBACnB;AAAA,wBACA;AAAA,wBACA,QAAQ,cAAc;AAAA,sBACxB;AACA,6BACE,gBAAAF;AAAA,wBAAC;AAAA;AAAA,0BAEC,KAAK,aAAa,KAAK,KAAK,EAAE;AAAA,0BAC9B;AAAA,0BACA;AAAA,0BACA,WAAW;AAAA,0BACX;AAAA,0BACA;AAAA,0BACA;AAAA,0BACA,OAAO;AAAA,4BACL,GAAG;AAAA,8BACD;AAAA,8BACA,MAAM;AAAA,8BACN;AAAA,4BACF;AAAA,4BACA,GAAG;AAAA,8BACD;AAAA,8BACA,gBAAgB,QAAQ,IAAI,KAAK,KAAK,EAAE,KAAK;AAAA,4BAC/C;AAAA,0BACF;AAAA,0BACA,SAAS;AAAA;AAAA,wBAnBJ,KAAK,KAAK;AAAA,sBAoBjB;AAAA,oBAEJ,CAAC;AAAA;AAAA,gBACH;AAAA;AAAA,YACF,IAEA,gBAAAC,MAAC,SAAI,WAAU,qIACZ;AAAA,oBAAM,IAAI,CAAC,SAAS;AACnB,sBAAM,mBAAmB;AAAA,kBACvB,KAAK;AAAA,kBACLC,8BAA6B,KAAK,IAAI,KAAK;AAAA,gBAC7C;AACA,sBAAM,kBACJ,2BAA2B,gBAAgB,MAAM,SAC7C,2BAA2B,gBAAgB,IAC3C,0BAA0B,gBAAgB;AAChD,sBAAM,eAAe;AAAA,kBACnB;AAAA,kBACA;AAAA,kBACA,QAAQ,cAAc;AAAA,gBACxB;AACA,uBACE,gBAAAF;AAAA,kBAAC;AAAA;AAAA,oBAEC,KAAK,aAAa,KAAK,KAAK,EAAE;AAAA,oBAC9B;AAAA,oBACA;AAAA,oBACA,WAAW;AAAA,oBACX;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA,SAAS;AAAA;AAAA,kBARJ,KAAK,KAAK;AAAA,gBASjB;AAAA,cAEJ,CAAC;AAAA,cACA,kBAAkB,QACjB,gBAAAC;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAU;AAAA,kBACV,MAAK;AAAA,kBACL,SAAS;AAAA,kBAET;AAAA,oCAAAD;AAAA,sBAAC;AAAA;AAAA,wBACC,eAAY;AAAA,wBACZ,WAAU;AAAA,wBACV,MAAM;AAAA;AAAA,oBACR;AAAA,oBACA,gBAAAA,KAAC,UAAK,WAAU,oDACb,0BACH;AAAA;AAAA;AAAA,cACF,IACE;AAAA,eACN;AAAA,aAEJ;AAAA;AAAA,MAEJ;AAAA;AAAA,EACF;AAGF,MAAI,OAAO,aAAa,eAAe,CAAC,SAAS,MAAM;AACrD,WAAO;AAAA,EACT;AACA,SAAOQ,cAAa,SAAS,SAAS,IAAI;AAC5C;AAEA,SAAS,6BAA6B;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAoBG;AACD,QAAM,iBAAiB,MAAM,SAAS;AACtC,QAAM,sBAAsB,kBAAkB;AAC9C,QAAM,iBAAiB,CAAC;AACxB,QAAM,qBACJ,QAAQ,aAAa,KAAK,uBAAuB;AACnD,QAAM,uBAAuB;AAE7B,SACE,gBAAAP;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,kCAA+B;AAAA,MAC/B,MAAK;AAAA,MAEJ;AAAA,yBACC,gBAAAD,KAAAD,WAAA,EACE,0BAAAC,KAAC,SAAI,WAAU,qDACZ,gBAAM,IAAI,CAAC,SACV,gBAAAA;AAAA,UAAC;AAAA;AAAA,YAEC,SAAS,CAAC,KAAK;AAAA,YACf,OAAO,KAAK,OAAO,KAAK,KAAK,KAAK,KAAK;AAAA,YACvC,UAAU,MAAM,aAAa,KAAK,KAAK,EAAE;AAAA;AAAA,UAHpC,KAAK,KAAK;AAAA,QAIjB,CACD,GACH,GACF,IACE;AAAA,QACH,mBAAmB,sBAAsB,wBACxC,gBAAAA,KAAC,yCAAsC,IACrC;AAAA,QACH,gBACC,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAS,cAAc;AAAA,YACvB,aACE,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,eAAY;AAAA,gBACZ,WAAU;AAAA;AAAA,YACZ;AAAA,YAEF,UAAU,cAAc;AAAA,YACxB,MAAM,gBAAAA,KAAC,WAAQ,eAAY,QAAO,WAAU,UAAS;AAAA,YACrD,OAAO,cAAc,gBAAgB,cAAc;AAAA,YACnD,UAAU;AAAA;AAAA,QACZ,IACE;AAAA,QACH,sBACC,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,gBAAAA,KAAC,kBAAe,eAAY,QAAO,WAAU,UAAS;AAAA,YAC5D,OAAO;AAAA,YACP,UAAU;AAAA;AAAA,QACZ,IACE;AAAA,QACH,iBACC,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,UAAU,CAAC;AAAA,YACX,MAAM,gBAAAA,KAAC,kBAAe,eAAY,QAAO,WAAU,UAAS;AAAA,YAC5D,OAAO;AAAA,YACP,UAAU;AAAA;AAAA,QACZ,IACE;AAAA,QACH,iBACC,gBAAAC,MAAAF,WAAA,EACG;AAAA,+BACC,gBAAAC,KAAC,yCAAsC,IACrC;AAAA,UACH,qBAAqB,mBACpB,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,MACE,gBAAAA,KAAC,sBAAmB,eAAY,QAAO,WAAU,UAAS;AAAA,cAE5D,OAAO;AAAA,cACP,UAAU;AAAA;AAAA,UACZ,IACE;AAAA,UACJ,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,UAAU,CAAC,sBAAsB,CAAC;AAAA,cAClC,MAAM,gBAAAA,KAACS,eAAA,EAAa,eAAY,QAAO,WAAU,UAAS;AAAA,cAC1D,OAAO;AAAA,cACP,UAAU;AAAA;AAAA,UACZ;AAAA,UACA,gBAAAT;AAAA,YAAC;AAAA;AAAA,cACC,UAAU,CAAC;AAAA,cACX,MAAM,gBAAAA,KAAC,gBAAa,eAAY,QAAO,WAAU,UAAS;AAAA,cAC1D,OAAO;AAAA,cACP,UAAU;AAAA;AAAA,UACZ;AAAA,UACA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,UAAU,CAAC;AAAA,cACX,MAAM,gBAAAA,KAAC,aAAU,eAAY,QAAO,WAAU,UAAS;AAAA,cACvD,OAAO;AAAA,cACP,UAAU;AAAA;AAAA,UACZ;AAAA,WACF,IACE;AAAA;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,iCAAiC;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAOG;AACD,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,WACI,8BACA;AAAA,MACN;AAAA,MACA;AAAA,MACA,MAAK;AAAA,MACL,MAAK;AAAA,MACL,SAAS,MAAM;AACb,YAAI,YAAY,CAAC,UAAU;AACzB;AAAA,QACF;AACA,iBAAS;AAAA,MACX;AAAA,MAEA;AAAA,wBAAAD,KAAC,UAAK,WAAU,iFACb,qBAAW,cACV,cACE,UACF,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,eAAY;AAAA,YACZ,WAAU;AAAA;AAAA,QACZ,IAEC,QAAQ,MAEb;AAAA,QACA,gBAAAA,KAAC,UAAK,WAAU,oBAAoB,iBAAM;AAAA;AAAA;AAAA,EAC5C;AAEJ;AAEA,SAAS,wCAAwC;AAC/C,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,eAAY;AAAA,MACZ,WAAU;AAAA,MACV,MAAK;AAAA;AAAA,EACP;AAEJ;AAEA,SAAS,yBACP,kBACA,UACwB;AACxB,MAAI,CAAC,UAAU;AACb,WAAO,QAAQ,QAAQ,IAAI;AAAA,EAC7B;AACA,SACE,kBAAkB,KAAK,QAAQ,EAAE,MAAM,MAAM,IAAI,KAAK,QAAQ,QAAQ,IAAI;AAE9E;AAEA,SAAS,gCACP,UACA,UACqC;AACrC,SAAO,WAAW,EAAE,GAAG,UAAU,SAAS,IAAI;AAChD;AAEA,SAAS,iCACP,MACA,UACQ;AACR,MAAI,CAAC,UAAU;AACb,WAAO,QAAQ,KAAK,EAAE;AAAA,EACxB;AACA,SAAO,SAAS,KAAK,UAAU;AAAA,IAC7B,YAAY,SAAS;AAAA,IACrB,aAAa,SAAS,eAAe;AAAA,IACrC,QAAQ,SAAS;AAAA,IACjB,QAAQ,SAAS;AAAA,IACjB,aAAa,SAAS;AAAA,EACxB,CAAC,CAAC;AACJ;AAEA,SAAS,uCACP,SACA,UACoC;AACpC,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AACA,MAAI,OAAO,YAAY,UAAU;AAC/B,WAAO,EAAE,MAAM,SAAS,UAAU,YAAY,QAAW,KAAK,QAAQ;AAAA,EACxE;AACA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,UAAU,QAAQ,YAAY,YAAY;AAAA,EAC5C;AACF;AAEA,SAAS,iCACP,MACA,iBACA,oBACoC;AACpC,QAAM,WAAW,KAAK;AACtB,MAAI,KAAK,SAAS;AAChB,WAAO,EAAE,SAAS,KAAK,SAAS,QAAQ,QAAQ;AAAA,EAClD;AACA,MACE,mBACA,gBAAgB,aAAa,YAC7B,gBAAgB,SAChB;AACA,WAAO,EAAE,SAAS,gBAAgB,SAAS,QAAQ,QAAQ;AAAA,EAC7D;AACA,MACG,oBAAoB,UAAa,gBAAgB,aAAa,YAC/D,CAAC,oBACD;AACA,WAAO,EAAE,QAAQ,WAAW;AAAA,EAC9B;AACA,SAAO,EAAE,QAAQ,UAAU;AAC7B;AAEA,SAAS,kBACP,SACQ;AACR,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AACA,UAAQ,QAAQ,MAAM;AAAA,IACpB,KAAK;AACH,aAAO,aAAa,QAAQ,YAAY,EAAE;AAAA,IAC5C,KAAK;AACH,aAAO,SAAS,QAAQ,YAAY,EAAE,IAAI,QAAQ,GAAG;AAAA,EACzD;AACF;AAEA,SAAS,2BACP,OACA,kBACA,SACM;AACN,MAAI,CAAC,kBAAkB,KAAK;AAC1B;AAAA,EACF;AACA,OAAK,QAAQ;AAAA,IACX,iBAAiB,IAAI;AAAA,MACnB;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP,QAAQ;AAAA,IACV,CAAC;AAAA,EACH,EAAE,MAAM,MAAM,MAAS;AACzB;AAEA,SAAS,iBAAiB,SAA8C;AACtE,QAAM,OAAO,QAAQ,sBAAsB;AAC3C,SAAO;AAAA,IACL,QAAQ,KAAK,MAAM,KAAK,MAAM;AAAA,IAC9B,QAAQ,KAAK,MAAM,KAAK,MAAM;AAAA,IAC9B,MAAM,KAAK,MAAM,KAAK,IAAI;AAAA,IAC1B,OAAO,KAAK,MAAM,KAAK,KAAK;AAAA,IAC5B,KAAK,KAAK,MAAM,KAAK,GAAG;AAAA,IACxB,OAAO,KAAK,MAAM,KAAK,KAAK;AAAA,EAC9B;AACF;AAEA,SAAS,kBAAkB,SAA8C;AACvE,QAAM,QAAQ,OAAO,iBAAiB,OAAO;AAC7C,SAAO;AAAA,IACL,SAAS,MAAM;AAAA,IACf,SAAS,MAAM;AAAA,IACf,eAAe,MAAM;AAAA,IACrB,UAAU,MAAM;AAAA,IAChB,WAAW,MAAM;AAAA,IACjB,YAAY,MAAM;AAAA,IAClB,QAAQ,MAAM;AAAA,EAChB;AACF;AAaA,IAAM,6BAA6B,WAGjC,SAASU,4BACT;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GACA,KACA;AACA,QAAM,QAAQ,KAAK,OAAO,KAAK,KAAK,KAAK,KAAK;AAC9C,QAAM,mBAAmB,YAAY;AACrC,QAAM,CAAC,aAAa,cAAc,IAAIN,UAAS,KAAK;AACpD,QAAM,iBAAiBD,QAA6C,IAAI;AAExE,EAAAE;AAAA,IACE,MAAM,MAAM;AACV,UAAI,eAAe,YAAY,MAAM;AACnC,qBAAa,eAAe,OAAO;AAAA,MACrC;AAAA,IACF;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,eAAeE,aAAY,MAAM;AACrC,QAAI,CAAC,kBAAkB;AACrB,mBAAa,KAAK,KAAK,EAAE;AACzB;AAAA,IACF;AACA,QAAI,eAAe,YAAY,MAAM;AACnC;AAAA,IACF;AACA,mBAAe,IAAI;AACnB,mBAAe,UAAU,WAAW,MAAM;AACxC,qBAAe,UAAU;AACzB,mBAAa,KAAK,KAAK,EAAE;AAAA,IAC3B,GAAG,wCAAwC;AAAA,EAC7C,GAAG,CAAC,kBAAkB,KAAK,KAAK,IAAI,YAAY,CAAC;AACjD,QAAM,sBAAsBA;AAAA,IAC1B,CAAC,UAA8C;AAC7C,UAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,KAAK;AAC9C;AAAA,MACF;AACA,YAAM,eAAe;AACrB,mBAAa;AAAA,IACf;AAAA,IACA,CAAC,YAAY;AAAA,EACf;AACA,QAAM,kBAAkB,aAAa,WAAW;AAEhD,SACE,gBAAAN;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA,KAAK,eAAe;AAAA,MACtB;AAAA,MACA,eAAa,KAAK,YAAY,SAAS;AAAA,MACvC,gCAA6B;AAAA,MAC7B,iBAAe,mBAAmB,SAAS;AAAA,MAC3C,kBAAgB,cAAc,SAAS;AAAA,MACvC,kBAAgB,KAAK,cAAc,SAAS;AAAA,MAC5C;AAAA,MAEA;AAAA,wBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,cAAY;AAAA,YACZ,eAAa,KAAK,YAAY,SAAS;AAAA,YACvC,WAAW;AAAA,cACT;AAAA,cACA,kBAAkB,QAAQ;AAAA,YAC5B;AAAA,YACA,MAAK;AAAA,YACL,UAAU;AAAA,YACV,SAAS;AAAA,YACT,WAAW;AAAA,YAEX;AAAA,8BAAAD,KAAC,qCAAkC,cAA4B;AAAA,cAC9D,cAAc,mBAAmB,KAAK,OAAO,KAAK,IACjD,gBAAAA,KAAC,mCAAgC,OAAO,KAAK,OAAO,IAClD;AAAA;AAAA;AAAA,QACN;AAAA,QACA,gBAAAA;AAAA,UAACW;AAAA,UAAA;AAAA,YACC,cAAY,iBAAiB,KAAK;AAAA,YAClC,WAAU;AAAA,YACV,MAAK;AAAA,YACL,OAAO,iBAAiB,KAAK;AAAA,YAC7B,MAAK;AAAA,YACL,SAAQ;AAAA,YACR,SAAS,CAAC,UAAU;AAClB,oBAAM,eAAe;AACrB,oBAAM,gBAAgB;AACtB,0BAAY,KAAK,KAAK,EAAE;AAAA,YAC1B;AAAA,YAEA,0BAAAX,KAAC,aAAU,WAAU,YAAW;AAAA;AAAA,QAClC;AAAA,QACC,KAAK,YACJ,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,eAAY;AAAA,YACZ,WAAU;AAAA,YACV,+CAA4C;AAAA;AAAA,QAC9C,IACE;AAAA,QACH,mBACC,gBAAAA,KAAC,UAAK,WAAU,qCAAoC,OACjD,iBACH,IACE;AAAA;AAAA;AAAA,EACN;AAEJ,CAAC;AAED,SAAS,kCAAkC;AAAA,EACzC;AACF,GAEG;AACD,MAAI,aAAa,WAAW,SAAS;AACnC,WACE,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,eAAY;AAAA,QACZ,sBAAoB,aAAa;AAAA,QAEjC;AAAA,0BAAAD,KAAC,UAAK,WAAU,4DAA2D;AAAA,UAC3E,gBAAAA,KAAC,UAAK,WAAU,4DAA2D;AAAA,UAC3E,gBAAAA,KAAC,UAAK,WAAU,4DAA2D;AAAA;AAAA;AAAA,IAC7E;AAAA,EAEJ;AAEA,QAAM,UAAU,aAAa;AAC7B,MAAI,QAAQ,SAAS,aAAa;AAChC,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,eAAY;AAAA,QACZ,qBAAmB,QAAQ;AAAA,QAC3B,sBAAoB,aAAa;AAAA,QAEhC,kBAAQ;AAAA;AAAA,IACX;AAAA,EAEJ;AAEA,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,eAAY;AAAA,MACZ,qBAAmB,QAAQ;AAAA,MAC3B,sBAAoB,aAAa;AAAA,MAEjC,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACC,KAAI;AAAA,UACJ,WAAU;AAAA,UACV,WAAW;AAAA,UACX,KAAK,QAAQ;AAAA;AAAA,MACf;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,gCAAgC,EAAE,MAAM,GAAsB;AACrE,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAO;AAAA,QACL,YACE;AAAA,MACJ;AAAA,MACA;AAAA,MAEA,0BAAAA,KAAC,UAAK,WAAU,6FACd,0BAAAA,KAAC,UAAK,WAAU,iJACb,iBACH,GACF;AAAA;AAAA,EACF;AAEJ;;;AP1CU,gBAAAY,OAuOU,QAAAC,aAvOV;AAp0CV,IAAM,+BAA+B;AAAA,EACnC,QAAQ;AAAA,EACR,OAAO;AACT;AAEA,SAAS,wCAAwC,OAAuB;AACtE,QAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,CAAC,WAAW,QAAQ,SAAS,KAAK,KAAK,QAAQ,SAAS,QAAG,GAAG;AAChE,WAAO;AAAA,EACT;AACA,SAAO,QAAQ,QAAQ,YAAY,EAAE;AACvC;AAEA,SAAS,+BACP,OACA,WAAW,OACX;AACA,MAAI,YAAa,MAAM,QAAQ,WAAW,MAAM,QAAQ,KAAM;AAC5D;AAAA,EACF;AAEA,QAAM,eAAe;AACrB,QAAM,cAAc,MAAM;AAC5B;AAEA,SAAS,2BAA2B,SAAsC;AACxE,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,SACE,QAAQ,aAAa,0BAA0B,KAC/C,QAAQ,aAAa,4BAA4B,KACjD,QAAQ;AAAA,IACN;AAAA,EACF,MAAM;AAEV;AAEO,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAgB;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAwBG;AACD,QAAM,mBAAmBC;AAAA,IACvB,MAAM,IAAI,IAAI,QAAQ,eAAe,IAAI,CAAC,SAAS,KAAK,EAAE,CAAC;AAAA,IAC3D,CAAC,QAAQ,cAAc;AAAA,EACzB;AACA,QAAM,iBAAiBC,QAA8B,IAAI;AACzD,QAAM,eAAeA,QAA8B,IAAI;AACvD,QAAM,gBAAgBA,QAA8B,IAAI;AACxD,QAAM,0BAA0BA;AAAA,IAC9B;AAAA,EACF;AACA,QAAM,yBAAyBA;AAAA,IAC7B;AAAA,EACF;AACA,QAAM,2BAA2BA;AAAA,IAC/B;AAAA,EACF;AACA,QAAM,8BAA8BA,QAG1B,IAAI;AACd,QAAM,gCAAgCA,QAG5B,IAAI;AACd,QAAM,0BAA0BA,QAGtB,IAAI;AACd,QAAM,sBAAsBA;AAAA,IAC1B;AAAA,EACF;AACA,QAAM,wBACJA,QAAkD,IAAI;AACxD,QAAM,6BAA6BA,QAAO,KAAK;AAC/C,QAAM,WAAWA,QAAO,oBAAI,IAAyB,CAAC;AACtD,QAAM,2BAA2BA,QAAO,oBAAI,IAAyB,CAAC;AACtE,QAAM,0BAA0BA;AAAA,IAC9B,oBAAI,IAAmD;AAAA,EACzD;AACA,QAAM,kCAAkCA,QAAO,oBAAI,IAAqB,CAAC;AACzE,QAAM,iCAAiCA,QAAO,oBAAI,IAAoB,CAAC;AACvE,QAAM,oBAAoBA;AAAA,IACxB,oBAAI,IAA2C;AAAA,EACjD;AACA,QAAM,CAAC,yBAAyB,0BAA0B,IAAIC,UAE5D,oBAAI,IAAI,CAAC;AACX,QAAM,CAAC,aAAa,cAAc,IAChCA,UAA6C,IAAI;AACnD,QAAM,CAAC,kBAAkB,mBAAmB,IAC1CA,UAAkD,IAAI;AACxD,QAAM,CAAC,oBAAoB,qBAAqB,IAC9CA,UAAoD,IAAI;AAC1D,QAAM,CAAC,2BAA2B,4BAA4B,IAC5DA,UAAkD,IAAI;AACxD,QAAM,CAAC,mBAAmB,oBAAoB,IAAIA;AAAA,IAChD,MAAM,oBAAI,IAAI;AAAA,EAChB;AACA,QAAM,CAAC,eAAe,gBAAgB,IAAIA,UAAwB,IAAI;AACtE,QAAM,EAAE,kBAAkB,IAAI,cAAc,QAAQ;AACpD,QAAM,CAAC,iBAAiB,kBAAkB,IACxCA,UAAuC,OAAO;AAAA,IAC5C,mBAAmB;AAAA,IACnB,kBAAkB;AAAA,IAClB,aAAa;AAAA,EACf,EAAE;AACJ,QAAM,CAAC,mBAAmB,oBAAoB,IAAIA,UAAS,CAAC;AAC5D,QAAM,CAAC,uBAAuB,wBAAwB,IAAIA,UAAS,CAAC;AACpE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,EACF,IAAIA,UAAsB,MAAM,oBAAI,IAAI,CAAC;AACzC,QAAM,oCAAoCD;AAAA,IACxC,oBAAI,IAA2C;AAAA,EACjD;AAEA,QAAM,4BAA4BE,cAAY,MAAM;AAClD,QAAI,wBAAwB,YAAY,MAAM;AAC5C;AAAA,IACF;AACA,iBAAa,wBAAwB,OAAO;AAC5C,4BAAwB,UAAU;AAAA,EACpC,GAAG,CAAC,CAAC;AAEL,QAAM,2BAA2BA,cAAY,MAAM;AACjD,QAAI,uBAAuB,YAAY,MAAM;AAC3C;AAAA,IACF;AACA,iBAAa,uBAAuB,OAAO;AAC3C,2BAAuB,UAAU;AACjC,gCAA4B,UAAU;AAAA,EACxC,GAAG,CAAC,CAAC;AAEL,QAAM,6BAA6BA,cAAY,MAAM;AACnD,QAAI,yBAAyB,YAAY,MAAM;AAC7C;AAAA,IACF;AACA,iBAAa,yBAAyB,OAAO;AAC7C,6BAAyB,UAAU;AACnC,kCAA8B,UAAU;AAAA,EAC1C,GAAG,CAAC,CAAC;AAEL,EAAAC;AAAA,IACE,MAAM,MAAM;AACV,gCAA0B;AAC1B,+BAAyB;AACzB,iCAA2B;AAC3B,iBAAW,SAAS,kCAAkC,QAAQ,OAAO,GAAG;AACtE,qBAAa,KAAK;AAAA,MACpB;AACA,wCAAkC,QAAQ,MAAM;AAAA,IAClD;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,iCAAiCD,cAAY,CAAC,cAAsB;AACxE,UAAM,QAAQ,kCAAkC,QAAQ,IAAI,SAAS;AACrE,QAAI,OAAO;AACT,mBAAa,KAAK;AAClB,wCAAkC,QAAQ,OAAO,SAAS;AAAA,IAC5D;AACA,UAAM,cAAc,SAAS,QAAQ,IAAI,SAAS;AAClD,iBAAa,gBAAgB,iBAAiB;AAC9C,iBAAa,MAAM,eAAe,qCAAqC;AACvE,iBAAa,MAAM,eAAe,oCAAoC;AACtE,2CAAuC,CAAC,YAAY;AAClD,UAAI,CAAC,QAAQ,IAAI,SAAS,GAAG;AAC3B,eAAO;AAAA,MACT;AACA,YAAM,OAAO,IAAI,IAAI,OAAO;AAC5B,WAAK,OAAO,SAAS;AACrB,aAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,yCAAyCA;AAAA,IAC7C,CAAC,cAAsB;AACrB,YAAM,WAAW,kCAAkC,QAAQ,IAAI,SAAS;AACxE,UAAI,UAAU;AACZ,qBAAa,QAAQ;AAAA,MACvB;AACA,wCAAkC,QAAQ;AAAA,QACxC;AAAA,QACA,WAAW,MAAM;AACf,yCAA+B,SAAS;AAAA,QAC1C,GAAG,kCAAkC;AAAA,MACvC;AAAA,IACF;AAAA,IACA,CAAC,8BAA8B;AAAA,EACjC;AAEA,EAAAE,iBAAgB,MAAM;AACpB,UAAM,UAAU,eAAe;AAC/B,QAAI,CAAC,WAAW,OAAO,WAAW,aAAa;AAC7C,aAAO;AAAA,IACT;AAEA,QAAI,UAAyB;AAC7B,UAAM,sBAAsB,MAAM;AAChC,gBAAU;AACV,UAAI,2BAA2B,eAAe,OAAO,GAAG;AACtD;AAAA,MACF;AACA,YAAM,OAAO,QAAQ,sBAAsB;AAC3C,YAAM,WAAW,KAAK;AAAA,SACnB,kBAAkB,SAAS,KAAK,SAAS,KAAK,SAC7C;AAAA,MACJ;AACA;AAAA,QAAiB,CAAC,YAChB,YAAY,WAAW,UAAU;AAAA,MACnC;AAAA,IACF;AACA,UAAM,iBAAiB,MAAM;AAC3B,UAAI,YAAY,MAAM;AACpB;AAAA,MACF;AACA,gBAAU,OAAO,sBAAsB,mBAAmB;AAAA,IAC5D;AAEA,wBAAoB;AAEpB,UAAM,iBACJ,OAAO,mBAAmB,cACtB,OACA,IAAI,eAAe,cAAc;AACvC,oBAAgB,QAAQ,OAAO;AAC/B,WAAO,iBAAiB,UAAU,cAAc;AAEhD,WAAO,MAAM;AACX,UAAI,YAAY,MAAM;AACpB,eAAO,qBAAqB,OAAO;AAAA,MACrC;AACA,sBAAgB,WAAW;AAC3B,aAAO,oBAAoB,UAAU,cAAc;AAAA,IACrD;AAAA,EACF,GAAG,CAAC,aAAa,CAAC;AAElB,QAAM,+BAA+BF,cAAY,MAAM;AACrD,QAAI,CAAC,2BAA2B,SAAS;AACvC;AAAA,IACF;AACA,+BAA2B,UAAU;AACrC,yBAAqB,CAAC,aAAa,WAAW,CAAC;AAAA,EACjD,GAAG,CAAC,CAAC;AAEL,EAAAC,WAAU,MAAM;AACd,QAAI,CAAC,iBAAiB;AACpB,aAAO;AAAA,IACT;AACA,WAAO,gBAAgB,UAAU,MAAM;AACrC,UAAI,2BAA2B,eAAe,OAAO,GAAG;AACtD,mCAA2B,UAAU;AACrC;AAAA,MACF;AACA,2BAAqB,CAAC,aAAa,WAAW,CAAC;AAAA,IACjD,CAAC;AAAA,EACH,GAAG,CAAC,eAAe,CAAC;AAEpB,QAAM,sBAAsBJ;AAAA,IAC1B,MACE,YAAY,IAAI,CAAC,UAAU;AACzB,YAAM,eAAe,iBAAiB,cAAc,MAAM,EAAE;AAC5D,aAAO,eAAe,EAAE,GAAG,OAAO,GAAG,aAAa,IAAI;AAAA,IACxD,CAAC;AAAA,IACH,CAAC,aAAa,mBAAmB,eAAe;AAAA,EAClD;AACA,QAAM,kBAAkBA;AAAA,IACtB,MACE,4BAA4B;AAAA,MAC1B,aAAa;AAAA,MACb,kBAAkB;AAAA,MAClB,OAAO,QAAQ;AAAA,IACjB,CAAC;AAAA,IACH,CAAC,QAAQ,OAAO,kBAAkB,mBAAmB;AAAA,EACvD;AACA,QAAM,qBAAqBA;AAAA,IACzB,MACE,mCAAmC;AAAA,MACjC;AAAA,MACA,OAAO,QAAQ;AAAA,IACjB,CAAC;AAAA,IACH,CAAC,QAAQ,gBAAgB,eAAe;AAAA,EAC1C;AACA,QAAM,EAAE,gBAAgB,iBAAiB,IACvC,+BAA+B,kBAAkB;AACnD,QAAM,YAAYA;AAAA,IAChB,MACE,6BAA6B;AAAA,MAC3B;AAAA,MACA;AAAA,IACF,CAAC;AAAA,IACH,CAAC,oBAAoB,eAAe;AAAA,EACtC;AACA,QAAM,mBAAmB;AAAA,IAAqB;AAAA,IAAW,CAAC,WACxD,QAAQ,MAAM,gCAAgC,MAAM;AAAA,EACtD;AACA,QAAM,sBAAsBA;AAAA,IAC1B,MAAM,iBAAiB,IAAI,CAAC,SAAS,KAAK,GAAG,EAAE,KAAK,IAAI;AAAA,IACxD,CAAC,gBAAgB;AAAA,EACnB;AACA,QAAM,iBAAiB,sBAAsB;AAAA,IAC3C;AAAA,IACA,aAAa;AAAA,IACb,UAAU;AAAA,EACZ,CAAC;AACD,QAAM,YAAYA;AAAA,IAChB,MAAM,mCAAmC,SAAS;AAAA,IAClD,CAAC,SAAS;AAAA,EACZ;AACA,QAAM;AAAA,IACJ;AAAA,IACA,oBAAoB;AAAA,IACpB,mBAAmB;AAAA,IACnB,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,EACtB,IAAI,qBAAqB;AAAA,IACvB;AAAA,IACA,aAAa;AAAA,IACb;AAAA,EACF,CAAC;AACD,QAAM,4BAA4BC,QAAoC,MAAM;AAC1E;AAAA,EACF,CAAC;AACD,QAAM,wBAAwBA;AAAA,IAC5B,CAAC,WAAmB,YAAgC;AAClD,cAAQ,MAAM,mBAAmB,WAAW,OAAO;AAAA,IACrD;AAAA,EACF;AACA,4BAA0B,UAAU,CAAC,cAAc;AACjD,2BAAuB,SAAS;AAAA,EAClC;AACA,wBAAsB,UAAU,CAAC,WAAW,YAAY;AACtD,YAAQ,MAAM,mBAAmB,WAAW,OAAO;AAAA,EACrD;AACA,QAAM,+BAA+BE;AAAA,IACnC,CAAC,QAAgB,CAAC,YAAgC;AAChD,UAAI,SAAS;AACX,iCAAyB,QAAQ,IAAI,KAAK,OAAO;AACjD;AAAA,MACF;AACA,+BAAyB,QAAQ,OAAO,GAAG;AAAA,IAC7C;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,wBAAwBA,cAAY,CAAC,SAAkB;AAC3D,QAAI,MAAM;AACR,qBAAe,SAAS;AAAA,QACtB;AAAA,QACA;AAAA,MACF;AACA;AAAA,IACF;AACA,mBAAe,SAAS,gBAAgB,4BAA4B;AAAA,EACtE,GAAG,CAAC,CAAC;AAEL,EAAAC,WAAU,MAAM;AACd,wBAAoB,UAAU;AAAA,EAChC,GAAG,CAAC,gBAAgB,CAAC;AAErB,EAAAA,WAAU,MAAM;AACd,0BAAsB,UAAU;AAAA,EAClC,GAAG,CAAC,kBAAkB,CAAC;AAEvB,QAAM,6BAA6BD;AAAA,IACjC,CAAC,cAAuB;AACtB,iCAA2B;AAC3B,UACE,cAAc,UACd,sBAAsB,SAAS,QAAQ,WACvC;AACA;AAAA,MACF;AACA,UAAI,sBAAsB,YAAY,MAAM;AAC1C;AAAA,MACF;AACA,4BAAsB,UAAU;AAChC,4BAAsB,IAAI;AAAA,IAC5B;AAAA,IACA,CAAC,0BAA0B;AAAA,EAC7B;AAEA,QAAM,2BAA2BA;AAAA,IAC/B,CAAC,YAAqB;AACpB,+BAAyB;AACzB,gCAA0B;AAC1B,UACE,YAAY,UACZ,oBAAoB,SAAS,YAAY,SACzC;AACA;AAAA,MACF;AACA,UAAI,oBAAoB,YAAY,MAAM;AACxC;AAAA,MACF;AACA,8BAAwB,UAAU;AAClC,4BAAsB,KAAK;AAC3B,0BAAoB,UAAU;AAC9B,0BAAoB,IAAI;AACxB,mCAA6B;AAAA,IAC/B;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,0BAA0BA;AAAA,IAC9B,CAAC,YAAqB;AACpB,+BAAyB;AACzB,gCAA0B;AAC1B,8BAAwB,UAAU,WAAW,MAAM;AACjD,gCAAwB,UAAU;AAClC,iCAAyB,OAAO;AAChC,+BAAuB;AAAA,MACzB,GAAG,0BAA0B;AAAA,IAC/B;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,iBAAiBA;AAAA,IACrB,CAAC,SAAiB,WAAmB,kBAAqC;AACxE,YAAM,cAAc,eAAe;AACnC,UAAI,CAAC,aAAa;AAChB;AAAA,MACF;AAEA,6BAAuB;AACvB,YAAM,WAAW,YAAY,sBAAsB;AACnD,YAAM,aAAa,cAAc,sBAAsB;AACvD,gCAA0B;AAC1B,YAAM,iBAAiB;AAAA,QACrB;AAAA,QACA,YAAY;AAAA,UACV,QAAQ,WAAW;AAAA,UACnB,MAAM,WAAW,OAAO,SAAS;AAAA,UACjC,KAAK,WAAW,MAAM,SAAS;AAAA,UAC/B,OAAO,WAAW;AAAA,QACpB;AAAA,QACA;AAAA,MACF;AACA,4BAAsB,IAAI;AAC1B,0BAAoB,UAAU;AAC9B,0BAAoB,cAAc;AAAA,IACpC;AAAA,IACA,CAAC,2BAA2B,wBAAwB,qBAAqB;AAAA,EAC3E;AAEA,QAAM,8BAA8BA;AAAA,IAClC,CAAC,SAAiB,cAAsB;AACtC,8BAAwB,UAAU,EAAE,WAAW,QAAQ;AACvD,+BAAyB;AACzB,kCAA4B,UAAU;AACtC,6BAAuB,UAAU,WAAW,MAAM;AAChD,+BAAuB,UAAU;AACjC,oCAA4B,UAAU;AACtC,cAAM,UAAU,wBAAwB;AACxC,YAAI,CAAC,WAAW,QAAQ,YAAY,SAAS;AAC3C;AAAA,QACF;AACA,cAAM,cAAc,SAAS,QAAQ,IAAI,SAAS;AAClD,YAAI,CAAC,aAAa;AAChB;AAAA,QACF;AACA,uBAAe,SAAS,WAAW,WAAW;AAAA,MAChD,GAAG,yBAAyB;AAAA,IAC9B;AAAA,IACA,CAAC,0BAA0B,cAAc;AAAA,EAC3C;AAEA,QAAM,mBAAmBA;AAAA,IACvB,CACE,QACA,WACA,kBACS;AACT,YAAM,cAAc,eAAe;AACnC,UAAI,CAAC,aAAa;AAChB;AAAA,MACF;AAEA,YAAM,WAAW,YAAY,sBAAsB;AACnD,YAAM,aAAa,kCAAkC;AAAA,QACnD;AAAA,QACA,aAAa;AAAA,MACf,CAAC;AACD,iCAA2B;AAC3B,YAAM,cAAc;AAAA,QAClB;AAAA,QACA,YAAY;AAAA,UACV,QAAQ,WAAW;AAAA,UACnB,MAAM,WAAW,OAAO,SAAS;AAAA,UACjC,KAAK,WAAW,MAAM,SAAS;AAAA,UAC/B,OAAO,WAAW;AAAA,QACpB;AAAA,QACA,KAAK,OAAO;AAAA,QACZ,OAAO,OAAO;AAAA,MAChB;AACA,4BAAsB,UAAU;AAChC,4BAAsB,WAAW;AAAA,IACnC;AAAA,IACA,CAAC,4BAA4B,aAAa;AAAA,EAC5C;AAEA,QAAM,gCAAgCA;AAAA,IACpC,CAAC,QAA6C,cAAsB;AAClE,iCAA2B;AAC3B,oCAA8B,UAAU;AACxC,+BAAyB,UAAU,WAAW,MAAM;AAClD,iCAAyB,UAAU;AACnC,sCAA8B,UAAU;AACxC,cAAM,cAAc,SAAS,QAAQ,IAAI,SAAS;AAClD,YAAI,CAAC,aAAa;AAChB;AAAA,QACF;AACA,yBAAiB,QAAQ,WAAW,WAAW;AAAA,MACjD,GAAG,yBAAyB;AAAA,IAC9B;AAAA,IACA,CAAC,4BAA4B,gBAAgB;AAAA,EAC/C;AAEA,QAAM,iCAAiCA;AAAA,IACrC,CACE,SACA,YAKU;AACV,iBAAW,CAAC,WAAW,WAAW,KAAK,SAAS,SAAS;AACvD,cAAM,UAAU,YAAY,QAAQ;AACpC,YAAI,CAAC,SAAS;AACZ;AAAA,QACF;AAEA,cAAM,OAAO,YAAY,sBAAsB;AAC/C,YACE,WAAW,KAAK,OAAO,2BACvB,WAAW,KAAK,QAAQ,2BACxB,WAAW,KAAK,MAAM,2BACtB,WAAW,KAAK,SAAS,yBACzB;AACA,iBAAO,EAAE,WAAW,SAAS,YAAY;AAAA,QAC3C;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,mCAAmCA;AAAA,IACvC,CACE,SACA,YAKU;AACV,iBAAW,CAAC,WAAW,WAAW,KAAK,SAAS,SAAS;AACvD,YAAI,YAAY,QAAQ,uBAAuB;AAC7C;AAAA,QACF;AACA,cAAM,MAAM,YAAY,QAAQ;AAChC,cAAM,QAAQ,YAAY,QAAQ,uBAAuB,KAAK,KAAK;AACnE,YAAI,CAAC,OAAO,CAAC,OAAO;AAClB;AAAA,QACF;AAEA,cAAM,OAAO,YAAY,sBAAsB;AAC/C,YACE,WAAW,KAAK,OAAO,2BACvB,WAAW,KAAK,QAAQ,2BACxB,WAAW,KAAK,MAAM,2BACtB,WAAW,KAAK,SAAS,yBACzB;AACA,iBAAO;AAAA,YACL;AAAA,YACA;AAAA,YACA,QAAQ;AAAA,cACN;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,wCAAwCA;AAAA,IAC5C,CAAC,SAAiB,YAA6B;AAC7C,YAAMG,oBAAmB,oBAAoB;AAC7C,UAAI,CAACA,mBAAkB;AACrB,eAAO;AAAA,MACT;AAEA,YAAM,aAAa,SAAS,QAAQ,IAAIA,kBAAiB,SAAS;AAClE,YAAM,QAAQ,cAAc;AAC5B,UACE,CAAC,cACD,CAAC,SACD,CAAC,WAAW,eACZ,CAAC,MAAM,aACP;AACA,eAAO;AAAA,MACT;AAEA,YAAM,aAAa,WAAW,sBAAsB;AACpD,YAAM,YAAY,MAAM,sBAAsB;AAC9C,aACE;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,KACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,KACA;AAAA,QACE,2BAA2B,YAAY,SAAS;AAAA,QAChD;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IAEJ;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,qCAAqCH;AAAA,IACzC,CAAC,SAAiB,YAAoB;AACpC,YAAM,iBAAiB,4BAA4B;AACnD,UACE,uBAAuB,YAAY,QACnC,kBACA,KAAK,IAAI,UAAU,eAAe,OAAO,KACvC,wCACF,KAAK,IAAI,UAAU,eAAe,OAAO,KACvC,sCACF;AACA;AAAA,MACF;AAEA,+BAAyB;AACzB,kCAA4B,UAAU,EAAE,SAAS,QAAQ;AACzD,6BAAuB,UAAU,WAAW,MAAM;AAChD,+BAAuB,UAAU;AACjC,oCAA4B,UAAU;AACtC,YAAI,oBAAoB,YAAY,MAAM;AACxC;AAAA,QACF;AACA,cAAM,SAAS,+BAA+B,SAAS,OAAO;AAC9D,YAAI,CAAC,QAAQ;AACX,kCAAwB,UAAU;AAClC;AAAA,QACF;AACA,gCAAwB,UAAU;AAAA,UAChC,WAAW,OAAO;AAAA,UAClB,SAAS,OAAO;AAAA,QAClB;AACA,uBAAe,OAAO,SAAS,OAAO,WAAW,OAAO,WAAW;AAAA,MACrE,GAAG,yBAAyB;AAAA,IAC9B;AAAA,IACA,CAAC,0BAA0B,gCAAgC,cAAc;AAAA,EAC3E;AAEA,QAAM,uCAAuCA;AAAA,IAC3C,CAAC,SAAiB,YAAoB;AACpC,UAAI,sBAAsB,YAAY,MAAM;AAC1C;AAAA,MACF;AAEA,YAAM,iBAAiB,8BAA8B;AACrD,UACE,yBAAyB,YAAY,QACrC,kBACA,KAAK,IAAI,UAAU,eAAe,OAAO,KACvC,wCACF,KAAK,IAAI,UAAU,eAAe,OAAO,KACvC,sCACF;AACA;AAAA,MACF;AAEA,iCAA2B;AAC3B,oCAA8B,UAAU,EAAE,SAAS,QAAQ;AAC3D,+BAAyB,UAAU,WAAW,MAAM;AAClD,iCAAyB,UAAU;AACnC,sCAA8B,UAAU;AACxC,YAAI,oBAAoB,YAAY,MAAM;AACxC;AAAA,QACF;AACA,cAAM,SAAS,iCAAiC,SAAS,OAAO;AAChE,YAAI,CAAC,QAAQ;AACX;AAAA,QACF;AACA,yBAAiB,OAAO,QAAQ,OAAO,WAAW,OAAO,WAAW;AAAA,MACtE,GAAG,yBAAyB;AAAA,IAC9B;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,2BAA2BA;AAAA,IAC/B,CAAC,cAAsB;AACrB,8BAAwB,UAAU;AAClC,+BAAyB;AACzB,iCAA2B;AAC3B,+BAAyB;AACzB,wBAAkB,SAAS;AAAA,IAC7B;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,4BAA4BA;AAAA,IAChC,CAAC,cAA+B;AAC9B,YAAM,iBACJ,+BAA+B,QAAQ,IAAI,SAAS;AACtD,aAAO,mBAAmB,UAAa,KAAK,IAAI,IAAI;AAAA,IACtD;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,sBAAsBA,cAAY,CAAC,cAA4B;AACnE,mCAA+B,QAAQ;AAAA,MACrC;AAAA,MACA,KAAK,IAAI,IAAI;AAAA,IACf;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,gCAAgCA;AAAA,IACpC,CAAC,cAAgC;AAC/B,8BAAwB,UAAU;AAClC,+BAAyB;AACzB,iCAA2B;AAC3B,iCAA2B;AAC3B,+BAAyB;AACzB,6BAAuB;AAEvB,UAAI,CAAC,WAAW;AACd,eAAO;AAAA,MACT;AACA,YAAM,cAAc,SAAS,QAAQ,IAAI,SAAS;AAClD,UAAI,CAAC,aAAa;AAChB,eAAO;AAAA,MACT;AACA,6BAAuB,SAAS;AAChC,UAAI,YAAY,QAAQ,eAAe,QAAQ;AAC7C,eAAO;AAAA,MACT;AACA,YAAM,OAAO,YAAY,sBAAsB;AAC/C,kBAAY,MAAM;AAAA,QAChB;AAAA,QACA,GAAG,KAAK,KAAK;AAAA,MACf;AACA,kBAAY,MAAM;AAAA,QAChB;AAAA,QACA,GAAG,KAAK,MAAM;AAAA,MAChB;AACA,kBAAY,QAAQ,aAAa;AACjC,aAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,sCAAsCA;AAAA,IAC1C,CACE,QACA,WACG;AACH,YAAM,EAAE,UAAU,IAAI;AACtB,oCAA8B,SAAS;AACvC,6CAAuC,CAAC,YAAY;AAClD,cAAM,OAAO,IAAI,IAAI,OAAO;AAC5B,aAAK,IAAI,SAAS;AAClB,eAAO;AAAA,MACT,CAAC;AACD,6CAAuC,SAAS;AAChD,aAAO,MAAM;AAAA,IACf;AAAA,IACA,CAAC,+BAA+B,sCAAsC;AAAA,EACxE;AAEA,QAAM,8BAA8BA;AAAA,IAClC,CACE,QACA,WAGG;AACH,oCAA8B;AAC9B,aAAO,MAAM;AAAA,IACf;AAAA,IACA,CAAC,6BAA6B;AAAA,EAChC;AAEA,QAAM,0BAA0BA;AAAA,IAC9B,CAAC,SAAiB,YAAoB;AACpC,UAAI,oBAAoB,YAAY,MAAM;AACxC,mCAA2B;AAC3B,YAAI,sCAAsC,SAAS,OAAO,GAAG;AAC3D,oCAA0B;AAC1B;AAAA,QACF;AACA,gCAAwB,oBAAoB,QAAQ,OAAO;AAC3D,+BAAuB;AACvB;AAAA,MACF;AAEA,YAAMI,sBAAqB,sBAAsB;AACjD,UAAIA,qBAAoB;AACtB,cAAM,SAAS,iCAAiC,SAAS,OAAO;AAChE,YAAI,QAAQ,OAAO,QAAQA,oBAAmB,KAAK;AACjD,qCAA2BA,oBAAmB,GAAG;AAAA,QACnD;AAAA,MACF;AAEA,4BAAsB,SAAS,OAAO;AACtC,yCAAmC,SAAS,OAAO;AACnD,2CAAqC,SAAS,OAAO;AAAA,IACvD;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,wBAAwBJ,cAAY,MAAM;AAC9C,UAAM,gBAAgB,aAAa;AACnC,UAAM,kBAAkB,eAAe;AACvC,QAAI,CAAC,iBAAiB,CAAC,iBAAiB;AACtC;AAAA,QAAmB,CAAC,YAClB,QAAQ,eACR,QAAQ,qBACR,QAAQ,mBACJ;AAAA,UACE,mBAAmB;AAAA,UACnB,kBAAkB;AAAA,UAClB,aAAa;AAAA,QACf,IACA;AAAA,MACN;AACA;AAAA,IACF;AAEA,UAAM,aAAa,kBAAkB;AACrC,UAAM,eAAe,aACjB,gBAAgB,eAChB,gBAAgB;AACpB,UAAM,aAAa,aACf,cAAc,eACd,cAAc;AAClB,UAAM,eAAe,aACjB,cAAc,YACd,cAAc;AAClB,UAAM,YAAY,oCAAoC;AAAA,MACpD,aAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED;AAAA,MAAmB,CAAC,YAClB,QAAQ,sBAAsB,UAAU,qBACxC,QAAQ,qBAAqB,UAAU,oBACvC,QAAQ,gBAAgB,UAAU,cAC9B,UACA;AAAA,IACN;AAAA,EACF,GAAG,CAAC,eAAe,SAAS,CAAC;AAE7B,EAAAE,iBAAgB,MAAM;AACpB,UAAM,UAAU,aAAa;AAC7B,QAAI,CAAC,WAAW,OAAO,WAAW,aAAa;AAC7C,aAAO;AAAA,IACT;AAEA,QAAI,UAAyB;AAC7B,UAAM,iBAAiB,MAAM;AAC3B,UAAI,2BAA2B,eAAe,OAAO,GAAG;AACtD;AAAA,MACF;AACA,UAAI,YAAY,MAAM;AACpB;AAAA,MACF;AACA,gBAAU,OAAO,sBAAsB,MAAM;AAC3C,kBAAU;AACV,8BAAsB;AAAA,MACxB,CAAC;AAAA,IACH;AAEA,0BAAsB;AAEtB,UAAM,iBACJ,OAAO,mBAAmB,cACtB,OACA,IAAI,eAAe,cAAc;AACvC,oBAAgB,QAAQ,OAAO;AAC/B,WAAO,iBAAiB,UAAU,cAAc;AAChD,YAAQ,iBAAiB,UAAU,gBAAgB,EAAE,SAAS,KAAK,CAAC;AAEpE,WAAO,MAAM;AACX,UAAI,YAAY,MAAM;AACpB,eAAO,qBAAqB,OAAO;AAAA,MACrC;AACA,sBAAgB,WAAW;AAC3B,aAAO,oBAAoB,UAAU,cAAc;AACnD,cAAQ,oBAAoB,UAAU,cAAc;AAAA,IACtD;AAAA,EACF,GAAG,CAAC,eAAe,iBAAiB,QAAQ,qBAAqB,CAAC;AAElE,QAAM,6BAA6B,mBAAmB;AAAA,IAAK,CAAC,SAC1D,uBAAuB,IAAI,EAAE;AAAA,MAAK,CAAC,UAChC,MAAM;AACL,YAAI,QAAQ,MAAM,2BAA2B,KAAK,EAAE,GAAG;AACrD,iBAAO;AAAA,QACT;AACA,cAAM,gBAAgB,gBAAgB,IAAI,KAAK,KAAK,MAAM,GAAG,QACzD;AACJ,eACE,eAAe,SAAS,cACxB,QAAQ,cAAc,cAAc;AAAA,MAExC,GAAG;AAAA,IACL;AAAA,EACF;AAEA,EAAAD,WAAU,MAAM;AACd,UAAM,kBAAkB,gBAAgB,QAAQ;AAChD,QAAI,CAAC,mBAAmB,CAAC,qBAAqB,WAAW;AACvD,aAAO;AAAA,IACT;AACA,WAAO,oBAAoB,UAAU,MAAM;AACzC,+BAAyB,CAAC,aAAa,WAAW,CAAC;AAAA,IACrD,CAAC;AAAA,EACH,GAAG,CAAC,aAAa,qBAAqB,0BAA0B,CAAC;AAEjE,EAAAA,WAAU,MAAM;AACd,UAAM,mBAAmB,oBAAI,IAAY;AAEzC,eAAW,SAAS,qBAAqB;AACvC,YAAM,YAAY,MAAM,kBAAkB;AAC1C,YAAM,gBACJ,gCAAgC,QAAQ,IAAI,MAAM,EAAE,KAAK;AAC3D,UAAI,cAAc,QAAQ,cAAc,eAAe;AACrD,yBAAiB,IAAI,MAAM,EAAE;AAAA,MAC/B;AACA,sCAAgC,QAAQ,IAAI,MAAM,IAAI,SAAS;AAAA,IACjE;AAEA,QAAI,iBAAiB,SAAS,GAAG;AAC/B;AAAA,IACF;AAEA,+BAA2B,CAAC,YAAY;AACtC,YAAM,OAAO,IAAI,IAAI,OAAO;AAC5B,iBAAW,WAAW,kBAAkB;AACtC,aAAK,IAAI,OAAO;AAAA,MAClB;AACA,aAAO;AAAA,IACT,CAAC;AAED,eAAW,WAAW,kBAAkB;AACtC,YAAM,kBAAkB,kBAAkB,QAAQ,IAAI,OAAO;AAC7D,UAAI,iBAAiB;AACnB,mBAAW,aAAa,eAAe;AAAA,MACzC;AACA,wBAAkB,QAAQ;AAAA,QACxB;AAAA,QACA,WAAW,WAAW,MAAM;AAC1B,4BAAkB,QAAQ,OAAO,OAAO;AACxC,qCAA2B,CAAC,YAAY;AACtC,gBAAI,CAAC,QAAQ,IAAI,OAAO,GAAG;AACzB,qBAAO;AAAA,YACT;AACA,kBAAM,OAAO,IAAI,IAAI,OAAO;AAC5B,iBAAK,OAAO,OAAO;AACnB,mBAAO;AAAA,UACT,CAAC;AAAA,QACH,GAAG,GAAG;AAAA,MACR;AAAA,IACF;AAAA,EACF,GAAG,CAAC,mBAAmB,CAAC;AAExB,EAAAA;AAAA,IACE,MAAM,MAAM;AACV,iBAAW,WAAW,kBAAkB,QAAQ,OAAO,GAAG;AACxD,mBAAW,aAAa,OAAO;AAAA,MACjC;AACA,wBAAkB,QAAQ,MAAM;AAAA,IAClC;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,8BAA8BD;AAAA,IAClC,OAAO,SAAqC;AAC1C,YAAM,gBAAgB,gBAAgB,IAAI,KAAK,KAAK,MAAM,GAAG,QACzD;AACJ,YAAM,iBACJ,eAAe,SAAS,aACpB,cAAc,iBACd;AACN,YAAM,gBAAgB,+BAA+B;AAAA,QACnD;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AACD,aACG,MAAM,QAAQ;AAAA,QACb,iBAAiB;AAAA,UACf,mBAAmB,cAAc;AAAA,UACjC,wBAAwB,cAAc;AAAA,UACtC;AAAA,UACA,WAAW,QAAQ,kBAAkB,KAAK;AAAA,UAC1C,aAAa,KAAK;AAAA,UAClB;AAAA,QACF,CAAC,KAAK;AAAA,MACR,EAAE,MAAM,MAAM,IAAI,KACjB,MAAM,QAAQ,QAAQ,0BAA0B,IAAI,KAAK,IAAI,EAAE;AAAA,QAC9D,MAAM;AAAA,MACR;AAAA,IAEJ;AAAA,IACA;AAAA,MACE;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,8BAA8BA;AAAA,IAClC,CAAC,SAAyE;AACxE,YAAM,gBAAgB,gBAAgB,IAAI,KAAK,KAAK,MAAM,GAAG,QACzD;AACJ,UAAI,eAAe,SAAS,aAAa;AACvC,eAAO;AAAA,MACT;AAEA,YAAM,gBAAgB,+BAA+B;AAAA,QACnD;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AACD,aAAO,cAAc,eAAe;AAAA,QAClC,mBAAmB,cAAc;AAAA,QACjC,wBAAwB,cAAc;AAAA,QACtC;AAAA,QACA,WAAW,QAAQ,kBAAkB,KAAK;AAAA,QAC1C,aAAa,KAAK;AAAA,QAClB;AAAA,QACA,iBAAiB;AAAA,MACnB,CAAC;AAAA,IACH;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,qCAAqCA;AAAA,IACzC,CAAC,SAAqC;AACpC,YAAM,gBAAgB,gBAAgB,IAAI,KAAK,KAAK,MAAM,GAAG,QACzD;AACJ,aAAO,eAAe,SAAS,cAC3B,8BACA;AAAA,IACN;AAAA,IACA,CAAC,iBAAiB,2BAA2B;AAAA,EAC/C;AAEA,MAAI,UAAU,WAAW,KAAK,iBAAiB,WAAW,GAAG;AAC3D,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,MAAM;AACvB,8BAA0B;AAC1B,6BAAyB;AACzB,+BAA2B;AAC3B,4BAAwB,UAAU;AAClC,0BAAsB,KAAK;AAC3B,mBAAe,IAAI;AACnB,wBAAoB,IAAI;AACxB,+BAA2B;AAC3B,iCAA6B,IAAI;AAAA,EACnC;AAEA,QAAM,kBAAkB,CAAC,cAAgD;AACvE,UAAM,UAAU,aAAa;AAC7B,QAAI,CAAC,SAAS;AACZ;AAAA,IACF;AAEA,2BAAuB;AACvB,6BAAyB;AACzB,+BAA2B;AAC3B,4BAAwB,UAAU;AAElC,UAAM,aAAa,kBAAkB;AACrC,UAAM,eAAe,aACjB,QAAQ,eACR,QAAQ;AACZ,UAAM,QACJ,KAAK,IAAI,sBAAsB,GAAG,eAAe,IAAI,KACpD,cAAc,YAAY,IAAI;AAEjC,YAAQ,SAAS;AAAA,MACf,UAAU;AAAA,MACV,MAAM,aAAa,IAAI;AAAA,MACvB,KAAK,aAAa,QAAQ;AAAA,IAC5B,CAAC;AAAA,EACH;AAEA,QAAM,mBAAmBA,cAAY,CAAC,cAAsB;AAC1D,UAAM,WAAW,wBAAwB,QAAQ,IAAI,SAAS;AAC9D,QAAI,UAAU;AACZ,aAAO;AAAA,IACT;AAEA,UAAM,WAAW,CAAC,YAAgC;AAChD,UAAI,SAAS;AACX,iBAAS,QAAQ,IAAI,WAAW,OAAO;AACvC,iCAAyB,QAAQ,IAAI,WAAW,OAAO;AAAA,MACzD,OAAO;AACL,iBAAS,QAAQ,OAAO,SAAS;AACjC,iCAAyB,QAAQ,OAAO,SAAS;AACjD,YAAI,CAAC,eAAe,SAAS,aAAa,0BAA0B,GAAG;AACrE,oCAA0B,QAAQ,SAAS;AAAA,QAC7C;AAAA,MACF;AACA,4BAAsB,QAAQ,WAAW,OAAO;AAAA,IAClD;AACA,4BAAwB,QAAQ,IAAI,WAAW,QAAQ;AACvD,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AAEL,QAAM,qBAAqBA;AAAA,IACzB,CAAC,SAAiB,aAAqB;AACrC,YAAM,YAAY,cAAc,SAAS,QAAQ;AACjD,UAAI,kBAAkB,IAAI,SAAS,GAAG;AACpC;AAAA,MACF;AACA,2BAAqB,CAAC,YAAY;AAChC,cAAM,OAAO,IAAI,IAAI,OAAO;AAC5B,aAAK,IAAI,SAAS;AAClB,eAAO;AAAA,MACT,CAAC;AACD,YAAM,YAAY;AAChB,YAAI;AACF,gBAAM,oBAAoB;AAAA,YACxB;AAAA,YACA;AAAA,YACA;AAAA,UACF,CAAC;AAAA,QACH,QAAQ;AAAA,QAER,UAAE;AACA,+BAAqB,CAAC,YAAY;AAChC,gBAAI,CAAC,QAAQ,IAAI,SAAS,GAAG;AAC3B,qBAAO;AAAA,YACT;AACA,kBAAM,OAAO,IAAI,IAAI,OAAO;AAC5B,iBAAK,OAAO,SAAS;AACrB,mBAAO;AAAA,UACT,CAAC;AAAA,QACH;AAAA,MACF,GAAG;AAAA,IACL;AAAA,IACA,CAAC,MAAM,mBAAmB,iBAAiB;AAAA,EAC7C;AAEA,QAAM,aACJ,gBAAgB,OACZ,OACC,gBAAgB;AAAA,IACf,CAAC,UAAU,MAAM,MAAM,OAAO,YAAY;AAAA,EAC5C,KAAK;AACX,QAAM,2BACJ,8BAA8B,OAC1B,OACC,mBAAmB;AAAA,IAClB,CACE,SAEA,KAAK,SAAS;AAAA,EAClB,KAAK;AACX,QAAM,6BACJ,YAAY,aAAa,IAAI,CAAC,SAAS,KAAK,EAAE,KAAK,CAAC;AACtD,QAAM,8BACJ,eAAe,OACX,SACA,6BAA6B,WAAW,OAAO,eAAe;AACpE,QAAM,uCACJ,gCAAgC,UAChC,gCAAgC,WAChC,2BAA2B,SAAS;AACtC,QAAM,oCACJ,eAAe,OACX,OACA,qCAAqC;AAAA,IACnC,eAAe,QAAQ;AAAA,IACvB;AAAA,IACA;AAAA,IACA,OAAO,WAAW;AAAA,EACpB,CAAC;AACP,QAAM,6BACJ,eAAe,QACf,WAAW,aAAa,WAAW,KACnC,+BAA+B;AAAA,IAC7B,OAAO,WAAW;AAAA,IAClB,cAAc;AAAA,IACd,cAAc,WAAW;AAAA,EAC3B,CAAC,EAAE,SAAS;AAEd,SACE,gBAAAJ;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,uBAAqB;AAAA,MAErB;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OACE,kBAAkB,OACd,SACC;AAAA,cACC,6BAA6B,GAAG,aAAa;AAAA,YAC/C;AAAA,YAGN,0BAAAC;AAAA,cAAC;AAAA;AAAA,gBACC,KAAK;AAAA,gBACL,cAAY,KAAK,EAAE,WAAW;AAAA,gBAC9B,WAAU;AAAA,gBACV,uBAAqB;AAAA,gBACrB,0BAAuB;AAAA,gBACvB,wBACE,gBAAgB,cAAc,SAAS;AAAA,gBAEzC,wBACE,gBAAgB,oBAAoB,SAAS;AAAA,gBAE/C,uBACE,gBAAgB,mBAAmB,SAAS;AAAA,gBAE9C,gBAAgB,MAAM;AACpB,0CAAwB,UAAU;AAClC,2CAAyB;AACzB,6CAA2B;AAC3B,6CAA2B;AAC3B,2CAAyB;AACzB,yCAAuB;AACvB,+CAA6B;AAAA,gBAC/B;AAAA,gBACA,sBAAsB,CAAC,UAAU;AAC/B,0CAAwB,MAAM,SAAS,MAAM,OAAO;AAAA,gBACtD;AAAA,gBACA,MAAK;AAAA,gBACL,OACE,kBAAkB,SACd,EAAE,QAAQ,UAAU,IACpB,EAAE,OAAO,UAAU;AAAA,gBAGzB;AAAA,kCAAAD;AAAA,oBAAC;AAAA;AAAA,sBACC,WAAU;AAAA,sBACV,kCAA+B;AAAA,sBAC/B,eAAW;AAAA;AAAA,kBACb;AAAA,kBACA,gBAAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,cAAY,KAAK;AAAA,wBACf,kBAAkB,SAAS,iBAAiB;AAAA,sBAC9C;AAAA,sBACA,WAAU;AAAA,sBACV,sBAAmB;AAAA,sBACnB,UAAU,CAAC,gBAAgB;AAAA,sBAC3B,SAAS,MAAM,gBAAgB,UAAU;AAAA,sBACzC,MAAK;AAAA,sBAEJ,4BAAkB,SACjB,gBAAAA,MAAC,iBAAc,MAAM,IAAI,IAEzB,gBAAAA,MAAC,iBAAc,MAAM,IAAI;AAAA;AAAA,kBAE7B;AAAA,kBACA,gBAAAA,MAAC,SAAI,KAAK,cAAc,WAAU,uBAC/B,2BAAiB,IAAI,CAAC,aAAa;AAClC,wBAAI,SAAS,KAAK,SAAS,aAAa;AACtC,6BACE,gBAAAA;AAAA,wBAAC;AAAA;AAAA,0BACC,KAAK,6BAA6B,SAAS,GAAG;AAAA,0BAC9C,WAAU;AAAA,0BACV,eAAY;AAAA,0BACZ,iBAAe,SAAS;AAAA,0BACxB,uBAAqB,eAAe,IAAI,SAAS,GAAG;AAAA;AAAA,wBAC/C,SAAS;AAAA,sBAChB;AAAA,oBAEJ;AAEA,wBAAI,SAAS,KAAK,SAAS,SAAS;AAClC,4BAAM,gBAAgB,SAAS,KAAK;AACpC,4BAAM,EAAE,WAAW,MAAM,IAAI;AAC7B,4BAAM,eACJ,aAAa,YAAY,MAAM,KAAK,cAAc;AACpD,4BAAM,eAAe;AAAA,wBACnB;AAAA,wBACA;AAAA,sBACF;AACA,4BAAM,kBAAkB,+BAA+B;AAAA,wBACrD;AAAA,wBACA;AAAA,wBACA,cAAc,cAAc;AAAA,sBAC9B,CAAC;AACD,4BAAM,gBAAgB,uBAAuB,KAAK;AAClD,4BAAMU,sBAAqB,gBACvB,OACA,uBAAuB,SAAS,MAAM,EAAE,IAAI,MAAM,KAAK;AAC3D,4BAAMC,cACJ,gBAAAX;AAAA,wBAAC;AAAA;AAAA,0BACC,iBAAe,eAAe,OAAO;AAAA,0BACrC,iBACE,gBAAgB,SAAS,eACrB,WACA;AAAA,0BAEN,cAAY,KAAK,EAAE,UAAU,EAAE,OAAO,MAAM,MAAM,CAAC;AAAA,0BACnD,iBACE,gBAAgB,SAAS,YAAY,OAAO;AAAA,0BAE9C,WAAU;AAAA,0BACV,oBACE,gBAAgB,SAAS,YAAY,UAAU;AAAA,0BAEjD,MAAK;AAAA,0BACL,eAAe,CAAC,UAAU;AACxB,gCAAI,MAAM,WAAW,GAAG;AACtB;AAAA,4BACF;AACA,gCAAI,gBAAgB,SAAS,WAAW;AACtC;AAAA,4BACF;AACA,gCAAI,0BAA0B,SAAS,GAAG;AACxC;AAAA,4BACF;AACA,qDAAyB,SAAS;AAAA,0BACpC;AAAA,0BACA,SAAS,CAAC,UAAU;AAClB,gCAAI,gBAAgB,SAAS,WAAW;AACtC;AAAA,4BACF;AACA,gCAAI,0BAA0B,SAAS,GAAG;AACxC;AAAA,4BACF;AACA,gDAAoB,SAAS;AAC7B,kDAAsB,cAAc,kBAAkB;AAAA,8BACpD;AAAA,8BACA;AAAA,8BACA,iBAAiB,MAAM,eAAe;AAAA,8BACtC,eAAe,cAAc;AAAA,8BAC7B,SAAS,MAAM;AAAA,8BACf,qBAAqB,MAAM,kBAAkB;AAAA,8BAC7C,YAAY,MAAM,SAAS;AAAA,8BAC3B,YAAY,MAAM,SAAS,EAAE,MAAM,UAAU;AAAA,8BAC7C,iBAAiB,MAAM,cAAc;AAAA,8BACrC,cACE,MAAM,cAAc,IAAI,CAAC,YAAY;AAAA,gCACnC,UAAU,OAAO,aAAa;AAAA,gCAC9B,IAAI,OAAO;AAAA,gCACX,SAAS,QAAQ,OAAO,YAAY;AAAA,8BACtC,EAAE,KAAK,CAAC;AAAA,8BACV,cAAc,gBAAgB;AAAA,8BAC9B,kBAAkB,cAAc,aAAa;AAAA,8BAC7C,gBAAgB,cAAc,aAAa;AAAA,gCACzC,CAACY,UAASA,MAAK;AAAA,8BACjB;AAAA,8BACA,QAAQ,MAAM;AAAA,8BACd;AAAA,4BACF,CAAC;AACD,oCAAQ,gBAAgB,MAAM;AAAA,8BAC5B,KAAK;AACH,2CAAW;AACX,sCAAM,YAAY;AAChB,sCAAI;AACF,0CAAM,mBAAmB;AAAA,sCACvB,SAAS,MAAM;AAAA,sCACf;AAAA,sCACA,QAAQ,gBAAgB;AAAA,oCAC1B,CAAC;AAAA,kCACH,QAAQ;AAAA,kCAER;AAAA,gCACF,GAAG;AACH,wCAAQ,MAAM;AAAA,kCACZ;AAAA,kCACA,gBAAgB;AAAA,kCAChB,MAAM;AACJ,yCAAK,UAAU,gBAAgB,MAAM;AAAA,kCACvC;AAAA,gCACF;AACA;AAAA,8BACF,KAAK,cAAc;AACjB,sCAAM,OACJ,MAAM,cAAc,sBAAsB;AAC5C;AAAA,kCACE;AAAA,kCACA;AAAA,kCACA;AAAA,oCACE;AAAA,oCACA,SAAS,MAAM;AAAA,oCACf,kBACE,cAAc,aAAa;AAAA,oCAC7B,UAAU,iBAAiB;AAAA,oCAC3B,QAAQ,MAAM;AAAA,oCACd;AAAA,kCACF;AAAA,gCACF;AACA;AAAA,kCAAe,CAAC,YACd,SAAS,YAAY,MAAM,KACvB,OACA;AAAA,oCACE,YAAY;AAAA,sCACV,QAAQ,KAAK;AAAA,sCACb,MAAM,KAAK;AAAA,sCACX,KAAK,KAAK;AAAA,sCACV,OAAO,KAAK;AAAA,oCACd;AAAA,oCACA,MAAM;AAAA,oCACN,SAAS,MAAM;AAAA,kCACjB;AAAA,gCACN;AACA;AAAA,8BACF;AAAA,8BACA,KAAK;AACH,2CAAW;AACX,sCAAM,YAAY;AAChB,sCAAI;AACF,0CAAM,oBAAoB;AAAA,sCACxB,UAAU,gBAAgB;AAAA,sCAC1B,SAAS,MAAM;AAAA,sCACf;AAAA,oCACF,CAAC;AAAA,kCACH,QAAQ;AAAA,kCAER;AAAA,gCACF,GAAG;AACH;AAAA,8BACF,KAAK;AACH,2CAAW;AACX,wCAAQ,MAAM;AAAA,kCACZ;AAAA,kCACA,MAAM;AAAA,kCACN,MACE,KAAK,WAAW;AAAA,oCACd,aAAa,MAAM;AAAA,oCACnB,SAAS,MAAM;AAAA,oCACf,QAAQ;AAAA,oCACR,QAAQ,MAAM;AAAA,kCAChB,CAAC;AAAA,gCACL;AACA;AAAA,4BACJ;AAAA,0BACF;AAAA,0BACA,eAAe,CAAC,UAAU;AACxB,gCACE,gBAAgB,SAAS,aACzB,CAAC,wBAAwB,OAAO,aAAa,GAC7C;AACA;AAAA,4BACF;AACA,kCAAM,eAAe;AACrB,kCAAM,OAAO,MAAM,cAAc,sBAAsB;AACvD;AAAA,8BACE;AAAA,8BACA;AAAA,8BACA;AAAA,gCACE;AAAA,gCACA,SAAS,MAAM;AAAA,gCACf,kBAAkB,cAAc,aAAa;AAAA,gCAC7C,QAAQ,MAAM;AAAA,gCACd;AAAA,8BACF;AAAA,4BACF;AACA,2CAAe;AAAA,8BACb,YAAY;AAAA,gCACV,QAAQ,KAAK;AAAA,gCACb,MAAM,KAAK;AAAA,gCACX,KAAK,KAAK;AAAA,gCACV,OAAO,KAAK;AAAA,8BACd;AAAA,8BACA,MAAM;AAAA,8BACN,SAAS,MAAM;AAAA,4BACjB,CAAC;AAAA,0BACH;AAAA,0BAEA,0BAAAX;AAAA,4BAAC;AAAA;AAAA,8BACC,WAAU;AAAA,8BACV,gCAA6B;AAAA,8BAC7B,oBAAkB,MAAM,OAAO,QAAQ;AAAA,8BACvC,eAAW;AAAA,8BAEX;AAAA,gDAAAD,MAAC,UAAK,WAAU,8BACb,gBAAM,MACT;AAAA,gCACC;AAAA,kCACC;AAAA,kCACA,cAAc,aAAa;AAAA,gCAC7B;AAAA;AAAA;AAAA,0BACF;AAAA;AAAA,sBACF;AAGF,6BACE,gBAAAA;AAAA,wBAAC;AAAA;AAAA,0BAEC,KAAK,iBAAiB,SAAS;AAAA,0BAC/B,WAAU;AAAA,0BACV,yBACE,wBAAwB,IAAI,MAAM,EAAE,IAAI,SAAS;AAAA,0BAEnD,gCAA8B;AAAA,0BAC9B,0BAAuB;AAAA,0BACvB,oBAAkB,MAAM,OAAO,QAAQ;AAAA,0BACvC,kCACE,gBAAgB,MAAM,KAAK;AAAA,0BAE7B,+BAA6BU,qBAAoB;AAAA,0BACjD,iCAA+BA,qBAAoB;AAAA,0BACnD,kBAAgB,MAAM,YAAY;AAAA,0BAClC,mBAAiB,cAAc;AAAA,0BAC/B,qBAAmB,eAAe,SAAS;AAAA,0BAC3C,iBAAe,SAAS;AAAA,0BACxB,mBAAiB,MAAM;AAAA,0BACvB,uBAAqB,eAAe,IAAI,SAAS;AAAA,0BACjD,QAAQ,CAAC,UAAU;AACjB,gCACE,iBACA,CAAC,MAAM,cAAc,SAAS,MAAM,aAAa,GACjD;AACA,uDAAyB,MAAM,EAAE;AAAA,4BACnC;AACA,gCACEA,uBACA,CAAC,MAAM,cAAc,SAAS,MAAM,aAAa,GACjD;AACA,yDAA2BA,oBAAmB,GAAG;AAAA,4BACnD;AAAA,0BACF;AAAA,0BACA,SAAS,CAAC,UAAU;AAClB,gCAAI,eAAe;AACjB;AAAA,gCACE,MAAM;AAAA,gCACN;AAAA,gCACA,MAAM;AAAA,8BACR;AACA;AAAA,4BACF;AACA,gCAAIA,qBAAoB;AACtB;AAAA,gCACEA;AAAA,gCACA;AAAA,gCACA,MAAM;AAAA,8BACR;AAAA,4BACF;AAAA,0BACF;AAAA,0BACA,gBAAgB,MAAM;AACpB,gCAAI,eAAe;AACjB,0DAA4B,MAAM,IAAI,SAAS;AAC/C;AAAA,4BACF;AACA,gCAAIA,qBAAoB;AACtB;AAAA,gCACEA;AAAA,gCACA;AAAA,8BACF;AAAA,4BACF;AAAA,0BACF;AAAA,0BACA,gBAAgB,CAAC,UAAU;AACzB,gCAAI,CAAC,eAAe;AAClB,kCAAIA,qBAAoB;AACtB,2DAA2B;AAC3B,2DAA2BA,oBAAmB,GAAG;AACjD,sCAAMG,iBAAgB,MAAM;AAC5B,oCACEA,0BAAyB,QACzB,eAAe,SAAS,SAASA,cAAa,GAC9C;AACA;AAAA,oCACE,MAAM;AAAA,oCACN,MAAM;AAAA,kCACR;AAAA,gCACF;AAAA,8BACF;AACA;AAAA,4BACF;AACA,kCAAM,gBAAgB,MAAM;AAC5B,gCACE,yBAAyB,QACzB,cAAc,SAAS,SAAS,aAAa,GAC7C;AACA;AAAA,4BACF;AACA,gCACE,yBAAyB,QACzB,eAAe,SAAS,SAAS,aAAa,GAC9C;AACA;AAAA,gCACE,MAAM;AAAA,gCACN,MAAM;AAAA,8BACR;AACA;AAAA,4BACF;AACA,gCACE,wBAAwB,SAAS,cAAc,WAC/C;AACA,sDAAwB,UAAU;AAAA,4BACpC;AACA,qDAAyB;AACzB,qDAAyB,MAAM,EAAE;AACjC,mDAAuB;AAAA,0BACzB;AAAA,0BAEC,UAAAF;AAAA;AAAA,wBA5GI,SAAS;AAAA,sBA6GhB;AAAA,oBAEJ;AAEA,0BAAM,OAAO,SAAS,KAAK;AAC3B,wBAAI,KAAK,SAAS,SAAS;AACzB,4BAAM,mBACJ,8BAA8B,OAAO,OAAO;AAC9C,4BAAM,aAAa,KAAK,EAAE,kBAAkB;AAC5C,4BAAMD,sBAAqB;AAAA,wBACzB,mBAAmB,KAAK,SAAS;AAAA,wBACjC;AAAA,sBACF;AACA,4BAAM,cACJ,gBAAAV;AAAA,wBAAC;AAAA;AAAA,0BACC,iBAAe;AAAA,0BACf,iBAAc;AAAA,0BACd,cAAY;AAAA,0BACZ,WAAU;AAAA,0BACV,oBAAiB;AAAA,0BACjB,MAAK;AAAA,0BACL,UAAU;AAAA,0BACV,WAAW;AAAA,0BACX,eAAe,CAAC,UAAU;AACxB,gCAAI,MAAM,WAAW,GAAG;AACtB;AAAA,4BACF;AACA,0DAA8B;AAAA,0BAChC;AAAA,0BACA,SAAS,CAAC,UAAU;AAClB,2CAAe,IAAI;AACnB,kCAAM,OAAO,MAAM,cAAc,sBAAsB;AACvD,kCAAM,WACJ,eAAe,SAAS,sBAAsB;AAChD;AAAA,8BAA6B,CAAC,YAC5B,UACI,OACA;AAAA,gCACE,WAAW,KAAK;AAAA,kCACd,KAAK;AAAA,kCACL,UAAU,SAAS,KAAK;AAAA,gCAC1B;AAAA,gCACA,QAAQ,KAAK;AAAA,gCACb,MAAM,KAAK;AAAA,gCACX,KAAK,KAAK;AAAA,gCACV,OAAO,KAAK;AAAA,8BACd;AAAA,4BACN;AAAA,0BACF;AAAA,0BAEA,0BAAAC;AAAA,4BAAC;AAAA;AAAA,8BACC,WAAU;AAAA,8BACV,gCAA6B;AAAA,8BAC7B,qBACE,KAAK,MAAM,SAAS,IAAI,SAAS;AAAA,8BAEnC,eAAW;AAAA,8BAEV;AAAA,sCAAM;AAAA,kCACL;AAAA,oCACE,QACE,KAAK,MAAM,SAAS,IAChB,IACA,KAAK,IAAI,KAAK,MAAM,QAAQ,CAAC;AAAA,kCACrC;AAAA,kCACA,CAAC,GAAG,UAAU;AACZ,0CAAMW,QAAO,KAAK,MAAM,KAAK;AAC7B,wCAAI,UAAU,KAAKA,OAAM;AACvB,6CACE,gBAAAZ;AAAA,wCAAC;AAAA;AAAA,0CAEC,gBAAgB;AAAA,0CAChB,WAAW,4EAA4E,KAAK;AAAA,0CAC5F;AAAA,0CACA,MAAMY;AAAA,0CACN,gBAAgB;AAAA,4CACdA;AAAA,0CACF;AAAA,0CACA;AAAA;AAAA,wCARK,8BAA8BA,KAAI;AAAA,sCASzC;AAAA,oCAEJ;AACA,2CACE,gBAAAZ;AAAA,sCAAC;AAAA;AAAA,wCAEC,eAAY;AAAA,wCACZ,WAAW,4GAA4G,KAAK;AAAA;AAAA,sCAFvH,GAAG,KAAK,SAAS,eAAe,KAAK;AAAA,oCAG5C;AAAA,kCAEJ;AAAA,gCACF;AAAA,gCACA,gBAAAA,MAAC,UAAK,WAAU,6BACb,eAAK,MAAM,QACd;AAAA;AAAA;AAAA,0BACF;AAAA;AAAA,sBACF;AAGF,6BACE,gBAAAA;AAAA,wBAAC;AAAA;AAAA,0BAEC,KAAK,iBAAiB,KAAK,SAAS;AAAA,0BACpC,WAAU;AAAA,0BACV,gCAA8B,KAAK;AAAA,0BACnC,0BAAuB;AAAA,0BACvB,+BAA6BU,oBAAmB;AAAA,0BAChD,iCAA+BA,oBAAmB;AAAA,0BAClD,mBAAgB;AAAA,0BAChB,qBAAmB;AAAA,0BACnB,iBAAe,SAAS;AAAA,0BACxB,mBAAgB;AAAA,0BAChB,0BACE,mBAAmB,SAAS;AAAA,0BAE9B,QAAQ,CAAC,UAAU;AACjB,gCAAI,CAAC,MAAM,cAAc,SAAS,MAAM,aAAa,GAAG;AACtD,yDAA2BA,oBAAmB,GAAG;AAAA,4BACnD;AAAA,0BACF;AAAA,0BACA,SAAS,CAAC,UAAU;AAClB;AAAA,8BACEA;AAAA,8BACA,KAAK;AAAA,8BACL,MAAM;AAAA,4BACR;AAAA,0BACF;AAAA,0BACA,gBAAgB,MAAM;AACpB;AAAA,8BACEA;AAAA,8BACA,KAAK;AAAA,4BACP;AAAA,0BACF;AAAA,0BACA,gBAAgB,CAAC,UAAU;AACzB,uDAA2B;AAC3B,uDAA2BA,oBAAmB,GAAG;AACjD,kCAAM,gBAAgB,MAAM;AAC5B,gCACE,yBAAyB,QACzB,eAAe,SAAS,SAAS,aAAa,GAC9C;AACA;AAAA,gCACE,MAAM;AAAA,gCACN,MAAM;AAAA,8BACR;AAAA,4BACF;AAAA,0BACF;AAAA,0BAEC;AAAA;AAAA,wBA/CI,SAAS;AAAA,sBAgDhB;AAAA,oBAEJ;AAEA,0BAAM,OAAO,KAAK;AAClB,0BAAM,yBACJ,QAAQ,MAAM,2BAA2B,KAAK,EAAE;AAClD,0BAAM,qBAAqB;AAAA,sBACzB,kBAAkB,KAAK,EAAE;AAAA,sBACzB,KAAK;AAAA,oBACP;AACA,0BAAM,aACJ,gBAAAV;AAAA,sBAAC;AAAA;AAAA,wBACC,cAAY,KAAK,EAAE,UAAU,EAAE,OAAO,KAAK,MAAM,CAAC;AAAA,wBAClD,iBAAe,yBAAyB,OAAO;AAAA,wBAC/C,WAAU;AAAA,wBACV,oBAAkB,yBAAyB,UAAU;AAAA,wBACrD,MAAK;AAAA,wBACL,UAAU,yBAAyB,KAAK;AAAA,wBACxC,WAAW,CAAC,UACV;AAAA,0BACE;AAAA,0BACA;AAAA,wBACF;AAAA,wBAEF,eAAe,CAAC,UAAU;AACxB,8BAAI,MAAM,WAAW,KAAK,wBAAwB;AAChD;AAAA,0BACF;AACA,gCAAM,gBACJ,2CAA2C;AAAA,4BACzC,QAAQ,KAAK;AAAA,4BACb,OAAO;AAAA,4BACP,QAAQ;AAAA,8BACN,WAAW,KAAK;AAAA,8BAChB,MAAM;AAAA,4BACR;AAAA,0BACF,CAAC;AACH,8BAAI,eAAe,SAAS,aAAa;AACvC,2DAA+B,KAAK,SAAS;AAC7C;AAAA,0BACF;AACA,wDAA8B;AAAA,wBAChC;AAAA,wBACA,SAAS,MAAM;AACb,8BAAI,wBAAwB;AAC1B;AAAA,0BACF;AACA,gCAAM,gBACJ,2CAA2C;AAAA,4BACzC,QAAQ,KAAK;AAAA,4BACb,OAAO;AAAA,4BACP,QAAQ;AAAA,8BACN,WAAW,KAAK;AAAA,8BAChB,MAAM;AAAA,4BACR;AAAA,0BACF,CAAC;AACH,8BAAI,eAAe,SAAS,aAAa;AACvC,2DAA+B,KAAK,SAAS;AAC7C;AAAA,0BACF;AACA,qCAAW;AACX;AAAA,4BACE;AAAA,4BACA,CAAC,WAAW;AACV,sCAAQ,MAAM;AAAA,gCACZ,OAAO;AAAA,gCACP,OAAO;AAAA,gCACP,MAAM;AACJ,uCAAK,UAAU,OAAO,MAAM;AAAA,gCAC9B;AAAA,8BACF;AAAA,4BACF;AAAA,0BACF;AAAA,wBACF;AAAA,wBAEA,0BAAAA;AAAA,0BAAC;AAAA;AAAA,4BAEC,gBACE,yBACI,SACA;AAAA,4BAEN,cAAc;AAAA,4BACd,kBACE,yBAAyB,SAAY;AAAA,4BAEvC;AAAA,4BACA,gBACE,yBACI,SACA,mCAAmC,IAAI;AAAA,4BAE7C;AAAA;AAAA,0BAhBK,8BAA8B,IAAI;AAAA,wBAiBzC;AAAA;AAAA,oBACF;AAGF,2BACE,gBAAAA;AAAA,sBAAC;AAAA;AAAA,wBAEC,KAAK,iBAAiB,KAAK,SAAS;AAAA,wBACpC,WAAU;AAAA,wBACV,mBACE,oCAAoC,IAAI,KAAK,SAAS,IAClD,SACA;AAAA,wBAEN,gCAA8B,KAAK;AAAA,wBACnC,0BAAuB;AAAA,wBACvB,+BAA6B,mBAAmB;AAAA,wBAChD,iCAA+B,mBAAmB;AAAA,wBAClD,mBAAgB;AAAA,wBAChB,yBACE,yBAAyB,SAAS;AAAA,wBAEpC,iBAAe,SAAS;AAAA,wBACxB,4BACE,mBAAmB,KAAK,KAAK,SAAS;AAAA,wBAExC,mBAAgB;AAAA,wBAChB,QAAQ,CAAC,UAAU;AACjB,8BAAI,CAAC,MAAM,cAAc,SAAS,MAAM,aAAa,GAAG;AACtD,uDAA2B,mBAAmB,GAAG;AAAA,0BACnD;AAAA,wBACF;AAAA,wBACA,SAAS,CAAC,UAAU;AAClB;AAAA,4BACE;AAAA,4BACA,KAAK;AAAA,4BACL,MAAM;AAAA,0BACR;AAAA,wBACF;AAAA,wBACA,gBAAgB,MAAM;AACpB;AAAA,4BACE;AAAA,4BACA,KAAK;AAAA,0BACP;AAAA,wBACF;AAAA,wBACA,gBAAgB,CAAC,UAAU;AACzB,qDAA2B;AAC3B,qDAA2B,mBAAmB,GAAG;AACjD,gCAAM,gBAAgB,MAAM;AAC5B,8BACE,yBAAyB,QACzB,eAAe,SAAS,SAAS,aAAa,GAC9C;AACA;AAAA,8BACE,MAAM;AAAA,8BACN,MAAM;AAAA,4BACR;AAAA,0BACF;AAAA,wBACF;AAAA,wBAEC;AAAA;AAAA,sBAtDI,SAAS;AAAA,oBAuDhB;AAAA,kBAEJ,CAAC,GACH;AAAA,kBACA,gBAAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,cAAY,KAAK;AAAA,wBACf,kBAAkB,SAAS,mBAAmB;AAAA,sBAChD;AAAA,sBACA,WAAU;AAAA,sBACV,sBAAmB;AAAA,sBACnB,UAAU,CAAC,gBAAgB;AAAA,sBAC3B,SAAS,MAAM,gBAAgB,SAAS;AAAA,sBACxC,MAAK;AAAA,sBAEJ,4BAAkB,SACjB,gBAAAA,MAAC,mBAAgB,MAAM,IAAI,IAE3B,gBAAAA,MAAC,kBAAe,MAAM,IAAI;AAAA;AAAA,kBAE9B;AAAA,kBACC,mBACC,gBAAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,OACE,gBAAgB;AAAA,wBACd,CAAC,UAAU,MAAM,MAAM,OAAO,iBAAiB;AAAA,sBACjD,GAAG,SAAS;AAAA,sBAEd;AAAA,sBACA;AAAA,sBACA;AAAA,sBACA,WAAW;AAAA,sBACX;AAAA,sBACA;AAAA,sBACA,OAAO;AAAA,sBACP,QAAQ,CAAC,UAAU;AACjB,4BAAI,CAAC,MAAM,cAAc,SAAS,MAAM,aAAa,GAAG;AACtD,mDAAyB,iBAAiB,OAAO;AAAA,wBACnD;AAAA,sBACF;AAAA,sBACA,SAAS;AAAA,sBACT,gBAAgB;AAAA,sBAChB,gBAAgB,CAAC,UAAU;AACzB,8BAAM,gBAAgB,MAAM;AAC5B,8BAAM,aAAa,SAAS,QAAQ;AAAA,0BAClC,iBAAiB;AAAA,wBACnB;AACA,4BACE,yBAAyB,QACzB,YAAY,SAAS,aAAa,GAClC;AACA;AAAA,wBACF;AACA,gDAAwB,iBAAiB,OAAO;AAChD,+CAAuB;AAAA,sBACzB;AAAA;AAAA,kBACF,IACE;AAAA,kBACH,qBACC,gBAAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,WAAW;AAAA,sBACX,OAAO;AAAA;AAAA,kBACT,IACE;AAAA;AAAA;AAAA,YACN;AAAA;AAAA,QACF;AAAA,QACC,cAAc,cACb,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,YAAY,YAAY;AAAA,YACxB,WAAW;AAAA,YACX,oBAAoB,sCAAsC;AAAA,YAC1D,mBAAmB;AAAA,YACnB;AAAA,YACA,eACE,WAAW,MAAM,gBACb;AAAA,cACE,SAAS,WAAW,MAAM,cAAc;AAAA,cACxC,UACE,WAAW,MAAM,cAAc,aAAa,QAC5C,kBAAkB;AAAA,gBAChB;AAAA,kBACE,WAAW,MAAM;AAAA,kBACjB,WAAW,MAAM,cAAc;AAAA,gBACjC;AAAA,cACF;AAAA,cACF,OAAO,KAAK;AAAA,gBACV,WAAW,MAAM,cAAc,WAC3B,mCACA;AAAA,cACN;AAAA,cACA,cAAc,kBAAkB;AAAA,gBAC9B;AAAA,kBACE,WAAW,MAAM;AAAA,kBACjB,WAAW,MAAM,cAAc;AAAA,gBACjC;AAAA,cACF,IACI,WAAW,MAAM,cAAc,eAC/B;AAAA,YACN,IACA;AAAA,YAEN,gBACE,WAAW,MAAM,0BACb,OAAO,SAAS;AACd,oBAAM,kBAAkB,MAAM,QAAQ;AAAA,gBACpC,WAAW,MAAM,0BAA0B,IAAI,KAAK;AAAA,cACtD,EAAE,MAAM,MAAM,IAAI;AAClB,qBAAO,kBACH;AAAA,gBACE,MAAM;AAAA,gBACN,UAAU,KAAK,mBAAmB;AAAA,gBAClC,KAAK;AAAA,cACP,IACA;AAAA,YACN,IACA;AAAA,YAEN;AAAA,YACA,OAAO,WAAW,aACf,IAAI,CAAC,SAAS;AACb,oBAAM,gBAAgB,+BAA+B;AAAA,gBACnD;AAAA,gBACA;AAAA,gBACA;AAAA,cACF,CAAC;AACD,oBAAM,OAAO;AAAA,gBACX,mBAAmB,cAAc;AAAA,gBACjC,wBAAwB,cAAc;AAAA,gBACtC;AAAA,gBACA,WAAW,QAAQ,kBAAkB,KAAK;AAAA,gBAC1C,aAAa,iBAAiB,IAAI,KAAK,EAAE;AAAA,gBACzC;AAAA,cACF;AACA,oBAAM,aACJ,WAAW,MAAM,mBAAmB,IAAI,KAAK,CAAC;AAChD,oBAAM,4BACJ,WAAW,mBAAmB;AAChC,oBAAM,oBACJ,WAAW,YACV,4BACI;AAAA,gBACC,MAAM;AAAA,gBACN,UAAU,WAAW,YAAY;AAAA,gBACjC,KAAK;AAAA,cACP,IACC,WAAW,MAAM,0BAA0B,IAAI,KAAK;AAC3D,qBAAO;AAAA,gBACL,GAAG;AAAA,gBACH,SAAS;AAAA,gBACT,iBACE,gBAAgB,iBAAiB,KACjC,WAAW,YACX;AAAA,gBACF,UACE,WAAW,aAAa,SACnB,KAAK,KAAK,eAAe,KAAK,KAAK,aACpC,WAAW;AAAA,gBACjB,OACE,WAAW,UAAU,SACjB,KAAK,QACL,WAAW,OAAO,KAAK,KAAK;AAAA,cACpC;AAAA,YACF,CAAC,EACA,KAAK,CAAC,MAAM,UAAU;AACrB,kBAAI,KAAK,cAAc,MAAM,WAAW;AACtC,uBAAO,KAAK,YAAY,KAAK;AAAA,cAC/B;AACA,qBAAO,KAAK,KAAK,GAAG,cAAc,MAAM,KAAK,EAAE;AAAA,YACjD,CAAC;AAAA,YACH,OAAO,WAAW,MAAM;AAAA,YACxB,WAAW,WAAW,MAAM;AAAA,YAC5B,gBAAgB,KAAK,EAAE,WAAW;AAAA,YAClC,WAAW,KAAK,EAAE,sBAAsB;AAAA,YACxC,kBAAkB,CAAC,UAAU,KAAK,EAAE,eAAe,EAAE,MAAM,CAAC;AAAA,YAC5D,iBAAiB,KAAK,EAAE,4BAA4B;AAAA,YACpD,WAAW,KAAK,EAAE,sBAAsB;AAAA,YACxC,SAAS,MAAM;AACb;AAAA,gBACE;AAAA,gBACA;AAAA,gBACA;AAAA,kBACE,SAAS,WAAW,MAAM;AAAA,kBAC1B,WAAW,WAAW,aAAa;AAAA,kBACnC;AAAA,gBACF;AAAA,cACF;AACA,yBAAW;AAAA,YACb;AAAA,YACA,aAAa,CAAC,WAAW;AACvB,mBAAK,iBAAiB,MAAM;AAC5B,oBAAM,oBAAoB,WAAW,aAAa;AAAA,gBAChD,CAAC,SAAS,KAAK,OAAO;AAAA,cACxB;AACA,kBAAI,CAAC,mBAAmB;AACtB,2BAAW;AAAA,cACb;AAAA,YACF;AAAA,YACA,aAAa,MAAM;AACjB,yBAAW;AACX,sBAAQ,MAAM;AAAA,gBACZ,wBAAwB,UAAU;AAAA,gBAClC,WAAW,MAAM;AAAA,gBACjB,MACE,KAAK,WAAW;AAAA,kBACd,aAAa,WAAW,MAAM;AAAA,kBAC9B,SAAS,WAAW,MAAM;AAAA,kBAC1B,QAAQ;AAAA,kBACR,QAAQ,WAAW,MAAM;AAAA,gBAC3B,CAAC;AAAA,cACL;AAAA,YACF;AAAA,YACA,mBAAmB,MAAM;AACvB,kBAAI,CAAC,mCAAmC;AACtC;AAAA,cACF;AACA,sBAAQ,WAAW,SAAS;AAAA,gBAC1B,kCAAkC;AAAA,cACpC;AACA,yBAAW;AAAA,YACb;AAAA,YACA,QAAQ,MAAM;AACZ,yBAAW,QAAQ,WAAW,cAAc;AAC1C,oBAAI,CAAC,iBAAiB,IAAI,KAAK,EAAE,GAAG;AAClC,uBAAK,aAAa,KAAK,EAAE;AAAA,gBAC3B;AAAA,cACF;AACA,yBAAW;AAAA,YACb;AAAA,YACA,0BACE,WAAW,MAAM,gBACb,MAAM;AACJ,oBAAM,gBAAgB,WAAW,MAAM;AACvC,kBAAI,CAAC,iBAAiB,cAAc,aAAa,MAAM;AACrD;AAAA,cACF;AACA;AAAA,gBACE,WAAW,MAAM;AAAA,gBACjB,cAAc;AAAA,cAChB;AACA,yBAAW;AAAA,YACb,IACA;AAAA,YAEN,cAAc,CAAC,WAAW;AACxB,yBAAW;AACX,oBAAM,YAAY;AAChB,oBAAI;AACF,wBAAM,mBAAmB;AAAA,oBACvB,SAAS,WAAW,MAAM;AAAA,oBAC1B;AAAA,oBACA;AAAA,kBACF,CAAC;AAAA,gBACH,QAAQ;AAAA,gBAER;AAAA,cACF,GAAG;AACH,sBAAQ,MAAM;AAAA,gBACZ,wBAAwB,UAAU;AAAA,gBAClC;AAAA,gBACA,MAAM;AACJ,uBAAK,UAAU,MAAM;AAAA,gBACvB;AAAA,cACF;AAAA,YACF;AAAA,YACA,kBAAkB,MAAM;AACtB,yBAAW;AACX,yBAAW,QAAQ,WAAW,cAAc;AAC1C,oBAAI,iBAAiB,IAAI,KAAK,EAAE,GAAG;AACjC,0BAAQ,WAAW,SAAS,YAAY,KAAK,EAAE;AAAA,gBACjD;AAAA,cACF;AACA,qBAAO,sBAAsB,MAAM;AACjC,8CAA8B,YAAY;AAAA,kBACxC,SAAS;AAAA,kBACT,SAAS;AAAA,gBACX,CAAC;AAAA,cACH,CAAC;AAAA,YACH;AAAA,YACA,QAAQ,MAAM;AACZ,yBAAW,QAAQ,WAAW,cAAc;AAC1C,qBAAK,iBAAiB,KAAK,EAAE;AAAA,cAC/B;AACA,yBAAW;AAAA,YACb;AAAA,YACA,WAAW,KAAK,EAAE,sBAAsB;AAAA,YACxC,eAAe;AAAA,cACb,WAAW;AAAA,cACX;AAAA,YACF;AAAA,YACA,UAAU;AAAA,YACV,qBAAqB,KAAK,EAAE,gCAAgC;AAAA,YAC5D,4BAA4B,CAAC,SAC3B,2BAA2B,aAAa,IAAI;AAAA,YAE9C,SACE,YAAY,SAAS,iBAAiB,iBAAiB;AAAA;AAAA,QAE3D,IACE;AAAA,QACH,4BAA4B,4BAC3B,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,YAAY;AAAA,YACZ,WAAW;AAAA,YACX;AAAA,YACA,gBAAgB,OAAO,SAAS;AAC9B,oBAAM,MAAM,MAAM,4BAA4B,KAAK,IAAI;AACvD,qBAAO,MAAM,EAAE,MAAM,SAAS,IAAI,IAAI;AAAA,YACxC;AAAA,YACA;AAAA,YACA,OAAO,yBAAyB,MAAM,IAAI,CAAC,SAAS;AAClD,oBAAM,gBAAgB,+BAA+B;AAAA,gBACnD;AAAA,gBACA;AAAA,gBACA;AAAA,cACF,CAAC;AACD,oBAAM,gBAAgB,gBAAgB,IAAI,KAAK,KAAK,MAAM,GAAG,QACzD;AACJ,qBAAO;AAAA,gBACL,mBAAmB,cAAc;AAAA,gBACjC,wBAAwB,cAAc;AAAA,gBACtC;AAAA,gBACA,WAAW,QAAQ,kBAAkB,KAAK;AAAA,gBAC1C,aAAa;AAAA,gBACb;AAAA,gBACA,SACE,eAAe,SAAS,cACnB,4BAA4B,IAAI,KAAK,OACtC,eAAe,SAAS,cACtB,cAAc,iBACd,QACC,MAAM;AACL,wBAAM,kBACJ,oCAAoC,KAAK,EAAE;AAC7C,yBAAO,kBACF,EAAE,MAAM,SAAS,KAAK,gBAAgB,IACvC;AAAA,gBACN,GAAG;AAAA,gBACX,iBAAiB;AAAA,gBACjB,UAAU,KAAK,KAAK,eAAe,KAAK,KAAK;AAAA,gBAC7C,OAAO,KAAK;AAAA,cACd;AAAA,YACF,CAAC;AAAA,YACD,OAAO,KAAK,EAAE,kBAAkB;AAAA,YAChC,gBAAgB,KAAK,EAAE,WAAW;AAAA,YAClC,kBAAkB,CAAC,UAAU,KAAK,EAAE,eAAe,EAAE,MAAM,CAAC;AAAA,YAC5D,SAAS,MAAM;AACb;AAAA,gBACE;AAAA,gBACA;AAAA,gBACA;AAAA,kBACE,SAAS;AAAA,kBACT,WAAW,yBAAyB,MAAM;AAAA,kBAC1C;AAAA,gBACF;AAAA,cACF;AACA,yBAAW;AAAA,YACb;AAAA,YACA,aAAa,CAAC,WAAW;AACvB,mBAAK,iBAAiB,MAAM;AAC5B,oBAAM,oBAAoB,yBAAyB,MAAM;AAAA,gBACvD,CAAC,SAAS,KAAK,OAAO;AAAA,cACxB;AACA,kBAAI,CAAC,mBAAmB;AACtB,2BAAW;AAAA,cACb;AAAA,YACF;AAAA,YACA,aAAa,MAAM;AAAA,YACnB,cAAc,CAAC,WAAW;AACxB,oBAAM,gBAAgB,2CAA2C;AAAA,gBAC/D;AAAA,gBACA,OAAO;AAAA,gBACP,QAAQ;AAAA,kBACN,MAAM;AAAA,kBACN,gBAAgB,yBAAyB;AAAA,gBAC3C;AAAA,cACF,CAAC;AACD,kBAAI,eAAe,SAAS,oBAAoB;AAC9C;AAAA,cACF;AACA,yBAAW;AACX,0CAA4B,eAAe,CAAC,WAAW;AACrD,wBAAQ,MAAM;AAAA,kBACZ,OAAO;AAAA,kBACP,OAAO;AAAA,kBACP,MAAM;AACJ,yBAAK,UAAU,OAAO,MAAM;AAAA,kBAC9B;AAAA,gBACF;AAAA,cACF,CAAC;AAAA,YACH;AAAA,YACA,eAAe;AAAA,YACf,4BAA4B,CAAC,SAC3B,2BAA2B,aAAa,IAAI;AAAA,YAE9C,SAAQ;AAAA;AAAA,QACV,IACE;AAAA;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,sCAAsC;AAAA,EAC7C;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAYG;AACD,QAAM,CAAC,kBAAkB,mBAAmB,IAAII,UAE9C,MAAS;AACX,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA;AAAA,IAAwB,MACpE,gBAAgB,iBACZ,OACA,oCAAoC,KAAK,EAAE;AAAA,EACjD;AAEA,EAAAE,WAAU,MAAM;AACd,QAAI,gBAAgB,CAAC,kBAAkB,qBAAqB,QAAW;AACrE,aAAO;AAAA,IACT;AAEA,QAAI,YAAY;AAChB,QAAI,UAAyB;AAC7B,QAAI,SAAwB;AAC5B,QAAI,YAA6D;AACjE,UAAM,8BAA8B,MAAM;AACxC,UAAI,WAAW;AACb;AAAA,MACF;AACA,0BAAoB,eAAe,IAAI,KAAK,IAAI;AAAA,IAClD;AACA,UAAM,YAAY;AAUlB,QAAI,OAAO,UAAU,wBAAwB,YAAY;AACvD,eAAS,UAAU,oBAAoB,6BAA6B;AAAA,QAClE,SAAS;AAAA,MACX,CAAC;AAAA,IACH,WAAW,OAAO,UAAU,0BAA0B,YAAY;AAChE,gBAAU,UAAU,sBAAsB,MAAM;AAC9C,kBAAU;AACV,oBAAY,WAAW,WAAW,6BAA6B,CAAC;AAAA,MAClE,CAAC;AAAA,IACH,OAAO;AACL,kBAAY,WAAW,WAAW,6BAA6B,CAAC;AAAA,IAClE;AAEA,WAAO,MAAM;AACX,kBAAY;AACZ,UACE,WAAW,QACX,OAAO,UAAU,uBAAuB,YACxC;AACA,kBAAU,mBAAmB,MAAM;AAAA,MACrC;AACA,UACE,YAAY,QACZ,OAAO,UAAU,yBAAyB,YAC1C;AACA,kBAAU,qBAAqB,OAAO;AAAA,MACxC;AACA,UAAI,cAAc,MAAM;AACtB,mBAAW,aAAa,SAAS;AAAA,MACnC;AAAA,IACF;AAAA,EACF,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA,KAAK,KAAK;AAAA,IACV,KAAK,KAAK;AAAA,IACV,KAAK,KAAK;AAAA,IACV,KAAK;AAAA,IACL,KAAK;AAAA,IACL;AAAA,EACF,CAAC;AAED,EAAAA,WAAU,MAAM;AACd,QAAI,gBAAgB,gBAAgB;AAClC,aAAO;AAAA,IACT;AAEA,QAAI,YAAY;AAChB,UAAM,wBAAwB,oCAAoC,KAAK,EAAE;AACzE,uBAAmB,qBAAqB;AACxC,UAAM,WAAW,2BAA2B,aAAa,IAAI;AAC7D,QAAI,CAAC,yBAAyB,kBAAkB;AAC9C,WAAK,iBACF,KAAK,QAAQ,EACb,MAAM,MAAM,IAAI,EAChB,KAAK,CAAC,qBAAqB;AAC1B,YAAI,aAAa,CAAC,kBAAkB;AAClC;AAAA,QACF;AACA,6CAAqC,KAAK,IAAI,gBAAgB;AAC9D,2BAAmB,gBAAgB;AAAA,MACrC,CAAC;AAAA,IACL;AACA,QAAI,gBAAgB;AAClB,WAAK,QAAQ,QAAQ,eAAe,IAAI,CAAC,EACtC,MAAM,MAAM,IAAI,EAChB,KAAK,CAAC,gBAAgB;AACrB,YAAI,aAAa,CAAC,aAAa;AAC7B;AAAA,QACF;AACA,6CAAqC,KAAK,IAAI,WAAW;AACzD,0BAAkB,MAAM;AAAA,UACtB,KAAK;AAAA,UACL,iBAAiB;AAAA,QACnB,CAAC;AACD,2BAAmB,WAAW;AAAA,MAChC,CAAC;AAAA,IACL;AACA,QAAI,yBAAyB,KAAK,eAAe,gBAAgB;AAC/D,aAAO,MAAM;AACX,oBAAY;AAAA,MACd;AAAA,IACF;AACA,SAAK,iCAAiC,KAAK,EAAE,EAAE,KAAK,CAAC,gBAAgB;AACnE,UAAI,CAAC,WAAW;AACd,2BAAmB,WAAW;AAAA,MAChC;AAAA,IACF,CAAC;AACD,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK,KAAK;AAAA,IACV,KAAK,KAAK;AAAA,IACV,KAAK,KAAK;AAAA,IACV,KAAK;AAAA,IACL,KAAK;AAAA,IACL;AAAA,IACA;AAAA,EACF,CAAC;AAED,MAAI,cAAc;AAChB,WAAO,sCAAsC,SAAS;AAAA,EACxD;AAEA,MAAI,kBAAkB;AACpB,WAAO,kCAAkC,kBAAkB,SAAS;AAAA,EACtE;AAEA,MAAI,iBAAiB;AACnB,WACE,gBAAAN;AAAA,MAAC;AAAA;AAAA,QACC,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,QACF,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,QACX,eAAY;AAAA,QAEZ,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACC,KAAI;AAAA,YACJ,WAAU;AAAA,YACV,WAAW;AAAA,YACX,KAAK;AAAA;AAAA,QACP;AAAA;AAAA,IACF;AAAA,EAEJ;AAEA,SAAO,sCAAsC,SAAS;AACxD;AAEA,SAAS,sCAAsC,WAAoB;AACjE,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,CAAC,mCAAmC,SAAS,EACrD,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,MACX,eAAY;AAAA,MAEZ;AAAA,wBAAAD,MAAC,UAAK,WAAU,wCAAuC;AAAA,QACvD,gBAAAA,MAAC,UAAK,WAAU,oFAAmF;AAAA,QACnG,gBAAAA,MAAC,UAAK,WAAU,qFAAoF;AAAA;AAAA;AAAA,EACtG;AAEJ;AAEO,SAAS,kCACd,SACA,WACA;AACA,MAAI,QAAQ,SAAS,SAAS;AAC5B,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,QACF,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,QACX,eAAY;AAAA,QAEZ,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACC,KAAI;AAAA,YACJ,WAAU;AAAA,YACV,WAAW;AAAA,YACX,KAAK,QAAQ;AAAA;AAAA,QACf;AAAA;AAAA,IACF;AAAA,EAEJ;AAEA,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,wCAAwC;AAAA,EAC/C;AAAA,EACA;AACF,GAGG;AACD,QAAM,YAAYG,QAA+B,IAAI;AACrD,QAAM,CAAC,cAAc,eAAe,IAAIC,UAAwB,IAAI;AAEpE,EAAAG,iBAAgB,MAAM;AACpB,QAAI,iBAAiB,MAAM;AACzB;AAAA,IACF;AACA,oBAAgB,UAAU,SAAS,aAAa,EAAE;AAAA,EACpD,GAAG,CAAC,YAAY,CAAC;AAEjB,SACE,gBAAAP;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,MACF,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,MACX,eAAY;AAAA,MAEX,2BAAiB,OAChB,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,KAAK;AAAA,UACL,WAAU;AAAA,UAET,kBAAQ;AAAA;AAAA,MACX,IAEA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,yBAAyB,EAAE,QAAQ,aAAa;AAAA;AAAA,MAClD;AAAA;AAAA,EAEJ;AAEJ;AAEA,SAAS,8BACP,MACQ;AACR,SAAO,GAAG,KAAK,EAAE,IAAI,KAAK,qBAAqB,SAAS;AAC1D;AAEA,SAAS,uBAAuB,OAAwC;AACtE,SACE,QAAQ,MAAM,OAAO,QAAQ,KAAK,CAAC,MAClC,MAAM,cAAc,UAAU,KAAK;AAExC;AAEA,SAAS,wBACP,OACA,eACS;AACT,MAAI,cAAc,aAAa,SAAS,KAAK,MAAM,eAAe;AAChE,WAAO;AAAA,EACT;AACA,SAAO,MAAM,kBAAkB;AACjC;AAEA,SAAS,qCAAqC;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,QAAM,aAAa,MAAM,OAAO,CAAC,SAAS;AACxC,QAAI,KAAK,gBAAgB,gBAAgB,iBAAiB,IAAI,KAAK,EAAE,GAAG;AACtE,aAAO;AAAA,IACT;AACA,WACE,gBAAgB,IAAI,KAAK,KAAK,MAAM,GAAG,QAAQ,mBAAmB;AAAA,EAEtE,CAAC;AACD,SACE,WAAW,KAAK,CAAC,SAAS,KAAK,OAAO,aAAa,KACnD,WAAW,CAAC,KACZ;AAEJ;AAEA,SAAS,uBACP,KACA,OACqC;AACrC,SAAO,EAAE,KAAK,OAAO,MAAM,KAAK,EAAE;AACpC;AAEA,SAAS,kCAAkC;AAAA,EACzC;AAAA,EACA;AACF,GAQE;AACA,QAAM,WAAW,YAAY,sBAAsB;AACnD,MAAI,kBAAkB,QAAQ;AAC5B,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,MAAM,SAAS;AAAA,MACf,KAAK,SAAS,OAAO,SAAS,SAAS,uBAAuB;AAAA,MAC9D,OAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,MAAM,SAAS,QAAQ,SAAS,QAAQ,uBAAuB;AAAA,IAC/D,KAAK,SAAS,SAAS;AAAA,IACvB,OAAO;AAAA,EACT;AACF;AAEA,SAAS,gBACP,OACA,kBACA;AACA,QAAM,QACJ,MAAM,UACL,mBAAmB,IACf;AAAA,IACC,MAAM;AAAA,IACN,OAAO;AAAA,EACT,IACA;AACN,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AACA,MAAI,MAAM,SAAS,SAAS;AAC1B,WAAO,gBAAAA,MAAC,UAAK,WAAU,6BAA6B,gBAAM,OAAM;AAAA,EAClE;AACA,MAAI,MAAM,SAAS,UAAU;AAC3B,WAAO,gBAAAA,MAAC,UAAK,WAAU,8BAA8B,gBAAM,SAAQ;AAAA,EACrE;AACA,SACE,gBAAAA,MAAC,UAAK,WAAU,8BAA6B,eAAa,MAAM,QAAQ;AAE5E;AAEA,SAAS,8BAA8B;AAAA,EACrC;AAAA,EACA;AACF,GAGG;AACD,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,uBAAqB;AAAA,MACrB,MAAK;AAAA,MACL,OACE;AAAA,QACE,8CAA8C,GAAG,MAAM,WAAW,MAAM;AAAA,QACxE,4CAA4C,GAAG,MAAM,WAAW,IAAI;AAAA,QACpE,2CAA2C,GAAG,MAAM,WAAW,GAAG;AAAA,QAClE,6CAA6C,GAAG,MAAM,WAAW,KAAK;AAAA,MACxE;AAAA,MAGD,gBAAM;AAAA;AAAA,EACT;AAEJ;AAEA,SAAS,4BAA4B;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAiBG;AACD,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,WAAU;AAAA,MACV,uBAAqB;AAAA,MACrB,MAAK;AAAA,MACL,cAAY,MAAM;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,OACE;AAAA,QACE,4CAA4C,GAAG,MAAM,WAAW,MAAM;AAAA,QACtE,0CAA0C,GAAG,MAAM,WAAW,IAAI;AAAA,QAClE,yCAAyC,GAAG,MAAM,WAAW,GAAG;AAAA,QAChE,2CAA2C,GAAG,MAAM,WAAW,KAAK;AAAA,MACtE;AAAA,MAGF;AAAA,wBAAAD,MAAC,SAAI,WAAU,mCAAmC,gBAAM,OAAM;AAAA,QAC7D,MAAM,OAAO,SACZ,gBAAAA,MAAC,SAAI,WAAU,yCACZ,kDAAwC,MAAM,MAAM,MAAM,GAC7D,IACE;AAAA,QACH,MAAM,cAAc,SACnB,gBAAAA,MAAC,SAAI,WAAU,+BACZ,gBAAM,aAAa,IAAI,CAAC,WAAW;AAClC,gBAAM,YAAY,cAAc,MAAM,IAAI,OAAO,EAAE;AACnD,gBAAM,mBAAmB,kBAAkB,IAAI,SAAS;AACxD,gBAAM,YACJ,oBACC,OAAO,aAAa,QAAQ,OAAO,iBAAiB;AACvD,iBACE,gBAAAA;AAAA,YAACc;AAAA,YAAA;AAAA,cAEC,aAAW,YAAY,OAAO;AAAA,cAC9B,WAAU;AAAA,cACV,UAAU,OAAO,YAAY;AAAA,cAC7B,MAAK;AAAA,cACL,SAAS,CAAC,UAAU;AAClB,sBAAM,eAAe;AACrB,sBAAM,gBAAgB;AACtB,oBACE,OAAO,aAAa,QACpB,kBAAkB,IAAI,SAAS,GAC/B;AACA;AAAA,gBACF;AACA,qCAAqB,CAAC,YAAY;AAChC,wBAAM,OAAO,IAAI,IAAI,OAAO;AAC5B,uBAAK,IAAI,SAAS;AAClB,yBAAO;AAAA,gBACT,CAAC;AACD,sBAAM,YAAY;AAChB,sBAAI;AACF,0BAAM,oBAAoB;AAAA,sBACxB,UAAU,OAAO;AAAA,sBACjB,SAAS,MAAM;AAAA,sBACf;AAAA,oBACF,CAAC;AAAA,kBACH,QAAQ;AAAA,kBAER,UAAE;AACA,yCAAqB,CAAC,YAAY;AAChC,0BAAI,CAAC,QAAQ,IAAI,SAAS,GAAG;AAC3B,+BAAO;AAAA,sBACT;AACA,4BAAM,OAAO,IAAI,IAAI,OAAO;AAC5B,2BAAK,OAAO,SAAS;AACrB,6BAAO;AAAA,oBACT,CAAC;AAAA,kBACH;AAAA,gBACF,GAAG;AAAA,cACL;AAAA,cAEC,sBACI,OAAO,gBAAgB,OAAO,QAC/B,OAAO;AAAA;AAAA,YA3CN,OAAO;AAAA,UA4Cd;AAAA,QAEJ,CAAC,GACH,IACE;AAAA;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,6BACP,OACA,iBACuD;AACvD,SACE,MAAM,gBAAgB,gBAAgB,IAAI,MAAM,MAAM,GAAG,UAAU;AAEvE;AAEA,SAAS,mBACP,OACA,cACS;AACT,QAAM,YAAY,MAAM,OAAO,QAAQ;AACvC,SACE,iBAAiB,YAChB,MAAM,kBAAkB,eAAe,aACxC,cAAc,cACd,cAAc,aACd,cAAc;AAElB;AAEA,SAAS,wBACP,OACQ;AACR,SAAO,MAAM;AACf;AAEA,SAAS,gBACP,SACe;AACf,SAAO,SAAS,YAAY;AAC9B;AAEA,SAAS,sBACP,OACA,kBACA,SACM;AACN,MAAI,CAAC,kBAAkB,KAAK;AAC1B;AAAA,EACF;AACA,OAAK,QAAQ;AAAA,IACX,iBAAiB,IAAI;AAAA,MACnB;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,aACE,OAAO,QAAQ,gBAAgB,WAAW,QAAQ,cAAc;AAAA,IACpE,CAAC;AAAA,EACH,EAAE,MAAM,MAAM,MAAS;AACzB;AAEA,SAAS,uBACP,MACuC;AACvC,SAAO,KAAK,SAAS,UAAU,KAAK,QAAQ,CAAC,KAAK,IAAI;AACxD;AAEA,SAAS,2BACP,aACA,MAC8B;AAC9B,SAAO;AAAA,IACL,YAAY,KAAK,KAAK;AAAA,IACtB,aAAa,KAAK,KAAK,eAAe;AAAA,IACtC,QAAQ,KAAK;AAAA,IACb,QAAQ,KAAK,KAAK;AAAA,IAClB;AAAA,EACF;AACF;AAEA,SAAS,cAAc,SAAiB,UAA0B;AAChE,SAAO,GAAG,OAAO,IAAI,QAAQ;AAC/B;AAEA,SAAS,6BAA6B;AAAA,EACpC;AAAA,EACA;AACF,GAG4B;AAC1B,QAAM,QAAiC,CAAC;AAExC,aAAW,iBAAiB,iBAAiB;AAC3C,QAAI,cAAc,oBAAoB;AACpC,YAAM,KAAK;AAAA,QACT,KAAK,oBAAoB,cAAc,MAAM,EAAE;AAAA,QAC/C,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AACA,UAAM,KAAK;AAAA,MACT,KAAK,SAAS,cAAc,MAAM,EAAE;AAAA,MACpC,MAAM;AAAA,MACN;AAAA,IACF,CAAC;AACD,QAAI,cAAc,MAAM,gBAAgB;AACtC,YAAM,KAAK;AAAA,QACT,KAAK,mBAAmB,cAAc,MAAM,EAAE;AAAA,QAC9C,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,mBAAmB,SAAS,KAAK,gBAAgB,SAAS,GAAG;AAC/D,UAAM,KAAK;AAAA,MACT,KAAK;AAAA,MACL,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAEA,aAAW,QAAQ,oBAAoB;AACrC,UAAM,KAAK;AAAA,MACT,KAAK,aAAa,KAAK,SAAS;AAAA,MAChC,MAAM;AAAA,MACN;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,+BACP,MACe;AACf,MAAI,KAAK,SAAS,eAAe,KAAK,KAAK,SAAS,QAAQ;AAC1D,WAAO;AAAA,EACT;AACA,SAAO,KAAK,KAAK,KAAK;AACxB;AAEA,SAAS,4BACP,MACA,aACA,kBACA,iCAC2B;AAC3B,MAAI,CAAC,aAAa;AAChB,WAAO;AAAA,EACT;AAEA,MAAI,KAAK,QAAQ,uBAAuB;AACtC,WAAO;AAAA,EACT;AAEA,MAAI,KAAK,SAAS,aAAa;AAC7B,UAAM,SAAS,+BAA+B,IAAI;AAClD,QAAI,UAAU,gCAAgC,MAAM,GAAG;AACrD,UAAI,qBAAqB,WAAW;AAClC,eAAO;AAAA,MACT;AACA,aAAO,oBAAoB;AAAA,IAC7B;AACA,WAAO;AAAA,EACT;AAEA,MAAI,qBAAqB,WAAW;AAClC,WAAO;AAAA,EACT;AAEA,SAAO,oBAAoB;AAC7B;AAEA,SAAS,yBAAyB,OAKC;AACjC,QAAM,eAAe,IAAI,IAAI,MAAM,QAAQ,IAAI,CAAC,SAAS,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC;AAC1E,QAAM,oBAAoB,IAAI;AAAA,IAC5B,MAAM,QAAQ,IAAI,CAAC,MAAM,UAAU,CAAC,KAAK,KAAK,KAAK,CAAC;AAAA,EACtD;AACA,QAAM,YAAY,IAAI;AAAA,IACpB,MAAM,gBAAgB,IAAI,CAAC,SAAS,CAAC,KAAK,KAAK,IAAI,CAAC;AAAA,EACtD;AACA,QAAM,WAAW,IAAI,IAAI,MAAM,gBAAgB,IAAI,CAAC,SAAS,KAAK,GAAG,CAAC;AACtE,QAAM,0BAA0B,MAAM,QAAQ;AAAA,IAC5C,CAAC,SAAS,KAAK,aAAa;AAAA,EAC9B,EAAE;AACF,QAAM,2BACJ,MAAM,gBAAgB,SAAS;AACjC,QAAM,cAAc,oBAAI,IAAY;AACpC,QAAM,YAA4C,CAAC;AACnD,MAAI,eAAe;AAEnB,QAAM,mBAAmB,CAAC,qBAA6B;AACrD,WAAO,eAAe,kBAAkB;AACtC,YAAM,cAAc,MAAM,QAAQ,YAAY;AAC9C,sBAAgB;AAChB,UACE,4BACA,eACA,CAAC,SAAS,IAAI,YAAY,GAAG,KAC7B,CAAC,YAAY,IAAI,YAAY,GAAG,GAChC;AACA,oBAAY,IAAI,YAAY,GAAG;AAC/B,kBAAU,KAAK;AAAA,UACb,GAAG;AAAA,UACH,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,aAAW,QAAQ,MAAM,iBAAiB;AACxC,UAAM,gBAAgB,kBAAkB,IAAI,KAAK,GAAG;AACpD,QAAI,kBAAkB,QAAW;AAC/B,uBAAiB,aAAa;AAC9B,qBAAe,KAAK,IAAI,cAAc,gBAAgB,CAAC;AAAA,IACzD;AACA,gBAAY,IAAI,KAAK,GAAG;AACxB,cAAU,KAAK;AAAA,MACb;AAAA,MACA,KAAK,KAAK;AAAA,MACV,UAAU;AAAA,QACR;AAAA,QACA,MAAM;AAAA,QACN,aAAa,IAAI,KAAK,GAAG,GAAG;AAAA,QAC5B,MAAM;AAAA,MACR;AAAA,IACF,CAAC;AAAA,EACH;AAEA,aAAW,eAAe,MAAM,SAAS;AACvC,QAAI,4BAA4B,CAAC,SAAS,IAAI,YAAY,GAAG,GAAG;AAC9D,UAAI,YAAY,IAAI,YAAY,GAAG,GAAG;AACpC;AAAA,MACF;AACA,kBAAY,IAAI,YAAY,GAAG;AAC/B,gBAAU,KAAK;AAAA,QACb,GAAG;AAAA,QACH,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO,UAAU;AAAA,IACf,CAAC,SAAS,UAAU,IAAI,KAAK,GAAG,KAAK,KAAK,aAAa;AAAA,EACzD;AACF;AAEA,SAAS,4BACP,OACQ;AACR,MACE,MAAM;AAAA,IACJ,CAAC,SACC,KAAK,KAAK,SAAS,gBAClB,KAAK,aAAa,cAAc,KAAK,aAAa;AAAA,EACvD,GACA;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,qBACP,OACA,iCACgC;AAChC,QAAM,mBAAmBX,QAAO,oBAAI,IAAmC,CAAC;AACxE,QAAM,qCAAqCA;AAAA,IACzC;AAAA,EACF;AACA,mBAAiB,UAAU,IAAI,IAAI,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC;AACxE,qCAAmC,UAAU;AAC7C,QAAM,WAAW,MAAM,IAAI,CAAC,SAAS,KAAK,GAAG,EAAE,KAAK,IAAQ;AAC5D,QAAM,CAAC,cAAc,eAAe,IAAIC;AAAA,IAEtC,MACA,MAAM,IAAI,CAAC,UAAU;AAAA,MACnB;AAAA,MACA,KAAK,KAAK;AAAA,MACV,UAAU;AAAA,IACZ,EAAE;AAAA,EACJ;AACA,QAAM,cAAcD,QAAO,KAAK;AAEhC,EAAAG,WAAU,MAAM;AACd,QAAI,eAAe;AAEnB,oBAAgB,CAAC,YAAY;AAC3B,YAAM,gBAAgB,yBAAyB;AAAA,QAC7C;AAAA,QACA,aAAa,YAAY;AAAA,QACzB,iBAAiB,CAAC,GAAG,iBAAiB,QAAQ,OAAO,CAAC;AAAA,QACtD,iCACE,mCAAmC;AAAA,MACvC,CAAC;AACD,qBAAe,4BAA4B,aAAa;AACxD,aAAO;AAAA,IACT,CAAC;AACD,gBAAY,UAAU;AAEtB,UAAM,UAAU,WAAW,WAAW,MAAM;AAC1C;AAAA,QAAgB,CAAC,YACf,QACG,OAAO,CAAC,SAAS,KAAK,aAAa,SAAS,EAC5C;AAAA,UAAI,CAAC,SACJ,KAAK,aAAa,aACd,EAAE,GAAG,MAAM,UAAU,UAAmB,IACxC;AAAA,QACN;AAAA,MACJ;AAAA,IACF,GAAG,YAAY;AAEf,WAAO,MAAM,WAAW,aAAa,OAAO;AAAA,EAC9C,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,uBAAuB,yBAAyB;AAAA,IACpD,SAAS;AAAA,IACT,aAAa,YAAY;AAAA,IACzB,iBAAiB,CAAC,GAAG,iBAAiB,QAAQ,OAAO,CAAC;AAAA,IACtD;AAAA,EACF,CAAC;AAED,SAAO,qBAAqB,IAAI,CAAC,gBAAgB;AAC/C,UAAM,aAAa,iBAAiB,QAAQ,IAAI,YAAY,GAAG;AAC/D,WAAO,aAAa,EAAE,GAAG,aAAa,MAAM,WAAW,IAAI;AAAA,EAC7D,CAAC;AACH;AAEA,SAAS,sBAAsB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AACF,GAIoD;AAClD,QAAM,CAAC,OAAO,QAAQ,IAAIF;AAAA,IACxB,MAAM,oBAAI,IAAI;AAAA,EAChB;AAEA,EAAAG,iBAAgB,MAAM;AACpB,QAAI,OAAO,WAAW,aAAa;AACjC,aAAO;AAAA,IACT;AAEA,QAAI,WAAW;AACf,QAAI,UAAyB;AAE7B,UAAM,cAAc,MAAM;AACxB,gBAAU;AACV,WAAK,0BAA0B;AAAA,QAC7B,kBAAkB,aAAa;AAAA,QAC/B,UAAU,YAAY;AAAA,MACxB,CAAC,EAAE,KAAK,CAAC,cAAc;AACrB,YAAI,UAAU;AACZ;AAAA,QACF;AACA;AAAA,UAAS,CAAC,YACR,2BAA2B,SAAS,SAAS,IAAI,UAAU;AAAA,QAC7D;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM,iBAAiB,MAAM;AAC3B,UAAI,YAAY,MAAM;AACpB;AAAA,MACF;AACA,gBAAU,OAAO,sBAAsB,WAAW;AAAA,IACpD;AAEA,mBAAe;AACf,WAAO,iBAAiB,UAAU,cAAc;AAEhD,UAAM,iBACJ,OAAO,mBAAmB,cACtB,OACA,IAAI,eAAe,cAAc;AACvC,QAAI,aAAa,SAAS;AACxB,sBAAgB,QAAQ,aAAa,OAAO;AAAA,IAC9C;AACA,UAAM,mBAAmB,aAAa,SAClC,QAAQ,oBAAoB,GAC5B,cAAc,+BAA+B;AACjD,QAAI,4BAA4B,aAAa;AAC3C,sBAAgB,QAAQ,gBAAgB;AAAA,IAC1C;AAEA,WAAO,MAAM;AACX,iBAAW;AACX,UAAI,YAAY,MAAM;AACpB,eAAO,qBAAqB,OAAO;AAAA,MACrC;AACA,sBAAgB,WAAW;AAC3B,aAAO,oBAAoB,UAAU,cAAc;AAAA,IACrD;AAAA,EACF,GAAG,CAAC,cAAc,aAAa,QAAQ,CAAC;AAExC,SAAO;AACT;AAEA,eAAe,0BAA0B;AAAA,EACvC;AAAA,EACA;AACF,GAGqD;AACnD,QAAM,mBAAmB,kBACrB,QAAQ,oBAAoB,GAC5B,cAAc,+BAA+B;AACjD,MAAI,EAAE,4BAA4B,cAAc;AAC9C,WAAO,oBAAI,IAAI;AAAA,EACjB;AAEA,QAAM,iBAAiB,OAAO,iBAAiB,gBAAgB;AAC/D,QAAM,eAAe,yBAAyB,eAAe,eAAe;AAC5E,MAAI,CAAC,cAAc;AACjB,WAAO,oBAAI,IAAI;AAAA,EACjB;AAEA,QAAM,iBAAiB,MAAM,uBAAuB,YAAY;AAChE,MAAI,CAAC,gBAAgB;AACnB,WAAO,oBAAI,IAAI;AAAA,EACjB;AAEA,QAAM,eAAe,gCAAgC,cAAc;AACnE,MAAI,CAAC,cAAc;AACjB,WAAO,oBAAI,IAAI;AAAA,EACjB;AAEA,QAAM,gBAAgB,iBAAiB,sBAAsB;AAC7D,QAAM,oBAAoB,sCAAsC;AAAA,IAC9D,iBAAiB,cAAc;AAAA,IAC/B,gBAAgB,cAAc;AAAA,IAC9B,aAAa,eAAe;AAAA,IAC5B,YAAY,eAAe;AAAA,IAC3B,WAAW,eAAe;AAAA,IAC1B,WAAW,eAAe;AAAA,IAC1B,MAAM,eAAe;AAAA,EACvB,CAAC;AACD,QAAM,YAAY,oBAAI,IAAwC;AAE9D,aAAW,CAAC,KAAK,OAAO,KAAK,UAAU;AACrC,UAAM,YAAY,sCAAsC;AAAA,MACtD,aAAa,QAAQ,sBAAsB;AAAA,MAC3C;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AACD,QAAI,cAAc,MAAM;AACtB;AAAA,IACF;AACA,cAAU;AAAA,MACR;AAAA,MACA,YAAY,sCAAsC,SAAS;AAAA,IAC7D;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,yBAAyB,iBAAwC;AACxE,QAAM,QAAQ,0BAA0B,KAAK,gBAAgB,KAAK,CAAC;AACnE,SAAO,QAAQ,CAAC,IAAI,MAAM,CAAC,IAAI;AACjC;AAEA,IAAM,0BAA0B,oBAAI,IAGlC;AAEF,SAAS,uBAAuB,KAA+C;AAC7E,QAAM,SAAS,wBAAwB,IAAI,GAAG;AAC9C,MAAI,QAAQ;AACV,WAAO;AAAA,EACT;AACA,QAAM,UAAU,IAAI,QAAiC,CAAC,YAAY;AAChE,UAAM,QAAQ,IAAI,MAAM;AACxB,UAAM,WAAW;AACjB,UAAM,SAAS,MAAM,QAAQ,KAAK;AAClC,UAAM,UAAU,MAAM,QAAQ,IAAI;AAClC,UAAM,MAAM;AAAA,EACd,CAAC;AACD,0BAAwB,IAAI,KAAK,OAAO;AACxC,SAAO;AACT;AAEA,SAAS,gCACP,OAC0B;AAC1B,MAAI,MAAM,gBAAgB,KAAK,MAAM,iBAAiB,GAAG;AACvD,WAAO;AAAA,EACT;AACA,QAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,QAAM,QACJ,qCACA,KAAK,IAAI,MAAM,cAAc,MAAM,aAAa;AAClD,SAAO,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM,eAAe,KAAK,CAAC;AACjE,SAAO,SAAS,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM,gBAAgB,KAAK,CAAC;AACnE,QAAM,UAAU,OAAO,WAAW,MAAM,EAAE,oBAAoB,KAAK,CAAC;AACpE,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AACA,MAAI;AACF,YAAQ,UAAU,OAAO,GAAG,GAAG,OAAO,OAAO,OAAO,MAAM;AAC1D,YAAQ,aAAa,GAAG,GAAG,GAAG,CAAC;AAAA,EACjC,QAAQ;AACN,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,sCAAsC;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAQiE;AAC/D,QAAM,cAAc,aAAa;AACjC,QAAM,kBAAkB,iBAAiB;AACzC,MAAI,QAAQ;AACZ,MAAI,SAAS;AAEb,MAAI,SAAS,SAAS;AACpB,QAAI,kBAAkB,aAAa;AACjC,eAAS,iBAAiB;AAAA,IAC5B,OAAO;AACL,cAAQ,kBAAkB;AAAA,IAC5B;AAAA,EACF,WAAW,SAAS,WAAW;AAC7B,QAAI,kBAAkB,aAAa;AACjC,cAAQ,kBAAkB;AAAA,IAC5B,OAAO;AACL,eAAS,iBAAiB;AAAA,IAC5B;AAAA,EACF,WAAW,SAAS,aAAa;AAC/B,YAAQ;AACR,aAAS;AAAA,EACX;AAEA,SAAO;AAAA,IACL;AAAA,IACA,MAAM,mCAAmC,WAAW,iBAAiB,KAAK;AAAA,IAC1E,KAAK;AAAA,MACH;AAAA,MACA,kBAAkB;AAAA,IACpB;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,mCACP,OACA,gBACQ;AACR,QAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,QAAQ,SAAS,GAAG,GAAG;AACzB,UAAM,aAAa,OAAO,WAAW,OAAO;AAC5C,WAAO,OAAO,SAAS,UAAU,IAC5B,iBAAiB,aAAc,MAChC,iBAAiB;AAAA,EACvB;AACA,MAAI,QAAQ,SAAS,IAAI,GAAG;AAC1B,UAAM,KAAK,OAAO,WAAW,OAAO;AACpC,WAAO,OAAO,SAAS,EAAE,IAAI,KAAK,iBAAiB;AAAA,EACrD;AACA,MAAI,YAAY,UAAU,YAAY,OAAO;AAC3C,WAAO;AAAA,EACT;AACA,MAAI,YAAY,WAAW,YAAY,UAAU;AAC/C,WAAO;AAAA,EACT;AACA,SAAO,iBAAiB;AAC1B;AAEA,SAAS,sCAAsC;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAUkB;AAChB,QAAM,UAAU,aAAa,WAAW,MAAM,EAAE,oBAAoB,KAAK,CAAC;AAC1E,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AACA,QAAM,oBAAoB,YAAY,UAAU,YAAY;AAC5D,MAAI,eAAe;AACnB,MAAI,UAAU;AAEd,WAAS,QAAQ,GAAG,QAAQ,8BAA8B,SAAS,GAAG;AACpE,UAAM,QAAQ,SAAS,+BAA+B;AACtD,UAAM,UAAU,oBACZ,YAAY,OAAO,YAAY,QAAQ,IACvC,YAAY,OAAO,YAAY,QAAQ;AAC3C,UAAM,UAAU,oBACZ,YAAY,MAAM,YAAY,SAAS,QACvC,YAAY,MAAM,YAAY,SAAS;AAC3C,UAAM,UACH,UAAU,cAAc,OAAO,kBAAkB,QAClD,kBAAkB;AACpB,UAAM,UACH,UAAU,cAAc,MAAM,kBAAkB,OACjD,kBAAkB;AACpB,QAAI,SAAS,KAAK,SAAS,KAAK,SAAS,KAAK,SAAS,GAAG;AACxD;AAAA,IACF;AACA,UAAM,UAAU,KAAK;AAAA,MACnB,aAAa,QAAQ;AAAA,MACrB,KAAK,IAAI,GAAG,KAAK,MAAM,UAAU,aAAa,QAAQ,EAAE,CAAC;AAAA,IAC3D;AACA,UAAM,UAAU,KAAK;AAAA,MACnB,aAAa,SAAS;AAAA,MACtB,KAAK,IAAI,GAAG,KAAK,MAAM,UAAU,aAAa,SAAS,EAAE,CAAC;AAAA,IAC5D;AACA,UAAM,QAAQ,QAAQ,aAAa,SAAS,SAAS,GAAG,CAAC,EAAE;AAC3D,UAAM,MAAM,MAAM,CAAC,KAAK;AACxB,UAAM,QAAQ,MAAM,CAAC,KAAK;AAC1B,UAAM,OAAO,MAAM,CAAC,KAAK;AACzB,oBAAgB,SAAS,MAAM,SAAS,QAAQ,SAAS;AACzD,eAAW;AAAA,EACb;AAEA,SAAO,UAAU,IAAI,eAAe,UAAU;AAChD;AAEA,SAAS,2BACP,MACA,OACS;AACT,MAAI,KAAK,SAAS,MAAM,MAAM;AAC5B,WAAO;AAAA,EACT;AACA,aAAW,CAAC,KAAK,KAAK,KAAK,MAAM;AAC/B,QAAI,MAAM,IAAI,GAAG,MAAM,OAAO;AAC5B,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,IAAM,iBAAiB;AACvB,IAAM,+BAA+B;AAErC,SAAS,cAAc,UAA+C;AACpE,QAAM,cAAcJ,QAAO,oBAAI,IAA2C,CAAC;AAE3E,QAAM,kBAAkBE;AAAA,IACtB,CAAC,cAA+B;AAC9B,YAAM,UAAU,YAAY,QAAQ,IAAI,SAAS;AACjD,YAAM,cAAc,SAAS,QAAQ,IAAI,SAAS;AAClD,YAAM,cAAc,aAAa,aAAa,eAAe,MAAM;AACnE,UAAI,SAAS;AACX,qBAAa,OAAO;AACpB,oBAAY,QAAQ,OAAO,SAAS;AAAA,MACtC;AACA,mBAAa,gBAAgB,eAAe;AAC5C,aAAO;AAAA,IACT;AAAA,IACA,CAAC,QAAQ;AAAA,EACX;AAEA,EAAAC;AAAA,IACE,MAAM,MAAM;AACV,iBAAW,aAAa,YAAY,QAAQ,KAAK,GAAG;AAClD,wBAAgB,SAAS;AAAA,MAC3B;AACA,kBAAY,QAAQ,MAAM;AAAA,IAC5B;AAAA,IACA,CAAC,eAAe;AAAA,EAClB;AAEA,QAAM,oBAAoBD;AAAA,IACxB,CAAC,cAAsB;AACrB,YAAM,yBAAyB,gBAAgB,SAAS;AAExD,YAAM,cAAc,SAAS,QAAQ,IAAI,SAAS;AAClD,UAAI,CAAC,aAAa;AAChB;AAAA,MACF;AAEA,UAAI,wBAAwB;AAE1B,aAAK,YAAY;AAAA,MACnB;AACA,kBAAY,aAAa,iBAAiB,MAAM;AAChD,kBAAY,QAAQ;AAAA,QAClB;AAAA,QACA,WAAW,MAAM;AACf,0BAAgB,SAAS;AAAA,QAC3B,GAAG,cAAc;AAAA,MACnB;AAAA,IACF;AAAA,IACA,CAAC,iBAAiB,QAAQ;AAAA,EAC5B;AAEA,SAAO,EAAE,kBAAkB;AAC7B;AAEA,SAAS,mCACP,OACQ;AACR,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,MAAM;AAAA,IACtB,CAAC,KAAK,SACJ,OACC,KAAK,SAAS,cAAc,4BAA4B;AAAA,IAC3D;AAAA,EACF;AACA,QAAM,WAAW,KAAK,IAAI,GAAG,MAAM,SAAS,CAAC,IAAI;AACjD,SAAO,YAAY,WAAW;AAChC;AAEA,IAAM,4BAA4B;AAClC,IAAM,6BAA6B;AACnC,IAAM,0BAA0B;AAChC,IAAM,6BAA6B;AACnC,IAAM,uCAAuC;AAC7C,IAAM,qCAAqC;AAC3C,IAAM,+BAA+B;AACrC,IAAM,sCAAsC;AAE5C,SAAS,kBACP,MACA,SACA,SACA,SAAS,GACA;AACT,SACE,WAAW,KAAK,OAAO,UACvB,WAAW,KAAK,QAAQ,UACxB,WAAW,KAAK,MAAM,UACtB,WAAW,KAAK,SAAS;AAE7B;AAEA,SAAS,2BAA2B,QAAiB,OAAyB;AAC5E,MAAI,OAAO,SAAS,MAAM,QAAQ,MAAM,SAAS,OAAO,MAAM;AAC5D,UAAMU,QAAO,KAAK,IAAI,OAAO,OAAO,MAAM,KAAK;AAC/C,UAAMC,SAAQ,KAAK,IAAI,OAAO,MAAM,MAAM,IAAI;AAC9C,UAAMC,OAAM,KAAK,IAAI,OAAO,KAAK,MAAM,GAAG;AAC1C,UAAMC,UAAS,KAAK,IAAI,OAAO,QAAQ,MAAM,MAAM;AACnD,WAAO,IAAI,QAAQH,OAAME,MAAKD,SAAQD,OAAM,KAAK,IAAI,GAAGG,UAASD,IAAG,CAAC;AAAA,EACvE;AAEA,QAAM,OAAO,KAAK,IAAI,OAAO,MAAM,MAAM,IAAI;AAC7C,QAAM,QAAQ,KAAK,IAAI,OAAO,OAAO,MAAM,KAAK;AAChD,QAAM,MAAM,KAAK,IAAI,OAAO,QAAQ,MAAM,MAAM;AAChD,QAAM,SAAS,KAAK,IAAI,OAAO,KAAK,MAAM,GAAG;AAC7C,SAAO,IAAI,QAAQ,MAAM,KAAK,KAAK,IAAI,GAAG,QAAQ,IAAI,GAAG,SAAS,GAAG;AACvE;AACA,IAAM,0BAA0B;AAChC,IAAM,qCAAqC;AAC3C,IAAM,iBAAiB;AACvB,IAAM,+BAA+B;AACrC,IAAM,4BAA4B;AAClC,IAAM,kBAAkB;AACxB,IAAM,8BAA8B;;;AS1uH7B,SAAS,2CACd,SACA,QAEI,CAAC,GAC4C;AACjD,SAAO;AAAA,IACL,iBAAiB,QAAQ;AACvB,cAAQ,WAAW,SAAS,iBAAiB,QAAQ,KAAK,IAAI,MAAM;AAAA,IACtE;AAAA,IACA,QAAQ;AACN,UAAI,MAAM,kBAAkB;AAC1B,cAAM,iBAAiB,QAAQ,KAAK,EAAE;AACtC;AAAA,MACF;AACA,cAAQ,WAAW,SAAS,UAAU,QAAQ,KAAK,EAAE;AAAA,IACvD;AAAA,IACA,QAAQ;AACN,cAAQ,WAAW,SAAS,UAAU,QAAQ,KAAK,EAAE;AAAA,IACvD;AAAA,IACA,WAAW;AACT,cAAQ,MAAM;AAAA,QAAqB,QAAQ,KAAK;AAAA,QAAI,MAClD,QAAQ,WAAW,SAAS,aAAa,QAAQ,KAAK,EAAE;AAAA,MAC1D;AAAA,IACF;AAAA,IACA,OAAO,OAAO;AACZ,cAAQ,WAAW,SAAS,WAAW,QAAQ,KAAK,IAAI,KAAK;AAAA,IAC/D;AAAA,IACA,oBAAoB;AAClB,UAAI,QAAQ,KAAK,gBAAgB,cAAc;AAC7C,gBAAQ,WAAW,SAAS,eAAe,QAAQ,KAAK,EAAE;AAC1D;AAAA,MACF;AACA,cAAQ,WAAW,SAAS,gBAAgB,QAAQ,KAAK,EAAE;AAAA,IAC7D;AAAA,EACF;AACF;;;AC1BO,SAAS,mCAGd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAS8E;AAC5E,QAAM,gBAAgB,+BAA+B;AAAA,IACnD;AAAA,IACA,MAAM,QAAQ;AAAA,IACd;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL,YAAY,QAAQ,KAAK,KAAK,cAAc;AAAA,IAC5C,aAAa,QAAQ,KAAK;AAAA,IAC1B,mBAAmB,cAAc;AAAA,IACjC,wBACE,cAAc;AAAA,IAChB,QAAQ;AACN,WAAK,UAAU,QAAQ,KAAK,EAAE;AAAA,IAChC;AAAA,IACA;AAAA,IACA,YAAY,QAAQ,KAAK,KAAK;AAAA,IAC9B,aAAa,QAAQ,KAAK,KAAK,eAAe;AAAA,IAC9C,WACE,2BAA2B,KAAK,YAAY,CAAC,GAAG,OAAO,QAAQ,KAAK;AAAA,IACtE,MAAM,QAAQ;AAAA,IACd,oBAAoB,OAAO;AACzB,WAAK,oBAAoB,QAAQ,KAAK,IAAI,KAAK;AAAA,IACjD;AAAA,IACA,qBAAqB,OAAO;AAC1B,WAAK,qBAAqB,QAAQ,KAAK,IAAI,KAAK;AAAA,IAClD;AAAA,EACF;AACF;AAEO,SAAS,qCAGd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAYE;AACA,QAAM,gBAAgB,+BAA+B;AAAA,IACnD;AAAA,IACA,MAAM,QAAQ;AAAA,IACd;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL,YAAY,QAAQ,KAAK,KAAK,cAAc;AAAA,IAC5C,gBAAgB,QAAQ;AAAA,IACxB,aAAa,QAAQ,KAAK;AAAA,IAC1B,iBAAiB,QAAQ;AAAA,IACzB,mBAAmB,cAAc;AAAA,IACjC,wBACE,cAAc;AAAA,IAChB,YAAY,QAAQ,KAAK,KAAK;AAAA,IAC9B,aAAa,QAAQ,KAAK,KAAK,eAAe;AAAA,IAC9C,WACE,2BAA2B,KAAK,YAAY,CAAC,GAAG,OAAO,QAAQ,KAAK;AAAA,IACtE,MAAM,QAAQ;AAAA,IACd,aAAa,QAAQ;AAAA,IACrB,eAAe,2CAA2C,SAAS;AAAA,MACjE,kBAAkB,CAAC,WAAW,KAAK,iBAAiB,MAAM;AAAA,IAC5D,CAAC;AAAA,EACH;AACF;;;AC7GA,SAAS,UAAAE,SAAQ,aAAAC,YAAW,gBAAAC,qBAAoB;AA6B5C,qBAAAC,WAeM,OAAAC,OAfN,QAAAC,aAAA;AApBG,SAAS,2BAA2B;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,QAAM,aAAa,gBAAgB,IAAI,QAAQ,KAAK,KAAK,MAAM;AAC/D,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,WAAW,QAAQ,gBAAgB;AACvD,QAAM,WAAW,WAAW,QAAQ,aAAa;AAEjD,SACE,gBAAAA,MAAAF,WAAA,EACG;AAAA,kBACC,gBAAAC;AAAA,MAACJ;AAAA,MAAA;AAAA,QACC,cAAY,KAAK,EAAE,kBAAkB;AAAA,QACrC,WAAU;AAAA,QACV,yBAAsB;AAAA,QACtB,MAAK;AAAA,QACL,MAAK;AAAA,QACL,SAAQ;AAAA,QACR,SAAS,MAAM;AACb,kBAAQ,MAAM;AAAA,YAAqB,QAAQ,KAAK;AAAA,YAAI,MAClD,QAAQ,WAAW,SAAS,aAAa,QAAQ,KAAK,EAAE;AAAA,UAC1D;AAAA,QACF;AAAA,QAEA,0BAAAI,MAACF,eAAA,EAAa,WAAU,YAAW;AAAA;AAAA,IACrC,IACE;AAAA,IACH,WACC,gBAAAE;AAAA,MAACJ;AAAA,MAAA;AAAA,QACC,cAAY,KAAK,EAAE,eAAe;AAAA,QAClC,WAAU;AAAA,QACV,yBAAsB;AAAA,QACtB,MAAK;AAAA,QACL,MAAK;AAAA,QACL,SAAQ;AAAA,QACR,SAAS,MAAM;AACb,eAAK,iBAAiB,QAAQ,KAAK,EAAE;AAAA,QACvC;AAAA,QAEA,0BAAAI,MAACH,YAAA,EAAU,WAAU,YAAW;AAAA;AAAA,IAClC,IACE;AAAA,KACN;AAEJ;;;AZUY,gBAAAK,OAkfJ,QAAAC,aAlfI;AAlCL,SAAS,iCAAiC,OAmB9C;AACD,QAAM,qBAAqBC,SAAQ,MAAM;AACvC,UAAM,eAAe,MAAM;AAC3B,WAAO,eACH,MACE,gBAAAF;AAAA,MAAC;AAAA;AAAA,QACC,kBAAkB,MAAM;AAAA,QACxB,SAAS;AAAA,UACP,YAAY;AAAA,QACd;AAAA,QACA,OAAM;AAAA,QACN,cAAa;AAAA,QACb,UAAU,GAAG,MAAM,WAAW;AAAA,QAC9B,aAAa,MAAM;AAAA,QAEnB,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAS,MAAM;AAAA,YACf;AAAA;AAAA,QACF;AAAA;AAAA,IACF,IAEF;AAAA,EACN,GAAG;AAAA,IACD,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,EACR,CAAC;AACD,QAAM,kBAAkBE,SAAQ,MAAM;AACpC,UAAM,eAAe,MAAM;AAC3B,WAAO,eACH,MACE,gBAAAF;AAAA,MAAC;AAAA;AAAA,QACC,kBAAkB,MAAM;AAAA,QACxB,SAAS;AAAA,UACP,YAAY;AAAA,QACd;AAAA,QACA,OAAM;AAAA,QACN,cAAa;AAAA,QACb,UAAU,GAAG,MAAM,WAAW;AAAA,QAC9B,aAAa,MAAM;AAAA,QAEnB,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAS,MAAM;AAAA,YACf;AAAA;AAAA,QACF;AAAA;AAAA,IACF,IAEF;AAAA,EACN,GAAG;AAAA,IACD,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,EACR,CAAC;AAED,QAAM,0BAA0BG;AAAA,IAC9B,OAAO,SAA+C;AACpD,YAAM,aAAa,MAAM,qBAAqB,IAAI,KAAK,KAAK,MAAM;AAClE,YAAM,gBAAgB,YAAY,QAAQ;AAC1C,YAAM,iBACJ,eAAe,SAAS,aACpB,cAAc,iBACd;AACN,YAAM,WAAW,MAAM,YAAY,YAAY;AAC/C,YAAM,gBAAgB,+BAA+B;AAAA,QACnD,qBAAqB,MAAM;AAAA,QAC3B;AAAA,QACA,aAAa,MAAM;AAAA,MACrB,CAAC;AACD,YAAM,cACH,MAAM,QAAQ;AAAA,QACb,iBAAiB;AAAA,UACf,mBAAmB,cAAc;AAAA,UACjC,wBAAwB,cAAc;AAAA,UACtC,MAAM,MAAM;AAAA,UACZ,WAAW,SAAS,UAAU,GAAG,EAAE,MAAM,KAAK;AAAA,UAC9C,aAAa,KAAK;AAAA,UAClB;AAAA,QACF,CAAC,KAAK;AAAA,MACR,EAAE,MAAM,MAAM,IAAI,KACjB,MAAM,QAAQ;AAAA,QACb,MAAM,0BAA0B,IAAI,KAAK;AAAA,MAC3C,EAAE,MAAM,MAAM,IAAI;AACpB,aAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,EACF;AAEA,QAAM,aAAaA;AAAA,IACjB,CAAC,YACC,gBAAAH;AAAA,MAAC;AAAA;AAAA,QACC,kBAAkB,MAAM;AAAA,QACxB,SAAS;AAAA,UACP,gBAAgB,MAAM,YAAY;AAAA,UAClC,eAAe,MAAM,iBAAiB;AAAA,QACxC;AAAA,QACA,OAAM;AAAA,QACN,cAAa;AAAA,QACb,UAAU,GAAG,MAAM,WAAW;AAAA,QAC9B,aAAa,MAAM;AAAA,QAEnB,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA,kBAAkB,MAAM;AAAA,YACxB,aAAa,MAAM;AAAA,YACnB,eAAe,MAAM;AAAA,YACrB,kBAAkB,MAAM;AAAA,YACxB,iBAAiB,MAAM;AAAA,YACvB,qBAAqB,MAAM;AAAA,YAC3B,MAAM,MAAM;AAAA,YACZ,MAAM,MAAM;AAAA,YACZ,iBAAiB,MAAM;AAAA,YACvB,mBAAmB,MAAM;AAAA,YACzB,kBAAkB,MAAM;AAAA,YACxB,6BAA6B,MAAM;AAAA,YACnC,aAAa,MAAM;AAAA;AAAA,QACrB;AAAA;AAAA,IACF;AAAA,IAEF;AAAA,MACE;AAAA,MACA,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,EACF;AAEA,QAAM,aAAaG;AAAA,IACjB,CAAC,YAA+D;AAC9D,YAAM,aAAa,MAAM,qBAAqB;AAAA,QAC5C,QAAQ,KAAK,KAAK;AAAA,MACpB;AACA,UAAI,CAAC,YAAY;AACf,eAAO;AAAA,MACT;AAEA,YAAM,cAAc,mCAAmC;AAAA,QACrD;AAAA,QACA;AAAA,QACA,qBAAqB,MAAM;AAAA,QAC3B,MAAM,MAAM;AAAA,QACZ,aAAa,MAAM;AAAA,MACrB,CAAC;AAED,aACE,gBAAAH;AAAA,QAAC;AAAA;AAAA,UACC,kBAAkB,MAAM;AAAA,UACxB,MAAM,QAAQ;AAAA,UACd,UAAU,GAAG,QAAQ,KAAK,EAAE,IAAI,QAAQ,KAAK,KAAK,MAAM,IAAI,MAAM,qBAAqB;AAAA,UACvF,aAAa,MAAM;AAAA,UAEnB,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACC,SAAS;AAAA,cACT;AAAA;AAAA,UACF;AAAA;AAAA,MACF;AAAA,IAEJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,EACF;AAEA,QAAM,sBAAsBG;AAAA,IAC1B,CAAC,YACC,gBAAAH;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,MAAM,MAAM;AAAA,QACZ,MAAM,MAAM;AAAA,QACZ,iBAAiB,MAAM;AAAA;AAAA,IACzB;AAAA,IAEF,CAAC,MAAM,UAAU,MAAM,aAAa,MAAM,oBAAoB;AAAA,EAChE;AAEA,QAAM,qBAAqBG;AAAA,IACzB,CACE,YACG;AACH,YAAM,aAAa,MAAM,qBAAqB;AAAA,QAC5C,QAAQ,KAAK,KAAK;AAAA,MACpB;AACA,UAAI,CAAC,YAAY,cAAc;AAC7B,eAAO;AAAA,MACT;AAEA,aAAO,WAAW;AAAA,QAChB,qCAAqC;AAAA,UACnC;AAAA,UACA;AAAA,UACA,qBAAqB,MAAM;AAAA,UAC3B,MAAM,MAAM;AAAA,UACZ,aAAa,MAAM;AAAA,QACrB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,EACF;AAEA,QAAM,iCAAiCA;AAAA,IACrC,CAAC,SAA+C;AAC9C,YAAM,aAAa,MAAM,qBAAqB,IAAI,KAAK,KAAK,MAAM,GAC9D,QAAQ;AACZ,aAAO,OAAO,eAAe,aACzB,WAAW,IAAI,IACf,eAAe;AAAA,IACrB;AAAA,IACA,CAAC,MAAM,oBAAoB;AAAA,EAC7B;AAEA,QAAM,gCAAgCA;AAAA,IACpC,CAAC,SAA+C;AAC9C,YAAM,gBAAgB,MAAM,qBAAqB,IAAI,KAAK,KAAK,MAAM,GACjE,QAAQ;AACZ,aAAO,eAAe,SAAS;AAAA,IACjC;AAAA,IACA,CAAC,MAAM,oBAAoB;AAAA,EAC7B;AAEA,QAAM,yBAAyBA;AAAA,IAC7B,CACE,MACA;AAAA,MACE;AAAA,IACF,MACG;AACH,YAAM,gBAAgB,MAAM,qBAAqB,IAAI,KAAK,KAAK,MAAM,GACjE,QAAQ;AACZ,UAAI,eAAe,SAAS,aAAa;AACvC,eAAO;AAAA,MACT;AAEA,YAAM,gBAAgB,+BAA+B;AAAA,QACnD,qBAAqB,MAAM;AAAA,QAC3B;AAAA,QACA,aAAa,MAAM;AAAA,MACrB,CAAC;AACD,YAAM,UAAU,cAAc,eAAe;AAAA,QAC3C,mBAAmB,cAAc;AAAA,QACjC,wBAAwB,cAAc;AAAA,QACtC,MAAM,MAAM;AAAA,QACZ,WAAW,MAAM,YAAY,YAAY,EAAE,UAAU,GAAG,EAAE,MAAM,KAAK;AAAA,QACrE,aAAa,KAAK;AAAA,QAClB;AAAA,QACA;AAAA,MACF,CAAC;AACD,aAAO,UACH;AAAA,QACE;AAAA,QACA;AAAA,MACF,IACA;AAAA,IACN;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,EACF;AAEA,QAAM,uBAAuBA;AAAA,IAC3B,CAAC,SAA+C;AAC9C,UACE,KAAK,eACL,qCAAqC;AAAA,QACnC;AAAA,QACA,iBAAiB,MAAM;AAAA,MACzB,CAAC,GACD;AACA,cAAM,gBAAgB,MAAM,YAAY,YAAY,EAAE;AACtD,cAAM,YAAY,cAAc;AAAA,UAC9B,CAAC,iBAAiB,aAAa,OAAO,KAAK;AAAA,QAC7C,IACI,cAAc;AAAA,UAAI,CAAC,iBACjB,aAAa,OAAO,KAAK,KAAK,OAAO;AAAA,QACvC,IACA,CAAC,GAAG,eAAe,IAAI;AAC3B,cAAM,qBACJ,8CAA8C;AAAA,UAC5C,QAAQ,KAAK;AAAA,UACb,OAAO,mCAAmC;AAAA,YACxC,iBAAiB,MAAM;AAAA,YACvB,OAAO;AAAA,UACT,CAAC;AAAA,QACH,CAAC;AACH,YAAI,oBAAoB;AACtB,iBAAO;AAAA,QACT;AAAA,MACF;AAEA,UAAI,OAAO,KAAK,KAAK,gBAAgB,UAAU;AAC7C,cAAM,YAAY,MAAM,YAAY;AAAA,UAClC,CAAC,UAAU,MAAM,OAAO,KAAK,KAAK;AAAA,QACpC;AACA,eAAO,WAAW,aAAa,KAAK,KAAK;AAAA,MAC3C;AAEA,aAAO,KAAK,KAAK;AAAA,IACnB;AAAA,IACA,CAAC,MAAM,aAAa,MAAM,aAAa,MAAM,oBAAoB;AAAA,EACnE;AAEA,QAAMC,8BAA6BD;AAAA,IACjC,CACE,UACyC;AAAA,MACzC,YAAY,KAAK,KAAK;AAAA,MACtB,aAAa,KAAK,KAAK,eAAe;AAAA,MACtC,QAAQ,KAAK;AAAA,MACb,QAAQ,KAAK,KAAK;AAAA,MAClB,aAAa,MAAM;AAAA,IACrB;AAAA,IACA,CAAC,MAAM,WAAW;AAAA,EACpB;AAEA,QAAM,mBAAmBA;AAAA,IAGvB,CAAC,EAAE,KAAK,MACN,MAAM,qBAAqB,IAAI,KAAK,KAAK,MAAM,GAAG,eAC9C,kBACA;AAAA,IACN,CAAC,MAAM,oBAAoB;AAAA,EAC7B;AAEA,QAAM,8BAA8BA;AAAA,IAClC,CAAC,EAAE,KAAK,MACN,MAAM,qBAAqB,IAAI,KAAK,KAAK,MAAM,GAAG,QAC9C;AAAA,IACN,CAAC,MAAM,oBAAoB;AAAA,EAC7B;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,4BAAAC;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AA4BA,IAAM,0CAAN,cAAsD,UAGpD;AAAA,EACS,QAAsD;AAAA,IAC7D,UAAU;AAAA,EACZ;AAAA,EAEA,OAAO,2BAAyE;AAC9E,WAAO,EAAE,UAAU,KAAK;AAAA,EAC1B;AAAA,EAES,mBACP,eACM;AACN,QAAI,KAAK,MAAM,YAAY,cAAc,aAAa,KAAK,MAAM,UAAU;AACzE,WAAK,SAAS,EAAE,UAAU,MAAM,CAAC;AAAA,IACnC;AAAA,EACF;AAAA,EAES,kBAAkB,OAAgB,MAAuB;AAChE,QAAI;AACF,YAAM,SAAS,KAAK,MAAM,kBAAkB,MAAM;AAAA,QAChD,SAAS;AAAA,UACP,GAAI,KAAK,MAAM,WAAW,CAAC;AAAA,UAC3B,gBAAgB,KAAK,kBAAkB;AAAA,UACvC,cAAc,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,UACnE,WAAW,iBAAiB,QAAQ,MAAM,OAAO,OAAO;AAAA,UACxD,YAAY,iBAAiB,QAAS,MAAM,SAAS,OAAQ;AAAA,QAC/D;AAAA,QACA,OAAO,KAAK,MAAM;AAAA,QAClB,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,aAAa,KAAK,MAAM;AAAA,MAC1B,CAAC;AACD,WAAK,QAAQ,QAAQ,MAAM,EAAE,MAAM,MAAM,MAAS;AAAA,IACpD,QAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAES,SAAoB;AAC3B,QAAI,KAAK,MAAM,UAAU;AACvB,aACE,gBAAAJ;AAAA,QAAC;AAAA;AAAA,UACC,uCAAqC,KAAK,MAAM;AAAA,UAChD,OAAO,EAAE,QAAQ,QAAQ,OAAO,OAAO;AAAA;AAAA,MACzC;AAAA,IAEJ;AAEA,WAAO,KAAK,MAAM;AAAA,EACpB;AACF;AAEA,IAAM,uCAAN,cAAmD,UAGjD;AAAA,EACS,QAAmD;AAAA,IAC1D,UAAU;AAAA,EACZ;AAAA,EAEA,OAAO,2BAAsE;AAC3E,WAAO,EAAE,UAAU,KAAK;AAAA,EAC1B;AAAA,EAES,mBACP,eACM;AACN,QAAI,KAAK,MAAM,YAAY,cAAc,aAAa,KAAK,MAAM,UAAU;AACzE,WAAK,SAAS,EAAE,UAAU,MAAM,CAAC;AAAA,IACnC;AAAA,EACF;AAAA,EAES,kBAAkB,OAAgB,MAAuB;AAChE,QAAI;AACF,YAAM,SAAS,KAAK,MAAM,kBAAkB,MAAM;AAAA,QAChD,SAAS;AAAA,UACP,gBAAgB,KAAK,kBAAkB;AAAA,UACvC,aAAa,KAAK,MAAM,KAAK,KAAK,eAAe;AAAA,UACjD,aAAa,KAAK,MAAM,KAAK;AAAA,UAC7B,cAAc,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,UACnE,WAAW,iBAAiB,QAAQ,MAAM,OAAO,OAAO;AAAA,UACxD,YAAY,iBAAiB,QAAS,MAAM,SAAS,OAAQ;AAAA,UAC7D,OAAO,KAAK,MAAM,KAAK;AAAA,UACvB,YAAY,KAAK,MAAM,KAAK,KAAK;AAAA,UACjC,aAAa,KAAK,MAAM,KAAK,KAAK,eAAe;AAAA,UACjD,aAAa,KAAK,MAAM,KAAK;AAAA,UAC7B,cAAc,KAAK,MAAM,KAAK,KAAK,gBAAgB;AAAA,UACnD,QAAQ,KAAK,MAAM,KAAK;AAAA,UACxB,QAAQ,KAAK,MAAM,KAAK,KAAK;AAAA,QAC/B;AAAA,QACA,OAAO;AAAA,QACP,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,aAAa,KAAK,MAAM;AAAA,MAC1B,CAAC;AACD,WAAK,QAAQ,QAAQ,MAAM,EAAE,MAAM,MAAM,MAAS;AAAA,IACpD,QAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAES,SAAoB;AAC3B,QAAI,KAAK,MAAM,UAAU;AACvB,aACE,gBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,oCAAiC;AAAA,UACjC,OAAO;AAAA,YACL,YAAY;AAAA,YACZ,WAAW;AAAA,YACX,OAAO;AAAA,YACP,SAAS;AAAA,YACT,eAAe;AAAA,YACf,KAAK;AAAA,YACL,QAAQ;AAAA,YACR,gBAAgB;AAAA,YAChB,SAAS;AAAA,YACT,WAAW;AAAA,YACX,OAAO;AAAA,UACT;AAAA,UAEA;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,4CAAyC;AAAA,gBACzC,OAAO;AAAA,kBACL,OAAO;AAAA,kBACP,UAAU;AAAA,kBACV,YAAY;AAAA,gBACd;AAAA,gBACD;AAAA;AAAA,YAED;AAAA,YACA,gBAAAA,MAAC,SAAI,OAAO,EAAE,UAAU,GAAG,GAAG,sEAE9B;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS,MAAM,KAAK,SAAS,EAAE,UAAU,MAAM,CAAC;AAAA,gBAChD,OAAO;AAAA,kBACL,QAAQ;AAAA,kBACR,cAAc;AAAA,kBACd,YAAY;AAAA,kBACZ,OAAO;AAAA,kBACP,QAAQ;AAAA,kBACR,UAAU;AAAA,kBACV,YAAY;AAAA,kBACZ,WAAW;AAAA,kBACX,SAAS;AAAA,gBACX;AAAA,gBACD;AAAA;AAAA,YAED;AAAA;AAAA;AAAA,MACF;AAAA,IAEJ;AAEA,WAAO,KAAK,MAAM;AAAA,EACpB;AACF;AAEA,SAAS,8BAA8B;AAAA,EACrC;AAAA,EACA;AACF,GAGc;AACZ,SAAO,WAAW,WAAW,OAAO;AACtC;AAEA,SAAS,4BAA4B;AAAA,EACnC;AAAA,EACA;AACF,GAGc;AACZ,SAAO,aAAa,OAAO;AAC7B;;;ApChfc,gBAAAK,aAAA;AApId,IAAMC,QAAO,MAAM;AAAC;AAEb,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAuB;AACrB,QAAM,oBAAoBC;AAAA,IACxB,MACE,kCAAkC;AAAA,MAChC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,IACH;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,QAAM,kBAAkBA;AAAA,IACtB,MACE,gCAAgC;AAAA,MAC9B;AAAA,MACA;AAAA,IACF,CAAC;AAAA,IACH,CAAC,eAAe,WAAW;AAAA,EAC7B;AACA,QAAM,qBAAqB,gBAAgB,QAAQ;AACnD,QAAM,wBAAwB,gBAAgB;AAC9C,QAAM,sBAAsB,gBAAgB,kBAAkBD;AAC9D,QAAM,wBACJ,uBAAuB,QAAQ,iCAAiC;AAClE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,wBAAwB;AAAA,IAC1B;AAAA,IACA,qBAAqB,kBAAkB;AAAA,IACvC;AAAA,IACA;AAAA,IACA,OAAO,kBAAkB;AAAA,IACzB;AAAA,IACA,iBAAiB,kBAAkB;AAAA,IACnC;AAAA,IACA,oBAAoB,kBAAkB;AAAA,IACtC;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,QAAM,mBAAmB,iCAAiC;AAAA,IACxD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa;AAAA,IACb,qBAAqB,kBAAkB;AAAA,IACvC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,QAAM,sBAAsB,gCAAgC;AAAA,IAC1D,SAAS;AAAA,IACT,MAAM;AAAA,IACN,SAAS;AAAA,IACT,gBAAgB;AAAA,EAClB,CAAC;AACD,QAAM,yBACJ,mCAAmC,mBAAmB;AACxD,QAAM,8BAA8B,uBAAuB;AAE3D,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,yBAAyB,iBAAiB;AAAA,MAC1C,YAAY,YAAY;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa,CAAC;AAAA,MACd;AAAA,MACA,qBAAqB,uBAAuB;AAAA,MAC5C;AAAA,MACA,cAAc,qBAAqB,gBAAgB;AAAA,MACnD,gBACE,8BACI,MACE,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,0BAA0B,MACxB,uBAAuB,uBAAuB;AAAA,UAEhD,OAAO,uBAAuB;AAAA;AAAA,MAChC,IAEF;AAAA,MAEN,oBAAoB,iBAAiB;AAAA,MACrC,YAAY,iBAAiB;AAAA,MAC7B,YAAY,iBAAiB;AAAA,MAC7B,wBAAwB,iBAAiB;AAAA,MACzC,eACE,8BACI,MACE,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAM;AAAA,UACN,OAAO,uBAAuB;AAAA,UAC9B,OAAO;AAAA;AAAA,MACT,IAEF;AAAA,MAEN,iBAAiB,iBAAiB;AAAA,MAClC,qBAAqB,iBAAiB;AAAA,MACtC,oBAAoB,iBAAiB;AAAA,MACrC,gCACE,iBAAiB;AAAA,MAEnB,4BAA4B,iBAAiB;AAAA,MAC7C,6BAA6B,iBAAiB;AAAA,MAC9C,sBAAsB,iBAAiB;AAAA,MACvC;AAAA,MACA,+BACE,iBAAiB;AAAA,MAEnB;AAAA,MACA;AAAA,MACA,kBAAkB,iBAAiB;AAAA;AAAA,EACrC;AAEJ;","names":["useMemo","useLayoutEffect","useRef","useState","useCallback","useState","useState","useCallback","nodeIds","useCallback","useEffect","useMemo","jsx","jsx","useMemo","useMemo","Button","jsx","useCallback","useCallback","useCallback","useCallback","useCallback","useCallback","Fragment","jsx","jsxs","jsx","jsxs","useMemo","useEffect","useEffect","useLayoutEffect","useRef","useCallback","useEffect","useRef","useState","Fragment","jsx","jsxs","resolveDockPreviewCacheKey","useRef","useState","useCallback","useEffect","minimizeCommitted","commitMinimize","generation","nodeElement","wasFocusedForCapture","pendingMinimizedNode","anchorKey","dockRect","jsx","jsxs","resolveDockPreviewCacheKey","useCallback","useEffect","useEffect","useMemo","useState","normalizeWorkbenchSnapshot","normalizeWorkbenchSnapshot","resolvedFrame","entry","useState","useMemo","useEffect","noop","useCallback","useMemo","useCallback","useEffect","useLayoutEffect","useMemo","useRef","useState","Button","useCallback","useEffect","useRef","slotElement","useEffect","useRef","useState","promotedNodeId","slot","useCallback","useEffect","useLayoutEffect","useRef","useState","createPortal","Button","MaximizeIcon","Fragment","jsx","jsxs","resolveDockPreviewCacheKey","useRef","useState","useEffect","useLayoutEffect","useCallback","createPortal","MaximizeIcon","WorkbenchHostDockPopupCard","Button","jsx","jsxs","useMemo","useRef","useState","useCallback","useEffect","useLayoutEffect","activeHoverPanel","activeLabelTooltip","labelTooltipTarget","dockButton","node","relatedTarget","Button","left","right","top","bottom","Button","CloseIcon","MinimizeIcon","Fragment","jsx","jsxs","jsx","jsxs","useMemo","useCallback","resolveDockPreviewCacheKey","jsx","noop","useMemo"]}