@pstdio/workbench 0.11.3 → 0.12.0
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/extensions.d.ts +15 -0
- package/dist/extensions.js +651 -641
- package/dist/extensions.js.map +1 -1
- package/dist/file-renderer-view-BJ3LX04R.js +545 -0
- package/dist/file-renderer-view-BJ3LX04R.js.map +1 -0
- package/dist/index-DwNKY4fO.js +5286 -0
- package/dist/index-DwNKY4fO.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +1714 -1617
- package/dist/index.js.map +1 -1
- package/dist/react.d.ts +8 -5
- package/dist/react.js +51 -5209
- package/dist/react.js.map +1 -1
- package/dist/webview-runtime.js +1 -1
- package/dist/webview-runtime.js.map +1 -1
- package/dist/{workbench-renderers-BhgHQ-Ne.js → workbench-renderers-BAPxtfpZ.js} +263 -257
- package/dist/workbench-renderers-BAPxtfpZ.js.map +1 -0
- package/dist/{workspaces-B9HZHIbz.js → workspaces-DdUPyzkL.js} +350 -339
- package/dist/workspaces-DdUPyzkL.js.map +1 -0
- package/package.json +3 -3
- package/dist/file-renderer-view-Bfmw6RxV.js +0 -515
- package/dist/file-renderer-view-Bfmw6RxV.js.map +0 -1
- package/dist/workbench-renderers-BhgHQ-Ne.js.map +0 -1
- package/dist/workspaces-B9HZHIbz.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"file-renderer-view-Bfmw6RxV.js","sources":["../src/core/registries/renderers/file-section-navigation.ts","../src/react/renderers/file/file-kind.ts","../src/react/renderers/file/file-renderer-presentation.ts","../src/react/renderers/file/file-renderer-content.tsx","../src/react/renderers/file/file-renderer-edit-state.ts","../src/react/renderers/file/file-renderer-error-notice.tsx","../src/react/renderers/file/file-renderer-load-key.ts","../src/react/renderers/file/file-renderer-path-header.tsx","../src/react/renderers/file/file-renderer-view.tsx"],"sourcesContent":["import type { ResourceRef } from \"../resources/resource-registry\";\n\nexport const FILE_SECTION_NAVIGATION_METADATA_KEY = \"pstdio.fileSectionNavigation\";\n\nexport interface FileSectionAnchor {\n id: string;\n heading: string;\n occurrence?: number;\n}\n\nexport interface FileSectionNavigation {\n treeId: string;\n targetNodeId: string;\n anchors: FileSectionAnchor[];\n}\n\nconst isAnchor = (value: unknown): value is FileSectionAnchor => {\n if (!value || typeof value !== \"object\") return false;\n const anchor = value as Record<string, unknown>;\n const occurrenceIsValid =\n anchor.occurrence === undefined ||\n (typeof anchor.occurrence === \"number\" && Number.isInteger(anchor.occurrence) && anchor.occurrence >= 0);\n return typeof anchor.id === \"string\" && typeof anchor.heading === \"string\" && occurrenceIsValid;\n};\n\nexport const getFileSectionNavigation = (resource: ResourceRef | undefined): FileSectionNavigation | undefined => {\n const value = resource?.metadata?.[FILE_SECTION_NAVIGATION_METADATA_KEY];\n if (!value || typeof value !== \"object\") return undefined;\n const navigation = value as Record<string, unknown>;\n if (typeof navigation.treeId !== \"string\" || typeof navigation.targetNodeId !== \"string\") return undefined;\n if (!Array.isArray(navigation.anchors) || !navigation.anchors.every(isAnchor)) return undefined;\n\n return {\n treeId: navigation.treeId,\n targetNodeId: navigation.targetNodeId,\n anchors: navigation.anchors,\n };\n};\n\nexport const resolveFileSectionTargetId = (navigation: FileSectionNavigation, selectedNodeId: string | undefined) => {\n if (selectedNodeId && navigation.anchors.some((anchor) => anchor.id === selectedNodeId)) return selectedNodeId;\n return navigation.targetNodeId;\n};\n\nexport interface PreviousFileSectionNavigation {\n resourceKey?: string;\n treeId: string;\n anchorIds: string[];\n}\n\nexport const shouldClearFileSectionSelection = (input: {\n previous: PreviousFileSectionNavigation | null;\n current: FileSectionNavigation | undefined;\n currentResourceKey?: string;\n selectedNodeId?: string;\n}) => {\n const { previous, current, currentResourceKey, selectedNodeId } = input;\n if (!previous || !selectedNodeId || !previous.anchorIds.includes(selectedNodeId)) return false;\n if (current?.targetNodeId === selectedNodeId) return false;\n\n return !current || previous.treeId !== current.treeId || previous.resourceKey !== currentResourceKey;\n};\n","// Generic file-type dispatch for the file renderer. Markdown is the default so\n// `.md` / `.txt` / extension-less files open in the prose editor; recognised code\n// extensions open in Monaco; images render read-only. This is deliberately\n// domain-agnostic — it knows about file types, not about tickets.\n\nexport type FileKind = \"markdown\" | \"code\" | \"image\";\n\nconst IMAGE_EXTENSIONS = new Set([\"png\", \"jpg\", \"jpeg\", \"gif\", \"webp\", \"svg\", \"avif\", \"bmp\", \"ico\"]);\nconst PROSE_EXTENSIONS = new Set([\"md\", \"markdown\", \"txt\"]);\n\n// Extension → Monaco language id. Markdown/plain text intentionally absent so\n// they fall through to the prose editor.\nconst CODE_LANGUAGE_BY_EXTENSION: Record<string, string> = {\n ts: \"typescript\",\n tsx: \"typescript\",\n js: \"javascript\",\n jsx: \"javascript\",\n mjs: \"javascript\",\n cjs: \"javascript\",\n json: \"json\",\n jsonc: \"json\",\n py: \"python\",\n rb: \"ruby\",\n rs: \"rust\",\n go: \"go\",\n java: \"java\",\n kt: \"kotlin\",\n c: \"c\",\n h: \"c\",\n cpp: \"cpp\",\n cc: \"cpp\",\n hpp: \"cpp\",\n cs: \"csharp\",\n php: \"php\",\n swift: \"swift\",\n sh: \"shell\",\n bash: \"shell\",\n zsh: \"shell\",\n sql: \"sql\",\n css: \"css\",\n scss: \"scss\",\n less: \"less\",\n html: \"html\",\n xml: \"xml\",\n yml: \"yaml\",\n yaml: \"yaml\",\n toml: \"ini\",\n ini: \"ini\",\n dockerfile: \"dockerfile\",\n graphql: \"graphql\",\n gql: \"graphql\",\n md: \"markdown\",\n markdown: \"markdown\",\n txt: \"plaintext\",\n};\n\nconst extensionOf = (fileName: string | undefined) => {\n if (!fileName) return \"\";\n const dot = fileName.lastIndexOf(\".\");\n if (dot < 0 || dot === fileName.length - 1) return \"\";\n return fileName.slice(dot + 1).toLowerCase();\n};\n\nconst isImage = (fileName: string | undefined, mimeType: string | undefined) => {\n if (mimeType?.startsWith(\"image/\")) return true;\n return IMAGE_EXTENSIONS.has(extensionOf(fileName));\n};\n\nexport const pickFileKind = (fileName: string | undefined, mimeType: string | undefined): FileKind => {\n if (isImage(fileName, mimeType)) return \"image\";\n const extension = extensionOf(fileName);\n if (!PROSE_EXTENSIONS.has(extension) && extension in CODE_LANGUAGE_BY_EXTENSION) return \"code\";\n return \"markdown\";\n};\n\n// Monaco language for a code file; falls back to plaintext for unknown extensions.\nexport const codeLanguageFor = (fileName: string | undefined) =>\n CODE_LANGUAGE_BY_EXTENSION[extensionOf(fileName)] ?? \"plaintext\";\n","import type { FileRendererContent } from \"../../../core\";\nimport { codeLanguageFor, pickFileKind } from \"./file-kind\";\n\nexport type FileRendererPresentation =\n | { kind: \"empty\"; isEditable: false }\n | { kind: \"image\"; isEditable: false }\n | { kind: \"code\"; isEditable: boolean; language: string }\n | { kind: \"markdown\"; isEditable: boolean };\n\nexport const resolveFileRendererPresentation = (\n content: FileRendererContent,\n contributionCanSave: boolean,\n): FileRendererPresentation => {\n if (content.emptyState) return { kind: \"empty\", isEditable: false };\n\n const automaticKind = pickFileKind(content.fileName, content.mimeType);\n if (automaticKind === \"image\") return { kind: \"image\", isEditable: false };\n\n const isEditable = contributionCanSave && content.editable !== false;\n if (automaticKind === \"code\" || content.textRenderer === \"monaco\") {\n return { kind: \"code\", isEditable, language: codeLanguageFor(content.fileName) };\n }\n return { kind: \"markdown\", isEditable };\n};\n","import { Box, Center, Flex, Image, Text } from \"@chakra-ui/react\";\nimport { EmptyState } from \"@pstdio/ui\";\nimport { CodeEditor } from \"@pstdio/ui/diff\";\nimport { MarkdownEditor } from \"@pstdio/ui/rich-text\";\nimport type { ReactNode, RefObject } from \"react\";\nimport type { FileRendererContent } from \"../../../core\";\nimport { resolveFileRendererPresentation } from \"./file-renderer-presentation\";\n\ninterface FileRendererContentViewProps {\n content: FileRendererContent;\n editorKey: string;\n errorNotice: ReactNode;\n contributionCanSave: boolean;\n onActiveSectionChange?: (sectionId: string | null) => void;\n onChange: (value: string) => void;\n rendererRef: RefObject<HTMLDivElement | null>;\n sectionNavigation?: {\n anchors: Array<{ id: string; heading: string; occurrence?: number }>;\n targetId: string;\n };\n title: string;\n}\n\nexport const FileRendererContentView = (props: FileRendererContentViewProps) => {\n const {\n content,\n editorKey,\n errorNotice,\n contributionCanSave,\n onActiveSectionChange,\n onChange,\n rendererRef,\n sectionNavigation,\n title,\n } = props;\n const presentation = resolveFileRendererPresentation(content, contributionCanSave);\n\n if (presentation.kind === \"empty\") {\n return (\n <Flex direction=\"column\" h=\"full\" minH=\"0\" bg=\"bg\">\n {errorNotice}\n <EmptyState\n flex=\"1\"\n minH=\"0\"\n title={content.emptyState?.title ?? \"Select a file\"}\n description={content.emptyState?.description}\n />\n </Flex>\n );\n }\n\n if (presentation.kind === \"image\") {\n if (!content.dataUrl) {\n return (\n <Center h=\"full\" minH=\"0\" bg=\"bg\" p=\"md\">\n <Text color=\"fg.muted\">This image preview is unavailable.</Text>\n </Center>\n );\n }\n return (\n <Flex direction=\"column\" h=\"full\" minH=\"0\" bg=\"bg\">\n {errorNotice}\n <Center ref={rendererRef} flex=\"1\" minH=\"0\" p=\"md\" overflow=\"auto\">\n <Image src={content.dataUrl} alt={content.fileName ?? title} maxW=\"100%\" maxH=\"100%\" objectFit=\"contain\" />\n </Center>\n </Flex>\n );\n }\n\n if (presentation.kind === \"code\") {\n return (\n <Flex direction=\"column\" h=\"full\" minH=\"0\" bg=\"bg\">\n {errorNotice}\n <Box flex=\"1\" minH=\"0\">\n <CodeEditor\n key={editorKey}\n language={presentation.language}\n defaultCode={content.content ?? \"\"}\n isEditable={presentation.isEditable}\n showLineNumbers\n onChange={presentation.isEditable ? onChange : undefined}\n />\n </Box>\n </Flex>\n );\n }\n\n return (\n <Flex ref={rendererRef} direction=\"column\" h=\"full\" minH=\"0\" overflow=\"hidden\" bg=\"bg\">\n {errorNotice}\n <Box flex=\"1\" minH=\"0\" overflowY=\"auto\">\n <MarkdownEditor\n key={editorKey}\n defaultState={content.content ?? \"\"}\n isEditable={presentation.isEditable}\n sectionNavigation={sectionNavigation}\n placeholder={presentation.isEditable ? (content.placeholder ?? \"Write…\") : undefined}\n onActiveSectionChange={onActiveSectionChange}\n onChange={presentation.isEditable ? onChange : undefined}\n />\n </Box>\n </Flex>\n );\n};\n","// Owns the editable file renderer's save lifecycle: the last loaded or saved\n// value (the baseline), the debounced draft, the one in-flight save, and\n// refresh events that arrive while a draft or save exists.\n//\n// Invariants (from the renderer edit/refresh lifecycle PRD):\n// - a change equal to the baseline never schedules a save\n// - at most one save runs at a time; the baseline advances when it succeeds\n// - a failed save keeps the draft so a later change or flush retries it\n// - refresh events are deferred while a draft or save exists and coalesce\n// into one reload after the last save settles\n\nimport type {\n FileRendererRefreshEnvelope,\n FileRendererRefreshOrigin,\n FileRendererSaveResult,\n} from \"../../../core/registries/renderers/file-renderer-registry\";\n\nexport interface FileEditControllerState {\n dirty: boolean;\n saving: boolean;\n saveError?: string;\n}\n\nexport interface FileEditControllerInput {\n binding: Omit<FileRendererRefreshOrigin, \"operationId\"> & { resourceKey?: string };\n debounceMs: number;\n load: (event?: FileRendererRefreshEnvelope) => void;\n save: (value: string, origin: FileRendererRefreshOrigin) => Promise<FileRendererSaveResult | undefined>;\n createOperationId?: () => string;\n onStateChange?: (state: FileEditControllerState) => void;\n}\n\nexport type FileEditController = ReturnType<typeof createFileEditController>;\n\nexport const createFileEditController = (input: FileEditControllerInput) => {\n let baseline: string | undefined;\n let baselineRevision: string | undefined;\n let draft: string | null = null;\n let activeSave: { value: string; origin: FileRendererRefreshOrigin } | null = null;\n let saveError: string | undefined;\n let deferredRevision: string | undefined;\n let genericRefreshDeferred = false;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let operationSequence = 0;\n const seenRefreshRevisions = new Set<string>();\n const completedOperationIds = new Set<string>();\n\n const describeError = (error: unknown) => (error instanceof Error ? error.message : \"Failed to save file.\");\n const getState = (): FileEditControllerState => ({\n dirty: draft !== null || (activeSave !== null && activeSave.value !== baseline),\n saving: activeSave !== null,\n ...(saveError ? { saveError } : {}),\n });\n const notify = () => input.onStateChange?.(getState());\n\n const clearTimer = () => {\n if (timer === null) return;\n clearTimeout(timer);\n timer = null;\n };\n\n const nextOperationId = () => input.createOperationId?.() ?? `file-save-${Date.now()}-${++operationSequence}`;\n\n const hasPendingLocalState = () => draft !== null || activeSave !== null || timer !== null || Boolean(saveError);\n\n const deferRefresh = (event: FileRendererRefreshEnvelope) => {\n if (event.revision && (!deferredRevision || event.revision.localeCompare(deferredRevision) > 0)) {\n deferredRevision = event.revision;\n }\n if (!event.revision) genericRefreshDeferred = true;\n };\n\n const isSelfRefresh = (event: FileRendererRefreshEnvelope) => {\n const operationId = event.origin?.operationId;\n if (!operationId) return false;\n if (event.origin?.rendererId !== input.binding.rendererId) return false;\n if (event.origin.instanceId !== input.binding.instanceId) return false;\n return activeSave?.origin.operationId === operationId || completedOperationIds.has(operationId);\n };\n\n const takeDeferredRefresh = (savedRevision?: string) => {\n if (draft !== null || activeSave) return;\n const revision = deferredRevision;\n const generic = genericRefreshDeferred;\n deferredRevision = undefined;\n genericRefreshDeferred = false;\n if (revision && (!savedRevision || revision.localeCompare(savedRevision) > 0)) {\n input.load({ resourceKey: input.binding.resourceKey, revision });\n return;\n }\n if (generic) input.load({ resourceKey: input.binding.resourceKey });\n };\n\n const runSave = () => {\n if (draft === null || activeSave || saveError) return;\n const value = draft;\n draft = null;\n const origin = {\n rendererId: input.binding.rendererId,\n instanceId: input.binding.instanceId,\n operationId: nextOperationId(),\n };\n activeSave = { value, origin };\n notify();\n void Promise.resolve(input.save(value, origin))\n .then((result) => {\n if (activeSave?.origin.operationId !== origin.operationId) return;\n activeSave = null;\n completedOperationIds.add(origin.operationId);\n if (completedOperationIds.size > 20) completedOperationIds.delete(completedOperationIds.values().next().value!);\n baseline = value;\n baselineRevision = result?.revision ?? baselineRevision;\n if (draft === baseline) {\n draft = null;\n clearTimer();\n }\n notify();\n if (draft !== null) {\n schedule();\n return;\n }\n takeDeferredRefresh(result?.revision);\n })\n .catch((error) => {\n if (activeSave?.origin.operationId !== origin.operationId) return;\n activeSave = null;\n if (draft === null) draft = value;\n saveError = describeError(error);\n notify();\n });\n };\n\n const schedule = () => {\n clearTimer();\n timer = setTimeout(() => {\n timer = null;\n runSave();\n }, input.debounceMs);\n };\n\n return {\n getBaseline() {\n return baseline;\n },\n getState,\n setBaseline(value: string | undefined, revision?: string) {\n baseline = value;\n baselineRevision = revision;\n notify();\n },\n acceptLoaded(value: string | undefined, revision?: string) {\n if (hasPendingLocalState()) {\n deferRefresh(revision ? { revision } : {});\n return false;\n }\n baseline = value;\n baselineRevision = revision;\n notify();\n return true;\n },\n handleChange(value: string) {\n if (saveError && value === draft) return;\n saveError = undefined;\n if (value === baseline && !activeSave) {\n draft = null;\n clearTimer();\n notify();\n return;\n }\n if (activeSave?.value === value) {\n draft = null;\n clearTimer();\n notify();\n return;\n }\n draft = value;\n schedule();\n notify();\n },\n handleRefreshEvent(event: FileRendererRefreshEnvelope = {}) {\n if (event.resourceKey && event.resourceKey !== input.binding.resourceKey) return;\n if (isSelfRefresh(event)) return;\n if (event.revision && seenRefreshRevisions.has(event.revision)) return;\n if (event.revision) seenRefreshRevisions.add(event.revision);\n if (hasPendingLocalState()) {\n deferRefresh(event);\n return;\n }\n if (event.revision && baselineRevision && event.revision.localeCompare(baselineRevision) <= 0) return;\n input.load(event);\n },\n retry() {\n if (!saveError || draft === null || activeSave) return;\n saveError = undefined;\n notify();\n runSave();\n },\n retryLoad() {\n input.load({ resourceKey: input.binding.resourceKey });\n },\n flush() {\n clearTimer();\n runSave();\n },\n };\n};\n\n// A reload that returns what the editor already shows must not remount it: the\n// revision feeds the editor's React key, and a new key destroys focus and\n// selection. `editorValue` is the current baseline for an editable renderer —\n// after a save, a reload returns the saved value, which matches the baseline\n// even though it differs from the previously loaded state.\nexport const nextLoadedRevision = (\n previous: { content?: string; dataUrl?: string; loadKey: string; editorRevision: number } | null,\n next: { content?: string; dataUrl?: string },\n loadKey: string,\n editorValue?: string,\n) => {\n if (!previous || previous.loadKey !== loadKey) return 1;\n const shownContent = editorValue ?? previous.content;\n if (shownContent === next.content && previous.dataUrl === next.dataUrl) return previous.editorRevision;\n return previous.editorRevision + 1;\n};\n\n// Last loaded document per binding, so reopening a recently viewed file mounts\n// the editor immediately instead of a spinner. The follow-up load reconciles:\n// unchanged content keeps the revision (no remount), changed content remounts.\nconst FILE_CONTENT_CACHE_LIMIT = 30;\nconst fileContentCache = new Map<\n string,\n { content?: string; dataUrl?: string; fileName?: string; mimeType?: string; placeholder?: string; revision?: string }\n>();\n\nexport const readCachedFileContent = (loadKey: string) => fileContentCache.get(loadKey);\n\nexport const storeCachedFileContent = (\n loadKey: string,\n content: NonNullable<ReturnType<typeof readCachedFileContent>>,\n) => {\n fileContentCache.delete(loadKey);\n fileContentCache.set(loadKey, content);\n if (fileContentCache.size <= FILE_CONTENT_CACHE_LIMIT) return;\n const oldest = fileContentCache.keys().next().value;\n if (oldest !== undefined) fileContentCache.delete(oldest);\n};\n","import { Button, Flex, Text } from \"@chakra-ui/react\";\n\nexport const FileRendererErrorNotice = (props: { message: string; onRetry: () => void }) => {\n const { message, onRetry } = props;\n return (\n <Flex\n flex=\"none\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n gap=\"sm\"\n borderBottomWidth=\"1px\"\n borderColor=\"border.muted\"\n bg=\"bg.muted\"\n px=\"sm\"\n py=\"xs\"\n >\n <Text color=\"fg.muted\" textStyle=\"label/S/regular\">\n {message}\n </Text>\n <Button size=\"2xs\" variant=\"subtle\" onClick={onRetry}>\n Retry\n </Button>\n </Flex>\n );\n};\n","import type { ResourceRef } from \"../../../core\";\n\ninterface FileRendererLoadKeyInput {\n fileRendererId: string;\n resource: ResourceRef | undefined;\n}\nconst stableValue = (value: unknown): unknown => {\n if (Array.isArray(value)) return value.map(stableValue);\n if (!value || typeof value !== \"object\") return value;\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, entry]) => [key, stableValue(entry)]),\n );\n};\nexport const createFileRendererLoadKey = (input: FileRendererLoadKeyInput) => {\n const { fileRendererId, resource } = input;\n const resourceValue = resource\n ? stableValue({\n id: resource.id,\n type: resource.type,\n metadata: resource.metadata,\n })\n : null;\n return `${fileRendererId}:${JSON.stringify(resourceValue)}`;\n};\nexport const isCurrentLoadedFile = (\n loaded: {\n loadKey: string;\n } | null,\n loadKey: string,\n) => loaded?.loadKey === loadKey;\n","import { Text } from \"@chakra-ui/react\";\nimport { Header, resolveFileIconElement, useFileIconThemePreference } from \"@pstdio/ui\";\n\nexport const FileRendererPathHeader = (props: { fileName: string; filePath: string }) => {\n const { fileName, filePath } = props;\n const { activeFileIconTheme } = useFileIconThemePreference();\n\n return (\n <Header variant=\"narrow\" flexShrink={0} gap=\"2xs\" bg=\"bg\">\n {resolveFileIconElement(fileName, { theme: activeFileIconTheme })}\n <Text aria-label={`File path ${filePath}`} textStyle=\"label/S/regular\" color=\"fg.muted\" truncate>\n {filePath}\n </Text>\n </Header>\n );\n};\n","import { Box, Button, Center, Flex, Spinner, Text } from \"@chakra-ui/react\";\nimport { resourceKey } from \"@pstdio/sdk/extensions\";\nimport { useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport type {\n FileRendererContent,\n RegisteredFileRendererContribution,\n WorkbenchCore,\n WorkbenchPanelInstance,\n} from \"../../../core\";\nimport { getWorkbenchRenderers } from \"../../../core\";\nimport {\n getFileSectionNavigation,\n resolveFileSectionTargetId,\n shouldClearFileSectionSelection,\n} from \"../../../core/registries/renderers/file-section-navigation\";\nimport { FileRendererContentView } from \"./file-renderer-content\";\nimport {\n createFileEditController,\n type FileEditController,\n type FileEditControllerState,\n nextLoadedRevision,\n readCachedFileContent,\n storeCachedFileContent,\n} from \"./file-renderer-edit-state\";\nimport { FileRendererErrorNotice } from \"./file-renderer-error-notice\";\nimport { createFileRendererLoadKey, isCurrentLoadedFile } from \"./file-renderer-load-key\";\nimport { FileRendererPathHeader } from \"./file-renderer-path-header\";\n\ninterface WorkbenchFileRendererViewProps {\n workbench: WorkbenchCore;\n contribution: RegisteredFileRendererContribution;\n // The bound resource (e.g. the open ticket / ticket-file) the load/save\n // commands operate on.\n placement?: WorkbenchPanelInstance;\n}\ninterface LoadedFile extends FileRendererContent {\n // Bumped on every (re)load so the uncontrolled editors remount with fresh\n // content on a refresh, but never mid-edit (load only runs on mount/refresh).\n editorRevision: number;\n loadKey: string;\n}\nconst SAVE_DEBOUNCE_MS = 600;\nconst describeError = (error: unknown) => (error instanceof Error ? error.message : \"Failed to load file.\");\nconst syncActiveFileSection = (input: {\n workbench: WorkbenchCore;\n navigation: ReturnType<typeof getFileSectionNavigation>;\n sectionId: string | null;\n}) => {\n const { workbench, navigation, sectionId } = input;\n if (!navigation || !getWorkbenchRenderers(workbench).getTreeRenderer(navigation.treeId)) return;\n if (sectionId && navigation.anchors.some((anchor) => anchor.id === sectionId)) {\n getWorkbenchRenderers(workbench).setSelectedNode(navigation.treeId, sectionId);\n return;\n }\n const selectedNodeId = getWorkbenchRenderers(workbench).getTreeState(navigation.treeId).selectedNodeId;\n if (selectedNodeId && navigation.anchors.some((anchor) => anchor.id === selectedNodeId)) {\n getWorkbenchRenderers(workbench).setSelectedNode(navigation.treeId, undefined);\n }\n};\nconst getEditorSectionNavigation = (\n workbench: WorkbenchCore,\n navigation: ReturnType<typeof getFileSectionNavigation>,\n) => {\n if (!navigation) return undefined;\n const selectedNodeId = getWorkbenchRenderers(workbench).getTreeRenderer(navigation.treeId)\n ? getWorkbenchRenderers(workbench).getTreeState(navigation.treeId).selectedNodeId\n : undefined;\n return {\n anchors: navigation.anchors,\n targetId: resolveFileSectionTargetId(navigation, selectedNodeId),\n };\n};\nexport const WorkbenchFileRendererView = (props: WorkbenchFileRendererViewProps) => {\n const { workbench, contribution } = props;\n const resource = props.placement?.resource;\n const sectionNavigation = getFileSectionNavigation(resource);\n const editorSectionNavigation = getEditorSectionNavigation(workbench, sectionNavigation);\n const loadKey = createFileRendererLoadKey({ fileRendererId: contribution.id, resource });\n const [loaded, setLoaded] = useState<LoadedFile | null>(null);\n const [error, setError] = useState<{\n loadKey: string;\n message: string;\n } | null>(null);\n const [editState, setEditState] = useState<FileEditControllerState>({ dirty: false, saving: false });\n const controllerRef = useRef<FileEditController | null>(null);\n const rendererRef = useRef<HTMLDivElement>(null);\n const previousSectionNavigationRef = useRef<{\n resourceKey?: string;\n treeId: string;\n anchorIds: string[];\n } | null>(null);\n useEffect(() => {\n const previous = previousSectionNavigationRef.current;\n const selectedNodeId =\n previous && getWorkbenchRenderers(workbench).getTreeRenderer(previous.treeId)\n ? getWorkbenchRenderers(workbench).getTreeState(previous.treeId).selectedNodeId\n : undefined;\n if (\n shouldClearFileSectionSelection({\n previous,\n current: sectionNavigation,\n currentResourceKey: resourceKey(resource),\n selectedNodeId,\n }) &&\n previous\n ) {\n getWorkbenchRenderers(workbench).setSelectedNode(previous.treeId, undefined);\n }\n previousSectionNavigationRef.current = sectionNavigation\n ? {\n resourceKey: resourceKey(resource),\n treeId: sectionNavigation.treeId,\n anchorIds: sectionNavigation.anchors.map((anchor) => anchor.id),\n }\n : null;\n }, [resource, sectionNavigation, workbench]);\n // Contribution refresh re-registers an identical contribution as a new\n // object, and a save that changes the document title produces a new resource\n // object with a fresh label. The load key uses resource values instead of\n // object identity, while callbacks read the latest objects through refs.\n const contributionRef = useRef(contribution);\n const resourceRef = useRef(resource);\n useEffect(() => {\n contributionRef.current = contribution;\n resourceRef.current = resource;\n });\n const contributionId = contribution.id;\n const hasSave = Boolean(contribution.save);\n // Re-binding a singleton widget to another resource changes `resource` and reloads.\n useEffect(() => {\n let cancelled = false;\n setError(null);\n // A recently viewed document mounts immediately from the cache; the load\n // below reconciles it (unchanged content keeps the editor mounted).\n const cached = readCachedFileContent(loadKey);\n setLoaded(cached ? { ...cached, editorRevision: 1, loadKey } : null);\n const load = () => {\n Promise.resolve(contributionRef.current.load(resourceRef.current))\n .then((next) => {\n if (cancelled) return;\n if (controllerRef.current && !controllerRef.current.acceptLoaded(next.content, next.revision)) return;\n setError(null);\n storeCachedFileContent(loadKey, next);\n // Compare against the editor's current value so a reload that returns\n // what is already shown (e.g. after a save) keeps the editor mounted.\n const editorValue = controllerRef.current?.getBaseline();\n setLoaded((previous) => ({\n ...next,\n editorRevision: nextLoadedRevision(previous, next, loadKey, editorValue),\n loadKey,\n }));\n })\n .catch((loadError) => {\n if (cancelled) return;\n setError({ loadKey, message: describeError(loadError) });\n });\n };\n controllerRef.current = hasSave\n ? createFileEditController({\n binding: {\n rendererId: contributionId,\n instanceId: props.placement?.instanceId ?? contributionId,\n resourceKey: resourceKey(resourceRef.current),\n },\n debounceMs: SAVE_DEBOUNCE_MS,\n load,\n onStateChange: (state) => {\n if (!cancelled) setEditState(state);\n },\n save: (value, origin) =>\n Promise.resolve(contributionRef.current.save?.(resourceRef.current, value, origin)).then((result) => {\n const current = readCachedFileContent(loadKey);\n if (current) storeCachedFileContent(loadKey, { ...current, content: value });\n return result ?? undefined;\n }),\n })\n : null;\n if (cached) controllerRef.current?.setBaseline(cached.content, cached.revision);\n setEditState({ dirty: false, saving: false });\n load();\n const refreshSubscription = getWorkbenchRenderers(workbench).onDidRefreshFileRenderer((event) => {\n if (event.fileRendererId !== contributionId) return;\n const controller = controllerRef.current;\n if (controller) controller.handleRefreshEvent(event);\n else load();\n });\n return () => {\n cancelled = true;\n refreshSubscription.dispose();\n // Flush the last keystrokes on unbind; the load callback above is\n // cancelled, so a deferred refresh cannot resurrect the old binding.\n controllerRef.current?.flush();\n controllerRef.current = null;\n };\n }, [contributionId, hasSave, workbench, loadKey, props.placement?.instanceId]);\n // The last keystrokes are also flushed when the tab is hidden or closed.\n useEffect(() => {\n const flush = () => controllerRef.current?.flush();\n const onVisibility = () => {\n if (document.visibilityState === \"hidden\") flush();\n };\n window.addEventListener(\"beforeunload\", flush);\n document.addEventListener(\"visibilitychange\", onVisibility);\n return () => {\n window.removeEventListener(\"beforeunload\", flush);\n document.removeEventListener(\"visibilitychange\", onVisibility);\n };\n }, []);\n const handleChange = (value: string) => {\n controllerRef.current?.handleChange(value);\n };\n const currentLoaded = isCurrentLoadedFile(loaded, loadKey) ? loaded : null;\n const scrollResetKey = currentLoaded ? `${currentLoaded.loadKey}:${currentLoaded.editorRevision}` : \"\";\n useLayoutEffect(() => {\n if (!scrollResetKey || sectionNavigation) return;\n const node = rendererRef.current;\n if (!node) return;\n requestAnimationFrame(() => {\n let current = node.parentElement;\n while (current) {\n const overflowY = getComputedStyle(current).overflowY;\n if ([\"auto\", \"scroll\", \"overlay\"].includes(overflowY) && current.scrollHeight > current.clientHeight) {\n current.scrollTop = 0;\n }\n current = current.parentElement;\n }\n });\n }, [scrollResetKey, sectionNavigation]);\n const loadError = error?.loadKey === loadKey ? error.message : undefined;\n const retryLoad = () => controllerRef.current?.retryLoad();\n const retrySave = () => controllerRef.current?.retry();\n if (loadError && !currentLoaded) {\n return (\n <Center h=\"full\" minH=\"0\" bg=\"bg\" p=\"md\" flexDirection=\"column\" gap=\"sm\">\n <Text color=\"fg.muted\">{loadError}</Text>\n <Button size=\"xs\" variant=\"subtle\" onClick={retryLoad}>\n Retry\n </Button>\n </Center>\n );\n }\n if (!currentLoaded) {\n return (\n <Center h=\"full\" minH=\"0\" bg=\"bg\">\n <Spinner size=\"sm\" />\n </Center>\n );\n }\n // The key must carry the document identity, not just the contribution: two\n // documents from the same renderer both start at revision 1, so keying on the\n // contribution alone reuses the editor and keeps showing the previous file.\n const editorKey = `${currentLoaded.loadKey}:${currentLoaded.editorRevision}`;\n const errorNotice = loadError ? (\n <FileRendererErrorNotice message={loadError} onRetry={retryLoad} />\n ) : editState.saveError ? (\n <FileRendererErrorNotice message={editState.saveError} onRetry={retrySave} />\n ) : null;\n const handleActiveSectionChange = (sectionId: string | null) => {\n syncActiveFileSection({ workbench, navigation: sectionNavigation, sectionId });\n };\n return (\n <Flex direction=\"column\" h=\"full\" minH=\"0\" bg=\"bg\">\n {currentLoaded.filePath ? (\n <FileRendererPathHeader\n fileName={currentLoaded.fileName ?? currentLoaded.filePath}\n filePath={currentLoaded.filePath}\n />\n ) : null}\n <Box flex=\"1\" minH=\"0\">\n <FileRendererContentView\n content={currentLoaded}\n editorKey={editorKey}\n errorNotice={errorNotice}\n contributionCanSave={Boolean(contribution.save)}\n onActiveSectionChange={sectionNavigation ? handleActiveSectionChange : undefined}\n onChange={handleChange}\n rendererRef={rendererRef}\n sectionNavigation={editorSectionNavigation}\n title={contribution.title}\n />\n </Box>\n </Flex>\n );\n};\n"],"names":["FILE_SECTION_NAVIGATION_METADATA_KEY","isAnchor","value","anchor","occurrenceIsValid","occurrence","undefined","Number","isInteger","id","heading","getFileSectionNavigation","resource","metadata","navigation","treeId","targetNodeId","Array","isArray","anchors","every","resolveFileSectionTargetId","selectedNodeId","some","shouldClearFileSectionSelection","input","previous","current","currentResourceKey","anchorIds","includes","resourceKey","IMAGE_EXTENSIONS","Set","PROSE_EXTENSIONS","CODE_LANGUAGE_BY_EXTENSION","ts","tsx","js","jsx","mjs","cjs","json","jsonc","py","rb","rs","go","java","kt","c","h","cpp","cc","hpp","cs","php","swift","sh","bash","zsh","sql","css","scss","less","html","xml","yml","yaml","toml","ini","dockerfile","graphql","gql","md","markdown","txt","extensionOf","fileName","dot","lastIndexOf","length","slice","toLowerCase","isImage","mimeType","startsWith","has","pickFileKind","extension","codeLanguageFor","resolveFileRendererPresentation","content","contributionCanSave","emptyState","kind","isEditable","automaticKind","editable","textRenderer","language","FileRendererContentView","props","$","_c","editorKey","errorNotice","onActiveSectionChange","onChange","rendererRef","sectionNavigation","title","t0","presentation","t1","t2","description","t3","EmptyState","t4","jsxs","Flex","dataUrl","Symbol","for","Center","Text","Image","Box","CodeEditor","placeholder","MarkdownEditor","t5","createFileEditController","baseline","baselineRevision","draft","activeSave","saveError","deferredRevision","genericRefreshDeferred","timer","operationSequence","seenRefreshRevisions","completedOperationIds","describeError","error","Error","message","getState","dirty","saving","notify","onStateChange","clearTimer","clearTimeout","nextOperationId","createOperationId","Date","now","hasPendingLocalState","Boolean","deferRefresh","event","revision","localeCompare","isSelfRefresh","operationId","origin","rendererId","binding","instanceId","takeDeferredRefresh","savedRevision","generic","load","runSave","Promise","resolve","save","then","result","add","size","delete","values","next","schedule","catch","setTimeout","debounceMs","getBaseline","setBaseline","acceptLoaded","handleChange","handleRefreshEvent","retry","retryLoad","flush","nextLoadedRevision","loadKey","editorValue","editorRevision","FILE_CONTENT_CACHE_LIMIT","fileContentCache","Map","readCachedFileContent","get","storeCachedFileContent","set","oldest","keys","FileRendererErrorNotice","onRetry","Button","stableValue","map","Object","fromEntries","entries","sort","left","right","key","entry","createFileRendererLoadKey","fileRendererId","resourceValue","type","JSON","stringify","isCurrentLoadedFile","loaded","FileRendererPathHeader","filePath","activeFileIconTheme","useFileIconThemePreference","resolveFileIconElement","theme","Header","SAVE_DEBOUNCE_MS","syncActiveFileSection","workbench","sectionId","getWorkbenchRenderers","getTreeRenderer","setSelectedNode","getTreeState","getEditorSectionNavigation","targetId","WorkbenchFileRendererView","contribution","placement","editorSectionNavigation","setLoaded","useState","setError","editState","setEditState","controllerRef","useRef","previousSectionNavigationRef","_temp","useEffect","contributionRef","resourceRef","contributionId","hasSave","t6","cancelled","cached","previous_0","loadError","state","refreshSubscription","onDidRefreshFileRenderer","controller","dispose","t7","t8","t10","t9","onVisibility","document","visibilityState","window","addEventListener","removeEventListener","t11","value_0","t12","currentLoaded","scrollResetKey","t13","t14","node","requestAnimationFrame","current_0","parentElement","overflowY","getComputedStyle","scrollHeight","clientHeight","scrollTop","useLayoutEffect","loadError_0","t15","t16","retrySave","t17","t18","t19","Spinner","handleActiveSectionChange","t20","t21","t22","t23"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"workbench-renderers-BhgHQ-Ne.js","sources":["../src/core/shared/disposable.ts","../src/core/shared/workbench-effect.ts","../src/core/shared/store/workbench-batch.ts","../src/core/shared/store/workbench-store.ts","../src/core/registries/layout/layout-regions.ts","../src/core/registries/layout/widget-id.ts","../src/core/registries/layout/layout-operations.ts","../src/core/registries/layout/panel-widget-eligibility.ts","../src/core/shared/contributions/metadata.ts","../src/core/registries/layout/panel-api.ts","../src/core/registries/modes/mode-layout.ts","../src/core/registries/keybindings/keybinding-registry.ts","../src/core/registries/layout/surface-map.ts","../src/core/registries/layout/surface-reconcile.ts","../src/core/registries/resources/resource-icons.ts","../src/core/registries/resources/resource-hierarchy.ts","../src/core/registries/resources/resource-registry.ts","../src/core/shared/context/context-key-service.ts","../src/core/workbench-renderers.ts"],"sourcesContent":["export interface Disposable {\n dispose(): void;\n}\n\nexport const createDisposable = (onDispose: () => void): Disposable => {\n let disposed = false;\n\n return {\n dispose() {\n if (disposed) return;\n disposed = true;\n onDispose();\n },\n };\n};\n","/** Host effects run after state commits. A failed effect must not interrupt other owners. */\nexport function runWorkbenchEffect<Result>(owner: string, effect: () => Result) {\n try {\n return effect();\n } catch (error) {\n console.error(`Workbench effect failed (${owner})`, error);\n return undefined;\n }\n}\n","import { runWorkbenchEffect } from \"../workbench-effect\";\n\nlet depth = 0;\nconst pending = new Map<object, () => void>();\n\nexport const notifyWorkbenchChange = (owner: object, notify: () => void) => {\n if (depth === 0) {\n runWorkbenchEffect(\"store subscriber\", notify);\n return;\n }\n if (!pending.has(owner)) pending.set(owner, notify);\n};\n\n/** Commit related stores before their subscribers read the resulting workbench state. */\nexport const batchWorkbenchChanges = <Result>(commit: () => Result) => {\n depth++;\n try {\n return commit();\n } finally {\n depth--;\n if (depth === 0) {\n depth++;\n try {\n while (pending.size) {\n const [owner, notify] = pending.entries().next().value!;\n pending.delete(owner);\n runWorkbenchEffect(\"store subscriber\", notify);\n }\n } finally {\n depth--;\n }\n }\n }\n};\n","import { devtools, type NamedSet } from \"zustand/middleware\";\nimport { createStore, type StoreApi } from \"zustand/vanilla\";\nimport { notifyWorkbenchChange } from \"./workbench-batch\";\n\nexport type WorkbenchStoreSelector<TState, TValue> = (state: TState) => TValue;\n\nexport type WorkbenchStoreListener<TState> = (state: TState, previousState: TState) => void;\n\nexport type WorkbenchStoreSelectorListener<TValue> = (value: TValue, previousValue: TValue) => void;\n\nexport interface WorkbenchStore<TState> {\n getState(): TState;\n getInitialState(): TState;\n subscribe(listener: WorkbenchStoreListener<TState>): () => void;\n subscribeSelector<TValue>(\n selector: WorkbenchStoreSelector<TState, TValue>,\n listener: WorkbenchStoreSelectorListener<TValue>,\n options?: { equalityFn?: (left: TValue, right: TValue) => boolean; fireImmediately?: boolean },\n ): () => void;\n}\n\nexport interface InternalWorkbenchStore<TState> extends WorkbenchStore<TState> {\n setState: NamedSet<TState>;\n api: StoreApi<TState>;\n}\n\nexport interface CreateWorkbenchStoreInput<TState> {\n name?: string;\n initialState: TState;\n}\n\nconst defaultEquality = <TValue>(left: TValue, right: TValue) => Object.is(left, right);\n\nexport const createWorkbenchStore = <TState>(\n input: CreateWorkbenchStoreInput<TState>,\n): InternalWorkbenchStore<TState> => {\n const api = createStore<TState>()(devtools(() => input.initialState, { name: input.name ?? \"workbench.store\" }));\n\n const subscribe: WorkbenchStore<TState>[\"subscribe\"] = (listener) => {\n const owner = {};\n return api.subscribe((_state, previous) => notifyWorkbenchChange(owner, () => listener(api.getState(), previous)));\n };\n\n const subscribeSelector: WorkbenchStore<TState>[\"subscribeSelector\"] = (selector, listener, options = {}) => {\n const equalityFn = options.equalityFn ?? defaultEquality;\n let previousValue = selector(api.getState());\n\n if (options.fireImmediately) listener(previousValue, previousValue);\n\n return subscribe((state) => {\n const nextValue = selector(state);\n if (equalityFn(previousValue, nextValue)) return;\n const previous = previousValue;\n previousValue = nextValue;\n listener(nextValue, previous);\n });\n };\n\n return {\n getState: api.getState,\n getInitialState: api.getInitialState,\n subscribe,\n subscribeSelector,\n setState: api.setState,\n api,\n };\n};\n","export const workbenchRegions = [\n \"nav\",\n \"activity\",\n \"sidenav\",\n \"main-header\",\n \"main-left-menu\",\n \"main\",\n \"main-right-menu\",\n \"secondary-header\",\n \"secondary-left-menu\",\n \"secondary\",\n \"secondary-right-menu\",\n \"side-header\",\n \"side-left-menu\",\n \"side\",\n \"side-right-menu\",\n \"status\",\n \"overlay\",\n] as const;\n\nexport type WorkbenchRegion = (typeof workbenchRegions)[number];\n\nexport const workbenchPanelRegions = [\"main\", \"secondary\", \"side\"] as const satisfies readonly WorkbenchRegion[];\n\nexport type WorkbenchPanelRegion = (typeof workbenchPanelRegions)[number];\n\nexport type WorkbenchPanelMenuSide = \"left\" | \"right\";\n\nexport const workbenchPanelMenuRegions = {\n main: { left: \"main-left-menu\", right: \"main-right-menu\" },\n secondary: { left: \"secondary-left-menu\", right: \"secondary-right-menu\" },\n side: { left: \"side-left-menu\", right: \"side-right-menu\" },\n} as const satisfies Record<WorkbenchPanelRegion, Record<WorkbenchPanelMenuSide, WorkbenchRegion>>;\n\nexport type WorkbenchPanelMenuRegion = (typeof workbenchPanelMenuRegions)[WorkbenchPanelRegion][WorkbenchPanelMenuSide];\n\nconst workbenchPanelByMenuRegion = {\n \"main-left-menu\": \"main\",\n \"main-right-menu\": \"main\",\n \"secondary-left-menu\": \"secondary\",\n \"secondary-right-menu\": \"secondary\",\n \"side-left-menu\": \"side\",\n \"side-right-menu\": \"side\",\n} as const satisfies Record<WorkbenchPanelMenuRegion, WorkbenchPanelRegion>;\n\nexport const getWorkbenchPanelForMenuRegion = (region: WorkbenchPanelMenuRegion) => workbenchPanelByMenuRegion[region];\n","export const resolveUniqueWidgetId = (\n widgetIds: ReadonlySet<string>,\n contributionId: string,\n preferredId = contributionId,\n) => {\n if (!widgetIds.has(preferredId)) return preferredId;\n\n let suffix = 1;\n while (widgetIds.has(`${contributionId}:${suffix}`)) suffix += 1;\n return `${contributionId}:${suffix}`;\n};\n","export { buildUpdatedPlacement, createPlacement } from \"./widget-placement\";\n\nimport type {\n WorkbenchLayout,\n WorkbenchPanelRegion,\n WorkbenchRegion,\n WorkbenchRegionState,\n WorkbenchWidgetPlacement,\n} from \"./layout-types\";\nimport { workbenchPanelRegions } from \"./layout-types\";\nimport { resolveUniqueWidgetId } from \"./widget-id\";\nexport const findPlacement = (layout: WorkbenchLayout, contributionId: string) => {\n for (const region of Object.values(layout.regions)) {\n const index = region.widgets.findIndex((candidate) => candidate.contributionId === contributionId);\n if (index >= 0) return { regionId: region.id, index, placement: region.widgets[index] };\n }\n return undefined;\n};\nexport const findResourcePlacement = (layout: WorkbenchLayout, contributionId: string, resourceKey: string) => {\n for (const region of Object.values(layout.regions)) {\n const index = region.widgets.findIndex(\n (candidate) => candidate.contributionId === contributionId && candidate.resourceKey === resourceKey,\n );\n if (index >= 0) return { regionId: region.id, index, placement: region.widgets[index] };\n }\n return undefined;\n};\nexport const findPlacementByWidgetId = (layout: WorkbenchLayout, widgetId: string) => {\n for (const region of Object.values(layout.regions)) {\n const index = region.widgets.findIndex((candidate) => candidate.widgetId === widgetId);\n if (index >= 0) return { regionId: region.id, index, placement: region.widgets[index] };\n }\n return undefined;\n};\nexport const createUniqueWidgetId = (layout: WorkbenchLayout, contributionId: string) => {\n const widgetIds = new Set(\n Object.values(layout.regions).flatMap((region) => region.widgets.map((placement) => placement.widgetId)),\n );\n return resolveUniqueWidgetId(widgetIds, contributionId);\n};\nexport const getActivePlacement = (region: WorkbenchRegionState) =>\n region.widgets.find((placement) => placement.widgetId === region.activeWidgetId) ?? region.widgets[0];\nconst isLocationPlacement = (placement: WorkbenchWidgetPlacement) => placement.role === \"location\";\nexport const locationWorkspaceKey = (placement: WorkbenchWidgetPlacement) =>\n placement.resourceKey ?? `${placement.contributionId}:${placement.widgetId}`;\nexport const setLocationSubPanelSelection = (\n layout: WorkbenchLayout,\n location: WorkbenchWidgetPlacement | undefined,\n region: WorkbenchPanelRegion,\n widgetId: string | undefined,\n) => {\n if (!location) return layout;\n const key = locationWorkspaceKey(location);\n const current = layout.locationSubPanelSelections?.[key] ?? {};\n const next = { ...current };\n if (widgetId) next[region] = widgetId;\n else delete next[region];\n return {\n ...layout,\n locationSubPanelSelections: {\n ...layout.locationSubPanelSelections,\n [key]: next,\n },\n };\n};\nexport const removeLocationSubPanelSelection = (layout: WorkbenchLayout, widgetId: string) => {\n if (!layout.locationSubPanelSelections) return layout;\n const locationSubPanelSelections = Object.fromEntries(\n Object.entries(layout.locationSubPanelSelections).map(([key, selections]) => [\n key,\n Object.fromEntries(Object.entries(selections).filter(([, selectedId]) => selectedId !== widgetId)),\n ]),\n ) as WorkbenchLayout[\"locationSubPanelSelections\"];\n return { ...layout, locationSubPanelSelections };\n};\nexport const getActiveLocationPlacement = (layout: WorkbenchLayout) => {\n const locations = layout.regions.main.widgets.filter(isLocationPlacement);\n return locations.find((placement) => placement.widgetId === layout.activeLocationWidgetId) ?? locations.at(-1);\n};\ninterface ReplaceRegionWidgetsOptions {\n activeWidgetId?: string;\n clearActiveWidget?: boolean;\n}\nexport const replaceRegionWidgets = (\n layout: WorkbenchLayout,\n regionId: WorkbenchRegion,\n update: (widgets: WorkbenchWidgetPlacement[]) => WorkbenchWidgetPlacement[],\n options: ReplaceRegionWidgetsOptions = {},\n): WorkbenchLayout => {\n const region = layout.regions[regionId];\n const widgets = update(region.widgets);\n const activeWidgetId =\n options.activeWidgetId !== undefined\n ? options.activeWidgetId\n : options.clearActiveWidget\n ? undefined\n : region.activeWidgetId;\n return {\n ...layout,\n activeLocationWidgetId:\n regionId === \"main\" && !widgets.some((placement) => placement.widgetId === layout.activeLocationWidgetId)\n ? widgets.filter(isLocationPlacement).at(-1)?.widgetId\n : layout.activeLocationWidgetId,\n regions: {\n ...layout.regions,\n [regionId]: { ...region, widgets, activeWidgetId },\n },\n };\n};\nexport const removePlacementsForContribution = (layout: WorkbenchLayout, contributionId: string): WorkbenchLayout => {\n let nextLayout = layout;\n for (const region of Object.values(layout.regions)) {\n const removed = region.widgets.filter((placement) => placement.contributionId === contributionId);\n const filtered = region.widgets.filter((placement) => placement.contributionId !== contributionId);\n if (filtered.length === region.widgets.length) continue;\n const activeWidgetId =\n region.activeWidgetId && !filtered.some((placement) => placement.widgetId === region.activeWidgetId)\n ? undefined\n : region.activeWidgetId;\n nextLayout = {\n ...nextLayout,\n regions: {\n ...nextLayout.regions,\n [region.id]: { ...region, widgets: filtered, activeWidgetId },\n },\n };\n for (const placement of removed) {\n nextLayout = removeLocationSubPanelSelection(nextLayout, placement.widgetId);\n }\n }\n const hasActiveWidget = Object.values(nextLayout.regions).some((region) =>\n region.widgets.some((placement) => placement.widgetId === nextLayout.activeWidgetId),\n );\n if (\n nextLayout.activeWidgetId &&\n (!hasActiveWidget ||\n nextLayout.activeWidgetId.startsWith(`${contributionId}:`) ||\n nextLayout.activeWidgetId === contributionId)\n ) {\n nextLayout = { ...nextLayout, activeWidgetId: undefined, activeResourceKey: undefined };\n }\n if (\n nextLayout.activeLocationWidgetId &&\n !nextLayout.regions.main.widgets.some((placement) => placement.widgetId === nextLayout.activeLocationWidgetId)\n ) {\n nextLayout = {\n ...nextLayout,\n activeLocationWidgetId: nextLayout.regions.main.widgets.filter(isLocationPlacement).at(-1)?.widgetId,\n };\n }\n return nextLayout;\n};\nexport const closeWidgetInLayout = (layout: WorkbenchLayout, widgetId: string) => {\n const found = findPlacementByWidgetId(layout, widgetId);\n if (!found) return undefined;\n const region = layout.regions[found.regionId];\n const widgets = region.widgets.filter((placement) => placement.widgetId !== widgetId);\n const closingEffectiveActive = region.activeWidgetId === widgetId || (!region.activeWidgetId && found.index === 0);\n const fallbackSubPanel =\n found.placement.role === \"sub-panel\"\n ? widgets.find(\n (placement) =>\n placement.role === \"sub-panel\" && placement.ownerResourceKey === found.placement.ownerResourceKey,\n )\n : undefined;\n const nextActivePlacement =\n fallbackSubPanel ??\n (found.placement.role === \"sub-panel\" && found.regionId === \"main\"\n ? getActiveLocationPlacement(layout)\n : (widgets[found.index] ?? widgets[found.index - 1]));\n const activeWidgetId = closingEffectiveActive ? nextActivePlacement?.widgetId : region.activeWidgetId;\n const nextRegion = { ...region, widgets, activeWidgetId };\n let nextLayout: WorkbenchLayout = removeLocationSubPanelSelection(\n {\n ...layout,\n activeLocationWidgetId:\n layout.activeLocationWidgetId === widgetId\n ? layout.regions.main.widgets\n .filter((placement) => placement.widgetId !== widgetId && isLocationPlacement(placement))\n .at(-1)?.widgetId\n : layout.activeLocationWidgetId,\n regions: {\n ...layout.regions,\n [region.id]: nextRegion,\n },\n },\n widgetId,\n );\n if (\n closingEffectiveActive &&\n found.regionId !== \"side\" &&\n workbenchPanelRegions.includes(found.regionId as WorkbenchPanelRegion)\n ) {\n nextLayout = setLocationSubPanelSelection(\n nextLayout,\n getActiveLocationPlacement(nextLayout),\n found.regionId as WorkbenchPanelRegion,\n nextActivePlacement?.role === \"sub-panel\" ? nextActivePlacement.widgetId : undefined,\n );\n }\n if (layout.activeWidgetId === widgetId) {\n nextLayout = {\n ...nextLayout,\n activeWidgetId: nextActivePlacement?.widgetId,\n activeResourceKey: nextActivePlacement?.resourceKey,\n };\n }\n return {\n regionId: found.regionId,\n closedPlacement: found.placement,\n activePlacement: getActivePlacement(nextRegion),\n layout: nextLayout,\n };\n};\nexport const activateInLayout = (\n layout: WorkbenchLayout,\n regionId: WorkbenchRegion,\n placement: WorkbenchWidgetPlacement,\n): WorkbenchLayout => {\n const region = layout.regions[regionId];\n if (regionId === \"main\" && isLocationPlacement(placement)) {\n const selections = layout.locationSubPanelSelections?.[locationWorkspaceKey(placement)] ?? {};\n const regions = Object.fromEntries(\n Object.entries(layout.regions).map(([id, panel]) => [\n id,\n {\n ...panel,\n widgets: panel.widgets.map((candidate) => {\n if (!placement.resource || candidate.widgetId === placement.widgetId) return candidate;\n if (candidate.ownerResourceKey !== placement.resourceKey) return candidate;\n if (candidate.resourceKey !== placement.resourceKey) return candidate;\n return { ...candidate, resource: placement.resource };\n }),\n },\n ]),\n ) as WorkbenchLayout[\"regions\"];\n for (const panelRegion of workbenchPanelRegions) {\n const panel = regions[panelRegion];\n const selectedId = selections[panelRegion];\n const selected = panel.widgets.find(\n (candidate) =>\n candidate.widgetId === selectedId &&\n candidate.role === \"sub-panel\" &&\n (!candidate.ownerResourceKey || candidate.ownerResourceKey === placement.resourceKey),\n );\n regions[panelRegion] = {\n ...panel,\n activeWidgetId:\n panelRegion === \"side\"\n ? panel.activeWidgetId\n : (selected?.widgetId ?? (panelRegion === \"main\" ? placement.widgetId : undefined)),\n };\n }\n return {\n ...layout,\n activeWidgetId: placement.widgetId,\n activeLocationWidgetId: placement.widgetId,\n activeResourceKey: placement.resourceKey,\n regions,\n };\n }\n const withSelection =\n placement.role === \"sub-panel\" &&\n regionId !== \"side\" &&\n workbenchPanelRegions.includes(regionId as WorkbenchPanelRegion)\n ? setLocationSubPanelSelection(\n layout,\n getActiveLocationPlacement(layout),\n regionId as WorkbenchPanelRegion,\n placement.widgetId,\n )\n : layout;\n return {\n ...withSelection,\n activeWidgetId: placement.widgetId,\n activeLocationWidgetId: layout.activeLocationWidgetId,\n activeResourceKey: placement.resourceKey,\n regions: {\n ...withSelection.regions,\n [regionId]: { ...region, activeWidgetId: placement.widgetId },\n },\n };\n};\n// Selects one widget as a region's active tab. In main the selected Location tab is the\n// active Location: panel menus, Sub Panel selections, and the primary resource all\n// follow it, so selecting a Location without moving it would leave them on the old\n// panel. Returns undefined when the selection is already current.\nexport const selectRegionActiveWidget = (\n layout: WorkbenchLayout,\n regionId: WorkbenchRegion,\n widgetId: string | undefined,\n) => {\n const region = layout.regions[regionId];\n const placement = widgetId ? region.widgets.find((candidate) => candidate.widgetId === widgetId) : undefined;\n if (widgetId && !placement) throw new Error(`Widget placement not found in ${regionId}: ${widgetId}`);\n if (region.activeWidgetId === widgetId) return undefined;\n const followsRegion = layout.activeWidgetId === region.activeWidgetId;\n const nextLayout: WorkbenchLayout = {\n ...layout,\n activeWidgetId: followsRegion ? placement?.widgetId : layout.activeWidgetId,\n activeResourceKey: followsRegion ? placement?.resourceKey : layout.activeResourceKey,\n activeLocationWidgetId:\n regionId === \"main\" && placement?.role === \"location\" ? placement.widgetId : layout.activeLocationWidgetId,\n regions: { ...layout.regions, [regionId]: { ...region, activeWidgetId: placement?.widgetId } },\n };\n if (regionId === \"side\" || !workbenchPanelRegions.includes(regionId as WorkbenchPanelRegion)) return nextLayout;\n return setLocationSubPanelSelection(\n nextLayout,\n getActiveLocationPlacement(nextLayout),\n regionId as WorkbenchPanelRegion,\n placement?.role === \"sub-panel\" ? placement.widgetId : undefined,\n );\n};\n","import { resourceKey } from \"@pstdio/sdk/extensions\";\nimport type { ResourceRef } from \"../resources/resource-registry\";\nimport { getActiveLocationPlacement } from \"./layout-operations\";\nimport type {\n RegisteredWidgetContribution,\n WorkbenchLayout,\n WorkbenchPanelRegion,\n WorkbenchWidgetPlacement,\n} from \"./layout-types\";\n\nconst supportsResource = (widget: RegisteredWidgetContribution, resource: ResourceRef | undefined) => {\n if (widget.resourceKinds?.length && (!resource || !widget.resourceKinds.includes(resource.type))) return false;\n if (widget.canOpen && (!resource || !widget.canOpen(resource))) return false;\n return true;\n};\nexport const getActiveWorkbenchSubPanel = (\n layout: WorkbenchLayout,\n region: WorkbenchPanelRegion,\n resource: ResourceRef | undefined,\n options: {\n ignoreOwnerResourceKey?: boolean;\n } = {},\n) => {\n const panel = layout.regions[region];\n return panel.widgets.find(\n (placement) =>\n placement.widgetId === panel.activeWidgetId &&\n placement.role === \"sub-panel\" &&\n (options.ignoreOwnerResourceKey ||\n !placement.ownerResourceKey ||\n placement.ownerResourceKey === resourceKey(resource)),\n );\n};\nexport const getActiveWorkbenchLocationPanel = (layout: WorkbenchLayout) => getActiveLocationPlacement(layout);\nconst matchesLocationEligibility = (\n widget: RegisteredWidgetContribution,\n resource: ResourceRef | undefined,\n modeId: string | undefined,\n placement?: WorkbenchWidgetPlacement,\n location?: WorkbenchWidgetPlacement,\n) => {\n const eligibleLocations = widget.eligibleLocations;\n if (!matchesWorkbenchModeEligibility(widget, modeId)) return false;\n if (\n eligibleLocations?.resourceKinds?.length &&\n (!resource || !eligibleLocations.resourceKinds.includes(resource.type))\n ) {\n return false;\n }\n if (\n eligibleLocations?.resourceIds?.length &&\n (!resource?.id || !eligibleLocations.resourceIds.includes(resource.id))\n ) {\n return false;\n }\n if (eligibleLocations?.canOpen && (!resource || !eligibleLocations.canOpen(resource))) return false;\n if (\n eligibleLocations?.canOpenLocation &&\n !eligibleLocations.canOpenLocation({ resource, viewId: location?.viewId })\n ) {\n return false;\n }\n if (placement?.ownerResourceKey && placement.ownerResourceKey !== resourceKey(resource)) return false;\n return true;\n};\nexport const matchesWorkbenchModeEligibility = (widget: RegisteredWidgetContribution, modeId: string | undefined) => {\n const eligibleModeIds = widget.eligibleLocations?.modeIds;\n return !eligibleModeIds?.length || (modeId !== undefined && eligibleModeIds.includes(modeId));\n};\nexport const isWorkbenchPanelPlacementVisible = (\n widget: RegisteredWidgetContribution,\n resource: ResourceRef | undefined,\n modeId: string | undefined,\n placement?: WorkbenchWidgetPlacement,\n options: {\n ignoreResourceLocation?: boolean;\n location?: WorkbenchWidgetPlacement;\n } = {},\n) => {\n if (!supportsResource(widget, placement?.resource ?? resource)) return false;\n if (options.ignoreResourceLocation) return matchesWorkbenchModeEligibility(widget, modeId);\n return matchesLocationEligibility(widget, resource, modeId, placement, options.location);\n};\nexport const matchesWorkbenchPanelMenuOwner = (\n widget: RegisteredWidgetContribution,\n context: {\n locationPanel?: WorkbenchWidgetPlacement;\n subPanel?: WorkbenchWidgetPlacement;\n },\n) => {\n const owner = widget.panelMenuOwner ?? { level: \"panel\" };\n if (owner.contributionId) {\n const activeOwner = context.subPanel ?? context.locationPanel;\n return activeOwner?.contributionId === owner.contributionId;\n }\n if (context.subPanel) {\n return owner.level === \"sub-panel\";\n }\n if (owner.level === \"panel\") {\n return true;\n }\n return false;\n};\n","export type ContributionSource = \"module\" | \"extension\";\n\nexport interface ContributionMetadata {\n source?: ContributionSource;\n ownerId?: string;\n priority?: number;\n}\n\nexport interface RegisteredContributionMetadata {\n source: ContributionSource;\n ownerId: string;\n priority: number;\n}\n\nconst defaultContributionOwnerId = \"workbench.core\";\n\nexport const normalizeContributionMetadata = (metadata: ContributionMetadata = {}) => ({\n source: metadata.source ?? \"module\",\n ownerId: metadata.ownerId ?? defaultContributionOwnerId,\n priority: metadata.priority ?? 0,\n});\n\nexport const byContributionPriority = (left: RegisteredContributionMetadata, right: RegisteredContributionMetadata) =>\n right.priority - left.priority || left.ownerId.localeCompare(right.ownerId);\n","import type {\n OpenWidgetInput,\n OpenWorkbenchPanelInput,\n RegisteredWidgetContribution,\n WorkbenchPanelContribution,\n WorkbenchPanelInstance,\n WorkbenchTabRetention,\n WorkbenchWidgetPlacement,\n} from \"./layout-types\";\n\n// Without a `defaultTabRetention` the retention of an existing placement is left alone,\n// so updating a panel's title never promotes a preview tab.\nexport const toOpenWidgetInput = (\n input: OpenWorkbenchPanelInput = {},\n defaultTabRetention?: WorkbenchTabRetention,\n): OpenWidgetInput => {\n const { strategy, ...shared } = input;\n const normalized = shared.resource && shared.viewId === undefined ? { ...shared, viewId: null } : shared;\n if (!strategy) return { ...normalized, tabRetention: defaultTabRetention };\n if (strategy.kind === \"persistent\") {\n return { ...normalized, tabPosition: strategy.position, tabRetention: \"persistent\" };\n }\n if (strategy.kind === \"replace-active\") return { ...normalized, replaceActive: true };\n if (strategy.kind === \"replace-panel\") {\n return { ...normalized, replaceWidgetId: strategy.instanceId, tabRetention: strategy.retention };\n }\n return { ...normalized, tabRetention: \"preview\", tabPosition: strategy.position };\n};\n\nexport const toPanelInstance = (placement: WorkbenchWidgetPlacement): WorkbenchPanelInstance => ({\n instanceId: placement.widgetId,\n panelId: placement.contributionId,\n placementIdentity: placement.placementIdentity,\n viewId: placement.viewId,\n ownerId: placement.ownerId,\n source: placement.source,\n resource: placement.resource,\n section: placement.section,\n resourceKey: placement.resourceKey,\n ownerResourceKey: placement.ownerResourceKey,\n title: placement.title,\n pinned: placement.pinned,\n closable: placement.closable === true,\n mountStrategy: placement.mountStrategy,\n hiddenByDefault: placement.hiddenByDefault,\n tabRetention: placement.tabRetention,\n tab: placement.tab,\n});\n\nexport const toPanelContribution = (widget: RegisteredWidgetContribution): WorkbenchPanelContribution => {\n const { closable: _closable, ownedPanelMenuIds: _ownedPanelMenuIds, ...panel } = widget;\n return panel;\n};\n","import type { Disposable } from \"../../shared/disposable\";\nimport { runWorkbenchEffect } from \"../../shared/workbench-effect\";\nimport {\n type WorkbenchLayout,\n type WorkbenchPanelRegion,\n type WorkbenchRegion,\n type WorkbenchWidgetPlacement,\n workbenchPanelRegions,\n} from \"../layout/layout-model\";\nimport type { WorkbenchModeActivationContext, WorkbenchModeContribution } from \"./mode-registry\";\n\nconst modePanelRegions = {\n main: [\"main-header\", \"main-left-menu\", \"main\", \"main-right-menu\"],\n secondary: [\"secondary-header\", \"secondary-left-menu\", \"secondary\", \"secondary-right-menu\"],\n side: [\"side-header\", \"side-left-menu\", \"side\", \"side-right-menu\"],\n} as const satisfies Record<WorkbenchPanelRegion, readonly WorkbenchRegion[]>;\n\nconst allModeRegions = Object.values(modePanelRegions).flat();\n\nexport const panelsForMode = (mode: WorkbenchModeContribution) => mode.panels ?? workbenchPanelRegions;\n\nexport const getWorkbenchModePanelForRegion = (region: WorkbenchRegion) =>\n (Object.keys(modePanelRegions) as WorkbenchPanelRegion[]).find((panel) =>\n modePanelRegions[panel].some((candidate) => candidate === region),\n );\n\nexport const isWorkbenchModePanelAvailable = (\n mode: WorkbenchModeContribution | undefined,\n panel: WorkbenchPanelRegion,\n) => !mode || panelsForMode(mode).includes(panel);\n\nconst placementById = (layout: WorkbenchLayout, widgetId: string | undefined) => {\n if (!widgetId) return undefined;\n return Object.values(layout.regions)\n .flatMap((region) => region.widgets)\n .find((placement) => placement.widgetId === widgetId);\n};\n\nconst withActivePlacement = (\n layout: WorkbenchLayout,\n candidates: readonly (WorkbenchWidgetPlacement | undefined)[],\n) => {\n const active = candidates.find((placement) => placement && placementById(layout, placement.widgetId));\n return {\n ...layout,\n activeWidgetId: active?.widgetId,\n activeResourceKey: active?.resourceKey,\n };\n};\n\nconst clearRegions = (layout: WorkbenchLayout, regionIds: readonly WorkbenchRegion[]) => {\n if (regionIds.length === 0) return layout;\n const clearedPanels = new Set(\n (Object.keys(modePanelRegions) as WorkbenchPanelRegion[]).filter((panel) =>\n modePanelRegions[panel].some((region) => regionIds.includes(region)),\n ),\n );\n const regionsNeedClearing = regionIds.some((regionId) => {\n const region = layout.regions[regionId];\n return region.widgets.length > 0 || region.activeWidgetId !== undefined || region.visible;\n });\n const selectionsNeedClearing = Object.values(layout.locationSubPanelSelections ?? {}).some((selections) =>\n Object.keys(selections).some((panel) => clearedPanels.has(panel as WorkbenchPanelRegion)),\n );\n if (!regionsNeedClearing && !selectionsNeedClearing) return layout;\n\n const regions = { ...layout.regions };\n for (const regionId of regionIds) {\n regions[regionId] = { ...regions[regionId], widgets: [], activeWidgetId: undefined, visible: false };\n }\n const locationSubPanelSelections = Object.fromEntries(\n Object.entries(layout.locationSubPanelSelections ?? {}).map(([resourceKey, selections]) => [\n resourceKey,\n Object.fromEntries(\n Object.entries(selections).filter(([panel]) => !clearedPanels.has(panel as WorkbenchPanelRegion)),\n ),\n ]),\n );\n const next = { ...layout, regions };\n return {\n ...withActivePlacement(next, [placementById(next, layout.activeWidgetId)]),\n activeLocationWidgetId: placementById(next, layout.activeLocationWidgetId)?.widgetId,\n locationSubPanelSelections,\n };\n};\n\nexport const applyModePanelAvailability = (layout: WorkbenchLayout, panels: readonly WorkbenchPanelRegion[]) => {\n const available = new Set(panels);\n const unavailableRegions = (Object.keys(modePanelRegions) as WorkbenchPanelRegion[])\n .filter((panel) => !available.has(panel))\n .flatMap((panel) => modePanelRegions[panel]);\n return clearRegions(layout, unavailableRegions);\n};\n\nexport const restoreUnscopedModeLayout = (\n current: WorkbenchLayout,\n saved: WorkbenchLayout | undefined,\n panels: readonly WorkbenchPanelRegion[],\n) => {\n if (!saved) {\n const regions = { ...current.regions };\n for (const regionId of allModeRegions) {\n const region = regions[regionId];\n const widgets = region.widgets.filter((placement) => placement.role !== \"content\");\n regions[regionId] = {\n ...region,\n widgets,\n activeWidgetId: widgets.some((placement) => placement.widgetId === region.activeWidgetId)\n ? region.activeWidgetId\n : undefined,\n };\n }\n const withoutModeContent = { ...current, regions };\n return applyModePanelAvailability(\n {\n ...withActivePlacement(withoutModeContent, [placementById(withoutModeContent, current.activeWidgetId)]),\n activeLocationWidgetId: placementById(withoutModeContent, current.activeLocationWidgetId)?.widgetId,\n },\n panels,\n );\n }\n\n const regions = { ...current.regions };\n for (const regionId of allModeRegions) regions[regionId] = saved.regions[regionId];\n const merged = applyModePanelAvailability({ ...current, regions }, panels);\n const savedActive = placementById(merged, saved.activeWidgetId);\n const currentActive = placementById(merged, current.activeWidgetId);\n return {\n ...withActivePlacement(merged, [savedActive, currentActive]),\n activeLocationWidgetId:\n placementById(merged, saved.activeLocationWidgetId)?.widgetId ??\n placementById(merged, current.activeLocationWidgetId)?.widgetId,\n locationSubPanelSelections: saved.locationSubPanelSelections,\n };\n};\n\nexport const disposeReverse = (disposables: readonly Disposable[]) => {\n for (let index = disposables.length - 1; index >= 0; index -= 1) {\n runWorkbenchEffect(\"mode disposal\", () => disposables[index]?.dispose());\n }\n};\n\nexport const restoreModeLayout = (context: WorkbenchModeActivationContext, layout: WorkbenchLayout) => {\n if (layout !== context.layout.getLayout()) context.layout.restoreLayout(layout);\n};\n","import type { ContextKeyService } from \"../../shared/context/context-key-service\";\nimport {\n byContributionPriority,\n type ContributionMetadata,\n normalizeContributionMetadata,\n type RegisteredContributionMetadata,\n} from \"../../shared/contributions/metadata\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport type { CommandRegistry } from \"../commands/command-registry\";\nimport type { NavigationTarget } from \"../navigation/navigation-registry\";\n\nexport interface Keybinding {\n /** Action the chord executes through the shared navigation executor. */\n action: NavigationTarget;\n keybinding: KeybindingSequence;\n when?: string;\n}\n\nexport type KeybindingSequence = string | string[];\n\nexport interface RegisteredKeybinding extends Keybinding, RegisteredContributionMetadata {}\n\ninterface KeybindingRegistryDeps {\n commands: CommandRegistry;\n context: ContextKeyService;\n}\n\nexport interface KeybindingRegistryStoreState {\n keybindings: RegisteredKeybinding[];\n}\n\nexport interface KeybindingRegistry {\n store: WorkbenchStore<KeybindingRegistryStoreState>;\n registerKeybinding(keybinding: Keybinding, metadata?: ContributionMetadata): Disposable;\n listKeybindings(): RegisteredKeybinding[];\n listActiveKeybindings(): RegisteredKeybinding[];\n /** Chords bound to plain command actions, for rendering shortcut hints beside commands. */\n listCommandKeybindings(): { commandId: string; keybinding: KeybindingSequence }[];\n}\n\nexport const getKeybindingSteps = (keybinding: KeybindingSequence) => {\n if (Array.isArray(keybinding)) return keybinding;\n\n return keybinding.trim().split(/\\s+/).filter(Boolean);\n};\n\nconst normalizeKeybindingSequence = (keybinding: KeybindingSequence): KeybindingSequence => {\n const steps = getKeybindingSteps(keybinding);\n return steps.length === 1 ? (steps[0] ?? \"\") : steps;\n};\n\nexport const createKeybindingRegistry = (deps: KeybindingRegistryDeps): KeybindingRegistry => {\n const store = createWorkbenchStore<KeybindingRegistryStoreState>({\n name: \"workbench.keybindings\",\n initialState: { keybindings: [] },\n });\n\n return {\n store,\n\n registerKeybinding(keybinding, metadata) {\n if (keybinding.action.kind === \"command\" && !deps.commands.getCommand(keybinding.action.commandId)) {\n throw new Error(`Keybinding command not registered: ${keybinding.action.commandId}`);\n }\n\n const record: RegisteredKeybinding = {\n ...normalizeContributionMetadata(metadata),\n ...keybinding,\n keybinding: normalizeKeybindingSequence(keybinding.keybinding),\n };\n\n const snapshot = store.getState();\n store.setState({ keybindings: [...snapshot.keybindings, record] }, false, \"registerKeybinding\");\n\n return createDisposable(() => {\n const current = store.getState();\n const next = current.keybindings.filter((candidate) => candidate !== record);\n if (next.length === current.keybindings.length) return;\n store.setState({ keybindings: next }, false, \"unregisterKeybinding\");\n });\n },\n\n listKeybindings() {\n return [...store.getState().keybindings].sort(byContributionPriority);\n },\n\n listActiveKeybindings() {\n return store\n .getState()\n .keybindings.filter((keybinding) => deps.context.matches(keybinding.when))\n .sort(byContributionPriority);\n },\n\n listCommandKeybindings() {\n return [...store.getState().keybindings]\n .sort(byContributionPriority)\n .flatMap((record) =>\n record.action.kind === \"command\"\n ? [{ commandId: record.action.commandId, keybinding: record.keybinding }]\n : [],\n );\n },\n };\n};\n","import { type WorkbenchRegion, workbenchRegions } from \"./layout-types\";\n\n// The surface map describes the *behavioural* role of each workbench region: which\n// regions host a resource (anchors), which render an anchor's resource (projections),\n// and which are frame chrome or the transient overlay layer. The project scope root is\n// not a surface; it is handled by the layout persistence scope.\n\n// Logical anchor identity, independent of the region id that currently hosts it.\nexport type AnchorId = \"primary\" | \"secondary\" | \"attached\";\n\n// Does an anchor's active selection survive a primary change?\n// - primary: the subject itself.\n// - derived: re-scopes/clears on primary change (terminals follow the workspace).\n// - detached: persists across primary navigation, but disconnects when the new\n// primary's scoped candidates no longer list it (scope wins).\nexport type AnchorPersistence = \"primary\" | \"derived\" | \"detached\";\n\n// What the anchor's quick-pick offers: everything, or filtered by primary.\nexport type AnchorCandidates = \"global\" | \"scoped\";\n\n// Which anchor(s) a projection renders.\nexport type AnchorReadId = AnchorId;\n\nexport interface AnchorSurface {\n role: \"anchor\";\n anchor: AnchorId;\n persistence: AnchorPersistence;\n candidates: AnchorCandidates;\n}\n\nexport interface ProjectionSurface {\n role: \"projection\";\n reads: AnchorReadId[];\n // The sidenav navigator both reads primary (highlight) and selects it (the picker).\n navigator?: boolean;\n}\n\nexport interface ChromeSurface {\n role: \"chrome\";\n}\n\nexport interface TransientSurface {\n role: \"transient\";\n}\n\nexport type SurfaceDescriptor = AnchorSurface | ProjectionSurface | ChromeSurface | TransientSurface;\n\nconst anchor = (anchor: AnchorId, persistence: AnchorPersistence, candidates: AnchorCandidates): AnchorSurface => ({\n role: \"anchor\",\n anchor,\n persistence,\n candidates,\n});\n\nconst projection = (reads: AnchorReadId[], navigator = false): ProjectionSurface =>\n navigator ? { role: \"projection\", reads, navigator } : { role: \"projection\", reads };\n\nconst chrome: ChromeSurface = { role: \"chrome\" };\nconst transient: TransientSurface = { role: \"transient\" };\n\nexport const surfaceMap: Record<WorkbenchRegion, SurfaceDescriptor> = {\n // The top bar hosts breadcrumbs (primary trail) and session status (attached), so it\n // reads both anchors — it is a projection, not inert chrome.\n nav: projection([\"primary\", \"attached\"]),\n activity: chrome,\n sidenav: projection([\"primary\"], true),\n \"main-header\": projection([\"primary\"]),\n \"main-left-menu\": projection([\"primary\"]),\n main: anchor(\"primary\", \"primary\", \"global\"),\n \"main-right-menu\": projection([\"primary\"]),\n \"secondary-header\": projection([\"primary\"]),\n \"secondary-left-menu\": projection([\"secondary\"]),\n secondary: anchor(\"secondary\", \"derived\", \"scoped\"),\n \"secondary-right-menu\": projection([\"secondary\"]),\n status: projection([\"primary\", \"attached\"]),\n overlay: transient,\n \"side-header\": projection([\"attached\"]),\n \"side-left-menu\": projection([\"attached\"]),\n side: anchor(\"attached\", \"detached\", \"scoped\"),\n \"side-right-menu\": projection([\"attached\"]),\n};\n\nexport const getSurface = (region: WorkbenchRegion) => surfaceMap[region];\n\nexport const listAnchorRegions = () =>\n workbenchRegions.filter((region): region is WorkbenchRegion => surfaceMap[region].role === \"anchor\");\n\nexport const listProjectionRegions = () =>\n workbenchRegions.filter((region): region is WorkbenchRegion => surfaceMap[region].role === \"projection\");\n\nexport const listProjectionsReading = (anchorId: AnchorReadId) =>\n workbenchRegions.filter((region) => {\n const surface = surfaceMap[region];\n return surface.role === \"projection\" && surface.reads.includes(anchorId);\n });\n\n// Reverse lookup: which region currently hosts a given logical anchor.\nexport const resolveAnchorRegion = (anchorId: AnchorId) => {\n const region = workbenchRegions.find((candidate) => {\n const surface = surfaceMap[candidate];\n return surface.role === \"anchor\" && surface.anchor === anchorId;\n });\n if (!region) throw new Error(`No region hosts anchor: ${anchorId}`);\n return region;\n};\n","import type { ResourceRef } from \"../resources/resource-registry\";\nimport { getActivePlacement } from \"./layout-operations\";\nimport type { WorkbenchLayout, WorkbenchRegion } from \"./layout-types\";\nimport { type AnchorId, getSurface, listAnchorRegions, resolveAnchorRegion } from \"./surface-map\";\n\n// The resource an anchor currently hosts, read from its region's active placement. This\n// is the primary-scoped signal the coordinator keys off — `getAnchorResource(layout,\n// \"primary\")` is the main resource, free of the global active-resource pollution that\n// any side-region activation otherwise introduces.\nexport const getAnchorResource = (layout: WorkbenchLayout, anchorId: AnchorId) =>\n getActivePlacement(layout.regions[resolveAnchorRegion(anchorId)])?.resource;\n\n// What the coordinator should do with a secondary anchor when the primary resource\n// changes. Projections re-render off their anchor (a render concern), so the reconciler\n// only decides the lifecycle of the derived/detached anchor placements.\nexport type AnchorReconcileAction = { region: WorkbenchRegion; action: \"keep\" | \"clear\" };\n\nexport interface ReconcileAnchorsInput {\n layout: WorkbenchLayout;\n primary: ResourceRef | undefined;\n // Whether a detached anchor's current resource still belongs to the new primary's\n // scoped candidates. Backed by scoped resource providers once wired.\n isInScope: (resource: ResourceRef, primary: ResourceRef | undefined) => boolean;\n}\n\n// On a primary change: derived anchors re-scope (clear, then repopulate from the new\n// scope); detached anchors stay while their resource is still in scope, else disconnect\n// (scope wins). The primary anchor is the subject and is never reconciled.\nexport const reconcileAnchors = ({ layout, primary, isInScope }: ReconcileAnchorsInput): AnchorReconcileAction[] => {\n const actions: AnchorReconcileAction[] = [];\n\n for (const region of listAnchorRegions()) {\n const surface = getSurface(region);\n if (surface.role !== \"anchor\" || surface.persistence === \"primary\") continue;\n\n // Only resource-bearing anchor placements are scoped content. A plain (resourceless)\n // widget parked in a side anchor is not a scoped resource and is left untouched.\n const placement = getActivePlacement(layout.regions[region]);\n if (!placement?.resource) continue;\n\n // Sub Panels are subordinate to their Location workspace. A Location switch\n // changes which placement is selected and rendered; it must not delete the\n // placements retained for the Location that is leaving the foreground.\n if (placement.role === \"sub-panel\" && placement.ownerResourceKey) {\n actions.push({ region, action: \"keep\" });\n continue;\n }\n\n if (surface.persistence === \"derived\") {\n actions.push({ region, action: \"clear\" });\n continue;\n }\n\n actions.push({ region, action: isInScope(placement.resource, primary) ? \"keep\" : \"clear\" });\n }\n\n return actions;\n};\n","export const standardResourceIcons = {\n project: \"folder-root\",\n workspace: \"computer\",\n worktree: \"git-pull-request-draft\",\n settings: \"settings\",\n kanbanRenderer: \"table-properties\",\n} as const;\n\nexport type StandardResourceIcon = (typeof standardResourceIcons)[keyof typeof standardResourceIcons];\n","import { resourceKey } from \"@pstdio/sdk/extensions\";\nimport type { ResourceRef } from \"./resource-registry\";\nexport interface WorkbenchViewHierarchyNode {\n type: \"view\";\n viewId: string;\n label?: string;\n icon?: string;\n}\nexport type WorkbenchHierarchyNode = ResourceRef | WorkbenchViewHierarchyNode;\nexport const isWorkbenchViewHierarchyNode = (node: WorkbenchHierarchyNode): node is WorkbenchViewHierarchyNode =>\n \"viewId\" in node && node.type === \"view\";\n// Hierarchy comes from resource identity: providers resolve a resource's parent,\n// and the walk below turns those edges into the root-to-leaf breadcrumb path.\nexport interface ResourceHierarchyProvider {\n id: string;\n priority?: number;\n canResolve(resource: ResourceRef): boolean;\n getParent(resource: ResourceRef): WorkbenchHierarchyNode | undefined;\n}\nexport type ResolvedResourceHierarchyProvider = Required<ResourceHierarchyProvider>;\nexport const resourceHierarchyCycleCode = \"resource_hierarchy_cycle\";\n// Emitted when parent resolution repeats a resource URI. Traversal keeps the\n// acyclic root-to-leaf prefix, so consumers such as breadcrumbs stay usable\n// while the faulty provider is diagnosed.\nexport interface ResourceHierarchyCycle {\n code: typeof resourceHierarchyCycleCode;\n path: WorkbenchHierarchyNode[];\n repeatedUri: string;\n}\nexport const sortHierarchyProviders = (providers: ResolvedResourceHierarchyProvider[]) =>\n [...providers].sort((left, right) => right.priority - left.priority || left.id.localeCompare(right.id));\nexport const walkResourceHierarchy = (\n providers: ResolvedResourceHierarchyProvider[],\n resource: ResourceRef,\n notifyCycle: (cycle: ResourceHierarchyCycle) => void,\n) => {\n const sorted = sortHierarchyProviders(providers);\n const path: WorkbenchHierarchyNode[] = [resource];\n const visitedKeys = new Set([`resource:${resourceKey(resource)}`]);\n let current = resource;\n while (true) {\n const provider = sorted.find((candidate) => candidate.canResolve(current));\n const parent = provider?.getParent(current);\n if (!parent) break;\n const parentKey = isWorkbenchViewHierarchyNode(parent)\n ? `view:${parent.viewId}`\n : `resource:${resourceKey(parent)}`;\n if (visitedKeys.has(parentKey)) {\n // A repeated URI means the providers formed a cycle. Keep the acyclic\n // prefix and surface the fault instead of looping or dropping the path.\n notifyCycle({\n code: resourceHierarchyCycleCode,\n path: [...path],\n repeatedUri: isWorkbenchViewHierarchyNode(parent) ? parentKey : resourceKey(parent),\n });\n break;\n }\n path.unshift(parent);\n visitedKeys.add(parentKey);\n if (isWorkbenchViewHierarchyNode(parent)) break;\n current = parent;\n }\n return path;\n};\n","import type { ResourceRef } from \"@pstdio/sdk/extensions\";\n\nexport type { ResourceRef } from \"@pstdio/sdk/extensions\";\n\nimport { resourceKey } from \"@pstdio/sdk/extensions\";\nimport type { ContextKeyValue } from \"../../shared/context/context-key-service\";\nimport {\n byContributionPriority,\n type ContributionMetadata,\n normalizeContributionMetadata,\n type RegisteredContributionMetadata,\n} from \"../../shared/contributions/metadata\";\nimport { createDisposable, type Disposable } from \"../../shared/disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../../shared/store/workbench-store\";\nimport {\n isWorkbenchViewHierarchyNode,\n type ResolvedResourceHierarchyProvider,\n type ResourceHierarchyCycle,\n type ResourceHierarchyProvider,\n sortHierarchyProviders,\n type WorkbenchHierarchyNode,\n walkResourceHierarchy,\n} from \"./resource-hierarchy\";\n\nexport type {\n ResolvedResourceHierarchyProvider,\n ResourceHierarchyCycle,\n ResourceHierarchyProvider,\n WorkbenchHierarchyNode,\n WorkbenchViewHierarchyNode,\n} from \"./resource-hierarchy\";\nexport { isWorkbenchViewHierarchyNode, resourceHierarchyCycleCode } from \"./resource-hierarchy\";\n\nexport const workbenchResourceTypeContextKey = \"workbench.resource.type\";\nexport const workbenchResourceIdContextKey = \"workbench.resource.id\";\nexport const workbenchResourceMetadataContextKey = (key: string) => `workbench.resource.metadata.${key}`;\nexport const workbenchSelectionResourceKeyMetadataKey = \"workbench.selectionResourceKey\";\nconst isContextPrimitive = (value: unknown): value is Exclude<ContextKeyValue, undefined> =>\n typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\";\nexport const createWorkbenchResourceContextValues = (resource: ResourceRef | undefined) => {\n if (!resource) return {};\n const values: Record<string, ContextKeyValue> = {\n [workbenchResourceTypeContextKey]: resource.type,\n [workbenchResourceIdContextKey]: resource.id,\n };\n for (const [key, value] of Object.entries(resource.metadata ?? {})) {\n if (isContextPrimitive(value)) values[workbenchResourceMetadataContextKey(key)] = value;\n }\n return values;\n};\nexport const createWorkbenchSelectionResourceMetadata = (resource: ResourceRef) => ({\n [workbenchSelectionResourceKeyMetadataKey]: resourceKey(resource),\n});\nexport const getWorkbenchSelectionResourceKeys = (resource: ResourceRef | undefined) => {\n if (!resource) return [];\n const selectionResourceKey = resource.metadata?.[workbenchSelectionResourceKeyMetadataKey];\n if (typeof selectionResourceKey !== \"string\" || selectionResourceKey === resourceKey(resource))\n return [resourceKey(resource)];\n return [resourceKey(resource), selectionResourceKey];\n};\nexport interface ResourceKindContribution {\n kind: string;\n label: string;\n icon?: string;\n}\nexport interface RegisteredResourceKind extends ResourceKindContribution, RegisteredContributionMetadata {}\nexport interface ResourceBrowseEntry {\n resource: ResourceRef;\n searchText?: string;\n description?: string;\n group?: string;\n order?: number;\n activate?: (resource: ResourceRef) => unknown | Promise<unknown>;\n}\n// Context handed to providers so candidate lists can be scoped to the current surface\n// hierarchy — e.g. only the sessions/terminals belonging to the active primary resource.\nexport interface ResourceListContext {\n primary?: ResourceRef;\n}\nexport interface ResourceProvider {\n id: string;\n kind: string;\n list(query: string, context: ResourceListContext): readonly ResourceBrowseEntry[];\n}\nexport interface ResourceRegistryStoreState {\n kinds: Record<string, RegisteredResourceKind>;\n providers: Record<string, ResourceProvider>;\n hierarchyProviders: Record<string, ResolvedResourceHierarchyProvider>;\n}\nexport interface ResourceRegistry {\n store: WorkbenchStore<ResourceRegistryStoreState>;\n registerKind(kind: ResourceKindContribution, metadata?: ContributionMetadata): Disposable;\n getKind(kind: string): RegisteredResourceKind | undefined;\n listKinds(): RegisteredResourceKind[];\n registerProvider(provider: ResourceProvider): Disposable;\n listProviders(): ResourceProvider[];\n listResources(query: string): readonly ResourceBrowseEntry[];\n registerHierarchyProvider(provider: ResourceHierarchyProvider): Disposable;\n listHierarchyProviders(): ResolvedResourceHierarchyProvider[];\n walkHierarchy(resource: ResourceRef | undefined): WorkbenchHierarchyNode[];\n onDidDetectHierarchyCycle(listener: (cycle: ResourceHierarchyCycle) => void): Disposable;\n}\nexport interface CreateResourceRegistryInput {\n // Resolves the active primary resource so listResources can scope provider candidates.\n getPrimary?: () => ResourceRef | undefined;\n resolveView?: (viewId: string) =>\n | {\n label?: string;\n icon?: string;\n }\n | undefined;\n}\nexport const createResourceRegistry = (input: CreateResourceRegistryInput = {}): ResourceRegistry => {\n const cycleListeners = new Set<(cycle: ResourceHierarchyCycle) => void>();\n const store = createWorkbenchStore<ResourceRegistryStoreState>({\n name: \"workbench.resources\",\n initialState: { kinds: {}, providers: {}, hierarchyProviders: {} },\n });\n return {\n store,\n registerKind(kind, metadata) {\n const snapshot = store.getState();\n if (snapshot.kinds[kind.kind]) throw new Error(`Resource kind already registered: ${kind.kind}`);\n const record: RegisteredResourceKind = {\n ...normalizeContributionMetadata(metadata),\n ...kind,\n };\n store.setState({ ...snapshot, kinds: { ...snapshot.kinds, [kind.kind]: record } }, false, \"registerKind\");\n return createDisposable(() => {\n const current = store.getState();\n if (current.kinds[kind.kind] !== record) return;\n const { [kind.kind]: _removed, ...rest } = current.kinds;\n store.setState({ ...current, kinds: rest }, false, \"unregisterKind\");\n });\n },\n getKind(kind) {\n return store.getState().kinds[kind];\n },\n listKinds() {\n return Object.values(store.getState().kinds).sort(byContributionPriority);\n },\n registerProvider(provider) {\n const snapshot = store.getState();\n if (snapshot.providers[provider.id]) throw new Error(`Resource provider already registered: ${provider.id}`);\n store.setState(\n { ...snapshot, providers: { ...snapshot.providers, [provider.id]: provider } },\n false,\n \"registerProvider\",\n );\n return createDisposable(() => {\n const current = store.getState();\n if (current.providers[provider.id] !== provider) return;\n const { [provider.id]: _removed, ...rest } = current.providers;\n store.setState({ ...current, providers: rest }, false, \"unregisterProvider\");\n });\n },\n listProviders() {\n return Object.values(store.getState().providers);\n },\n listResources(query) {\n const context: ResourceListContext = { primary: input.getPrimary?.() };\n const entries: ResourceBrowseEntry[] = [];\n for (const provider of Object.values(store.getState().providers)) {\n entries.push(...provider.list(query, context));\n }\n return entries;\n },\n registerHierarchyProvider(provider) {\n const snapshot = store.getState();\n if (snapshot.hierarchyProviders[provider.id]) {\n throw new Error(`Resource hierarchy provider already registered: ${provider.id}`);\n }\n const record: ResolvedResourceHierarchyProvider = { ...provider, priority: provider.priority ?? 0 };\n store.setState(\n {\n ...snapshot,\n hierarchyProviders: { ...snapshot.hierarchyProviders, [provider.id]: record },\n },\n false,\n \"registerHierarchyProvider\",\n );\n return createDisposable(() => {\n const current = store.getState();\n if (current.hierarchyProviders[provider.id] !== record) return;\n const { [provider.id]: _removed, ...rest } = current.hierarchyProviders;\n store.setState({ ...current, hierarchyProviders: rest }, false, \"unregisterHierarchyProvider\");\n });\n },\n listHierarchyProviders() {\n return sortHierarchyProviders(Object.values(store.getState().hierarchyProviders));\n },\n walkHierarchy(resource) {\n if (!resource) return [];\n const path = walkResourceHierarchy(Object.values(store.getState().hierarchyProviders), resource, (cycle) => {\n for (const listener of cycleListeners) listener(cycle);\n });\n return path.map((node) => {\n if (!isWorkbenchViewHierarchyNode(node)) return node;\n const view = input.resolveView?.(node.viewId);\n return view ? { ...node, label: view.label, icon: view.icon } : node;\n });\n },\n onDidDetectHierarchyCycle(listener) {\n cycleListeners.add(listener);\n return createDisposable(() => {\n cycleListeners.delete(listener);\n });\n },\n };\n};\n","import type { Disposable } from \"../disposable\";\nimport { createWorkbenchStore, type WorkbenchStore } from \"../store/workbench-store\";\n\nexport type ContextKeyValue = boolean | number | string | undefined;\n\nexport interface ContextKeyStoreState {\n values: Record<string, ContextKeyValue>;\n}\n\nexport interface ContextKeyScope extends Disposable {\n ownerId: string;\n set(key: string, value: ContextKeyValue): void;\n get(key: string): ContextKeyValue;\n delete(key: string): void;\n}\n\nexport interface ContextKeyService {\n store: WorkbenchStore<ContextKeyStoreState>;\n set(key: string, value: ContextKeyValue): void;\n get(key: string): ContextKeyValue;\n delete(key: string): void;\n createScope(ownerId: string): ContextKeyScope;\n deleteOwner(ownerId: string): void;\n snapshot(): Record<string, ContextKeyValue>;\n matches(expression?: string): boolean;\n}\n\nconst readComparisonValue = (value: string) => value.replace(/^['\"]|['\"]$/g, \"\");\n\nconst matchesTerm = (values: Record<string, ContextKeyValue>, term: string) => {\n const trimmed = term.trim();\n if (trimmed.length === 0) return true;\n\n const comparison = trimmed.match(/^([A-Za-z0-9_.-]+)\\s*(==|!=)\\s*(.+)$/);\n if (comparison) {\n const [, key, operator, rawValue] = comparison;\n const actual = values[key ?? \"\"];\n const expected = readComparisonValue(rawValue ?? \"\");\n return operator === \"==\" ? String(actual) === expected : String(actual) !== expected;\n }\n\n if (trimmed.startsWith(\"!\")) return !values[trimmed.slice(1)];\n\n return Boolean(values[trimmed]);\n};\n\nexport const matchesContextExpression = (values: Record<string, ContextKeyValue>, expression?: string) => {\n if (!expression) return true;\n return expression.split(\"||\").some((orClause) => orClause.split(\"&&\").every((term) => matchesTerm(values, term)));\n};\n\nexport const createContextKeyService = (): ContextKeyService => {\n const store = createWorkbenchStore<ContextKeyStoreState>({\n name: \"workbench.context\",\n initialState: { values: {} },\n });\n\n let globalValues: Record<string, ContextKeyValue> = {};\n const ownerValues = new Map<string, Record<string, ContextKeyValue>>();\n\n const buildValues = () => {\n const values = { ...globalValues };\n for (const scopedValues of ownerValues.values()) Object.assign(values, scopedValues);\n return values;\n };\n\n const publish = (action: string) => {\n store.setState({ values: buildValues() }, false, action);\n };\n\n return {\n store,\n\n set(key, value) {\n if (globalValues[key] === value) return;\n globalValues = { ...globalValues, [key]: value };\n publish(\"setContextKey\");\n },\n\n get(key) {\n return store.getState().values[key];\n },\n\n delete(key) {\n if (!(key in globalValues)) return;\n const { [key]: _removed, ...rest } = globalValues;\n globalValues = rest;\n publish(\"deleteContextKey\");\n },\n\n createScope(ownerId) {\n ownerValues.set(ownerId, ownerValues.get(ownerId) ?? {});\n let disposed = false;\n\n const assertActive = () => {\n if (disposed) throw new Error(`Context key scope disposed: ${ownerId}`);\n };\n\n return {\n ownerId,\n\n set(key, value) {\n assertActive();\n const values = ownerValues.get(ownerId) ?? {};\n if (values[key] === value) return;\n ownerValues.set(ownerId, { ...values, [key]: value });\n publish(\"setScopedContextKey\");\n },\n\n get(key) {\n assertActive();\n return ownerValues.get(ownerId)?.[key];\n },\n\n delete(key) {\n assertActive();\n const values = ownerValues.get(ownerId);\n if (!values || !(key in values)) return;\n const { [key]: _removed, ...rest } = values;\n ownerValues.set(ownerId, rest);\n publish(\"deleteScopedContextKey\");\n },\n\n dispose() {\n if (disposed) return;\n disposed = true;\n if (!ownerValues.delete(ownerId)) return;\n publish(\"disposeContextKeyScope\");\n },\n };\n },\n\n deleteOwner(ownerId) {\n if (!ownerValues.delete(ownerId)) return;\n publish(\"deleteContextKeyOwner\");\n },\n\n snapshot() {\n return { ...store.getState().values };\n },\n\n matches(expression) {\n return matchesContextExpression(store.getState().values, expression);\n },\n };\n};\n","import type { WorkbenchCore, WorkbenchRenderers } from \"./workbench-core-types\";\n\nconst renderersByWorkbench = new WeakMap<WorkbenchCore, WorkbenchRenderers>();\n\nexport const setWorkbenchRenderers = (workbench: WorkbenchCore, renderers: WorkbenchRenderers) => {\n renderersByWorkbench.set(workbench, renderers);\n};\n\nexport const getWorkbenchRenderers = (workbench: WorkbenchCore) => {\n const renderers = renderersByWorkbench.get(workbench);\n if (!renderers) throw new Error(\"Workbench renderers are not initialized\");\n return renderers;\n};\n"],"names":["createDisposable","onDispose","disposed","dispose","runWorkbenchEffect","owner","effect","error","console","depth","pending","Map","notifyWorkbenchChange","notify","has","set","batchWorkbenchChanges","commit","size","entries","next","value","delete","defaultEquality","left","right","Object","is","createWorkbenchStore","input","api","createStore","devtools","initialState","name","subscribe","listener","_state","previous","getState","subscribeSelector","selector","options","equalityFn","previousValue","fireImmediately","state","nextValue","getInitialState","setState","workbenchRegions","workbenchPanelRegions","workbenchPanelMenuRegions","main","secondary","side","workbenchPanelByMenuRegion","getWorkbenchPanelForMenuRegion","region","resolveUniqueWidgetId","widgetIds","contributionId","preferredId","suffix","findPlacement","layout","values","regions","index","widgets","findIndex","candidate","regionId","id","placement","findResourcePlacement","resourceKey","findPlacementByWidgetId","widgetId","createUniqueWidgetId","Set","flatMap","map","getActivePlacement","find","activeWidgetId","isLocationPlacement","role","locationWorkspaceKey","setLocationSubPanelSelection","location","key","locationSubPanelSelections","current","removeLocationSubPanelSelection","fromEntries","selections","filter","selectedId","getActiveLocationPlacement","locations","activeLocationWidgetId","at","replaceRegionWidgets","update","undefined","clearActiveWidget","some","removePlacementsForContribution","nextLayout","removed","filtered","length","hasActiveWidget","startsWith","activeResourceKey","closeWidgetInLayout","found","closingEffectiveActive","nextActivePlacement","ownerResourceKey","nextRegion","includes","closedPlacement","activePlacement","activateInLayout","panel","resource","panelRegion","selected","withSelection","selectRegionActiveWidget","Error","followsRegion","supportsResource","widget","resourceKinds","type","canOpen","getActiveWorkbenchSubPanel","ignoreOwnerResourceKey","getActiveWorkbenchLocationPanel","matchesLocationEligibility","modeId","eligibleLocations","matchesWorkbenchModeEligibility","resourceIds","canOpenLocation","viewId","eligibleModeIds","modeIds","isWorkbenchPanelPlacementVisible","ignoreResourceLocation","matchesWorkbenchPanelMenuOwner","context","panelMenuOwner","level","subPanel","locationPanel","defaultContributionOwnerId","normalizeContributionMetadata","metadata","source","ownerId","priority","byContributionPriority","localeCompare","toOpenWidgetInput","defaultTabRetention","strategy","shared","normalized","kind","tabPosition","position","tabRetention","replaceActive","replaceWidgetId","instanceId","retention","toPanelInstance","panelId","placementIdentity","section","title","pinned","closable","mountStrategy","hiddenByDefault","tab","toPanelContribution","_closable","ownedPanelMenuIds","_ownedPanelMenuIds","modePanelRegions","allModeRegions","flat","panelsForMode","mode","panels","getWorkbenchModePanelForRegion","keys","isWorkbenchModePanelAvailable","placementById","withActivePlacement","candidates","active","clearRegions","regionIds","clearedPanels","regionsNeedClearing","visible","selectionsNeedClearing","applyModePanelAvailability","available","unavailableRegions","restoreUnscopedModeLayout","saved","withoutModeContent","merged","savedActive","currentActive","disposeReverse","disposables","restoreModeLayout","getLayout","restoreLayout","getKeybindingSteps","keybinding","Array","isArray","trim","split","Boolean","normalizeKeybindingSequence","steps","createKeybindingRegistry","deps","store","keybindings","registerKeybinding","action","commands","getCommand","commandId","record","snapshot","listKeybindings","sort","listActiveKeybindings","matches","when","listCommandKeybindings","anchor","persistence","projection","reads","navigator","chrome","transient","surfaceMap","nav","activity","sidenav","status","overlay","getSurface","listAnchorRegions","resolveAnchorRegion","anchorId","surface","getAnchorResource","reconcileAnchors","primary","isInScope","actions","push","standardResourceIcons","project","workspace","worktree","settings","kanbanRenderer","isWorkbenchViewHierarchyNode","node","resourceHierarchyCycleCode","sortHierarchyProviders","providers","walkResourceHierarchy","notifyCycle","sorted","path","visitedKeys","parent","canResolve","getParent","parentKey","code","repeatedUri","unshift","add","workbenchResourceTypeContextKey","workbenchResourceIdContextKey","workbenchResourceMetadataContextKey","workbenchSelectionResourceKeyMetadataKey","isContextPrimitive","createWorkbenchResourceContextValues","createWorkbenchSelectionResourceMetadata","getWorkbenchSelectionResourceKeys","selectionResourceKey","createResourceRegistry","cycleListeners","kinds","hierarchyProviders","registerKind","_removed","rest","getKind","listKinds","registerProvider","provider","listProviders","listResources","query","getPrimary","list","registerHierarchyProvider","listHierarchyProviders","walkHierarchy","cycle","view","resolveView","label","icon","onDidDetectHierarchyCycle","readComparisonValue","replace","matchesTerm","term","trimmed","comparison","match","operator","rawValue","actual","expected","String","slice","matchesContextExpression","expression","orClause","every","createContextKeyService","globalValues","ownerValues","buildValues","scopedValues","assign","publish","get","createScope","assertActive","deleteOwner","renderersByWorkbench","WeakMap","setWorkbenchRenderers","workbench","renderers","getWorkbenchRenderers"],"mappings":";;;AAIO,MAAMA,IAAmBA,CAACC,MAAsC;AACrE,MAAIC,IAAW;AAEf,SAAO;AAAA,IACLC,UAAU;AACR,MAAID,MACJA,IAAW,IACXD,EAAAA;AAAAA,IACF;AAAA,EAAA;AAEJ;ACbO,SAASG,EAA2BC,GAAeC,GAAsB;AAC9E,MAAI;AACF,WAAOA,EAAAA;AAAAA,EACT,SAASC,GAAO;AACdC,YAAQD,MAAM,4BAA4BF,CAAK,KAAKE,CAAK;AACzD;AAAA,EACF;AACF;ACNA,IAAIE,IAAQ;AACZ,MAAMC,wBAAcC,IAAAA,GAEPC,IAAwBA,CAACP,GAAeQ,MAAuB;AAC1E,MAAIJ,MAAU,GAAG;AACfL,IAAAA,EAAmB,oBAAoBS,CAAM;AAC7C;AAAA,EACF;AACA,EAAKH,EAAQI,IAAIT,CAAK,KAAGK,EAAQK,IAAIV,GAAOQ,CAAM;AACpD,GAGaG,KAAwB,CAASC,MAAyB;AACrER,EAAAA;AACA,MAAI;AACF,WAAOQ,EAAAA;AAAAA,EACT,UAAA;AAEE,QADAR,KACIA,MAAU,GAAG;AACfA,MAAAA;AACA,UAAI;AACF,eAAOC,EAAQQ,QAAM;AACnB,gBAAM,CAACb,GAAOQ,CAAM,IAAIH,EAAQS,QAAAA,EAAUC,OAAOC;AACjDX,UAAAA,EAAQY,OAAOjB,CAAK,GACpBD,EAAmB,oBAAoBS,CAAM;AAAA,QAC/C;AAAA,MACF,UAAA;AACEJ,QAAAA;AAAAA,MACF;AAAA,IACF;AAAA,EACF;AACF,GCFMc,IAAkB,CAASC,GAAcC,MAAkBC,OAAOC,GAAGH,GAAMC,CAAK,GAEzEG,IAAuB,CAClCC,MACmC;AACnC,QAAMC,IAAMC,EAAAA,EAAsBC,EAAS,MAAMH,EAAMI,cAAc;AAAA,IAAEC,MAAML,EAAMK,QAAQ;AAAA,EAAA,CAAmB,CAAC,GAEzGC,IAAkDC,CAAAA,MAAa;AACnE,UAAM/B,IAAQ,CAAA;AACd,WAAOyB,EAAIK,UAAU,CAACE,GAAQC,MAAa1B,EAAsBP,GAAO,MAAM+B,EAASN,EAAIS,SAAAA,GAAYD,CAAQ,CAAC,CAAC;AAAA,EACnH,GAEME,IAAiEA,CAACC,GAAUL,GAAUM,IAAU,CAAA,MAAO;AAC3G,UAAMC,IAAaD,EAAQC,cAAcpB;AACzC,QAAIqB,IAAgBH,EAASX,EAAIS,SAAAA,CAAU;AAE3C,WAAIG,EAAQG,mBAAiBT,EAASQ,GAAeA,CAAa,GAE3DT,EAAWW,CAAAA,MAAU;AAC1B,YAAMC,IAAYN,EAASK,CAAK;AAChC,UAAIH,EAAWC,GAAeG,CAAS,EAAG;AAC1C,YAAMT,IAAWM;AACjBA,MAAAA,IAAgBG,GAChBX,EAASW,GAAWT,CAAQ;AAAA,IAC9B,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACLC,UAAUT,EAAIS;AAAAA,IACdS,iBAAiBlB,EAAIkB;AAAAA,IACrBb,WAAAA;AAAAA,IACAK,mBAAAA;AAAAA,IACAS,UAAUnB,EAAImB;AAAAA,IACdnB,KAAAA;AAAAA,EAAAA;AAEJ,GClEaoB,IAAmB,CAC9B,OACA,YACA,WACA,eACA,kBACA,QACA,mBACA,oBACA,uBACA,aACA,wBACA,eACA,kBACA,QACA,mBACA,UACA,SAAS,GAKEC,IAAwB,CAAC,QAAQ,aAAa,MAAM,GAMpDC,KAA4B;AAAA,EACvCC,MAAM;AAAA,IAAE7B,MAAM;AAAA,IAAkBC,OAAO;AAAA,EAAA;AAAA,EACvC6B,WAAW;AAAA,IAAE9B,MAAM;AAAA,IAAuBC,OAAO;AAAA,EAAA;AAAA,EACjD8B,MAAM;AAAA,IAAE/B,MAAM;AAAA,IAAkBC,OAAO;AAAA,EAAA;AACzC,GAIM+B,IAA6B;AAAA,EACjC,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,uBAAuB;AAAA,EACvB,wBAAwB;AAAA,EACxB,kBAAkB;AAAA,EAClB,mBAAmB;AACrB,GAEaC,KAAiCA,CAACC,MAAqCF,EAA2BE,CAAM,GC7CxGC,IAAwBA,CACnCC,GACAC,GACAC,IAAcD,MACX;AACH,MAAI,CAACD,EAAU9C,IAAIgD,CAAW,EAAG,QAAOA;AAExC,MAAIC,IAAS;AACb,SAAOH,EAAU9C,IAAI,GAAG+C,CAAc,IAAIE,CAAM,EAAE,IAAGA,CAAAA,KAAU;AAC/D,SAAO,GAAGF,CAAc,IAAIE,CAAM;AACpC,GCCaC,KAAgBA,CAACC,GAAyBJ,MAA2B;AAChF,aAAWH,KAAUhC,OAAOwC,OAAOD,EAAOE,OAAO,GAAG;AAClD,UAAMC,IAAQV,EAAOW,QAAQC,UAAWC,CAAAA,MAAcA,EAAUV,mBAAmBA,CAAc;AACjG,QAAIO,KAAS,EAAG,QAAO;AAAA,MAAEI,UAAUd,EAAOe;AAAAA,MAAIL,OAAAA;AAAAA,MAAOM,WAAWhB,EAAOW,QAAQD,CAAK;AAAA,IAAA;AAAA,EACtF;AAEF,GACaO,KAAwBA,CAACV,GAAyBJ,GAAwBe,MAAwB;AAC7G,aAAWlB,KAAUhC,OAAOwC,OAAOD,EAAOE,OAAO,GAAG;AAClD,UAAMC,IAAQV,EAAOW,QAAQC,UAC1BC,CAAAA,MAAcA,EAAUV,mBAAmBA,KAAkBU,EAAUK,gBAAgBA,CAC1F;AACA,QAAIR,KAAS,EAAG,QAAO;AAAA,MAAEI,UAAUd,EAAOe;AAAAA,MAAIL,OAAAA;AAAAA,MAAOM,WAAWhB,EAAOW,QAAQD,CAAK;AAAA,IAAA;AAAA,EACtF;AAEF,GACaS,IAA0BA,CAACZ,GAAyBa,MAAqB;AACpF,aAAWpB,KAAUhC,OAAOwC,OAAOD,EAAOE,OAAO,GAAG;AAClD,UAAMC,IAAQV,EAAOW,QAAQC,UAAWC,CAAAA,MAAcA,EAAUO,aAAaA,CAAQ;AACrF,QAAIV,KAAS,EAAG,QAAO;AAAA,MAAEI,UAAUd,EAAOe;AAAAA,MAAIL,OAAAA;AAAAA,MAAOM,WAAWhB,EAAOW,QAAQD,CAAK;AAAA,IAAA;AAAA,EACtF;AAEF,GACaW,KAAuBA,CAACd,GAAyBJ,MAA2B;AACvF,QAAMD,IAAY,IAAIoB,IACpBtD,OAAOwC,OAAOD,EAAOE,OAAO,EAAEc,QAASvB,CAAAA,MAAWA,EAAOW,QAAQa,IAAKR,OAAcA,EAAUI,QAAQ,CAAC,CACzG;AACA,SAAOnB,EAAsBC,GAAWC,CAAc;AACxD,GACasB,IAAqBA,CAACzB,MACjCA,EAAOW,QAAQe,KAAMV,CAAAA,MAAcA,EAAUI,aAAapB,EAAO2B,cAAc,KAAK3B,EAAOW,QAAQ,CAAC,GAChGiB,IAAsBA,CAACZ,MAAwCA,EAAUa,SAAS,YAC3EC,IAAuBA,CAACd,MACnCA,EAAUE,eAAe,GAAGF,EAAUb,cAAc,IAAIa,EAAUI,QAAQ,IAC/DW,IAA+BA,CAC1CxB,GACAyB,GACAhC,GACAoB,MACG;AACH,MAAI,CAACY,EAAU,QAAOzB;AACtB,QAAM0B,IAAMH,EAAqBE,CAAQ,GAEnCtE,IAAO;AAAA,IAAE,GADC6C,EAAO2B,6BAA6BD,CAAG,KAAK,CAAA;AAAA,EAC1CE;AAClB,SAAIf,IAAU1D,EAAKsC,CAAM,IAAIoB,IACxB,OAAO1D,EAAKsC,CAAM,GAChB;AAAA,IACL,GAAGO;AAAAA,IACH2B,4BAA4B;AAAA,MAC1B,GAAG3B,EAAO2B;AAAAA,MACV,CAACD,CAAG,GAAGvE;AAAAA,IAAAA;AAAAA,EACT;AAEJ,GACa0E,IAAkCA,CAAC7B,GAAyBa,MAAqB;AAC5F,MAAI,CAACb,EAAO2B,2BAA4B,QAAO3B;AAC/C,QAAM2B,IAA6BlE,OAAOqE,YACxCrE,OAAOP,QAAQ8C,EAAO2B,0BAA0B,EAAEV,IAAI,CAAC,CAACS,GAAKK,CAAU,MAAM,CAC3EL,GACAjE,OAAOqE,YAAYrE,OAAOP,QAAQ6E,CAAU,EAAEC,OAAO,CAAC,CAAA,EAAGC,CAAU,MAAMA,MAAepB,CAAQ,CAAC,CAAC,CACnG,CACH;AACA,SAAO;AAAA,IAAE,GAAGb;AAAAA,IAAQ2B,4BAAAA;AAAAA,EAAAA;AACtB,GACaO,IAA6BA,CAAClC,MAA4B;AACrE,QAAMmC,IAAYnC,EAAOE,QAAQd,KAAKgB,QAAQ4B,OAAOX,CAAmB;AACxE,SAAOc,EAAUhB,KAAMV,CAAAA,MAAcA,EAAUI,aAAab,EAAOoC,sBAAsB,KAAKD,EAAUE,GAAG,EAAE;AAC/G,GAKaC,KAAuBA,CAClCtC,GACAO,GACAgC,GACA9D,IAAuC,CAAA,MACnB;AACpB,QAAMgB,IAASO,EAAOE,QAAQK,CAAQ,GAChCH,IAAUmC,EAAO9C,EAAOW,OAAO,GAC/BgB,IACJ3C,EAAQ2C,mBAAmBoB,SACvB/D,EAAQ2C,iBACR3C,EAAQgE,oBACND,SACA/C,EAAO2B;AACf,SAAO;AAAA,IACL,GAAGpB;AAAAA,IACHoC,wBACE7B,MAAa,UAAU,CAACH,EAAQsC,KAAMjC,CAAAA,MAAcA,EAAUI,aAAab,EAAOoC,sBAAsB,IACpGhC,EAAQ4B,OAAOX,CAAmB,EAAEgB,GAAG,EAAE,GAAGxB,WAC5Cb,EAAOoC;AAAAA,IACblC,SAAS;AAAA,MACP,GAAGF,EAAOE;AAAAA,MACV,CAACK,CAAQ,GAAG;AAAA,QAAE,GAAGd;AAAAA,QAAQW,SAAAA;AAAAA,QAASgB,gBAAAA;AAAAA,MAAAA;AAAAA,IAAe;AAAA,EACnD;AAEJ,GACauB,KAAkCA,CAAC3C,GAAyBJ,MAA4C;AACnH,MAAIgD,IAAa5C;AACjB,aAAWP,KAAUhC,OAAOwC,OAAOD,EAAOE,OAAO,GAAG;AAClD,UAAM2C,IAAUpD,EAAOW,QAAQ4B,OAAQvB,CAAAA,MAAcA,EAAUb,mBAAmBA,CAAc,GAC1FkD,IAAWrD,EAAOW,QAAQ4B,OAAQvB,CAAAA,MAAcA,EAAUb,mBAAmBA,CAAc;AACjG,QAAIkD,EAASC,WAAWtD,EAAOW,QAAQ2C,OAAQ;AAC/C,UAAM3B,IACJ3B,EAAO2B,kBAAkB,CAAC0B,EAASJ,KAAMjC,CAAAA,MAAcA,EAAUI,aAAapB,EAAO2B,cAAc,IAC/FoB,SACA/C,EAAO2B;AACbwB,IAAAA,IAAa;AAAA,MACX,GAAGA;AAAAA,MACH1C,SAAS;AAAA,QACP,GAAG0C,EAAW1C;AAAAA,QACd,CAACT,EAAOe,EAAE,GAAG;AAAA,UAAE,GAAGf;AAAAA,UAAQW,SAAS0C;AAAAA,UAAU1B,gBAAAA;AAAAA,QAAAA;AAAAA,MAAe;AAAA,IAC9D;AAEF,eAAWX,KAAaoC;AACtBD,MAAAA,IAAaf,EAAgCe,GAAYnC,EAAUI,QAAQ;AAAA,EAE/E;AACA,QAAMmC,IAAkBvF,OAAOwC,OAAO2C,EAAW1C,OAAO,EAAEwC,KAAMjD,CAAAA,MAC9DA,EAAOW,QAAQsC,KAAMjC,CAAAA,MAAcA,EAAUI,aAAa+B,EAAWxB,cAAc,CACrF;AACA,SACEwB,EAAWxB,mBACV,CAAC4B,KACAJ,EAAWxB,eAAe6B,WAAW,GAAGrD,CAAc,GAAG,KACzDgD,EAAWxB,mBAAmBxB,OAEhCgD,IAAa;AAAA,IAAE,GAAGA;AAAAA,IAAYxB,gBAAgBoB;AAAAA,IAAWU,mBAAmBV;AAAAA,EAAAA,IAG5EI,EAAWR,0BACX,CAACQ,EAAW1C,QAAQd,KAAKgB,QAAQsC,KAAMjC,CAAAA,MAAcA,EAAUI,aAAa+B,EAAWR,sBAAsB,MAE7GQ,IAAa;AAAA,IACX,GAAGA;AAAAA,IACHR,wBAAwBQ,EAAW1C,QAAQd,KAAKgB,QAAQ4B,OAAOX,CAAmB,EAAEgB,GAAG,EAAE,GAAGxB;AAAAA,EAAAA,IAGzF+B;AACT,GACaO,KAAsBA,CAACnD,GAAyBa,MAAqB;AAChF,QAAMuC,IAAQxC,EAAwBZ,GAAQa,CAAQ;AACtD,MAAI,CAACuC,EAAO;AACZ,QAAM3D,IAASO,EAAOE,QAAQkD,EAAM7C,QAAQ,GACtCH,IAAUX,EAAOW,QAAQ4B,OAAQvB,CAAAA,MAAcA,EAAUI,aAAaA,CAAQ,GAC9EwC,IAAyB5D,EAAO2B,mBAAmBP,KAAa,CAACpB,EAAO2B,kBAAkBgC,EAAMjD,UAAU,GAQ1GmD,KANJF,EAAM3C,UAAUa,SAAS,cACrBlB,EAAQe,KACLV,CAAAA,MACCA,EAAUa,SAAS,eAAeb,EAAU8C,qBAAqBH,EAAM3C,UAAU8C,gBACrF,IACAf,YAGHY,EAAM3C,UAAUa,SAAS,eAAe8B,EAAM7C,aAAa,SACxD2B,EAA2BlC,CAAM,IAChCI,EAAQgD,EAAMjD,KAAK,KAAKC,EAAQgD,EAAMjD,QAAQ,CAAC,IAChDiB,IAAiBiC,IAAyBC,GAAqBzC,WAAWpB,EAAO2B,gBACjFoC,IAAa;AAAA,IAAE,GAAG/D;AAAAA,IAAQW,SAAAA;AAAAA,IAASgB,gBAAAA;AAAAA,EAAAA;AACzC,MAAIwB,IAA8Bf,EAChC;AAAA,IACE,GAAG7B;AAAAA,IACHoC,wBACEpC,EAAOoC,2BAA2BvB,IAC9Bb,EAAOE,QAAQd,KAAKgB,QACjB4B,OAAQvB,CAAAA,MAAcA,EAAUI,aAAaA,KAAYQ,EAAoBZ,CAAS,CAAC,EACvF4B,GAAG,EAAE,GAAGxB,WACXb,EAAOoC;AAAAA,IACblC,SAAS;AAAA,MACP,GAAGF,EAAOE;AAAAA,MACV,CAACT,EAAOe,EAAE,GAAGgD;AAAAA,IAAAA;AAAAA,EACf,GAEF3C,CACF;AACA,SACEwC,KACAD,EAAM7C,aAAa,UACnBrB,EAAsBuE,SAASL,EAAM7C,QAAgC,MAErEqC,IAAapB,EACXoB,GACAV,EAA2BU,CAAU,GACrCQ,EAAM7C,UACN+C,GAAqBhC,SAAS,cAAcgC,EAAoBzC,WAAW2B,MAC7E,IAEExC,EAAOoB,mBAAmBP,MAC5B+B,IAAa;AAAA,IACX,GAAGA;AAAAA,IACHxB,gBAAgBkC,GAAqBzC;AAAAA,IACrCqC,mBAAmBI,GAAqB3C;AAAAA,EAAAA,IAGrC;AAAA,IACLJ,UAAU6C,EAAM7C;AAAAA,IAChBmD,iBAAiBN,EAAM3C;AAAAA,IACvBkD,iBAAiBzC,EAAmBsC,CAAU;AAAA,IAC9CxD,QAAQ4C;AAAAA,EAAAA;AAEZ,GACagB,KAAmBA,CAC9B5D,GACAO,GACAE,MACoB;AACpB,QAAMhB,IAASO,EAAOE,QAAQK,CAAQ;AACtC,MAAIA,MAAa,UAAUc,EAAoBZ,CAAS,GAAG;AACzD,UAAMsB,IAAa/B,EAAO2B,6BAA6BJ,EAAqBd,CAAS,CAAC,KAAK,CAAA,GACrFP,IAAUzC,OAAOqE,YACrBrE,OAAOP,QAAQ8C,EAAOE,OAAO,EAAEe,IAAI,CAAC,CAACT,GAAIqD,CAAK,MAAM,CAClDrD,GACA;AAAA,MACE,GAAGqD;AAAAA,MACHzD,SAASyD,EAAMzD,QAAQa,IAAKX,CAAAA,MACtB,CAACG,EAAUqD,YAAYxD,EAAUO,aAAaJ,EAAUI,YACxDP,EAAUiD,qBAAqB9C,EAAUE,eACzCL,EAAUK,gBAAgBF,EAAUE,cAAoBL,IACrD;AAAA,QAAE,GAAGA;AAAAA,QAAWwD,UAAUrD,EAAUqD;AAAAA,MAAAA,CAC5C;AAAA,IAAA,CACF,CACF,CACH;AACA,eAAWC,KAAe7E,GAAuB;AAC/C,YAAM2E,IAAQ3D,EAAQ6D,CAAW,GAC3B9B,IAAaF,EAAWgC,CAAW,GACnCC,IAAWH,EAAMzD,QAAQe,KAC5Bb,CAAAA,MACCA,EAAUO,aAAaoB,KACvB3B,EAAUgB,SAAS,gBAClB,CAAChB,EAAUiD,oBAAoBjD,EAAUiD,qBAAqB9C,EAAUE,YAC7E;AACAT,MAAAA,EAAQ6D,CAAW,IAAI;AAAA,QACrB,GAAGF;AAAAA,QACHzC,gBACE2C,MAAgB,SACZF,EAAMzC,iBACL4C,GAAUnD,aAAakD,MAAgB,SAAStD,EAAUI,WAAW2B;AAAAA,MAAAA;AAAAA,IAEhF;AACA,WAAO;AAAA,MACL,GAAGxC;AAAAA,MACHoB,gBAAgBX,EAAUI;AAAAA,MAC1BuB,wBAAwB3B,EAAUI;AAAAA,MAClCqC,mBAAmBzC,EAAUE;AAAAA,MAC7BT,SAAAA;AAAAA,IAAAA;AAAAA,EAEJ;AACA,QAAM+D,IACJxD,EAAUa,SAAS,eACnBf,MAAa,UACbrB,EAAsBuE,SAASlD,CAAgC,IAC3DiB,EACExB,GACAkC,EAA2BlC,CAAM,GACjCO,GACAE,EAAUI,QACZ,IACAb;AACN,SAAO;AAAA,IACL,GAAGiE;AAAAA,IACH7C,gBAAgBX,EAAUI;AAAAA,IAC1BuB,wBAAwBpC,EAAOoC;AAAAA,IAC/Bc,mBAAmBzC,EAAUE;AAAAA,IAC7BT,SAAS;AAAA,MACP,GAAG+D,EAAc/D;AAAAA,MACjB,CAACK,CAAQ,GAAG;AAAA,QAAE,GAAGd;AAAAA,QAAQ2B,gBAAgBX,EAAUI;AAAAA,MAAAA;AAAAA,IAAS;AAAA,EAC9D;AAEJ,GAKaqD,KAA2BA,CACtClE,GACAO,GACAM,MACG;AACH,QAAMpB,IAASO,EAAOE,QAAQK,CAAQ,GAChCE,IAAYI,IAAWpB,EAAOW,QAAQe,KAAMb,CAAAA,MAAcA,EAAUO,aAAaA,CAAQ,IAAI2B;AACnG,MAAI3B,KAAY,CAACJ,EAAW,OAAM,IAAI0D,MAAM,iCAAiC5D,CAAQ,KAAKM,CAAQ,EAAE;AACpG,MAAIpB,EAAO2B,mBAAmBP,EAAU;AACxC,QAAMuD,IAAgBpE,EAAOoB,mBAAmB3B,EAAO2B,gBACjDwB,IAA8B;AAAA,IAClC,GAAG5C;AAAAA,IACHoB,gBAAgBgD,IAAgB3D,GAAWI,WAAWb,EAAOoB;AAAAA,IAC7D8B,mBAAmBkB,IAAgB3D,GAAWE,cAAcX,EAAOkD;AAAAA,IACnEd,wBACE7B,MAAa,UAAUE,GAAWa,SAAS,aAAab,EAAUI,WAAWb,EAAOoC;AAAAA,IACtFlC,SAAS;AAAA,MAAE,GAAGF,EAAOE;AAAAA,MAAS,CAACK,CAAQ,GAAG;AAAA,QAAE,GAAGd;AAAAA,QAAQ2B,gBAAgBX,GAAWI;AAAAA,MAAAA;AAAAA,IAAS;AAAA,EAAE;AAE/F,SAAIN,MAAa,UAAU,CAACrB,EAAsBuE,SAASlD,CAAgC,IAAUqC,IAC9FpB,EACLoB,GACAV,EAA2BU,CAAU,GACrCrC,GACAE,GAAWa,SAAS,cAAcb,EAAUI,WAAW2B,MACzD;AACF,GC9SM6B,IAAmBA,CAACC,GAAsCR,MAC1DQ,EAAAA,EAAOC,eAAexB,WAAW,CAACe,KAAY,CAACQ,EAAOC,cAAcd,SAASK,EAASU,IAAI,MAC1FF,EAAOG,YAAY,CAACX,KAAY,CAACQ,EAAOG,QAAQX,CAAQ,KAGjDY,KAA6BA,CACxC1E,GACAP,GACAqE,GACArF,IAEI,CAAA,MACD;AACH,QAAMoF,IAAQ7D,EAAOE,QAAQT,CAAM;AACnC,SAAOoE,EAAMzD,QAAQe,KAClBV,CAAAA,MACCA,EAAUI,aAAagD,EAAMzC,kBAC7BX,EAAUa,SAAS,gBAClB7C,EAAQkG,0BACP,CAAClE,EAAU8C,oBACX9C,EAAU8C,qBAAqB5C,EAAYmD,CAAQ,EACzD;AACF,GACac,KAAkCA,CAAC5E,MAA4BkC,EAA2BlC,CAAM,GACvG6E,IAA6BA,CACjCP,GACAR,GACAgB,GACArE,GACAgB,MACG;AACH,QAAMsD,IAAoBT,EAAOS;AAqBjC,SApBI,GAACC,EAAgCV,GAAQQ,CAAM,KAEjDC,GAAmBR,eAAexB,WACjC,CAACe,KAAY,CAACiB,EAAkBR,cAAcd,SAASK,EAASU,IAAI,MAKrEO,GAAmBE,aAAalC,WAC/B,CAACe,GAAUtD,MAAM,CAACuE,EAAkBE,YAAYxB,SAASK,EAAStD,EAAE,MAInEuE,GAAmBN,YAAY,CAACX,KAAY,CAACiB,EAAkBN,QAAQX,CAAQ,MAEjFiB,GAAmBG,mBACnB,CAACH,EAAkBG,gBAAgB;AAAA,IAAEpB,UAAAA;AAAAA,IAAUqB,QAAQ1D,GAAU0D;AAAAA,EAAAA,CAAQ,KAIvE1E,GAAW8C,oBAAoB9C,EAAU8C,qBAAqB5C,EAAYmD,CAAQ;AAExF,GACakB,IAAkCA,CAACV,GAAsCQ,MAA+B;AACnH,QAAMM,IAAkBd,EAAOS,mBAAmBM;AAClD,SAAO,CAACD,GAAiBrC,UAAW+B,MAAWtC,UAAa4C,EAAgB3B,SAASqB,CAAM;AAC7F,GACaQ,KAAmCA,CAC9ChB,GACAR,GACAgB,GACArE,GACAhC,IAGI,OAEC4F,EAAiBC,GAAQ7D,GAAWqD,YAAYA,CAAQ,IACzDrF,EAAQ8G,yBAA+BP,EAAgCV,GAAQQ,CAAM,IAClFD,EAA2BP,GAAQR,GAAUgB,GAAQrE,GAAWhC,EAAQgD,QAAQ,IAFhB,IAI5D+D,KAAiCA,CAC5ClB,GACAmB,MAIG;AACH,QAAMrJ,IAAQkI,EAAOoB,kBAAkB;AAAA,IAAEC,OAAO;AAAA,EAAA;AAChD,SAAIvJ,EAAMwD,kBACY6F,EAAQG,YAAYH,EAAQI,gBAC5BjG,mBAAmBxD,EAAMwD,iBAE3C6F,EAAQG,WACHxJ,EAAMuJ,UAAU,cAErBvJ,EAAMuJ,UAAU;AAItB,GCxFMG,IAA6B,kBAEtBC,IAAgCA,CAACC,IAAiC,QAAQ;AAAA,EACrFC,QAAQD,EAASC,UAAU;AAAA,EAC3BC,SAASF,EAASE,WAAWJ;AAAAA,EAC7BK,UAAUH,EAASG,YAAY;AACjC,IAEaC,IAAyBA,CAAC7I,GAAsCC,MAC3EA,EAAM2I,WAAW5I,EAAK4I,YAAY5I,EAAK2I,QAAQG,cAAc7I,EAAM0I,OAAO,GCX/DI,KAAoBA,CAC/B1I,IAAiC,CAAA,GACjC2I,MACoB;AACpB,QAAM;AAAA,IAAEC,UAAAA;AAAAA,IAAU,GAAGC;AAAAA,EAAAA,IAAW7I,GAC1B8I,IAAaD,EAAO3C,YAAY2C,EAAOtB,WAAW3C,SAAY;AAAA,IAAE,GAAGiE;AAAAA,IAAQtB,QAAQ;AAAA,EAAA,IAASsB;AAClG,SAAKD,IACDA,EAASG,SAAS,eACb;AAAA,IAAE,GAAGD;AAAAA,IAAYE,aAAaJ,EAASK;AAAAA,IAAUC,cAAc;AAAA,EAAA,IAEpEN,EAASG,SAAS,mBAAyB;AAAA,IAAE,GAAGD;AAAAA,IAAYK,eAAe;AAAA,EAAA,IAC3EP,EAASG,SAAS,kBACb;AAAA,IAAE,GAAGD;AAAAA,IAAYM,iBAAiBR,EAASS;AAAAA,IAAYH,cAAcN,EAASU;AAAAA,EAAAA,IAEhF;AAAA,IAAE,GAAGR;AAAAA,IAAYI,cAAc;AAAA,IAAWF,aAAaJ,EAASK;AAAAA,EAAAA,IARjD;AAAA,IAAE,GAAGH;AAAAA,IAAYI,cAAcP;AAAAA,EAAAA;AASvD,GAEaY,KAAkBA,CAAC1G,OAAiE;AAAA,EAC/FwG,YAAYxG,EAAUI;AAAAA,EACtBuG,SAAS3G,EAAUb;AAAAA,EACnByH,mBAAmB5G,EAAU4G;AAAAA,EAC7BlC,QAAQ1E,EAAU0E;AAAAA,EAClBe,SAASzF,EAAUyF;AAAAA,EACnBD,QAAQxF,EAAUwF;AAAAA,EAClBnC,UAAUrD,EAAUqD;AAAAA,EACpBwD,SAAS7G,EAAU6G;AAAAA,EACnB3G,aAAaF,EAAUE;AAAAA,EACvB4C,kBAAkB9C,EAAU8C;AAAAA,EAC5BgE,OAAO9G,EAAU8G;AAAAA,EACjBC,QAAQ/G,EAAU+G;AAAAA,EAClBC,UAAUhH,EAAUgH,aAAa;AAAA,EACjCC,eAAejH,EAAUiH;AAAAA,EACzBC,iBAAiBlH,EAAUkH;AAAAA,EAC3Bb,cAAcrG,EAAUqG;AAAAA,EACxBc,KAAKnH,EAAUmH;AACjB,IAEaC,KAAsBA,CAACvD,MAAqE;AACvG,QAAM;AAAA,IAAEmD,UAAUK;AAAAA,IAAWC,mBAAmBC;AAAAA,IAAoB,GAAGnE;AAAAA,EAAAA,IAAUS;AACjF,SAAOT;AACT,GCzCMoE,IAAmB;AAAA,EACvB7I,MAAM,CAAC,eAAe,kBAAkB,QAAQ,iBAAiB;AAAA,EACjEC,WAAW,CAAC,oBAAoB,uBAAuB,aAAa,sBAAsB;AAAA,EAC1FC,MAAM,CAAC,eAAe,kBAAkB,QAAQ,iBAAiB;AACnE,GAEM4I,IAAiBzK,OAAOwC,OAAOgI,CAAgB,EAAEE,KAAAA,GAE1CC,IAAgBA,CAACC,MAAoCA,EAAKC,UAAUpJ,GAEpEqJ,KAAiCA,CAAC9I,MAC5ChC,OAAO+K,KAAKP,CAAgB,EAA6B9G,KAAM0C,CAAAA,MAC9DoE,EAAiBpE,CAAK,EAAEnB,KAAMpC,CAAAA,MAAcA,MAAcb,CAAM,CAClE,GAEWgJ,KAAgCA,CAC3CJ,GACAxE,MACG,CAACwE,KAAQD,EAAcC,CAAI,EAAE5E,SAASI,CAAK,GAE1C6E,IAAgBA,CAAC1I,GAAyBa,MAAiC;AAC/E,MAAKA;AACL,WAAOpD,OAAOwC,OAAOD,EAAOE,OAAO,EAChCc,QAASvB,CAAAA,MAAWA,EAAOW,OAAO,EAClCe,KAAMV,CAAAA,MAAcA,EAAUI,aAAaA,CAAQ;AACxD,GAEM8H,IAAsBA,CAC1B3I,GACA4I,MACG;AACH,QAAMC,IAASD,EAAWzH,KAAMV,CAAAA,MAAcA,KAAaiI,EAAc1I,GAAQS,EAAUI,QAAQ,CAAC;AACpG,SAAO;AAAA,IACL,GAAGb;AAAAA,IACHoB,gBAAgByH,GAAQhI;AAAAA,IACxBqC,mBAAmB2F,GAAQlI;AAAAA,EAAAA;AAE/B,GAEMmI,IAAeA,CAAC9I,GAAyB+I,MAA0C;AACvF,MAAIA,EAAUhG,WAAW,EAAG,QAAO/C;AACnC,QAAMgJ,IAAgB,IAAIjI,IACvBtD,OAAO+K,KAAKP,CAAgB,EAA6BjG,OAAQ6B,CAAAA,MAChEoE,EAAiBpE,CAAK,EAAEnB,KAAMjD,CAAAA,MAAWsJ,EAAUtF,SAAShE,CAAM,CAAC,CACrE,CACF,GACMwJ,IAAsBF,EAAUrG,KAAMnC,CAAAA,MAAa;AACvD,UAAMd,IAASO,EAAOE,QAAQK,CAAQ;AACtC,WAAOd,EAAOW,QAAQ2C,SAAS,KAAKtD,EAAO2B,mBAAmBoB,UAAa/C,EAAOyJ;AAAAA,EACpF,CAAC,GACKC,IAAyB1L,OAAOwC,OAAOD,EAAO2B,8BAA8B,CAAA,CAAE,EAAEe,KAAMX,CAAAA,MAC1FtE,OAAO+K,KAAKzG,CAAU,EAAEW,KAAMmB,CAAAA,MAAUmF,EAAcnM,IAAIgH,CAA6B,CAAC,CAC1F;AACA,MAAI,CAACoF,KAAuB,CAACE,EAAwB,QAAOnJ;AAE5D,QAAME,IAAU;AAAA,IAAE,GAAGF,EAAOE;AAAAA,EAAAA;AAC5B,aAAWK,KAAYwI;AACrB7I,IAAAA,EAAQK,CAAQ,IAAI;AAAA,MAAE,GAAGL,EAAQK,CAAQ;AAAA,MAAGH,SAAS,CAAA;AAAA,MAAIgB,gBAAgBoB;AAAAA,MAAW0G,SAAS;AAAA,IAAA;AAE/F,QAAMvH,IAA6BlE,OAAOqE,YACxCrE,OAAOP,QAAQ8C,EAAO2B,8BAA8B,CAAA,CAAE,EAAEV,IAAI,CAAC,CAACN,GAAaoB,CAAU,MAAM,CACzFpB,GACAlD,OAAOqE,YACLrE,OAAOP,QAAQ6E,CAAU,EAAEC,OAAO,CAAC,CAAC6B,CAAK,MAAM,CAACmF,EAAcnM,IAAIgH,CAA6B,CAAC,CAClG,CAAC,CACF,CACH,GACM1G,IAAO;AAAA,IAAE,GAAG6C;AAAAA,IAAQE,SAAAA;AAAAA,EAAAA;AAC1B,SAAO;AAAA,IACL,GAAGyI,EAAoBxL,GAAM,CAACuL,EAAcvL,GAAM6C,EAAOoB,cAAc,CAAC,CAAC;AAAA,IACzEgB,wBAAwBsG,EAAcvL,GAAM6C,EAAOoC,sBAAsB,GAAGvB;AAAAA,IAC5Ec,4BAAAA;AAAAA,EAAAA;AAEJ,GAEayH,IAA6BA,CAACpJ,GAAyBsI,MAA4C;AAC9G,QAAMe,IAAY,IAAItI,IAAIuH,CAAM,GAC1BgB,IAAsB7L,OAAO+K,KAAKP,CAAgB,EACrDjG,OAAQ6B,CAAAA,MAAU,CAACwF,EAAUxM,IAAIgH,CAAK,CAAC,EACvC7C,QAAS6C,CAAAA,MAAUoE,EAAiBpE,CAAK,CAAC;AAC7C,SAAOiF,EAAa9I,GAAQsJ,CAAkB;AAChD,GAEaC,KAA4BA,CACvC3H,GACA4H,GACAlB,MACG;AACH,MAAI,CAACkB,GAAO;AACV,UAAMtJ,IAAU;AAAA,MAAE,GAAG0B,EAAQ1B;AAAAA,IAAAA;AAC7B,eAAWK,KAAY2H,GAAgB;AACrC,YAAMzI,IAASS,EAAQK,CAAQ,GACzBH,IAAUX,EAAOW,QAAQ4B,OAAQvB,CAAAA,MAAcA,EAAUa,SAAS,SAAS;AACjFpB,MAAAA,EAAQK,CAAQ,IAAI;AAAA,QAClB,GAAGd;AAAAA,QACHW,SAAAA;AAAAA,QACAgB,gBAAgBhB,EAAQsC,KAAMjC,CAAAA,MAAcA,EAAUI,aAAapB,EAAO2B,cAAc,IACpF3B,EAAO2B,iBACPoB;AAAAA,MAAAA;AAAAA,IAER;AACA,UAAMiH,IAAqB;AAAA,MAAE,GAAG7H;AAAAA,MAAS1B,SAAAA;AAAAA,IAAAA;AACzC,WAAOkJ,EACL;AAAA,MACE,GAAGT,EAAoBc,GAAoB,CAACf,EAAce,GAAoB7H,EAAQR,cAAc,CAAC,CAAC;AAAA,MACtGgB,wBAAwBsG,EAAce,GAAoB7H,EAAQQ,sBAAsB,GAAGvB;AAAAA,IAAAA,GAE7FyH,CACF;AAAA,EACF;AAEA,QAAMpI,IAAU;AAAA,IAAE,GAAG0B,EAAQ1B;AAAAA,EAAAA;AAC7B,aAAWK,KAAY2H,EAAgBhI,CAAAA,EAAQK,CAAQ,IAAIiJ,EAAMtJ,QAAQK,CAAQ;AACjF,QAAMmJ,IAASN,EAA2B;AAAA,IAAE,GAAGxH;AAAAA,IAAS1B,SAAAA;AAAAA,EAAAA,GAAWoI,CAAM,GACnEqB,IAAcjB,EAAcgB,GAAQF,EAAMpI,cAAc,GACxDwI,IAAgBlB,EAAcgB,GAAQ9H,EAAQR,cAAc;AAClE,SAAO;AAAA,IACL,GAAGuH,EAAoBe,GAAQ,CAACC,GAAaC,CAAa,CAAC;AAAA,IAC3DxH,wBACEsG,EAAcgB,GAAQF,EAAMpH,sBAAsB,GAAGvB,YACrD6H,EAAcgB,GAAQ9H,EAAQQ,sBAAsB,GAAGvB;AAAAA,IACzDc,4BAA4B6H,EAAM7H;AAAAA,EAAAA;AAEtC,GAEakI,KAAiBA,CAACC,MAAuC;AACpE,WAAS3J,IAAQ2J,EAAY/G,SAAS,GAAG5C,KAAS,GAAGA,KAAS;AAC5DhE,IAAAA,EAAmB,iBAAiB,MAAM2N,EAAY3J,CAAK,GAAGjE,SAAS;AAE3E,GAEa6N,KAAoBA,CAACtE,GAAyCzF,MAA4B;AACrG,EAAIA,MAAWyF,EAAQzF,OAAOgK,UAAAA,KAAavE,EAAQzF,OAAOiK,cAAcjK,CAAM;AAChF,GCvGakK,KAAqBA,CAACC,MAC7BC,MAAMC,QAAQF,CAAU,IAAUA,IAE/BA,EAAWG,OAAOC,MAAM,KAAK,EAAEvI,OAAOwI,OAAO,GAGhDC,KAA8BA,CAACN,MAAuD;AAC1F,QAAMO,IAAQR,GAAmBC,CAAU;AAC3C,SAAOO,EAAM3H,WAAW,IAAK2H,EAAM,CAAC,KAAK,KAAMA;AACjD,GAEaC,KAA2BA,CAACC,MAAqD;AAC5F,QAAMC,IAAQlN,EAAmD;AAAA,IAC/DM,MAAM;AAAA,IACND,cAAc;AAAA,MAAE8M,aAAa,CAAA;AAAA,IAAA;AAAA,EAAG,CACjC;AAED,SAAO;AAAA,IACLD,OAAAA;AAAAA,IAEAE,mBAAmBZ,GAAYnE,GAAU;AACvC,UAAImE,EAAWa,OAAOrE,SAAS,aAAa,CAACiE,EAAKK,SAASC,WAAWf,EAAWa,OAAOG,SAAS;AAC/F,cAAM,IAAIhH,MAAM,sCAAsCgG,EAAWa,OAAOG,SAAS,EAAE;AAGrF,YAAMC,IAA+B;AAAA,QACnC,GAAGrF,EAA8BC,CAAQ;AAAA,QACzC,GAAGmE;AAAAA,QACHA,YAAYM,GAA4BN,EAAWA,UAAU;AAAA,MAAA,GAGzDkB,IAAWR,EAAMvM,SAAAA;AACvBuM,aAAAA,EAAM7L,SAAS;AAAA,QAAE8L,aAAa,CAAC,GAAGO,EAASP,aAAaM,CAAM;AAAA,MAAA,GAAK,IAAO,oBAAoB,GAEvFrP,EAAiB,MAAM;AAC5B,cAAM6F,IAAUiJ,EAAMvM,SAAAA,GAChBnB,IAAOyE,EAAQkJ,YAAY9I,OAAQ1B,CAAAA,MAAcA,MAAc8K,CAAM;AAC3E,QAAIjO,EAAK4F,WAAWnB,EAAQkJ,YAAY/H,UACxC8H,EAAM7L,SAAS;AAAA,UAAE8L,aAAa3N;AAAAA,QAAAA,GAAQ,IAAO,sBAAsB;AAAA,MACrE,CAAC;AAAA,IACH;AAAA,IAEAmO,kBAAkB;AAChB,aAAO,CAAC,GAAGT,EAAMvM,SAAAA,EAAWwM,WAAW,EAAES,KAAKnF,CAAsB;AAAA,IACtE;AAAA,IAEAoF,wBAAwB;AACtB,aAAOX,EACJvM,SAAAA,EACAwM,YAAY9I,OAAQmI,CAAAA,MAAeS,EAAKnF,QAAQgG,QAAQtB,EAAWuB,IAAI,CAAC,EACxEH,KAAKnF,CAAsB;AAAA,IAChC;AAAA,IAEAuF,yBAAyB;AACvB,aAAO,CAAC,GAAGd,EAAMvM,SAAAA,EAAWwM,WAAW,EACpCS,KAAKnF,CAAsB,EAC3BpF,QAASoK,CAAAA,MACRA,EAAOJ,OAAOrE,SAAS,YACnB,CAAC;AAAA,QAAEwE,WAAWC,EAAOJ,OAAOG;AAAAA,QAAWhB,YAAYiB,EAAOjB;AAAAA,MAAAA,CAAY,IACtE,CAAA,CACN;AAAA,IACJ;AAAA,EAAA;AAEJ,GCzDMyB,IAASA,CAACA,GAAkBC,GAAgCjD,OAAiD;AAAA,EACjHtH,MAAM;AAAA,EACNsK,QAAAA;AAAAA,EACAC,aAAAA;AAAAA,EACAjD,YAAAA;AACF,IAEMkD,IAAaA,CAACC,GAAuBC,IAAY,OACrDA,IAAY;AAAA,EAAE1K,MAAM;AAAA,EAAcyK,OAAAA;AAAAA,EAAOC,WAAAA;AAAU,IAAI;AAAA,EAAE1K,MAAM;AAAA,EAAcyK,OAAAA;AAAM,GAE/EE,KAAwB;AAAA,EAAE3K,MAAM;AAAS,GACzC4K,KAA8B;AAAA,EAAE5K,MAAM;AAAY,GAE3C6K,IAAyD;AAAA;AAAA;AAAA,EAGpEC,KAAKN,EAAW,CAAC,WAAW,UAAU,CAAC;AAAA,EACvCO,UAAUJ;AAAAA,EACVK,SAASR,EAAW,CAAC,SAAS,GAAG,EAAI;AAAA,EACrC,eAAeA,EAAW,CAAC,SAAS,CAAC;AAAA,EACrC,kBAAkBA,EAAW,CAAC,SAAS,CAAC;AAAA,EACxC1M,MAAMwM,EAAO,WAAW,WAAW,QAAQ;AAAA,EAC3C,mBAAmBE,EAAW,CAAC,SAAS,CAAC;AAAA,EACzC,oBAAoBA,EAAW,CAAC,SAAS,CAAC;AAAA,EAC1C,uBAAuBA,EAAW,CAAC,WAAW,CAAC;AAAA,EAC/CzM,WAAWuM,EAAO,aAAa,WAAW,QAAQ;AAAA,EAClD,wBAAwBE,EAAW,CAAC,WAAW,CAAC;AAAA,EAChDS,QAAQT,EAAW,CAAC,WAAW,UAAU,CAAC;AAAA,EAC1CU,SAASN;AAAAA,EACT,eAAeJ,EAAW,CAAC,UAAU,CAAC;AAAA,EACtC,kBAAkBA,EAAW,CAAC,UAAU,CAAC;AAAA,EACzCxM,MAAMsM,EAAO,YAAY,YAAY,QAAQ;AAAA,EAC7C,mBAAmBE,EAAW,CAAC,UAAU,CAAC;AAC5C,GAEaW,KAAaA,CAAChN,MAA4B0M,EAAW1M,CAAM,GAE3DiN,KAAoBA,MAC/BzN,EAAiB+C,OAAO,CAACvC,MAAsC0M,EAAW1M,CAAM,EAAE6B,SAAS,QAAQ,GAYxFqL,KAAsBA,CAACC,MAAuB;AACzD,QAAMnN,IAASR,EAAiBkC,KAAMb,CAAAA,MAAc;AAClD,UAAMuM,IAAUV,EAAW7L,CAAS;AACpC,WAAOuM,EAAQvL,SAAS,YAAYuL,EAAQjB,WAAWgB;AAAAA,EACzD,CAAC;AACD,MAAI,CAACnN,EAAQ,OAAM,IAAI0E,MAAM,2BAA2ByI,CAAQ,EAAE;AAClE,SAAOnN;AACT,GC/FaqN,KAAoBA,CAAC9M,GAAyB4M,MACzD1L,EAAmBlB,EAAOE,QAAQyM,GAAoBC,CAAQ,CAAC,CAAC,GAAG9I,UAkBxDiJ,KAAmBA,CAAC;AAAA,EAAE/M,QAAAA;AAAAA,EAAQgN,SAAAA;AAAAA,EAASC,WAAAA;AAAiC,MAA+B;AAClH,QAAMC,IAAmC,CAAA;AAEzC,aAAWzN,KAAUiN,MAAqB;AACxC,UAAMG,IAAUJ,GAAWhN,CAAM;AACjC,QAAIoN,EAAQvL,SAAS,YAAYuL,EAAQhB,gBAAgB,UAAW;AAIpE,UAAMpL,IAAYS,EAAmBlB,EAAOE,QAAQT,CAAM,CAAC;AAC3D,QAAKgB,GAAWqD,UAKhB;AAAA,UAAIrD,EAAUa,SAAS,eAAeb,EAAU8C,kBAAkB;AAChE2J,QAAAA,EAAQC,KAAK;AAAA,UAAE1N,QAAAA;AAAAA,UAAQuL,QAAQ;AAAA,QAAA,CAAQ;AACvC;AAAA,MACF;AAEA,UAAI6B,EAAQhB,gBAAgB,WAAW;AACrCqB,QAAAA,EAAQC,KAAK;AAAA,UAAE1N,QAAAA;AAAAA,UAAQuL,QAAQ;AAAA,QAAA,CAAS;AACxC;AAAA,MACF;AAEAkC,MAAAA,EAAQC,KAAK;AAAA,QAAE1N,QAAAA;AAAAA,QAAQuL,QAAQiC,EAAUxM,EAAUqD,UAAUkJ,CAAO,IAAI,SAAS;AAAA,MAAA,CAAS;AAAA;AAAA,EAC5F;AAEA,SAAOE;AACT,GCzDaE,KAAwB;AAAA,EACnCC,SAAS;AAAA,EACTC,WAAW;AAAA,EACXC,UAAU;AAAA,EACVC,UAAU;AAAA,EACVC,gBAAgB;AAClB,GCGaC,IAA+BA,CAACC,MAC3C,YAAYA,KAAQA,EAAKnJ,SAAS,QAUvBoJ,KAA6B,4BAS7BC,IAAyBA,CAACC,MACrC,CAAC,GAAGA,CAAS,EAAEvC,KAAK,CAAChO,GAAMC,MAAUA,EAAM2I,WAAW5I,EAAK4I,YAAY5I,EAAKiD,GAAG6F,cAAc7I,EAAMgD,EAAE,CAAC,GAC3FuN,KAAwBA,CACnCD,GACAhK,GACAkK,MACG;AACH,QAAMC,IAASJ,EAAuBC,CAAS,GACzCI,IAAiC,CAACpK,CAAQ,GAC1CqK,wBAAkBpN,IAAI,CAAC,YAAYJ,EAAYmD,CAAQ,CAAC,EAAE,CAAC;AACjE,MAAIlC,IAAUkC;AACd,aAAa;AAEX,UAAMsK,IADWH,EAAO9M,KAAMb,OAAcA,EAAU+N,WAAWzM,CAAO,CAAC,GAChD0M,UAAU1M,CAAO;AAC1C,QAAI,CAACwM,EAAQ;AACb,UAAMG,IAAYb,EAA6BU,CAAM,IACjD,QAAQA,EAAOjJ,MAAM,KACrB,YAAYxE,EAAYyN,CAAM,CAAC;AACnC,QAAID,EAAYtR,IAAI0R,CAAS,GAAG;AAG9BP,MAAAA,EAAY;AAAA,QACVQ,MAAMZ;AAAAA,QACNM,MAAM,CAAC,GAAGA,CAAI;AAAA,QACdO,aAAaf,EAA6BU,CAAM,IAAIG,IAAY5N,EAAYyN,CAAM;AAAA,MAAA,CACnF;AACD;AAAA,IACF;AAGA,QAFAF,EAAKQ,QAAQN,CAAM,GACnBD,EAAYQ,IAAIJ,CAAS,GACrBb,EAA6BU,CAAM,EAAG;AAC1CxM,IAAAA,IAAUwM;AAAAA,EACZ;AACA,SAAOF;AACT,GC9BaU,KAAkC,2BAClCC,KAAgC,yBAChCC,KAAsCA,CAACpN,MAAgB,+BAA+BA,CAAG,IACzFqN,IAA2C,kCAClDC,KAAqBA,CAAC5R,MAC1B,OAAOA,KAAU,YAAY,OAAOA,KAAU,YAAY,OAAOA,KAAU,WAChE6R,KAAuCA,CAACnL,MAAsC;AACzF,MAAI,CAACA,EAAU,QAAO,CAAA;AACtB,QAAM7D,IAA0C;AAAA,IAC9C,CAAC2O,EAA+B,GAAG9K,EAASU;AAAAA,IAC5C,CAACqK,EAA6B,GAAG/K,EAAStD;AAAAA,EAAAA;AAE5C,aAAW,CAACkB,GAAKtE,CAAK,KAAKK,OAAOP,QAAQ4G,EAASkC,YAAY,CAAA,CAAE;AAC/D,IAAIgJ,GAAmB5R,CAAK,QAAU0R,GAAoCpN,CAAG,CAAC,IAAItE;AAEpF,SAAO6C;AACT,GACaiP,KAA2CA,CAACpL,OAA2B;AAAA,EAClF,CAACiL,CAAwC,GAAGpO,EAAYmD,CAAQ;AAClE,IACaqL,KAAoCA,CAACrL,MAAsC;AACtF,MAAI,CAACA,EAAU,QAAO,CAAA;AACtB,QAAMsL,IAAuBtL,EAASkC,WAAW+I,CAAwC;AACzF,SAAI,OAAOK,KAAyB,YAAYA,MAAyBzO,EAAYmD,CAAQ,IACpF,CAACnD,EAAYmD,CAAQ,CAAC,IACxB,CAACnD,EAAYmD,CAAQ,GAAGsL,CAAoB;AACrD,GAqDaC,KAAyBA,CAACzR,IAAqC,OAAyB;AACnG,QAAM0R,wBAAqBvO,IAAAA,GACrB8J,IAAQlN,EAAiD;AAAA,IAC7DM,MAAM;AAAA,IACND,cAAc;AAAA,MAAEuR,OAAO,CAAA;AAAA,MAAIzB,WAAW,CAAA;AAAA,MAAI0B,oBAAoB,CAAA;AAAA,IAAC;AAAA,EAAE,CAClE;AACD,SAAO;AAAA,IACL3E,OAAAA;AAAAA,IACA4E,aAAa9I,GAAMX,GAAU;AAC3B,YAAMqF,IAAWR,EAAMvM,SAAAA;AACvB,UAAI+M,EAASkE,MAAM5I,EAAKA,IAAI,EAAG,OAAM,IAAIxC,MAAM,qCAAqCwC,EAAKA,IAAI,EAAE;AAC/F,YAAMyE,IAAiC;AAAA,QACrC,GAAGrF,EAA8BC,CAAQ;AAAA,QACzC,GAAGW;AAAAA,MAAAA;AAELkE,aAAAA,EAAM7L,SAAS;AAAA,QAAE,GAAGqM;AAAAA,QAAUkE,OAAO;AAAA,UAAE,GAAGlE,EAASkE;AAAAA,UAAO,CAAC5I,EAAKA,IAAI,GAAGyE;AAAAA,QAAAA;AAAAA,MAAO,GAAK,IAAO,cAAc,GACjGrP,EAAiB,MAAM;AAC5B,cAAM6F,IAAUiJ,EAAMvM,SAAAA;AACtB,YAAIsD,EAAQ2N,MAAM5I,EAAKA,IAAI,MAAMyE,EAAQ;AACzC,cAAM;AAAA,UAAE,CAACzE,EAAKA,IAAI,GAAG+I;AAAAA,UAAU,GAAGC;AAAAA,QAAAA,IAAS/N,EAAQ2N;AACnD1E,QAAAA,EAAM7L,SAAS;AAAA,UAAE,GAAG4C;AAAAA,UAAS2N,OAAOI;AAAAA,QAAAA,GAAQ,IAAO,gBAAgB;AAAA,MACrE,CAAC;AAAA,IACH;AAAA,IACAC,QAAQjJ,GAAM;AACZ,aAAOkE,EAAMvM,WAAWiR,MAAM5I,CAAI;AAAA,IACpC;AAAA,IACAkJ,YAAY;AACV,aAAOpS,OAAOwC,OAAO4K,EAAMvM,SAAAA,EAAWiR,KAAK,EAAEhE,KAAKnF,CAAsB;AAAA,IAC1E;AAAA,IACA0J,iBAAiBC,GAAU;AACzB,YAAM1E,IAAWR,EAAMvM,SAAAA;AACvB,UAAI+M,EAASyC,UAAUiC,EAASvP,EAAE,EAAG,OAAM,IAAI2D,MAAM,yCAAyC4L,EAASvP,EAAE,EAAE;AAC3GqK,aAAAA,EAAM7L,SACJ;AAAA,QAAE,GAAGqM;AAAAA,QAAUyC,WAAW;AAAA,UAAE,GAAGzC,EAASyC;AAAAA,UAAW,CAACiC,EAASvP,EAAE,GAAGuP;AAAAA,QAAAA;AAAAA,MAAS,GAC3E,IACA,kBACF,GACOhU,EAAiB,MAAM;AAC5B,cAAM6F,IAAUiJ,EAAMvM,SAAAA;AACtB,YAAIsD,EAAQkM,UAAUiC,EAASvP,EAAE,MAAMuP,EAAU;AACjD,cAAM;AAAA,UAAE,CAACA,EAASvP,EAAE,GAAGkP;AAAAA,UAAU,GAAGC;AAAAA,QAAAA,IAAS/N,EAAQkM;AACrDjD,QAAAA,EAAM7L,SAAS;AAAA,UAAE,GAAG4C;AAAAA,UAASkM,WAAW6B;AAAAA,QAAAA,GAAQ,IAAO,oBAAoB;AAAA,MAC7E,CAAC;AAAA,IACH;AAAA,IACAK,gBAAgB;AACd,aAAOvS,OAAOwC,OAAO4K,EAAMvM,SAAAA,EAAWwP,SAAS;AAAA,IACjD;AAAA,IACAmC,cAAcC,GAAO;AACnB,YAAMzK,IAA+B;AAAA,QAAEuH,SAASpP,EAAMuS,aAAAA;AAAAA,MAAa,GAC7DjT,IAAiC,CAAA;AACvC,iBAAW6S,KAAYtS,OAAOwC,OAAO4K,EAAMvM,SAAAA,EAAWwP,SAAS;AAC7D5Q,QAAAA,EAAQiQ,KAAK,GAAG4C,EAASK,KAAKF,GAAOzK,CAAO,CAAC;AAE/C,aAAOvI;AAAAA,IACT;AAAA,IACAmT,0BAA0BN,GAAU;AAClC,YAAM1E,IAAWR,EAAMvM,SAAAA;AACvB,UAAI+M,EAASmE,mBAAmBO,EAASvP,EAAE;AACzC,cAAM,IAAI2D,MAAM,mDAAmD4L,EAASvP,EAAE,EAAE;AAElF,YAAM4K,IAA4C;AAAA,QAAE,GAAG2E;AAAAA,QAAU5J,UAAU4J,EAAS5J,YAAY;AAAA,MAAA;AAChG0E,aAAAA,EAAM7L,SACJ;AAAA,QACE,GAAGqM;AAAAA,QACHmE,oBAAoB;AAAA,UAAE,GAAGnE,EAASmE;AAAAA,UAAoB,CAACO,EAASvP,EAAE,GAAG4K;AAAAA,QAAAA;AAAAA,MAAO,GAE9E,IACA,2BACF,GACOrP,EAAiB,MAAM;AAC5B,cAAM6F,IAAUiJ,EAAMvM,SAAAA;AACtB,YAAIsD,EAAQ4N,mBAAmBO,EAASvP,EAAE,MAAM4K,EAAQ;AACxD,cAAM;AAAA,UAAE,CAAC2E,EAASvP,EAAE,GAAGkP;AAAAA,UAAU,GAAGC;AAAAA,QAAAA,IAAS/N,EAAQ4N;AACrD3E,QAAAA,EAAM7L,SAAS;AAAA,UAAE,GAAG4C;AAAAA,UAAS4N,oBAAoBG;AAAAA,QAAAA,GAAQ,IAAO,6BAA6B;AAAA,MAC/F,CAAC;AAAA,IACH;AAAA,IACAW,yBAAyB;AACvB,aAAOzC,EAAuBpQ,OAAOwC,OAAO4K,EAAMvM,SAAAA,EAAWkR,kBAAkB,CAAC;AAAA,IAClF;AAAA,IACAe,cAAczM,GAAU;AACtB,aAAKA,IACQiK,GAAsBtQ,OAAOwC,OAAO4K,EAAMvM,WAAWkR,kBAAkB,GAAG1L,GAAW0M,CAAAA,MAAU;AAC1G,mBAAWrS,KAAYmR,EAAgBnR,CAAAA,EAASqS,CAAK;AAAA,MACvD,CAAC,EACWvP,IAAK0M,CAAAA,MAAS;AACxB,YAAI,CAACD,EAA6BC,CAAI,EAAG,QAAOA;AAChD,cAAM8C,IAAO7S,EAAM8S,cAAc/C,EAAKxI,MAAM;AAC5C,eAAOsL,IAAO;AAAA,UAAE,GAAG9C;AAAAA,UAAMgD,OAAOF,EAAKE;AAAAA,UAAOC,MAAMH,EAAKG;AAAAA,QAAAA,IAASjD;AAAAA,MAClE,CAAC,IARqB,CAAA;AAAA,IASxB;AAAA,IACAkD,0BAA0B1S,GAAU;AAClCmR,aAAAA,EAAeX,IAAIxQ,CAAQ,GACpBpC,EAAiB,MAAM;AAC5BuT,QAAAA,EAAejS,OAAOc,CAAQ;AAAA,MAChC,CAAC;AAAA,IACH;AAAA,EAAA;AAEJ,GCtLM2S,KAAsBA,CAAC1T,MAAkBA,EAAM2T,QAAQ,gBAAgB,EAAE,GAEzEC,KAAcA,CAAC/Q,GAAyCgR,MAAiB;AAC7E,QAAMC,IAAUD,EAAK3G,KAAAA;AACrB,MAAI4G,EAAQnO,WAAW,EAAG,QAAO;AAEjC,QAAMoO,IAAaD,EAAQE,MAAM,sCAAsC;AACvE,MAAID,GAAY;AACd,UAAM,GAAGzP,GAAK2P,GAAUC,CAAQ,IAAIH,GAC9BI,IAAStR,EAAOyB,KAAO,EAAE,GACzB8P,IAAWV,GAAoBQ,KAAY,EAAE;AACnD,WAAOD,MAAa,OAAOI,OAAOF,CAAM,MAAMC,IAAWC,OAAOF,CAAM,MAAMC;AAAAA,EAC9E;AAEA,SAAIN,EAAQjO,WAAW,GAAG,IAAU,CAAChD,EAAOiR,EAAQQ,MAAM,CAAC,CAAC,IAErDlH,EAAQvK,EAAOiR,CAAO;AAC/B,GAEaS,KAA2BA,CAAC1R,GAAyC2R,MAC3EA,IACEA,EAAWrH,MAAM,IAAI,EAAE7H,KAAMmP,OAAaA,EAAStH,MAAM,IAAI,EAAEuH,MAAOb,CAAAA,MAASD,GAAY/Q,GAAQgR,CAAI,CAAC,CAAC,IADxF,IAIbc,KAA0BA,MAAyB;AAC9D,QAAMlH,IAAQlN,EAA2C;AAAA,IACvDM,MAAM;AAAA,IACND,cAAc;AAAA,MAAEiC,QAAQ,CAAA;AAAA,IAAC;AAAA,EAAE,CAC5B;AAED,MAAI+R,IAAgD,CAAA;AACpD,QAAMC,wBAAkBvV,IAAAA,GAElBwV,IAAcA,MAAM;AACxB,UAAMjS,IAAS;AAAA,MAAE,GAAG+R;AAAAA,IAAAA;AACpB,eAAWG,KAAgBF,EAAYhS,OAAAA,EAAUxC,QAAO2U,OAAOnS,GAAQkS,CAAY;AACnF,WAAOlS;AAAAA,EACT,GAEMoS,IAAUA,CAACrH,MAAmB;AAClCH,IAAAA,EAAM7L,SAAS;AAAA,MAAEiB,QAAQiS,EAAAA;AAAAA,IAAY,GAAK,IAAOlH,CAAM;AAAA,EACzD;AAEA,SAAO;AAAA,IACLH,OAAAA;AAAAA,IAEA/N,IAAI4E,GAAKtE,GAAO;AACd,MAAI4U,EAAatQ,CAAG,MAAMtE,MAC1B4U,IAAe;AAAA,QAAE,GAAGA;AAAAA,QAAc,CAACtQ,CAAG,GAAGtE;AAAAA,MAAAA,GACzCiV,EAAQ,eAAe;AAAA,IACzB;AAAA,IAEAC,IAAI5Q,GAAK;AACP,aAAOmJ,EAAMvM,WAAW2B,OAAOyB,CAAG;AAAA,IACpC;AAAA,IAEArE,OAAOqE,GAAK;AACV,UAAI,EAAEA,KAAOsQ,GAAe;AAC5B,YAAM;AAAA,QAAE,CAACtQ,CAAG,GAAGgO;AAAAA,QAAU,GAAGC;AAAAA,MAAAA,IAASqC;AACrCA,MAAAA,IAAerC,GACf0C,EAAQ,kBAAkB;AAAA,IAC5B;AAAA,IAEAE,YAAYrM,GAAS;AACnB+L,MAAAA,EAAYnV,IAAIoJ,GAAS+L,EAAYK,IAAIpM,CAAO,KAAK,EAAE;AACvD,UAAIjK,IAAW;AAEf,YAAMuW,IAAeA,MAAM;AACzB,YAAIvW,EAAU,OAAM,IAAIkI,MAAM,+BAA+B+B,CAAO,EAAE;AAAA,MACxE;AAEA,aAAO;AAAA,QACLA,SAAAA;AAAAA,QAEApJ,IAAI4E,GAAKtE,GAAO;AACdoV,UAAAA,EAAAA;AACA,gBAAMvS,IAASgS,EAAYK,IAAIpM,CAAO,KAAK,CAAA;AAC3C,UAAIjG,EAAOyB,CAAG,MAAMtE,MACpB6U,EAAYnV,IAAIoJ,GAAS;AAAA,YAAE,GAAGjG;AAAAA,YAAQ,CAACyB,CAAG,GAAGtE;AAAAA,UAAAA,CAAO,GACpDiV,EAAQ,qBAAqB;AAAA,QAC/B;AAAA,QAEAC,IAAI5Q,GAAK;AACP8Q,iBAAAA,EAAAA,GACOP,EAAYK,IAAIpM,CAAO,IAAIxE,CAAG;AAAA,QACvC;AAAA,QAEArE,OAAOqE,GAAK;AACV8Q,UAAAA,EAAAA;AACA,gBAAMvS,IAASgS,EAAYK,IAAIpM,CAAO;AACtC,cAAI,CAACjG,KAAU,EAAEyB,KAAOzB,GAAS;AACjC,gBAAM;AAAA,YAAE,CAACyB,CAAG,GAAGgO;AAAAA,YAAU,GAAGC;AAAAA,UAAAA,IAAS1P;AACrCgS,UAAAA,EAAYnV,IAAIoJ,GAASyJ,CAAI,GAC7B0C,EAAQ,wBAAwB;AAAA,QAClC;AAAA,QAEAnW,UAAU;AACR,UAAID,MACJA,IAAW,IACNgW,EAAY5U,OAAO6I,CAAO,KAC/BmM,EAAQ,wBAAwB;AAAA,QAClC;AAAA,MAAA;AAAA,IAEJ;AAAA,IAEAI,YAAYvM,GAAS;AACnB,MAAK+L,EAAY5U,OAAO6I,CAAO,KAC/BmM,EAAQ,uBAAuB;AAAA,IACjC;AAAA,IAEAhH,WAAW;AACT,aAAO;AAAA,QAAE,GAAGR,EAAMvM,WAAW2B;AAAAA,MAAAA;AAAAA,IAC/B;AAAA,IAEAwL,QAAQmG,GAAY;AAClB,aAAOD,GAAyB9G,EAAMvM,SAAAA,EAAW2B,QAAQ2R,CAAU;AAAA,IACrE;AAAA,EAAA;AAEJ,GC/IMc,wBAA2BC,QAAAA,GAEpBC,KAAwBA,CAACC,GAA0BC,MAAkC;AAChGJ,EAAAA,EAAqB5V,IAAI+V,GAAWC,CAAS;AAC/C,GAEaC,KAAwBA,CAACF,MAA6B;AACjE,QAAMC,IAAYJ,EAAqBJ,IAAIO,CAAS;AACpD,MAAI,CAACC,EAAW,OAAM,IAAI3O,MAAM,yCAAyC;AACzE,SAAO2O;AACT;"}
|