dsh-web-annotator 0.0.0-stage → 0.2.0-alpha.12
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/CHANGELOG.md +125 -0
- package/CONTRIBUTING.md +90 -0
- package/LICENSE +21 -0
- package/README.md +110 -2
- package/README_en.md +136 -0
- package/THIRD_PARTY_NOTICES.md +15 -0
- package/cordis.patch.yml +15 -0
- package/docs/AGENTS.md +16 -0
- package/docs/README.md +25 -0
- package/docs/architecture.md +170 -0
- package/docs/browser-integration.md +94 -0
- package/docs/distribution.md +66 -0
- package/docs/harness-browser-annotation.patch +1909 -0
- package/docs/images/annotation-expanded-dark.png +0 -0
- package/docs/images/annotation-expanded.png +0 -0
- package/docs/images/annotation-image.png +0 -0
- package/docs/images/annotation-message.png +0 -0
- package/docs/images/annotation-region.png +0 -0
- package/docs/marketplace/cslkkl__dsh-web-annotator.yml +7 -0
- package/docs/publishing.md +169 -0
- package/docs/roadmap.md +31 -0
- package/docs/verification.md +179 -0
- package/dsh-plugin.naming.json +27 -0
- package/examples/responsive-demo/AGENTS.md +12 -0
- package/examples/responsive-demo/README.md +33 -0
- package/examples/responsive-demo/index.html +13 -0
- package/examples/responsive-demo/src/main.tsx +110 -0
- package/examples/responsive-demo/src/style.css +344 -0
- package/examples/responsive-demo/vite.config.ts +9 -0
- package/lib/THIRD_PARTY_LICENSES.md +345 -0
- package/lib/bridge.js +890 -0
- package/lib/bridge.js.map +7 -0
- package/lib/client.js +1083 -0
- package/lib/client.js.map +7 -0
- package/lib/host/THIRD_PARTY_NOTICES.md +15 -0
- package/lib/host/browser-provider/LICENSE +21 -0
- package/lib/host/browser-provider/README.md +130 -0
- package/lib/host/browser-provider/lib/client.css +217 -0
- package/lib/host/browser-provider/lib/client.css.map +7 -0
- package/lib/host/browser-provider/lib/client.js +2360 -0
- package/lib/host/browser-provider/lib/client.js.map +7 -0
- package/lib/host/browser-provider/lib/index.js +7 -0
- package/lib/host/browser-provider/lib/index.js.map +7 -0
- package/lib/host/browser-provider/package.json +23 -0
- package/lib/host/bundle.json +27 -0
- package/lib/host/chat-provider/LICENSE +21 -0
- package/lib/host/chat-provider/README.md +186 -0
- package/lib/host/chat-provider/lib/client.css +1604 -0
- package/lib/host/chat-provider/lib/client.css.map +7 -0
- package/lib/host/chat-provider/lib/client.js +11074 -0
- package/lib/host/chat-provider/lib/client.js.map +7 -0
- package/lib/host/chat-provider/lib/index.js +911 -0
- package/lib/host/chat-provider/lib/index.js.map +7 -0
- package/lib/host/chat-provider/package.json +31 -0
- package/lib/host/layout-provider/LICENSE +21 -0
- package/lib/host/layout-provider/README.md +109 -0
- package/lib/host/layout-provider/lib/client.css +177 -0
- package/lib/host/layout-provider/lib/client.css.map +7 -0
- package/lib/host/layout-provider/lib/client.js +565 -0
- package/lib/host/layout-provider/lib/client.js.map +7 -0
- package/lib/host/layout-provider/lib/index.js +7 -0
- package/lib/host/layout-provider/lib/index.js.map +7 -0
- package/lib/host/layout-provider/package.json +25 -0
- package/lib/index.d.ts +2 -0
- package/lib/index.js +9 -0
- package/lib/index.js.map +7 -0
- package/lib/vite.d.ts +8 -0
- package/lib/vite.js +1254 -0
- package/lib/vite.js.map +7 -0
- package/licenses/deepseek-harness-MIT.txt +21 -0
- package/locale/AGENTS.md +11 -0
- package/locale/README.md +11 -0
- package/locale/en.json +6 -0
- package/locale/zh.json +6 -0
- package/package.json +154 -4
- package/screenshots.json +7 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../.host-source/packages/client/ui-sidebar-browser/src/client/index.ts", "../../../.host-source/packages/client/ui-sidebar-browser/src/client/view/BrowserBody.tsx", "../../../.host-source/packages/client/ui-sidebar-browser/src/client/browser/BrowserFrame.ts", "../../../.host-source/packages/client/ui-sidebar-browser/src/client/browser/BrowserPersistence.ts", "../../../.host-source/packages/client/ui-sidebar-browser/src/client/view/Browser.module.css", "../../../.host-source/packages/client/ui-sidebar-browser/src/client/view/BrowserTitle.tsx", "../../../.host-source/packages/client/ui-sidebar-browser/src/client/browser/BrowserController.ts", "../../../.host-source/packages/client/ui-sidebar-browser/src/client/browser/url.ts", "../../../.host-source/packages/client/ui-sidebar-browser/src/client/browser/IframeImpl.ts", "../../../.host-source/packages/client/ui-sidebar-browser/src/client/browser/BrowserNavigation.ts", "../../../.host-source/packages/client/ui-sidebar-browser/src/client/annotation/protocol.ts", "../../../.host-source/packages/client/ui-sidebar-browser/src/client/annotation/iframe-annotation.ts", "../../../.host-source/packages/client/ui-sidebar-browser/src/client/view/IframePresentation.ts", "../../../.host-source/packages/client/ui-sidebar-browser/src/client/pages.ts", "../../../.host-source/packages/client/ui-sidebar-browser/src/client/electron/ElectronWebViewImpl.ts", "../../../.host-source/packages/client/ui-sidebar-browser/src/client/annotation/page-inspector.ts", "../../../.host-source/packages/client/ui-sidebar-browser/src/client/annotation/screenshot.ts", "../../../.host-source/packages/client/ui-sidebar-browser/src/client/electron/ElectronWebviewPresentation.ts", "../../../.host-source/packages/client/ui-sidebar-browser/src/client/electron/pages.ts", "../../../.host-source/packages/client/ui-sidebar-browser/src/client/electron/workspace.ts", "../../../.host-source/packages/client/ui-sidebar-browser/src/client/definition.tsx", "../../../.host-source/packages/client/ui-sidebar-browser/src/client/locales.ts", "../../../.host-source/packages/client/ui-sidebar-browser/src/client/browser/store.ts"],
|
|
4
|
+
"sourcesContent": ["/** Register the HTTP(S) Browser tab type in the right Sidebar. */\nimport type { ShortcutCommandId } from '@deepseek-ai/dsh-client-shortcuts/client'\nimport type { Context } from '@deepseek-ai/cordis'\nimport type {} from '@deepseek-ai/dsh-client-locale/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-renderer/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-session/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-sidebar-right/client'\nimport type {} from '@deepseek-ai/dsh-api-workspace-controller/client'\nimport { BrowserBody, type BrowserBodyProps } from './view/BrowserBody.tsx'\nimport { BrowserTitle } from './view/BrowserTitle.tsx'\nimport { createBrowserControllers } from './browser/BrowserController.ts'\nimport type { BrowserInjected } from './browser/BrowserController.ts'\nimport { createIframePage } from './pages.ts'\nimport { createElectronPage } from './electron/pages.ts'\nimport type { DesktopBrowserBridge } from '../types.ts'\nimport { browserWorkspace } from './electron/workspace.ts'\nimport type { BrowserPageFactory } from './browser/BrowserPage.ts'\nimport { BROWSER_ID, browserDefinition } from './definition.tsx'\nimport { en, zh } from './locales.ts'\nimport { createBrowserStore } from './browser/store.ts'\nimport type {} from './annotation/slots.ts'\n\nexport type { BrowserBodyProps } from './view/BrowserBody.tsx'\nexport type { BrowserAnnotationOwner } from './annotation/slots.ts'\nexport type { BrowserAnnotation, BrowserAnnotationOptions, BrowserAnnotationElement } from './annotation/page-inspector.ts'\nexport type { AnnotationResult } from './annotation/protocol.ts'\nexport type { BrowserControllerState, BrowserInjected, BrowserMountRequest } from './browser/BrowserController.ts'\nexport type { BrowserFrame, BrowserFrameState, BrowserLoadError, BrowserSandboxControl } from './browser/BrowserFrame.ts'\nexport type { BrowserPage, BrowserPageFactory, BrowserPageOptions } from './browser/BrowserPage.ts'\nexport type { BrowserPresentation } from './view/BrowserPresentation.ts'\nexport type { BrowserFailure, BrowserHistoryEntry, BrowserNavigationStatus, BrowserTabState } from './browser/BrowserPersistence.ts'\nexport type { SidebarBrowserKey } from './locales.ts'\nexport type { BrowserState } from './browser/store.ts'\nexport type { BrowserAddressFailure, BrowserAddressResult, BrowserTarget } from './browser/url.ts'\n\ndeclare module '@deepseek-ai/dsh-client-ui-sidebar-right/client' {\n interface SidebarRightTabParamsMap {\n /** Optional initial Browser URL. */\n browser: { readonly url?: string }\n }\n}\n\n/** Required Browser services. */\nexport const inject = ['slots', 'locale', 'sidebarRight', 'sidebarRightTabs']\n\n/** Register the Browser type, localized guide entry, body, and title. */\nexport function apply(ctx: Context): void {\n const namespace = 'sidebarBrowser'\n const t = ctx.locale.bind(namespace)\n ctx.inject(['shortcuts'], (ctx) => {\n ctx.effect(() => ctx.shortcuts.register({\n id: 'browser.new' as ShortcutCommandId, label: () => t('guide.title'), aliases: ['browser', 'new browser tab'],\n defaults: {\n 'desktop:macos': { code: 'KeyT', modifiers: ['primary'] },\n 'desktop:windows': { code: 'KeyT', modifiers: ['primary'] },\n 'desktop:linux': { code: 'KeyT', modifiers: ['primary'] },\n 'web:macos': { code: 'KeyT', modifiers: ['primary', 'alt'] },\n 'web:windows': { code: 'KeyT', modifiers: ['primary', 'alt'] },\n },\n // Each tab plugin owns its command's availability, localized refusal, and tab kind.\n /* jscpd:ignore-start */\n regions: ['page', 'editable', 'terminal'], modals: [],\n resolve: ({ target: element }) => {\n const target = ctx.sidebarRight.commandTarget(element)\n if (target === undefined) return { status: 'blocked', reason: t('shortcut.noSession') }\n return { status: 'handled', run: () => { ctx.sidebarRight.openTabFromTarget('browser', target) } }\n },\n /* jscpd:ignore-end */\n }), 'ui-sidebar-browser: shortcut')\n })\n const store = createBrowserStore()\n const openTabs = ctx.sidebarRight.openTabs\n const carrier = (globalThis as typeof globalThis & {\n dshDesktop?: { readonly protocolVersion: number; readonly browser?: DesktopBrowserBridge }\n }).dshDesktop\n const desktop = carrier?.protocolVersion === 1 ? carrier.browser : undefined\n ctx.effect(() => ctx.locale.register(namespace, { zh, en }), 'ui-sidebar-browser.copy')\n ctx.effect(() => ctx.sidebarRightTabs.register({ ...browserDefinition(t), keepMounted: desktop !== undefined }), 'ui-sidebar-browser.type')\n const installFrames = (scope: Context, factory: (sessionId: BrowserBodyProps['sessionId']) => BrowserPageFactory): void => {\n const controllers = new Map<BrowserBodyProps['sessionId'], BrowserInjected>()\n scope.effect(() => async () => {\n const pending = [...controllers.values()].map(controller => controller.dispose())\n controllers.clear()\n await Promise.all(pending)\n }, 'ui-sidebar-browser.frames')\n scope.effect(() => scope.slots.inject('sidebar.right.pane.tab', () => scope.slots.register({\n name: 'sidebar.right.pane.tab', key: BROWSER_ID, locale: namespace, store,\n children: {\n 'sidebar.right.tab.browser.toolbar': { kind: 'list', scope: 'session' },\n 'sidebar.right.tab.browser.annotations': { kind: 'list', scope: 'session' },\n },\n inject: (sessionId, actions) => {\n const existing = controllers.get(sessionId)\n if (existing !== undefined) {\n existing.rebind(actions)\n return existing\n }\n const controller = createBrowserControllers(actions, factory(sessionId), tabId =>\n openTabs.getSnapshot().some(tab => tab.sessionId === sessionId && tab.tabId === tabId))\n controllers.set(sessionId, controller)\n return controller\n },\n }, BrowserBody)), 'ui-sidebar-browser.body')\n }\n if (desktop === undefined) installFrames(ctx, () => createIframePage)\n else ctx.inject(['workspaces'], (scope) => {\n installFrames(scope, sessionId => options => createElectronPage(options, desktop,\n signal => browserWorkspace(scope.workspaces.list, sessionId, signal)))\n })\n ctx.effect(() => ctx.slots.inject('sidebar.right.pane.tab.title', () => ctx.slots.register({\n name: 'sidebar.right.pane.tab.title', key: BROWSER_ID, store,\n }, BrowserTitle)), 'ui-sidebar-browser.title')\n}\n", "/** Common browser chrome; a presentation adapter attaches the page inside its content container. */\nimport { useEffect, useId, useLayoutEffect, useMemo, useRef, useState } from 'react'\nimport type { FormEvent, ReactNode } from 'react'\nimport {\n Button,\n IconChevronLeftOutlineRegular,\n IconChevronRightOutlineRegular,\n IconLinkOutlineRegular,\n IconRefreshOutlineRegular, Tooltip,\n IconRightUpOutlineRegular,\n SHIELD_OUTLINE_PATH,\n ICON_REGULAR_STROKE,\n} from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { InjectFace, PropsLocale, PropsRuntime, PropsStore, PropsRenderSlots } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { BrowserAnnotationOwner } from '../annotation/slots.ts'\nimport type { BrowserInjected } from '../browser/BrowserController.ts'\nimport { emptyBrowserFrame } from '../browser/BrowserFrame.ts'\nimport { currentBrowserTarget } from '../browser/BrowserPersistence.ts'\nimport type { BrowserStore } from '../browser/store.ts'\nimport css from './Browser.module.css'\n\nconst EMPTY_FRAME = emptyBrowserFrame()\n\nfunction SandboxPolicyIcon({ sandboxed }: { readonly sandboxed: boolean }): ReactNode {\n return (\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden>\n <path d={SHIELD_OUTLINE_PATH} stroke=\"currentColor\" strokeWidth={ICON_REGULAR_STROKE} strokeLinejoin=\"round\" />\n {sandboxed\n ? <path d=\"M12.1654 5.7552L8.9447 9.41475C8.73044 9.65816 8.53628 9.8804 8.35774 10.0423C8.1713 10.2114 7.94235 10.3717 7.64016 10.4254C7.48207 10.4535 7.32 10.4552 7.16151 10.4294C6.85843 10.3801 6.62728 10.2223 6.43836 10.0559C6.25752 9.89653 6.06037 9.67732 5.84264 9.43705L4.72925 8.20897L5.63557 7.38707L6.74897 8.61594C6.98603 8.87755 7.12974 9.03533 7.24673 9.13839C7.31033 9.19443 7.34485 9.21476 7.35823 9.22122C7.38068 9.22484 7.40352 9.22515 7.42593 9.22122C7.40522 9.22502 7.42893 9.23294 7.53583 9.136C7.65132 9.03126 7.79316 8.87139 8.02643 8.60638L11.2479 4.94763L12.1654 5.7552Z\" fill=\"currentColor\" />\n : <path d=\"M10.6074 4.40278L8.00975 6.99973L10.6074 9.59739L9.59736 10.6074L6.9997 8.00978L4.40274 10.6074L3.3927 9.59739L5.98966 6.99973L3.3927 4.40278L4.40274 3.39273L6.9997 5.98969L9.59736 3.39273L10.6074 4.40278Z\" fill=\"currentColor\" transform=\"translate(1.2 0.8)\" />}\n </svg>\n )\n}\n\n/** Browser body props assembled by the tab seat. */\nexport type BrowserBodyProps = PropsRuntime<'sidebar.right.pane.tab'>\n & PropsStore<BrowserStore>\n & PropsLocale<'sidebarBrowser'>\n & InjectFace<BrowserInjected>\n & PropsRenderSlots<'sidebar.right.tab.browser.toolbar' | 'sidebar.right.tab.browser.annotations'>\n\nfunction useBrowserDraft(url: string | undefined, revision: number): readonly [string, (value: string) => void] {\n const [edit, setEdit] = useState<{ readonly revision: number; readonly value: string }>()\n return [edit?.revision === revision ? edit.value : url ?? '',\n (value) => { setEdit({ revision, value }) }]\n}\n\n/** Render provider-neutral navigation state and optional controls. */\nexport function BrowserBody(props: BrowserBodyProps): ReactNode {\n const { mount, loadUrl, restore, goBack, goForward, reload, setSandbox, useBrowserState, useStore, useTabInfo, t } = props\n const { tab } = useTabInfo()\n useEffect(() => tab.actions.bindCommands({ refresh: () => { reload(tab.id) } }), [tab.actions, tab.id, reload])\n const saved = useStore(state => state.byTab[tab.id])\n const initial = useRef(saved)\n const initialUrl = useRef(tab.navigation.params?.url)\n const viewportId = useId()\n const [mountEpoch, setMountEpoch] = useState(0)\n const state = useBrowserState(tab.id)\n const frame = state?.frame ?? EMPTY_FRAME\n const restoreTarget = state === undefined ? currentBrowserTarget(initial.current) : state.restoreTarget\n const target = frame.target ?? restoreTarget\n const [draft, setDraft] = useBrowserDraft(target?.url ?? initialUrl.current, state?.addressRevision ?? 0)\n\n useLayoutEffect(() => {\n const hide = mount({\n tabId: tab.id, signal: tab.signal, viewportId, applicationOrigin: window.location.origin,\n initial: initial.current, initialUrl: initialUrl.current,\n openTab: (url) => { tab.actions.openTab('browser', { params: { url }, revealIfOpened: false }) },\n })\n setMountEpoch(value => value + 1)\n return hide\n }, [mount, tab.id, tab.signal, tab.actions, viewportId, props.actions])\n\n const unknown = frame.address === 'unknown'\n const externalUrl = unknown ? undefined : target?.url\n const sandboxed = frame.sandboxEnabled\n const failure = state?.addressFailure\n const error = frame.error\n const submit = (event: FormEvent): void => { event.preventDefault(); loadUrl(tab.id, draft) }\n const annotationOwner: BrowserAnnotationOwner = useMemo(() => ({\n tabId: tab.id, url: unknown ? undefined : frame.target?.url, loading: frame.loading || mountEpoch === 0,\n annotate: options => props.annotate(tab.id, options),\n cancelAnnotation: () => { props.cancelAnnotation(tab.id) },\n }), [tab.id, unknown, frame.target?.url, frame.loading, mountEpoch, props.annotate, props.cancelAnnotation])\n\n return (\n <div className={css.root}>\n <form className={css.toolbar} onSubmit={submit}>\n <button type=\"button\" className={css.tool} aria-label={t('back')} title={t('back')} disabled={!frame.canGoBack} onClick={() => { goBack(tab.id) }}><IconChevronLeftOutlineRegular /></button>\n <button type=\"button\" className={css.tool} aria-label={t('forward')} title={t('forward')} disabled={!frame.canGoForward} onClick={() => { goForward(tab.id) }}><IconChevronRightOutlineRegular /></button>\n {props.renderSlot('sidebar.right.tab.browser.toolbar', annotationOwner)}\n <Tooltip label={t('reload')} shortcutKeys={tab.refreshShortcut?.keys} side=\"bottom\" delayMs={500}>\n <button type=\"button\" className={css.tool} aria-label={t('reload')} aria-keyshortcuts={tab.refreshShortcut?.aria} disabled={target === undefined || mountEpoch === 0} onClick={() => { reload(tab.id) }}><IconRefreshOutlineRegular /></button>\n </Tooltip>\n <div className={css.addressBox}>\n <input\n className={[css.address, unknown ? css.addressUnknown : ''].join(' ')}\n value={draft}\n aria-label={t('address.placeholder')}\n placeholder={t('address.placeholder')}\n spellCheck={false}\n onChange={(event) => { setDraft(event.currentTarget.value) }}\n />\n {unknown && <span className={css.addressChanged}>{t('address.changed')}</span>}\n <button type=\"submit\" className={[css.tool, css.addressGo].join(' ')} aria-label={t('go')} title={t('go')}><IconLinkOutlineRegular /></button>\n </div>\n <button type=\"button\" className={css.tool} aria-label={t('external')} title={t('external')} disabled={externalUrl === undefined}\n onClick={externalUrl === undefined ? undefined : () => { window.open(externalUrl, '_blank', 'noopener,noreferrer') }}\n ><IconRightUpOutlineRegular size={14} /></button>\n {sandboxed !== undefined && <button\n type=\"button\"\n className={[css.tool, sandboxed ? '' : css.sandboxOff].join(' ')}\n aria-label={t(sandboxed ? 'sandbox.disable' : 'sandbox.enable')}\n title={t(sandboxed ? 'sandbox.disable' : 'sandbox.enable')}\n aria-pressed={!sandboxed}\n onClick={() => { setSandbox(tab.id, !sandboxed) }}\n ><SandboxPolicyIcon sandboxed={sandboxed} /></button>}\n </form>\n {sandboxed === false && <div className={css.sandboxWarning} role=\"status\">{t('sandbox.warning')}</div>}\n {error !== undefined && <div className={css.failure} role=\"status\">{error.code !== undefined && error.description !== undefined\n ? t('load.failed.detail', { code: String(error.code), description: error.description })\n : t('load.failed')}</div>}\n {failure !== undefined && <div className={css.failure} role=\"alert\">{t(`error.${failure}`)}</div>}\n <div className={css.content} aria-busy={frame.loading}>\n <div id={viewportId} className={css.viewport} aria-label={t('type.label')} />\n {restoreTarget !== undefined && <section className={css.restore} aria-label={t('restore.previous')}>\n <p className={css.restoreLabel}>{t('restore.previous')}</p>\n <p className={css.restoreTitle}>{restoreTarget.title}</p>\n <p className={css.restoreUrl}>{restoreTarget.url}</p>\n <Button variant=\"primary\" size=\"sm\" disabled={mountEpoch === 0} onClick={() => { restore(tab.id) }}>\n {t('restore.action')}\n </Button>\n </section>}\n {restoreTarget === undefined && (target === undefined || frame.loading) && error === undefined && <div className={css.placeholder}>\n <div className={css.start}>{t(target === undefined ? 'start' : 'loading')}</div>\n </div>}\n </div>\n {props.renderSlot('sidebar.right.tab.browser.annotations', annotationOwner)}\n {unknown && <p className={css.limit}>{t('address.unknown')}</p>}\n </div>\n )\n}\n", "/** Carrier-neutral page navigation and observable state. */\nimport type { HostObservable } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { BrowserTarget } from './url.ts'\n\n/** A loading failure, optionally carrying the underlying browser's diagnostic. */\nexport interface BrowserLoadError {\n readonly code: number | undefined\n readonly description: string | undefined\n}\n\n/** State consumed by common browser chrome, without DOM or carrier identifiers. */\nexport interface BrowserFrameState {\n readonly target: BrowserTarget | undefined\n readonly address: 'empty' | 'requested' | 'observed' | 'unknown'\n readonly loading: boolean\n readonly canGoBack: boolean\n readonly canGoForward: boolean\n readonly error: BrowserLoadError | undefined\n /** Undefined when this provider does not expose a sandbox control. */\n readonly sandboxEnabled: boolean | undefined\n}\n\n/** Optional iframe policy control, not an Electron process-sandbox switch. */\nexport interface BrowserSandboxControl {\n /** @param enabled - whether the provider's embedding sandbox is enforced. */\n setEnabled(enabled: boolean): void\n}\n\n/** Navigation owns page lifetime; mounting and hiding belong to BrowserPresentation. */\nexport interface BrowserFrame extends HostObservable<BrowserFrameState> {\n readonly sandbox?: BrowserSandboxControl\n /** @param target - validated HTTP(S) address; loading failures are published in state. */\n loadUrl(target: BrowserTarget): void\n /** Move backward when the provider reports an available entry. */\n goBack(): void\n /** Move forward when the provider reports an available entry. */\n goForward(): void\n /** Reload the current address without creating a new history entry. */\n reload(): void\n /** @returns after the page, listeners and pending initialization have been released; repeated calls join disposal. */\n dispose(): Promise<void>\n}\n\n/**\n * Create idle navigation state without a page target.\n * @returns state before any page has been requested.\n */\nexport function emptyBrowserFrame(): BrowserFrameState {\n return { target: undefined, address: 'empty', loading: false, canGoBack: false, canGoForward: false,\n error: undefined, sandboxEnabled: undefined }\n}\n", "/** Existing browser-local navigation records, independent from live frame state. */\nimport type { BrowserAddressFailure, BrowserTarget } from './url.ts'\n\n/** One retained address. */\nexport type BrowserHistoryEntry = BrowserTarget\n\n/** Observability recorded for a controlled navigation. */\nexport type BrowserNavigationStatus =\n | { readonly status: 'empty' }\n | { readonly status: 'loading'; readonly revision: number }\n | { readonly status: 'known'; readonly revision: number }\n | { readonly status: 'unknown'; readonly revision: number }\n\n/** Address refusal carried by existing browser-local records. */\nexport type BrowserFailure = { readonly kind: 'address'; readonly reason: BrowserAddressFailure }\n\n/** Serializable record; providers retain the history they can restore. */\nexport interface BrowserTabState {\n readonly entries: readonly BrowserHistoryEntry[]\n readonly index: number\n readonly request: { readonly revision: number; readonly target: BrowserTarget } | undefined\n readonly navigation: BrowserNavigationStatus\n readonly failure: BrowserFailure | undefined\n}\n\n/**\n * Read the selected address from a saved navigation record.\n * @param state - saved navigation.\n * @returns its last selected address, if any.\n */\nexport function currentBrowserTarget(state: BrowserTabState | undefined): BrowserTarget | undefined {\n return state === undefined || state.index < 0 ? undefined : state.entries[state.index]\n}\n\n/**\n * Checkpoint an observed address without serializing native history.\n * @param target - current address.\n * @param revision - navigation generation.\n * @returns an address-only checkpoint.\n */\nexport function browserAddressCheckpoint(target: BrowserTarget, revision: number): BrowserTabState {\n return { entries: [target], index: 0, request: { target, revision },\n navigation: { status: 'known', revision }, failure: undefined }\n}\n", ".root {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-bg-base);\n}\n\n.toolbar {\n display: flex;\n flex: 0 0 auto;\n gap: 4px;\n align-items: center;\n box-sizing: border-box;\n height: 38px;\n padding: 5px 6px;\n border-bottom: 0.5px solid var(--dsw-alias-border-l3);\n}\n\n.tool {\n display: inline-flex;\n flex: 0 0 auto;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n padding: 0;\n color: var(--dsw-alias-label-secondary);\n background: transparent;\n border: 0;\n border-radius: var(--dsw-radius-sm);\n cursor: pointer;\n}\n\n.tool:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.tool:disabled {\n color: var(--dsw-alias-label-quaternary);\n cursor: default;\n}\n\n.sandboxOff {\n color: var(--dsw-alias-state-error-primary);\n background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 10%, transparent);\n}\n\n.addressBox {\n position: relative;\n flex: 1 1 auto;\n min-width: 0;\n}\n\n.address {\n width: 100%;\n height: 28px;\n box-sizing: border-box;\n padding: 0 34px 0 9px;\n color: var(--dsw-alias-label-primary);\n font: var(--dsw-font-xxs-12);\n background: var(--dsw-alias-bg-layer-1);\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--dsw-radius-sm);\n}\n\n.addressGo {\n position: absolute;\n top: 0;\n right: 0;\n visibility: hidden;\n opacity: 0;\n}\n\n.addressBox:focus-within .addressGo {\n visibility: visible;\n opacity: 1;\n}\n\n.addressUnknown {\n --dsh-scrollbar-thumb: var(--dsw-alias-scrollbar-bg-l2);\n --dsh-scrollbar-thumb-hover: var(--dsw-alias-scrollbar-hover-l2);\n\n color: var(--dsw-alias-label-tertiary);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n.addressUnknown:focus {\n color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-bg-layer-1);\n}\n\n.addressChanged {\n position: absolute;\n top: 6px;\n right: 8px;\n padding-left: 8px;\n color: var(--dsw-alias-label-tertiary);\n font: var(--dsw-font-xxxs-11);\n line-height: 16px;\n pointer-events: none;\n background: var(--dsw-alias-bg-layer-2);\n}\n\n.addressBox:focus-within .addressChanged {\n visibility: hidden;\n opacity: 0;\n}\n\n.address:focus {\n outline: 1px solid var(--dsw-alias-state-business-primary);\n outline-offset: -1px;\n}\n\n.frame {\n display: flex;\n flex: 1 1 auto;\n width: 100%;\n min-height: 0;\n border: 0;\n background: var(--dsw-alias-bg-base);\n}\n\n.content {\n position: relative;\n display: flex;\n flex: 1 1 auto;\n min-width: 0;\n min-height: 0;\n}\n\n.viewport {\n display: flex;\n flex: 1 1 auto;\n min-width: 0;\n min-height: 0;\n}\n\n.placeholder {\n position: absolute;\n inset: 0;\n display: flex;\n pointer-events: none;\n}\n\n.restore {\n position: absolute;\n inset: 0;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 10px;\n padding: 24px;\n overflow: auto;\n text-align: center;\n}\n\n.restoreLabel {\n margin: auto 0 0;\n color: var(--dsw-alias-label-tertiary);\n font: var(--dsw-font-xxs-12);\n}\n\n.restoreTitle {\n max-width: 100%;\n margin: 0;\n overflow-wrap: anywhere;\n font: var(--dsw-font-xs-13);\n font-weight: 500;\n}\n\n.restoreUrl {\n max-width: 100%;\n margin: 0;\n overflow-wrap: anywhere;\n color: var(--dsw-alias-label-secondary);\n font: var(--dsw-font-xxs-12);\n}\n\n.restore > :last-child {\n flex-shrink: 0;\n margin-bottom: auto;\n}\n\n.webview {\n display: flex;\n flex: 1 1 auto;\n min-width: 0;\n min-height: 0;\n width: 100%;\n height: 100%;\n border: 0;\n -webkit-app-region: no-drag;\n}\n\n/* Native guest input must not consume a docking gesture's window events. */\n:global(html:has([data-dockkit-pointer])) .webview {\n pointer-events: none;\n}\n\n.start {\n display: flex;\n flex: 1 1 auto;\n align-items: center;\n justify-content: center;\n min-height: 0;\n padding: 24px;\n color: var(--dsw-alias-label-tertiary);\n font: var(--dsw-font-xs-13);\n text-align: center;\n}\n\n.failure {\n flex: 0 0 auto;\n padding: 6px 12px;\n color: var(--dsw-alias-state-error-primary);\n font: var(--dsw-font-xxxs-11);\n background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 8%, transparent);\n}\n\n.sandboxWarning {\n flex: 0 0 auto;\n padding: 6px 12px;\n color: var(--dsw-alias-label-secondary);\n font: var(--dsw-font-xxxs-11);\n background: var(--dsw-alias-state-warn-tertiary);\n}\n\n.limit {\n flex: 0 0 auto;\n margin: 0;\n padding: 4px 10px;\n overflow: hidden;\n color: var(--dsw-alias-label-tertiary);\n font: var(--dsw-font-xxxs-11);\n text-overflow: ellipsis;\n white-space: nowrap;\n border-top: 0.5px solid var(--dsw-alias-border-l3);\n}\n\n.titleIcon {\n flex: 0 0 auto;\n margin-right: 4px;\n}\n", "/** Live Browser tab title from the Browser store. */\nimport type { ReactNode } from 'react'\nimport { IconGlobeOutlineRegular } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { PropsRuntime, PropsStore } from '@deepseek-ai/dsh-client-ui-slots'\nimport { currentBrowserTarget } from '../browser/BrowserPersistence.ts'\nimport type { BrowserStore } from '../browser/store.ts'\nimport css from './Browser.module.css'\n\n/** Browser title props assembled by the Sidebar title seat. */\nexport type BrowserTitleProps = PropsRuntime<'sidebar.right.pane.tab.title'> & PropsStore<BrowserStore>\n\n/** Browser icon and current host name. */\nexport function BrowserTitle({ useTabInfo, useStore }: BrowserTitleProps): ReactNode {\n const { tab } = useTabInfo()\n const entry = useStore(state => currentBrowserTarget(state.byTab[tab.id]))\n return <><IconGlobeOutlineRegular className={css.titleIcon} />{entry?.title ?? tab.title}</>\n}\n", "/** Carrier-independent tab commands and renderer-facing state. */\nimport { createSnapshotStore, type BoundActions, type SnapshotStore } from '@deepseek-ai/dsh-client-store'\nimport type { TabId } from '@deepseek-ai/dsh-client-ui-dockkit'\nimport type { HostObservable } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { BrowserFrameState } from './BrowserFrame.ts'\nimport type { BrowserPage, BrowserPageFactory } from './BrowserPage.ts'\nimport { currentBrowserTarget, type BrowserTabState } from './BrowserPersistence.ts'\nimport type { BrowserStore } from './store.ts'\nimport { parseBrowserAddress, type BrowserAddressFailure, type BrowserTarget } from './url.ts'\nimport type { BrowserAnnotationOptions } from '../annotation/page-inspector.ts'\nimport type { AnnotationResult } from '../annotation/protocol.ts'\n\n/** Live tab state; navigation comes from its provider and draft validation stays local. */\nexport interface BrowserControllerState {\n readonly frame: BrowserFrameState\n /** Saved address offered for explicit restoration before any page has been requested. */\n readonly restoreTarget: BrowserTarget | undefined\n readonly addressFailure: BrowserAddressFailure | undefined\n readonly addressRevision: number\n}\n\n/** Construction inputs for one tab occurrence. */\nexport interface BrowserControllerOptions {\n readonly tabId: TabId\n readonly signal: AbortSignal\n readonly applicationOrigin: string\n readonly initial: BrowserTabState | undefined\n readonly actions: BoundActions<BrowserStore>\n readonly createPage: BrowserPageFactory\n readonly openTab: (url: string) => void\n}\n\n/** Owns input validation and page lifetime without inspecting the carrier type. */\nexport class BrowserController implements HostObservable<BrowserControllerState> {\n private readonly page: BrowserPage\n private readonly store: SnapshotStore<BrowserControllerState>\n private readonly unsubscribe: () => void\n private actions: BoundActions<BrowserStore>\n private checkpoint: BrowserTabState | undefined\n private started = false\n private disposed = false\n private disposal: Promise<void> | undefined\n private annotation: AbortController | undefined\n private readonly abort = (): void => { void this.dispose() }\n\n /** @param options - identity, persistence, page factory and source-tab navigation. */\n constructor(private readonly options: BrowserControllerOptions) {\n this.actions = options.actions\n this.checkpoint = options.initial\n this.page = options.createPage({\n initial: options.initial,\n persist: (state) => {\n if (this.disposed) return\n this.checkpoint = state\n this.actions.replace(options.tabId, state)\n },\n openRequested: (value) => {\n if (this.disposed) return\n const result = parseBrowserAddress(value, options.applicationOrigin)\n if (!result.ok) { this.addressFailed(result.reason); return }\n options.openTab(result.target.url)\n },\n })\n this.store = createSnapshotStore({ frame: this.page.frame.getSnapshot(),\n restoreTarget: currentBrowserTarget(this.checkpoint), addressFailure: undefined, addressRevision: 0 })\n this.unsubscribe = this.page.frame.subscribe(() => {\n if (this.disposed) return\n const current = this.store.getSnapshot()\n const frame = this.page.frame.getSnapshot()\n const changed = frame.target?.url !== current.frame.target?.url\n this.store.set({ frame, restoreTarget: frame.target === undefined ? currentBrowserTarget(this.checkpoint) : undefined,\n addressFailure: changed ? undefined : current.addressFailure,\n addressRevision: current.addressRevision + Number(changed) })\n })\n options.signal.addEventListener('abort', this.abort, { once: true })\n }\n\n /** @returns immutable state for the common toolbar. */\n getSnapshot = (): BrowserControllerState => this.store.getSnapshot()\n /** @param listener - state invalidation. @returns unsubscribe callback. */\n subscribe = (listener: () => void): (() => void) => this.store.subscribe(listener)\n\n /**\n * Attach the page without transferring ownership of its tab occurrence.\n * @param viewportId - mounted content container.\n * @returns physical attachment cleanup only.\n */\n mount(viewportId: string): () => void {\n this.publishSaved()\n const unmount = this.page.presentation.mount(viewportId)\n return () => { this.cancelAnnotation(); unmount() }\n }\n\n /** @param options - localized picker configuration. @returns saved evidence or cancellation. */\n async annotate(options: BrowserAnnotationOptions): Promise<AnnotationResult> {\n this.cancelAnnotation()\n const frame = this.page.frame.getSnapshot()\n if (this.disposed || frame.loading || frame.address === 'unknown' || frame.target === undefined || this.page.presentation.annotate === undefined) throw new Error('annotation-unavailable')\n const lifetime = new AbortController()\n this.annotation = lifetime\n try {\n const result = await this.page.presentation.annotate(frame.target.url, options, lifetime.signal)\n return lifetime.signal.aborted ? { cancelled: true } : result\n } finally {\n if (this.annotation === lifetime) this.annotation = undefined\n }\n }\n\n /** Cancel the current tab's picker. */\n cancelAnnotation(): void { this.annotation?.abort(); this.annotation = undefined }\n\n /**\n * Consume initial navigation once; a saved checkpoint alone never starts a page.\n * @param initialUrl - explicit typed-open address, or absence.\n */\n start(initialUrl: string | undefined): void {\n if (this.started || this.disposed) return\n this.started = true\n if (initialUrl !== undefined) this.loadUrl(initialUrl)\n }\n\n /** Load the saved address only after an explicit restore action. */\n restore(): void {\n const target = this.store.getSnapshot().restoreTarget\n if (target !== undefined) this.loadUrl(target.url)\n }\n\n /**\n * Validate an address before navigation, publishing invalid input for correction.\n * @param value - address-bar or typed-open input.\n */\n loadUrl(value: string): void {\n if (this.disposed) return\n const parsed = parseBrowserAddress(value, this.options.applicationOrigin)\n if (!parsed.ok) { this.addressFailed(parsed.reason); return }\n this.command(() => { this.page.frame.loadUrl(parsed.target) })\n }\n\n /** Delegate Back to the page's navigation provider. */\n goBack(): void { this.command(() => { this.page.frame.goBack() }) }\n /** Delegate Forward to the page's navigation provider. */\n goForward(): void { this.command(() => { this.page.frame.goForward() }) }\n /** Restore a saved address, or reload the already requested page. */\n reload(): void {\n if (this.store.getSnapshot().restoreTarget !== undefined) this.restore()\n else this.command(() => { this.page.frame.reload() })\n }\n\n /**\n * Apply the optional embedding-sandbox control; unsupported providers remain unchanged.\n * @param enabled - whether to enforce the provider's embedding sandbox.\n */\n setSandbox(enabled: boolean): void {\n const sandbox = this.page.frame.sandbox\n if (sandbox !== undefined) this.command(() => { sandbox.setEnabled(enabled) })\n }\n\n /**\n * Redirect future checkpoint writes to a replacement Session binding.\n * @param actions - replacement persistence writer.\n */\n rebind(actions: BoundActions<BrowserStore>): void { this.actions = actions }\n\n /**\n * Release the page and detach occurrence and state listeners.\n * @returns after page teardown; repeated callers join the same disposal.\n */\n dispose(): Promise<void> {\n if (this.disposal !== undefined) return this.disposal\n this.disposed = true\n this.cancelAnnotation()\n this.options.signal.removeEventListener('abort', this.abort)\n this.unsubscribe()\n this.disposal = this.page.frame.dispose()\n return this.disposal\n }\n\n private publishSaved(): void {\n if (this.checkpoint !== undefined) this.actions.replace(this.options.tabId, this.checkpoint)\n }\n\n private addressFailed(reason: BrowserAddressFailure): void {\n this.store.set({ ...this.store.getSnapshot(), addressFailure: reason })\n }\n\n private command(run: () => void): void {\n if (this.disposed) return\n this.cancelAnnotation()\n const current = this.store.getSnapshot()\n this.store.set({ ...current, addressFailure: undefined, addressRevision: current.addressRevision + 1 })\n run()\n }\n}\n\n/** Values available once a Sidebar body has committed its content container. */\nexport interface BrowserMountRequest {\n readonly tabId: TabId\n readonly signal: AbortSignal\n readonly viewportId: string\n readonly applicationOrigin: string\n readonly initial: BrowserTabState | undefined\n readonly initialUrl: string | undefined\n readonly openTab: (url: string) => void\n}\n\n/** Plain Slot callbacks and a framework-bound state source, not a desktop protocol. */\nexport interface BrowserInjected {\n /** @param tabId - tab occurrence. @param options - picker configuration. @returns saved evidence or cancellation. */\n annotate(tabId: TabId, options: BrowserAnnotationOptions): Promise<AnnotationResult>\n /** @param tabId - tab whose picker is active. */\n cancelAnnotation(tabId: TabId): void\n readonly keyedHooks: {\n readonly browserState: (key: string) => HostObservable<BrowserControllerState> | undefined\n }\n /** @param request - committed tab and container. @returns ends physical attachment without closing the tab. */\n mount(request: BrowserMountRequest): () => void\n /** @returns after every page has been disposed. */\n dispose(): Promise<void>\n /** @param actions - writer from a recreated Session binding. */\n rebind(actions: BoundActions<BrowserStore>): void\n /** @param tabId - owning tab. @param value - address input. */\n loadUrl(tabId: TabId, value: string): void\n /** @param tabId - tab whose saved address the user requested to restore. */\n restore(tabId: TabId): void\n /** @param tabId - owning tab. */\n goBack(tabId: TabId): void\n /** @param tabId - owning tab. */\n goForward(tabId: TabId): void\n /** Restore a saved address or reload its page. @param tabId - owning tab. */\n reload(tabId: TabId): void\n /** @param tabId - owning tab. @param enabled - provider's optional sandbox control. */\n setSandbox(tabId: TabId, enabled: boolean): void\n}\n\n/**\n * Own tab-occurrence controllers behind Session-scoped callbacks.\n * @param actions - persisted view-state writer.\n * @param createPage - composition-selected provider.\n * @param isTabOpen - authoritative layout membership, independent of mounted bodies and plugin lifetime.\n * @returns tab callbacks.\n */\nexport function createBrowserControllers(actions: BoundActions<BrowserStore>, createPage: BrowserPageFactory,\n isTabOpen: (tabId: TabId) => boolean): BrowserInjected {\n let currentActions = actions\n const controllers = new Map<TabId, {\n readonly signal: AbortSignal\n readonly controller: BrowserController\n readonly forget: () => void\n }>()\n const controller = (id: TabId): BrowserController | undefined => controllers.get(id)?.controller\n return {\n annotate: (id, options) => controller(id)?.annotate(options) ?? Promise.reject(new Error('annotation-unavailable')),\n cancelAnnotation: id => { controller(id)?.cancelAnnotation() },\n keyedHooks: { browserState: key => controller(key as TabId) },\n mount(request) {\n const { tabId, signal } = request\n if (signal.aborted) return () => {}\n let held = controllers.get(tabId)\n if (held?.signal !== signal) {\n if (held !== undefined) {\n held.signal.removeEventListener('abort', held.forget)\n void held.controller.dispose()\n }\n const created = new BrowserController({ ...request, actions: currentActions, createPage })\n const forget = (): void => {\n controllers.delete(tabId)\n // Plugin unload also aborts occurrences; only layout removal deletes saved navigation.\n if (!isTabOpen(tabId)) currentActions.forget(tabId)\n }\n held = { signal, controller: created, forget }\n controllers.set(tabId, held)\n signal.addEventListener('abort', forget, { once: true })\n }\n const hide = held.controller.mount(request.viewportId)\n held.controller.start(request.initialUrl)\n return hide\n },\n dispose: async () => {\n const pending = [...controllers.values()].map(({ signal, controller, forget }) => {\n signal.removeEventListener('abort', forget)\n return controller.dispose()\n })\n controllers.clear()\n await Promise.all(pending)\n },\n rebind: (actions) => {\n currentActions = actions\n for (const { controller } of controllers.values()) controller.rebind(actions)\n },\n loadUrl: (id, value) => { controller(id)?.loadUrl(value) },\n restore: (id) => { controller(id)?.restore() },\n goBack: (id) => { controller(id)?.goBack() },\n goForward: (id) => { controller(id)?.goForward() },\n reload: (id) => { controller(id)?.reload() },\n setSandbox: (id, enabled) => { controller(id)?.setSandbox(enabled) },\n }\n}\n", "/** Address parsing for the Sidebar browser's HTTP(S) allowlist. */\n\n/** Maximum accepted address length; this bounds persisted navigation state. */\nexport const MAX_BROWSER_URL_LENGTH = 16 * 1024\n\n/** A normalized Browser navigation target. */\nexport type BrowserTarget =\n | { readonly kind: 'https'; readonly url: string; readonly title: string }\n | { readonly kind: 'http'; readonly url: string; readonly title: string }\n\n/** Why an address was refused before navigation. */\nexport type BrowserAddressFailure = 'empty' | 'invalid' | 'protocol' | 'credentials' | 'application-origin'\n\n/** Result of parsing an address-bar value. */\nexport type BrowserAddressResult =\n | { readonly ok: true; readonly target: BrowserTarget }\n | { readonly ok: false; readonly reason: BrowserAddressFailure }\n\n/**\n * Parse one address-bar value into the fixed protocol allowlist.\n * @param input - user or typed-open input.\n * @param applicationOrigin - current DSH document origin, blocked for HTTPS.\n * @returns a canonical target or the refusal reason.\n */\nexport function parseBrowserAddress(input: string, applicationOrigin?: string): BrowserAddressResult {\n const trimmed = input.trim()\n if (trimmed === '') return { ok: false, reason: 'empty' }\n if (trimmed.length > MAX_BROWSER_URL_LENGTH) return { ok: false, reason: 'invalid' }\n const explicitScheme = /^[A-Za-z][A-Za-z\\d+.-]*:(?!\\d+(?:[/?#]|$))/u.test(trimmed)\n const candidate = explicitScheme ? trimmed : `https://${trimmed}`\n let url: URL\n try { url = new URL(candidate) } catch { return { ok: false, reason: 'invalid' } }\n if (url.username !== '' || url.password !== '') return { ok: false, reason: 'credentials' }\n if (url.protocol === 'https:' || url.protocol === 'http:') {\n if (applicationOrigin !== undefined && applicationOrigin !== 'null') {\n try {\n if (url.origin === new URL(applicationOrigin).origin) return { ok: false, reason: 'application-origin' }\n } catch {\n // An unavailable application origin cannot grant access to a target.\n }\n }\n return { ok: true, target: { kind: url.protocol === 'https:' ? 'https' : 'http', url: url.href, title: url.hostname } }\n }\n return { ok: false, reason: 'protocol' }\n}\n", "/** Iframe navigation provider with bounded application-known history. */\nimport { createSnapshotStore, type SnapshotStore } from '@deepseek-ai/dsh-client-store'\nimport type { IframePresentation } from '../view/IframePresentation.ts'\nimport { emptyBrowserFrame, type BrowserFrame, type BrowserFrameState, type BrowserLoadError, type BrowserSandboxControl } from './BrowserFrame.ts'\nimport type { BrowserPageOptions } from './BrowserPage.ts'\nimport { BrowserNavigation } from './BrowserNavigation.ts'\nimport type { BrowserTarget } from './url.ts'\n\n/** Owns iframe navigation; the view reports loads without reading cross-origin content. */\nexport class IframeImpl implements BrowserFrame {\n readonly sandbox: BrowserSandboxControl = { setEnabled: (enabled) => { this.setSandbox(enabled) } }\n private readonly navigation: BrowserNavigation\n private readonly store: SnapshotStore<BrowserFrameState>\n private sandboxed = true\n private error: BrowserLoadError | undefined\n private disposed = false\n private disposal: Promise<void> | undefined\n\n /** @param options - initial checkpoint and persistence writer. @param presentation - iframe DOM adapter. */\n constructor(private readonly options: BrowserPageOptions, private readonly presentation: IframePresentation) {\n this.navigation = new BrowserNavigation(options.initial)\n this.store = createSnapshotStore({ ...emptyBrowserFrame(), sandboxEnabled: this.sandboxed })\n }\n\n /**\n * Record a controlled load or a later navigation to an unreadable address.\n * @param revision - document generation whose iframe emitted load.\n */\n handleLoaded(revision: number): void {\n if (this.disposed) return\n this.navigation.frameLoaded(revision)\n this.publish()\n }\n\n /**\n * Publish a failure only for the current document generation.\n * @param revision - document generation whose iframe reported failure.\n */\n handleLoadFailed(revision: number): void {\n if (this.disposed || this.navigation.snapshot.request?.revision !== revision) return\n this.error = { code: undefined, description: undefined }\n this.publish()\n }\n\n /** @returns immutable navigation state. */\n getSnapshot = (): BrowserFrameState => this.store.getSnapshot()\n /** @param listener - state invalidation. @returns unsubscribe callback. */\n subscribe = (listener: () => void): (() => void) => this.store.subscribe(listener)\n\n /** @param target - validated address; submitting the current address reloads it. */\n loadUrl(target: BrowserTarget): void {\n if (this.disposed) return\n const request = BrowserNavigation.current(this.navigation.snapshot)?.url === target.url\n ? this.navigation.reload() : this.navigation.navigate(target)\n this.load(request)\n }\n\n /** Move through application-known history while the iframe address remains known. */\n goBack(): void { if (!this.disposed) this.load(this.navigation.back()) }\n /** Move through application-known history while the iframe address remains known. */\n goForward(): void { if (!this.disposed) this.load(this.navigation.forward()) }\n /** Reload the last application-known address. */\n reload(): void { if (!this.disposed) this.load(this.navigation.reload()) }\n\n /** @returns after the presentation has been removed; repeated calls join disposal. */\n dispose(): Promise<void> {\n if (this.disposal !== undefined) return this.disposal\n this.disposed = true\n this.presentation.dispose()\n this.disposal = Promise.resolve()\n return this.disposal\n }\n\n private setSandbox(enabled: boolean): void {\n if (this.disposed || enabled === this.sandboxed) return\n this.sandboxed = enabled\n if (this.store.getSnapshot().target === undefined) {\n this.store.set({ ...this.store.getSnapshot(), sandboxEnabled: enabled })\n return\n }\n this.load(this.navigation.reload())\n }\n\n private load(request: ReturnType<BrowserNavigation['navigate']> | undefined): void {\n if (request === undefined) return\n this.error = undefined\n this.publish()\n this.presentation.show({ target: request.target, revision: request.revision, sandboxed: this.sandboxed })\n }\n\n private snapshot(): BrowserFrameState {\n const state = this.navigation.snapshot\n const target = BrowserNavigation.current(state)\n return { target, address: target === undefined ? 'empty' : state.navigation.status === 'unknown' ? 'unknown' : 'requested',\n loading: state.navigation.status === 'loading' && this.error === undefined,\n canGoBack: this.navigation.canGoBack, canGoForward: this.navigation.canGoForward,\n error: this.error, sandboxEnabled: this.sandboxed }\n }\n\n private publish(): void {\n this.store.set(this.snapshot())\n this.options.persist(this.navigation.snapshot)\n }\n}\n", "/** Bounded, application-known history used only by the iframe provider. */\nimport type { BrowserTarget } from './url.ts'\nimport type { BrowserHistoryEntry, BrowserTabState } from './BrowserPersistence.ts'\n\n/** Maximum retained application-known navigation entries per tab. */\nexport const MAX_BROWSER_HISTORY = 100\n\n/**\n * Owns the application-known URL history and the iframe observation state machine.\n * The first load for a request keeps its URL authoritative; another load marks it unknown.\n */\nexport class BrowserNavigation {\n private value: BrowserTabState\n\n /**\n * @param initial - persisted state restored for this tab, or a fresh empty state.\n */\n constructor(initial: BrowserTabState = BrowserNavigation.empty()) {\n this.value = initial\n }\n\n /**\n * Create state before a tab has a controlled navigation target.\n * @returns empty serializable state.\n */\n static empty(): BrowserTabState {\n return { entries: [], index: -1, request: undefined, navigation: { status: 'empty' }, failure: undefined }\n }\n\n /**\n * Read the selected application-history entry.\n * @param state - serializable tab state.\n * @returns the current target, if any.\n */\n static current(state: BrowserTabState | undefined): BrowserHistoryEntry | undefined {\n return state === undefined || state.index < 0 ? undefined : state.entries[state.index]\n }\n\n /**\n * Test whether the Web carrier can use the preceding application-history entry.\n * @param state - serializable tab state.\n * @returns whether Back is available.\n */\n static canGoBack(state: BrowserTabState): boolean {\n return state.navigation.status !== 'unknown' && state.index > 0\n }\n\n /**\n * Test whether the Web carrier can use the following application-history entry.\n * @param state - serializable tab state.\n * @returns whether Forward is available.\n */\n static canGoForward(state: BrowserTabState): boolean {\n return state.navigation.status !== 'unknown'\n && state.index >= 0\n && state.index < state.entries.length - 1\n }\n\n /** Current immutable serializable state. */\n get snapshot(): BrowserTabState {\n return this.value\n }\n\n /** Whether the Web iframe can safely use the application-owned Back entry. */\n get canGoBack(): boolean {\n return BrowserNavigation.canGoBack(this.value)\n }\n\n /** Whether the Web iframe can safely use the application-owned Forward entry. */\n get canGoForward(): boolean {\n return BrowserNavigation.canGoForward(this.value)\n }\n\n /**\n * Add a controlled target and discard its stale forward branch.\n * @param target - validated canonical target.\n * @returns the new load request.\n */\n navigate(target: BrowserTarget): NonNullable<BrowserTabState['request']> {\n const entries = [...this.value.entries.slice(0, this.value.index + 1), target]\n if (entries.length > MAX_BROWSER_HISTORY) entries.splice(0, entries.length - MAX_BROWSER_HISTORY)\n return this.request(target, { ...this.value, entries, index: entries.length - 1 })\n }\n\n /**\n * Select the preceding application-known target.\n * @returns a new load request, or undefined when unavailable.\n */\n back(): BrowserTabState['request'] {\n if (!this.canGoBack) return undefined\n const index = this.value.index - 1\n const target = this.value.entries[index] as BrowserHistoryEntry\n return this.request(target, { ...this.value, index })\n }\n\n /**\n * Select the following application-known target.\n * @returns a new load request, or undefined when unavailable.\n */\n forward(): BrowserTabState['request'] {\n if (!this.canGoForward) return undefined\n const index = this.value.index + 1\n const target = this.value.entries[index] as BrowserHistoryEntry\n return this.request(target, { ...this.value, index })\n }\n\n /**\n * Start another load of the last application-known target.\n * @returns a new load request, or undefined before the first target.\n */\n reload(): BrowserTabState['request'] {\n const target = BrowserNavigation.current(this.value)\n return target === undefined ? undefined : this.request(target, this.value)\n }\n\n /**\n * Record a frame load for its captured revision.\n * @param revision - revision bound to the rendered frame.\n */\n frameLoaded(revision: number): void {\n const navigation = this.value.navigation\n if (navigation.status === 'empty' || navigation.revision !== revision) return\n if (navigation.status === 'loading') {\n this.value = { ...this.value, navigation: { status: 'known', revision } }\n } else if (navigation.status === 'known') {\n this.value = { ...this.value, navigation: { status: 'unknown', revision } }\n }\n }\n\n private request(\n target: BrowserTarget,\n basis: BrowserTabState,\n ): NonNullable<BrowserTabState['request']> {\n const request = { revision: (this.value.request?.revision ?? 0) + 1, target }\n this.value = {\n ...basis,\n request,\n navigation: { status: 'loading', revision: request.revision },\n failure: undefined,\n }\n return request\n }\n}\n", "/** Validation for page and guest process results, not same-process slot props. */\nimport type { BrowserAnnotation, BrowserAnnotationOptions } from './page-inspector.ts';\n\n/** Result of one annotation operation. */\nexport type AnnotationResult = BrowserAnnotation | { cancelled: true };\n\nfunction object(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n}\nfunction string(value: unknown, limit: number): value is string {\n return typeof value === 'string' && value.length <= limit;\n}\nfunction number(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value) && Math.abs(value) <= 1e7;\n}\nfunction rect(value: unknown): boolean {\n return (\n object(value) &&\n number(value.x) &&\n number(value.y) &&\n number(value.width) &&\n number(value.height) &&\n value.width >= 0 &&\n value.height >= 0\n );\n}\n/** Validate bounded JSON evidence received from a visited document.\n * @param value - process or MessagePort result.\n * @returns whether the result can be retained and rendered.\n */\nexport function isAnnotationResult(value: unknown): value is AnnotationResult {\n if (!object(value)) return false;\n if (value.cancelled === true) return Object.keys(value).length === 1;\n if (\n (value.intent !== 'comment' && value.intent !== 'question') ||\n !string(value.note, 1000) ||\n !value.note.trim() ||\n !string(value.url, 8192) ||\n !string(value.title, 300)\n )\n return false;\n if (\n value.styleChanges !== undefined &&\n (!object(value.styleChanges) ||\n Object.keys(value.styleChanges).length > 10 ||\n !Object.entries(value.styleChanges).every(\n ([key, change]) =>\n [\n 'color',\n 'background-color',\n 'opacity',\n 'font-family',\n 'font-size',\n 'font-weight',\n 'padding',\n 'margin',\n 'gap',\n ].includes(key) &&\n object(change) &&\n string(change.before, 1000) &&\n string(change.after, 1000),\n ))\n )\n return false;\n if (\n value.screenshot !== undefined &&\n (!object(value.screenshot) ||\n value.screenshot.mediaType !== 'image/jpeg' ||\n !string(value.screenshot.data, 4000000) ||\n !/^[A-Za-z0-9+/]+={0,2}$/.test(value.screenshot.data) ||\n !number(value.screenshot.width) ||\n !number(value.screenshot.height) ||\n value.screenshot.width <= 0 ||\n value.screenshot.width > 1600 ||\n value.screenshot.height <= 0 ||\n value.screenshot.height > 1600)\n )\n return false;\n try {\n if (!['http:', 'https:'].includes(new URL(value.url).protocol)) return false;\n } catch {\n return false;\n }\n if (\n !object(value.viewport) ||\n !number(value.viewport.width) ||\n !number(value.viewport.height) ||\n value.viewport.width <= 0 ||\n value.viewport.height <= 0\n )\n return false;\n const selection = value.selection;\n if (\n !object(selection) ||\n !['element', 'region', 'point'].includes(String(selection.kind)) ||\n !rect(selection.rect) ||\n !rect(selection.viewportRect) ||\n !object(selection.scroll) ||\n !number(selection.scroll.x) ||\n !number(selection.scroll.y) ||\n !Array.isArray(selection.candidates) ||\n selection.candidates.length > 12\n )\n return false;\n if (selection.kind === 'element' && selection.candidates.length !== 1) return false;\n for (const item of selection.candidates) {\n if (\n !object(item) ||\n !string(item.selector, 8192) ||\n !Array.isArray(item.shadowHosts) ||\n item.shadowHosts.length > 32 ||\n !item.shadowHosts.every((x) => string(x, 8192)) ||\n item.matchCount !== 1 ||\n !string(item.tag, 200) ||\n !string(item.text, 400) ||\n !rect(item.rect) ||\n !object(item.styles) ||\n Object.keys(item.styles).length > 16 ||\n !Object.entries(item.styles).every(([key, val]) => string(key, 100) && string(val, 1000)) ||\n (item.source !== undefined && !string(item.source, 1000))\n )\n return false;\n }\n try {\n return JSON.stringify({ ...value, screenshot: undefined }).length <= 64000;\n } catch {\n return false;\n }\n}\n\n/** Validate picker configuration crossing the iframe bridge.\n * @param value - parent message options.\n * @returns whether all localized fields are bounded strings.\n */\nexport function isAnnotationOptions(value: unknown): value is BrowserAnnotationOptions {\n return (\n object(value) &&\n (value.intent === 'comment' || value.intent === 'question') &&\n typeof value.dark === 'boolean' &&\n object(value.copy) &&\n [\n 'select',\n 'comment',\n 'question',\n 'placeholder',\n 'settings',\n 'save',\n 'cancel',\n 'parent',\n 'child',\n 'targetGone',\n 'empty',\n 'region',\n 'point',\n 'interact',\n 'color',\n 'background',\n 'opacity',\n 'font',\n 'fontSize',\n 'fontWeight',\n 'spacing',\n 'elementOnly',\n 'invalidStyle',\n 'applyStyles',\n 'styleHint',\n ].every((key) => string(value.copy && object(value.copy) ? value.copy[key] : null, 500))\n );\n}\n", "/** Bounded annotation requests to a bridge-enabled iframe owned by Browser. */\nimport type { BrowserAnnotationOptions } from './page-inspector.ts';\nimport { isAnnotationResult, type AnnotationResult } from './protocol.ts';\n\n/** Request one picker without exposing the iframe or an evaluator to plugins.\n * @param frame - provider-owned iframe.\n * @param url - controller-known HTTP(S) page.\n * @param options - picker copy and theme.\n * @param signal - operation lifetime.\n * @returns saved evidence or cancellation; rejects when the page has no bridge.\n */\nexport function annotateIframe(\n frame: HTMLIFrameElement,\n url: string,\n options: BrowserAnnotationOptions,\n signal: AbortSignal,\n): Promise<AnnotationResult> {\n if (signal.aborted) return Promise.resolve({ cancelled: true });\n return new Promise((resolve, reject) => {\n const channel = new MessageChannel();\n let ended = false;\n let ready = false;\n const handshake = setTimeout(() => {\n if (!ready) finish(undefined, new Error('annotation-unavailable'));\n }, 3000);\n function finish(value?: AnnotationResult, error?: Error) {\n if (ended) return;\n ended = true;\n channel.port1.postMessage({ type: 'cancel' });\n channel.port1.close();\n channel.port2.close();\n clearTimeout(handshake);\n signal.removeEventListener('abort', cancel);\n frame.removeEventListener('load', cancel);\n if (error) reject(error);\n else resolve(value || { cancelled: true });\n }\n function cancel() {\n finish({ cancelled: true });\n }\n signal.addEventListener('abort', cancel, { once: true });\n frame.addEventListener('load', cancel, { once: true });\n channel.port1.onmessage = (event) => {\n if (event.data?.ready === true && !ready) {\n ready = true;\n clearTimeout(handshake);\n return;\n }\n if (!isAnnotationResult(event.data)) {\n finish(undefined, new Error('annotation-invalid'));\n return;\n }\n if (!('cancelled' in event.data) && event.data.url !== url) {\n finish(undefined, new Error('annotation-page-changed'));\n return;\n }\n finish(event.data);\n };\n try {\n if (!frame.contentWindow) {\n finish(undefined, new Error('annotation-unavailable'));\n return;\n }\n frame.contentWindow.postMessage(\n { channel: 'dsh-browser-annotation-v1', type: 'start', options },\n new URL(url).origin,\n [channel.port2],\n );\n frame.focus();\n } catch (error) {\n finish(undefined, error instanceof Error ? error : new Error('annotation-unavailable'));\n }\n });\n}\n", "/** Iframe DOM and revision-tagged load observations. */\nimport type { BrowserTarget } from '../browser/url.ts'\nimport type { BrowserPresentation } from './BrowserPresentation.ts'\nimport css from './Browser.module.css'\nimport { annotateIframe } from '../annotation/iframe-annotation.ts'\nimport type { BrowserAnnotationOptions } from '../annotation/page-inspector.ts'\nimport type { AnnotationResult } from '../annotation/protocol.ts'\n\n/** Fixed iframe policy; top navigation and downloads are not granted directly. */\nexport const WEB_BROWSER_SANDBOX = 'allow-scripts allow-forms allow-same-origin allow-popups allow-popups-to-escape-sandbox'\n\ninterface IframeDocument {\n readonly target: BrowserTarget\n readonly revision: number\n readonly sandboxed: boolean\n}\n\n/** Reports only what an iframe can observe without inspecting cross-origin content. */\nexport interface IframePresentationEvents {\n readonly loaded: (revision: number) => void\n readonly failed: (revision: number) => void\n readonly remounted: () => void\n}\n\n/** Owns the iframe element; navigation and history remain in IframeImpl. */\nexport class IframePresentation implements BrowserPresentation {\n private host: HTMLElement | undefined\n private element: HTMLIFrameElement | undefined\n private document: IframeDocument | undefined\n private rendered = false\n\n /** @param events - provider-owned load and remount callbacks. */\n constructor(private readonly events: IframePresentationEvents) {}\n\n /** @param url - controller-known URL. @param options - picker copy. @param signal - lifetime. @returns saved annotation or cancellation. */\n annotate(url: string, options: BrowserAnnotationOptions, signal: AbortSignal): Promise<AnnotationResult> {\n if (this.element === undefined) return Promise.reject(new Error('annotation-unavailable'))\n return annotateIframe(this.element, url, options, signal)\n }\n\n /** @param viewportId - mounted placeholder. @returns removes only the iframe presentation. */\n mount(viewportId: string): () => void {\n const host = document.getElementById(viewportId)\n if (host === null) throw new Error('iframe presentation: viewport is not mounted')\n this.element?.remove()\n this.element = undefined\n this.host = host\n if (this.rendered) this.events.remounted()\n else this.render()\n return () => {\n if (this.host !== host) return\n this.element?.remove()\n this.element = undefined\n this.host = undefined\n }\n }\n\n /**\n * Retain the prepared document and render it when a container is mounted.\n * @param value - prepared document and event generation.\n */\n show(value: IframeDocument): void {\n this.document = value\n this.render()\n }\n\n /** Remove the owned DOM and retained presentation data. */\n dispose(): void {\n this.element?.remove()\n this.element = undefined\n this.host = undefined\n this.document = undefined\n }\n\n private render(): void {\n const current = this.document\n const host = this.host\n if (current === undefined || host === undefined) return\n this.element?.remove()\n const element = document.createElement('iframe')\n element.className = css.frame as string\n element.src = current.target.url\n element.title = current.target.title\n element.referrerPolicy = 'no-referrer'\n element.dataset.sidebarBrowserFrame = 'iframe'\n if (current.sandboxed) element.setAttribute('sandbox', WEB_BROWSER_SANDBOX)\n element.addEventListener('load', () => {\n if (this.element === element) this.events.loaded(current.revision)\n })\n element.addEventListener('error', () => {\n if (this.element === element) this.events.failed(current.revision)\n })\n this.element = element\n this.rendered = true\n host.append(element)\n }\n}\n", "/** Assemble iframe navigation and presentation without platform branches in consumers. */\nimport type { BrowserPage, BrowserPageOptions } from './browser/BrowserPage.ts'\nimport { IframeImpl } from './browser/IframeImpl.ts'\nimport { IframePresentation } from './view/IframePresentation.ts'\n\n/**\n * Assemble an idle iframe provider and its DOM presentation.\n * @param options - saved navigation and callbacks.\n * @returns the Web page's navigation and presentation objects.\n */\nexport function createIframePage(options: BrowserPageOptions): BrowserPage {\n const presentation = new IframePresentation({\n loaded: (revision) => { frame.handleLoaded(revision) },\n failed: (revision) => { frame.handleLoadFailed(revision) },\n remounted: () => { frame.reload() },\n })\n const frame = new IframeImpl(options, presentation)\n return { frame, presentation }\n}\n", "/** Electron navigation and guest lifetime, independent from DOM placement. */\nimport { createSnapshotStore, type SnapshotStore } from '@deepseek-ai/dsh-client-store'\nimport type { DesktopBrowserBridge, DesktopBrowserLeaseId } from '../../types.ts'\nimport type { ElectronWebviewPresentation, WebviewElement } from './ElectronWebviewPresentation.ts'\nimport { emptyBrowserFrame, type BrowserFrame, type BrowserFrameState, type BrowserLoadError } from '../browser/BrowserFrame.ts'\nimport type { BrowserPageOptions } from '../browser/BrowserPage.ts'\nimport { browserAddressCheckpoint, currentBrowserTarget } from '../browser/BrowserPersistence.ts'\nimport { parseBrowserAddress, type BrowserTarget } from '../browser/url.ts'\n\ninterface NavigationEvent extends Event { readonly isMainFrame: boolean }\ninterface LoadFailureEvent extends NavigationEvent {\n readonly errorCode: number\n readonly errorDescription: string\n}\n\n/** Owns native history and translates Electron observations into common frame state. */\nexport class ElectronWebViewImpl implements BrowserFrame {\n private readonly store: SnapshotStore<BrowserFrameState>\n private readonly lifetime = new AbortController()\n private guestLifetime: AbortController | undefined\n private element: WebviewElement | undefined\n private lease: DesktopBrowserLeaseId | undefined\n private workspaceKey: string | undefined\n private initializing: Promise<void> | undefined\n private ready = false\n private pending: BrowserTarget | undefined\n private revision = 0\n private firstDocument = true\n private checkpoint: BrowserTarget | undefined\n private disposal: Promise<void> | undefined\n private attachment: AbortController | undefined\n private readonly releases = new Set<Promise<void>>()\n\n /**\n * @param options - saved address, persistence and source-tab opening callback.\n * @param bridge - main-process guest operations.\n * @param workspace - resolves the storage account once for this frame lifetime.\n * @param presentation - tag and Sidebar placement adapter.\n */\n constructor(private readonly options: BrowserPageOptions, private readonly bridge: DesktopBrowserBridge,\n private readonly workspace: (signal: AbortSignal) => Promise<string>,\n private readonly presentation: ElectronWebviewPresentation) {\n this.checkpoint = currentBrowserTarget(options.initial)\n this.store = createSnapshotStore(emptyBrowserFrame())\n }\n\n /** @returns immutable carrier-neutral navigation state. */\n getSnapshot = (): BrowserFrameState => this.store.getSnapshot()\n /** @param listener - state invalidation. @returns unsubscribe callback. */\n subscribe = (listener: () => void): (() => void) => this.store.subscribe(listener)\n\n /** A physical mount may recreate a lost guest; ordinary Sidebar hiding never calls this. */\n attach(): void {\n if (this.lifetime.signal.aborted) return\n this.attachment = new AbortController()\n this.pending ??= this.store.getSnapshot().target\n if (this.pending !== undefined) {\n this.store.set({ ...this.store.getSnapshot(), address: 'requested', loading: true,\n canGoBack: false, canGoForward: false, error: undefined })\n this.initialize()\n }\n }\n\n /** Invalidate pending attachment before the containing DOM is removed. */\n detach(): void {\n this.attachment?.abort()\n this.attachment = undefined\n this.pending = this.store.getSnapshot().target\n void this.dropGuest()\n }\n\n /** @param target - validated address, loaded without replacing the guest. */\n loadUrl(target: BrowserTarget): void {\n if (this.lifetime.signal.aborted) return\n const current = this.store.getSnapshot()\n if (this.ready && current.address === 'observed' && current.target?.url === target.url) {\n this.reload()\n return\n }\n this.revision++\n this.pending = target\n this.store.set({ ...current, target, address: 'requested', loading: true, error: undefined })\n this.persist(target)\n if (this.ready) this.loadPending()\n else this.initialize()\n }\n\n /** Move backward through Chromium history. */\n goBack(): void {\n if (this.store.getSnapshot().canGoBack) this.navigate('goBack')\n }\n\n /** Move forward through Chromium history. */\n goForward(): void {\n if (this.store.getSnapshot().canGoForward) this.navigate('goForward')\n }\n\n /** Reload the actual current page, or retry failed guest creation. */\n reload(): void {\n const current = this.store.getSnapshot()\n if (this.lifetime.signal.aborted || current.target === undefined) return\n if (!this.ready || current.error !== undefined) {\n this.revision++\n this.pending = current.target\n this.store.set({ ...current, loading: true, error: undefined })\n if (this.ready) this.loadPending()\n else this.initialize()\n } else this.navigate('reload')\n }\n\n /** @returns after pending initialization and the owned guest have been released. */\n dispose(): Promise<void> {\n if (this.disposal !== undefined) return this.disposal\n this.lifetime.abort()\n this.pending = undefined\n this.disposal = Promise.all([this.dropGuest(), this.initializing])\n .then(() => Promise.all(this.releases)).then(() => {})\n this.presentation.dispose()\n return this.disposal\n }\n\n private navigate(command: 'goBack' | 'goForward' | 'reload'): void {\n if (this.lifetime.signal.aborted || !this.ready || this.element === undefined) return\n this.revision++\n this.pending = undefined\n this.store.set({ ...this.store.getSnapshot(), loading: true, error: undefined })\n try { this.element[command]() }\n catch (error) { this.commandFailed(error) }\n }\n\n private initialize(): void {\n const attachment = this.attachment\n if (attachment === undefined || this.initializing !== undefined || this.element !== undefined || this.lifetime.signal.aborted) return\n const signal = AbortSignal.any([this.lifetime.signal, attachment.signal])\n this.initializing = this.createGuest(signal).catch(async (error: unknown) => {\n await this.dropGuest()\n if (!signal.aborted) this.commandFailed(error)\n }).finally(() => {\n this.initializing = undefined\n if (this.attachment !== attachment && this.pending !== undefined) this.initialize()\n })\n }\n\n private async createGuest(attachmentSignal: AbortSignal): Promise<void> {\n this.workspaceKey ??= await this.workspace(attachmentSignal)\n if (attachmentSignal.aborted) return\n const reservation = await this.bridge.acquire(this.workspaceKey)\n // oxlint-disable-next-line typescript/no-unnecessary-condition -- The signal can abort while acquire is pending.\n if (attachmentSignal.aborted) { await this.release(reservation.lease); return }\n this.lease = reservation.lease\n this.guestLifetime = new AbortController()\n const signal = AbortSignal.any([attachmentSignal, this.guestLifetime.signal])\n const element = this.presentation.createElement(reservation)\n this.element = element\n const unsubscribeOpen = this.bridge.onOpenRequested(reservation.lease, (url) => {\n if (this.element === element && !signal.aborted) this.options.openRequested(url)\n })\n signal.addEventListener('abort', unsubscribeOpen, { once: true })\n element.addEventListener('dom-ready', () => {\n this.ready = true\n this.observe(this.store.getSnapshot().address !== 'requested')\n this.loadPending()\n }, { signal })\n element.addEventListener('did-navigate', () => { this.observe(true) }, { signal })\n element.addEventListener('did-navigate-in-page', (event) => {\n if ((event as NavigationEvent).isMainFrame) this.observe(true)\n }, { signal })\n element.addEventListener('did-start-navigation', (event) => {\n if ((event as NavigationEvent).isMainFrame) {\n this.store.set({ ...this.store.getSnapshot(), loading: true, error: undefined })\n }\n }, { signal })\n for (const name of ['did-start-loading', 'did-stop-loading', 'page-title-updated']) {\n element.addEventListener(name, () => {\n this.observe(name === 'page-title-updated' && this.store.getSnapshot().address === 'observed')\n }, { signal })\n }\n element.addEventListener('did-fail-load', (event) => {\n const failure = event as LoadFailureEvent\n if (failure.isMainFrame && failure.errorCode !== -3) {\n this.failed({ code: failure.errorCode, description: failure.errorDescription })\n }\n }, { signal })\n for (const name of ['render-process-gone', 'destroyed']) {\n element.addEventListener(name, () => { void this.dropGuest(); this.failed() }, { signal })\n }\n this.presentation.present(element)\n }\n\n private loadPending(): void {\n const target = this.pending\n const element = this.element\n if (!this.ready || target === undefined || element === undefined) return\n const revision = this.revision\n this.pending = undefined\n void element.loadURL(target.url).catch((error: unknown) => {\n if (this.element !== element || this.lifetime.signal.aborted || this.revision !== revision) return\n if (typeof error === 'object' && error !== null && 'code' in error && error.code === 'ERR_ABORTED') return\n if (this.store.getSnapshot().error === undefined) this.commandFailed(error)\n })\n }\n\n private observe(committed: boolean): void {\n if (!this.ready || this.element === undefined || this.lifetime.signal.aborted) return\n try { this.observeReady(this.element, committed) }\n catch (error) { this.commandFailed(error) }\n }\n\n private observeReady(element: WebviewElement, committed: boolean): void {\n const current = this.store.getSnapshot()\n const parsed = committed ? parseBrowserAddress(element.getURL()) : undefined\n if (parsed?.ok && this.firstDocument) {\n // The lease-bearing bootstrap document is not a user history entry.\n element.clearHistory()\n this.firstDocument = false\n }\n let target = current.target\n let address = current.address\n if (parsed?.ok) {\n target = { ...parsed.target, title: element.getTitle() || parsed.target.title }\n address = 'observed'\n this.presentation.show(target.title)\n }\n const loading = current.error === undefined && element.isLoading()\n const canGoBack = element.canGoBack()\n const canGoForward = element.canGoForward()\n if (target?.url !== current.target?.url || target?.title !== current.target?.title || address !== current.address\n || loading !== current.loading || canGoBack !== current.canGoBack || canGoForward !== current.canGoForward) {\n this.store.set({ ...current, target, address, loading, canGoBack, canGoForward })\n }\n if (parsed?.ok && target !== undefined) this.persist(target)\n }\n\n private persist(target: BrowserTarget): void {\n if (target.url === this.checkpoint?.url && target.title === this.checkpoint.title) return\n this.checkpoint = target\n this.options.persist(browserAddressCheckpoint(target, this.revision))\n }\n\n private failed(error: BrowserLoadError = { code: undefined, description: undefined }): void {\n if (this.lifetime.signal.aborted) return\n const current = this.store.getSnapshot()\n this.store.set({ ...current, loading: false, error,\n canGoBack: this.ready && current.canGoBack, canGoForward: this.ready && current.canGoForward })\n }\n\n private commandFailed(error: unknown): void {\n console.error('Desktop browser operation failed', error)\n this.failed()\n }\n\n private dropGuest(): Promise<void> {\n this.guestLifetime?.abort()\n this.guestLifetime = undefined\n this.presentation.clear()\n this.element = undefined\n this.ready = false\n this.firstDocument = true\n const lease = this.lease\n this.lease = undefined\n return lease === undefined ? Promise.resolve() : this.release(lease)\n }\n\n private release(lease: DesktopBrowserLeaseId): Promise<void> {\n const released = this.bridge.release(lease)\n .catch((error: unknown) => { console.error('Desktop browser guest release failed', error) })\n .finally(() => { this.releases.delete(released) })\n this.releases.add(released)\n return released\n }\n}\n", "/** Data returned by one explicit, in-page annotation gesture. */\nexport interface BrowserAnnotation {\n /** Provider-captured viewport with the saved area marked; never part of DOM evidence. */\n readonly screenshot?: BrowserAnnotationImage;\n /** Requested CSS values for the precisely selected element. */\n readonly styleChanges?: Record<string, { before: string; after: string }>;\n readonly intent: 'comment' | 'question';\n readonly note: string;\n readonly url: string;\n readonly title: string;\n readonly viewport: { width: number; height: number };\n readonly selection: {\n kind: 'element' | 'region' | 'point';\n /** CSS pixels in the document, never substituted with a parent element. */\n rect: { x: number; y: number; width: number; height: number };\n viewportRect: { x: number; y: number; width: number; height: number };\n scroll: { x: number; y: number };\n candidates: BrowserAnnotationElement[];\n };\n}\n\n/** Bounded JPEG capture supplied by Browser, not by a visited page. */\nexport interface BrowserAnnotationImage {\n readonly mediaType: 'image/jpeg';\n readonly data: string;\n readonly width: number;\n readonly height: number;\n}\n\n/** Bounded DOM evidence; candidates do not redefine a point or region. */\nexport interface BrowserAnnotationElement {\n selector: string;\n shadowHosts: string[];\n matchCount: number;\n tag: string;\n text: string;\n rect: { x: number; y: number; width: number; height: number };\n styles: Record<string, string>;\n source?: string;\n}\n\n/** Copy and theme supplied by the owning Harness plugin, never by the page. */\nexport interface BrowserAnnotationOptions {\n readonly intent: 'comment' | 'question';\n readonly dark: boolean;\n readonly copy: {\n select: string;\n comment: string;\n question: string;\n placeholder: string;\n settings: string;\n save: string;\n cancel: string;\n parent: string;\n child: string;\n targetGone: string;\n empty: string;\n region: string;\n point: string;\n interact: string;\n color: string;\n background: string;\n opacity: string;\n font: string;\n fontSize: string;\n fontWeight: string;\n spacing: string;\n elementOnly: string;\n invalidStyle: string;\n applyStyles: string;\n styleHint: string;\n };\n}\n\ndeclare global {\n interface Window {\n __DSH_PAGE_ANNOTATION_CANCEL__?: () => void;\n }\n}\n\n/**\n * Run a bounded picker inside the inspected document. This function is self-contained\n * so Desktop can execute its compiled body in an approved guest, without a preload.\n * @param options - localized copy, initial intent, and host theme.\n * @returns the saved annotation, or a cancellation when no annotation was saved.\n */\nexport function annotatePage(\n options: BrowserAnnotationOptions,\n): Promise<BrowserAnnotation | { cancelled: true }> {\n window.__DSH_PAGE_ANNOTATION_CANCEL__?.();\n const doc = document;\n const originalUrl = location.href;\n const originalFocus = doc.activeElement;\n const root = doc.createElement('div');\n root.setAttribute('data-dsh-page-annotation', '');\n root.style.cssText = 'position:fixed;inset:0;z-index:2147483647;pointer-events:none;';\n const shadow = root.attachShadow({ mode: 'open' });\n const style = doc.createElement('style');\n style.textContent = `\n :host{all:initial;color-scheme:${options.dark ? 'dark' : 'light'}}\n *{box-sizing:border-box}\n .outline{position:fixed;pointer-events:none;border:2px solid #2979ff;border-radius:5px;background:#2979ff0c}\n .hint{position:fixed;top:12px;left:50%;transform:translateX(-50%);padding:8px 12px;border-radius:8px;background:#181a20;color:#fff;font:13px/20px system-ui;max-width:calc(100vw - 24px);pointer-events:none}\n .editor,.options{position:fixed;pointer-events:auto;border:0;background:${options.dark ? '#292a2d' : '#fff'};color:${options.dark ? '#ededee' : '#303338'};box-shadow:0 0 0 .5px ${options.dark ? '#55565b' : '#dcdfe3'},0 2px 8px #00000014;font:14px/22px system-ui}\n .editor{border-radius:26px;corner-shape:round;padding:7px 8px;width:min(384px,calc(100vw - 24px));overflow:hidden;max-height:calc(100vh - 24px);display:flex;flex-direction:column}\n .editor.expanded{width:min(420px,calc(100vw - 24px));border-radius:24px;padding:0}\n .expanded>.row{padding:12px 14px;flex:none}\n .expanded>.row>.save{display:none}\n .expanded textarea{max-height:min(66px,20vh)}\n .editor:focus-within{box-shadow:0 0 0 .5px ${options.dark ? '#85868b' : '#bfc4cc'},0 2px 8px #00000014}\n .row{display:flex;align-items:center;gap:10px}\n button,select,textarea{font:inherit;color:inherit}\n button{border:0;border-radius:8px;padding:6px 8px;background:transparent;cursor:pointer;flex:none}\n button:disabled{opacity:.4;cursor:default}\n button:hover:not(:disabled){background:${options.dark ? '#3b3c40' : '#f0f1f3'}}\n button:focus-visible,select:focus-visible{outline:2px solid #2979ff;outline-offset:2px}\n .options-toggle,.save{display:flex;align-items:center;justify-content:center;padding:0;width:30px;height:30px;border-radius:50%;corner-shape:round}\n .options-toggle{color:${options.dark ? '#bdc0c5' : '#737880'}}\n .save,.save:disabled{background:${options.dark ? '#797c82' : '#a2a5a9'};color:#fff;opacity:1}\n .save:not(:disabled){background:${options.dark ? '#d2d3d6' : '#777c83'};color:${options.dark ? '#242529' : '#fff'}}\n .save:hover:not(:disabled){background:${options.dark ? '#eeeff1' : '#60656d'}}\n textarea{display:block;flex:1;width:100%;min-width:0;height:22px;max-height:110px;resize:none;border:0;background:transparent;padding:0;margin:0;outline:0;line-height:22px;overflow-y:auto}\n textarea::placeholder{color:${options.dark ? '#aaaeb5' : '#888e96'};opacity:1}\n .options{position:static;box-shadow:none;flex:1;min-height:0;overflow:auto;font-size:14px;line-height:22px;scrollbar-width:thin}\n .target-row{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:7px 20px;background:${options.dark ? '#35363a' : '#f4f4f4'}}\n .target{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:${options.dark ? '#c9ccd1' : '#656b73'}}\n .target-controls{display:flex;gap:2px;flex:none}\n .target-controls button{font-size:13px;padding:0;width:24px;height:24px}\n .properties{padding:12px 20px;display:grid;gap:10px}\n .property{display:grid;grid-template-columns:minmax(90px,1fr) minmax(0,180px);align-items:center;gap:12px;color:${options.dark ? '#c9ccd1' : '#6e747b'}}\n .field{display:flex;align-items:center;gap:9px;border:.5px solid ${options.dark ? '#57595f' : '#dedfe2'};border-radius:13px;padding:7px 10px;min-width:0}\n .field input{font:13px/20px ui-monospace,monospace;background:transparent;color:inherit;border:0;outline:0;width:100%;min-width:0}\n .field:focus-within{border-color:${options.dark ? '#a2a5ac' : '#a5a9b1'}}\n .swatch{width:22px;height:22px;border-radius:7px;flex:none;box-shadow:inset 0 0 0 .5px #8886}\n .intent{display:flex;align-items:center;justify-content:space-between;padding:0 20px 12px;gap:8px;font-size:13px;color:${options.dark ? '#c9ccd1' : '#6e747b'}}\n select{font:inherit;border:.5px solid ${options.dark ? '#57595f' : '#dedfe2'};background:transparent;border-radius:10px;padding:5px 8px;max-width:160px}\n .footer{border-top:.5px solid ${options.dark ? '#44464b' : '#eee'};display:flex;align-items:center;justify-content:space-between;padding:10px 12px;flex:none}\n .footer>.cancel{border:.5px solid ${options.dark ? '#55565b' : '#e5e6e9'};border-radius:20px;padding:6px 12px;font-size:13px}\n .style-hint{font-size:12px;line-height:18px;margin:3px 0;color:${options.dark ? '#adb1b8' : '#8a9097'}}\n .error{color:${options.dark ? '#ffb0a9' : '#b82920'};font-size:12px;padding:3px 40px 1px}\n .hidden{display:none!important}\n `;\n const outline = doc.createElement('div');\n outline.className = 'outline hidden';\n const hint = doc.createElement('div');\n hint.className = 'hint';\n hint.textContent = options.copy.select;\n const editor = doc.createElement('form');\n editor.className = 'editor hidden';\n editor.setAttribute('aria-label', options.copy.placeholder);\n const row = doc.createElement('div');\n row.className = 'row';\n // The injected picker reuses the shared SlidersTwoOutline and CheckOutline artwork.\n function icon(parts: readonly (readonly [string, Record<string, string>])[]) {\n const svg = doc.createElementNS('http://www.w3.org/2000/svg', 'svg');\n for (const [name, value] of Object.entries({\n width: '18',\n height: '18',\n viewBox: '0 0 16 16',\n fill: 'none',\n stroke: 'currentColor',\n 'stroke-width': '1.3',\n 'stroke-linecap': 'round',\n 'stroke-linejoin': 'round',\n 'aria-hidden': 'true',\n }))\n svg.setAttribute(name, value);\n for (const [tag, attributes] of parts) {\n const node = doc.createElementNS('http://www.w3.org/2000/svg', tag);\n for (const [name, value] of Object.entries(attributes)) node.setAttribute(name, value);\n svg.append(node);\n }\n return svg;\n }\n const settings = doc.createElement('button');\n settings.type = 'button';\n settings.className = 'options-toggle';\n settings.title = options.copy.settings;\n settings.setAttribute('aria-label', options.copy.settings);\n settings.setAttribute('aria-expanded', 'false');\n settings.setAttribute('aria-haspopup', 'dialog');\n settings.append(\n icon([\n ['path', { d: 'M2.3 5h5.85M12.05 5h1.65' }],\n ['circle', { cx: '9.95', cy: '5', r: '1.45' }],\n ['path', { d: 'M2.3 11h1.65M7.85 11h5.85' }],\n ['circle', { cx: '5.75', cy: '11', r: '1.45' }],\n ]),\n );\n const optionsPanel = doc.createElement('section');\n optionsPanel.className = 'options hidden';\n optionsPanel.setAttribute('role', 'dialog');\n optionsPanel.setAttribute('aria-label', options.copy.settings);\n const intentRow = doc.createElement('div');\n intentRow.className = 'intent';\n const intentLabel = doc.createElement('span');\n intentLabel.textContent = options.copy.comment + ' / ' + options.copy.question;\n const intent = doc.createElement('select');\n intent.setAttribute('aria-label', options.copy.comment + ' / ' + options.copy.question);\n for (const [value, label] of [\n ['comment', options.copy.comment],\n ['question', options.copy.question],\n ]) {\n const option = doc.createElement('option');\n option.value = value!;\n option.textContent = label!;\n intent.append(option);\n }\n intent.value = options.intent;\n const input = doc.createElement('textarea');\n input.placeholder = options.copy.placeholder;\n input.setAttribute('aria-label', options.copy.placeholder);\n input.maxLength = 1000;\n const save = doc.createElement('button');\n save.type = 'submit';\n save.className = 'save';\n save.disabled = true;\n save.append(\n icon([\n [\n 'path',\n { d: 'M2.25 8.5L5.49732 11.7473C5.90519 12.1552 6.57263 12.1344 6.95426 11.7018L13.75 4' },\n ],\n ]),\n );\n save.title = options.copy.save;\n save.setAttribute('aria-label', options.copy.save);\n row.append(settings, input, save);\n const targetLabel = doc.createElement('span');\n targetLabel.className = 'target';\n const controls = doc.createElement('div');\n controls.className = 'controls';\n function control(label: string, glyph: string) {\n const button = doc.createElement('button');\n button.type = 'button';\n button.title = label;\n button.setAttribute('aria-label', label);\n button.textContent = glyph + ' ' + label;\n controls.append(button);\n return button;\n }\n const parent = control(options.copy.parent, '\u2191');\n const child = control(options.copy.child, '\u2193');\n const cancel = control(options.copy.cancel, '\u00D7');\n const error = doc.createElement('div');\n error.className = 'error hidden';\n error.setAttribute('role', 'alert');\n intentRow.append(intentLabel, intent);\n const targetRow = doc.createElement('div');\n targetRow.className = 'target-row';\n controls.className = 'target-controls';\n cancel.remove();\n parent.textContent = '\u2191';\n child.textContent = '\u2193';\n targetRow.append(targetLabel, controls);\n const properties = doc.createElement('div');\n properties.className = 'properties';\n const styleHint = doc.createElement('p');\n styleHint.className = 'style-hint';\n const fields = new Map<\n string,\n { input: HTMLInputElement; before: string; swatch?: HTMLElement }\n >();\n for (const [property, label] of [\n ['color', options.copy.color],\n ['background-color', options.copy.background],\n ['opacity', options.copy.opacity],\n ['font-family', options.copy.font],\n ['font-size', options.copy.fontSize],\n ['font-weight', options.copy.fontWeight],\n ['gap', options.copy.spacing],\n ]) {\n const item = doc.createElement('label');\n item.className = 'property';\n const labelText = doc.createElement('span');\n labelText.textContent = label!;\n const field = doc.createElement('div');\n field.className = 'field';\n const value = doc.createElement('input');\n value.setAttribute('aria-label', label!);\n value.dataset.property = property;\n value.maxLength = 1000;\n let swatch: HTMLElement | undefined;\n if (property === 'color' || property === 'background-color') {\n swatch = doc.createElement('span');\n swatch.className = 'swatch';\n swatch.setAttribute('aria-hidden', 'true');\n field.append(swatch);\n }\n field.append(value);\n item.append(labelText, field);\n properties.append(item);\n fields.set(property!, { input: value, before: '', ...(swatch ? { swatch } : {}) });\n }\n properties.append(styleHint);\n const footer = doc.createElement('div');\n footer.className = 'footer hidden';\n cancel.className = 'cancel';\n cancel.textContent = options.copy.cancel;\n const expandedSave = save.cloneNode(true) as HTMLButtonElement;\n footer.append(cancel, expandedSave);\n optionsPanel.append(targetRow, properties, intentRow);\n editor.append(row, optionsPanel, error, footer);\n shadow.append(style, outline, hint, editor);\n const surface = doc.createElement('div');\n surface.style.cssText =\n 'position:fixed;inset:0;pointer-events:auto;cursor:crosshair;touch-action:none';\n shadow.prepend(surface);\n doc.documentElement.append(root);\n\n let target: Element | null = null;\n let hovered: Element | null = null;\n let selection: {\n kind: 'element' | 'region' | 'point';\n rect: { x: number; y: number; width: number; height: number };\n } | null = null;\n let gesture: {\n id: number;\n x: number;\n y: number;\n clientX: number;\n clientY: number;\n dragging: boolean;\n } | null = null;\n let suspended = false;\n let suppressClick = false;\n const descendants: Element[] = [];\n let animation = 0;\n let ended = false;\n let settle!: (value: BrowserAnnotation | { cancelled: true }) => void;\n const result = new Promise<BrowserAnnotation | { cancelled: true }>((resolve) => {\n settle = resolve;\n });\n const lifecycle = new AbortController();\n function changes(): Record<string, { before: string; after: string }> {\n if (selection?.kind !== 'element') return {};\n return Object.fromEntries(\n [...fields].flatMap(([key, field]) => {\n let after = field.input.value.trim();\n if ((key === 'font-size' || key === 'gap') && /^\\d+(\\.\\d+)?$/.test(after)) after += 'px';\n return after === field.before ? [] : [[key, { before: field.before, after }]];\n }),\n );\n }\n function refreshProperties(element: Element | null) {\n const computed = element ? getComputedStyle(element) : null;\n for (const [key, field] of fields) {\n field.before = computed?.getPropertyValue(key) || '';\n field.input.value = field.before;\n field.input.disabled = !element;\n if (field.swatch) field.swatch.style.background = field.before;\n }\n properties.classList.toggle('area', !element);\n for (const field of fields.values())\n field.input.closest('.property')?.classList.toggle('hidden', !element);\n styleHint.textContent = element ? options.copy.styleHint : options.copy.elementOnly;\n }\n for (const [key, field] of fields) {\n field.input.addEventListener(\n 'input',\n () => {\n if (field.swatch && CSS.supports(key, field.input.value))\n field.swatch.style.background = field.input.value;\n intent.value = 'comment';\n error.classList.add('hidden');\n draw();\n },\n { signal: lifecycle.signal },\n );\n field.input.addEventListener(\n 'keydown',\n (event) => {\n if (event.key === 'Enter' && !event.isComposing && event.keyCode !== 229) {\n event.preventDefault();\n event.stopPropagation();\n submit(event);\n }\n },\n { signal: lifecycle.signal },\n );\n }\n const observer = new ResizeObserver(draw);\n\n function finish(value: BrowserAnnotation | { cancelled: true }) {\n if (ended) return;\n ended = true;\n lifecycle.abort();\n cancelAnimationFrame(animation);\n observer.disconnect();\n root.remove();\n if (window.__DSH_PAGE_ANNOTATION_CANCEL__ === dismiss)\n delete window.__DSH_PAGE_ANNOTATION_CANCEL__;\n if (originalFocus instanceof HTMLElement && originalFocus.isConnected)\n originalFocus.focus({ preventScroll: true });\n settle(value);\n }\n function dismiss() {\n finish({ cancelled: true });\n }\n window.__DSH_PAGE_ANNOTATION_CANCEL__ = dismiss;\n function showError(message: string) {\n error.textContent = message;\n error.classList.remove('hidden');\n }\n function valid(element: Element | null): element is Element {\n return (\n !!element &&\n element !== doc.body &&\n element !== doc.documentElement &&\n !element.closest('[data-dsh-page-annotation]')\n );\n }\n function hit(x: number, y: number): Element | null {\n surface.style.pointerEvents = 'none';\n editor.style.pointerEvents = 'none';\n let node = doc.elementFromPoint(x, y);\n while (node?.shadowRoot) {\n const inner = node.shadowRoot.elementFromPoint(x, y);\n if (!inner || inner === node) break;\n node = inner;\n }\n surface.style.pointerEvents = suspended ? 'none' : 'auto';\n editor.style.pointerEvents = 'auto';\n return valid(node) ? node : null;\n }\n function rectInDocument(element: Element) {\n const rect = element.getBoundingClientRect();\n return { x: rect.x + scrollX, y: rect.y + scrollY, width: rect.width, height: rect.height };\n }\n function gestureRect(x: number, y: number) {\n return {\n x: Math.min(gesture!.x, x),\n y: Math.min(gesture!.y, y),\n width: Math.max(1, Math.abs(x - gesture!.x)),\n height: Math.max(1, Math.abs(y - gesture!.y)),\n };\n }\n function selector(element: Element): string {\n const scope = element.getRootNode() as Document | ShadowRoot;\n if (element.id) {\n const id = '#' + CSS.escape(element.id);\n if (scope.querySelectorAll(id).length === 1) return id;\n }\n const pieces: string[] = [];\n let node: Element | null = element;\n while (node) {\n let part = node.localName;\n const peers = node.parentElement\n ? Array.from(node.parentElement.children).filter((x) => x.localName === node!.localName)\n : [];\n if (peers.length > 1) part += `:nth-of-type(${peers.indexOf(node) + 1})`;\n pieces.unshift(part);\n const path = pieces.join(' > ');\n if (scope.querySelectorAll(path).length === 1 && scope.querySelector(path) === element)\n return path;\n node = node.parentElement;\n }\n return pieces.join(' > ');\n }\n function locator(element: Element) {\n const shadowHosts: string[] = [];\n let scope = element.getRootNode();\n while (scope instanceof ShadowRoot) {\n shadowHosts.unshift(selector(scope.host));\n scope = scope.host.getRootNode();\n }\n return {\n selector: selector(element),\n shadowHosts,\n matchCount: (element.getRootNode() as Document | ShadowRoot).querySelectorAll(\n selector(element),\n ).length,\n };\n }\n function draw() {\n if (ended) return;\n if (location.href !== originalUrl) {\n dismiss();\n return;\n }\n if (suspended) return;\n const node = target || hovered;\n if (selection?.kind === 'element' && !target?.isConnected) {\n outline.classList.add('hidden');\n showError(options.copy.targetGone);\n save.disabled = expandedSave.disabled = true;\n return;\n }\n save.disabled = expandedSave.disabled =\n !selection || (!input.value.trim() && !Object.keys(changes()).length);\n const documentRect =\n selection?.kind === 'element' && target\n ? rectInDocument(target)\n : selection?.rect || (node?.isConnected ? rectInDocument(node) : null);\n if (!documentRect) {\n outline.classList.add('hidden');\n return;\n }\n const rect = {\n left: documentRect.x - scrollX,\n top: documentRect.y - scrollY,\n width: documentRect.width,\n height: documentRect.height,\n bottom: documentRect.y - scrollY + documentRect.height,\n };\n outline.classList.remove('hidden');\n Object.assign(outline.style, {\n left: `${rect.left - (selection?.kind === 'point' ? 5 : 0)}px`,\n top: `${rect.top - (selection?.kind === 'point' ? 5 : 0)}px`,\n width: `${selection?.kind === 'point' ? 10 : rect.width}px`,\n height: `${selection?.kind === 'point' ? 10 : rect.height}px`,\n borderStyle: selection?.kind === 'region' ? 'dashed' : 'solid',\n });\n if (editor.classList.contains('hidden')) return;\n const width = editor.getBoundingClientRect().width;\n const height = editor.getBoundingClientRect().height;\n const left = Math.max(12, Math.min(rect.left, innerWidth - width - 12));\n const below = rect.bottom + 8;\n const above = rect.top - height - 8;\n const top = Math.max(\n 12,\n Math.min(\n below + height <= innerHeight - 12 ? below : above >= 12 ? above : rect.top + 8,\n innerHeight - height - 12,\n ),\n );\n Object.assign(editor.style, { left: `${left}px`, top: `${top}px` });\n }\n function setOptions(open: boolean, restoreFocus = false) {\n optionsPanel.classList.toggle('hidden', !open);\n editor.classList.toggle('expanded', open);\n footer.classList.toggle('hidden', !open);\n settings.setAttribute('aria-expanded', String(open));\n draw();\n if (open) settings.focus({ preventScroll: true });\n else if (restoreFocus) settings.focus({ preventScroll: true });\n }\n settings.addEventListener(\n 'click',\n () => {\n setOptions(optionsPanel.classList.contains('hidden'));\n },\n { signal: lifecycle.signal },\n );\n intent.addEventListener(\n 'change',\n () => {\n setOptions(false);\n input.focus({ preventScroll: true });\n },\n { signal: lifecycle.signal },\n );\n input.addEventListener(\n 'input',\n () => {\n input.style.height = '22px';\n input.style.height = `${Math.min(110, input.scrollHeight)}px`;\n error.classList.add('hidden');\n draw();\n },\n { signal: lifecycle.signal },\n );\n function track() {\n draw();\n if (!ended) animation = requestAnimationFrame(track);\n }\n function choose(element: Element) {\n if (!valid(element)) return;\n observer.disconnect();\n target = element;\n selection = { kind: 'element', rect: rectInDocument(element) };\n observer.observe(element);\n hint.classList.add('hidden');\n editor.classList.remove('hidden');\n error.classList.add('hidden');\n const where = locator(element);\n targetLabel.textContent = `<${element.localName}>`;\n targetLabel.title = [...where.shadowHosts, where.selector].join(' \u203A ');\n refreshProperties(element);\n parent.disabled =\n !valid(element.parentElement) && !(element.getRootNode() instanceof ShadowRoot);\n child.disabled = descendants.length === 0;\n draw();\n if (!animation) animation = requestAnimationFrame(track);\n input.focus({ preventScroll: true });\n }\n function chooseArea(\n kind: 'region' | 'point',\n rect: { x: number; y: number; width: number; height: number },\n ) {\n observer.disconnect();\n target = null;\n selection = { kind, rect };\n hint.classList.add('hidden');\n editor.classList.remove('hidden');\n error.classList.add('hidden');\n targetLabel.textContent =\n kind === 'region'\n ? `${options.copy.region} \u00B7 ${Math.round(rect.width)} \u00D7 ${Math.round(rect.height)}`\n : options.copy.point;\n parent.disabled = child.disabled = true;\n targetLabel.title = '';\n refreshProperties(null);\n draw();\n if (!animation) animation = requestAnimationFrame(track);\n input.focus({ preventScroll: true });\n }\n function isOverlay(event: Event) {\n return event.composedPath().includes(root);\n }\n window.addEventListener(\n 'pointermove',\n (event) => {\n if (suspended || !editor.classList.contains('hidden')) return;\n if (gesture && gesture.id === event.pointerId) {\n gesture.dragging ||=\n Math.hypot(event.clientX - gesture.clientX, event.clientY - gesture.clientY) >= 5;\n if (gesture.dragging) {\n selection = {\n kind: 'region',\n rect: gestureRect(event.clientX + scrollX, event.clientY + scrollY),\n };\n draw();\n return;\n }\n }\n const node = hit(event.clientX, event.clientY);\n hovered = event.shiftKey && valid(node?.parentElement || null) ? node!.parentElement : node;\n draw();\n },\n { capture: true, signal: lifecycle.signal },\n );\n window.addEventListener(\n 'pointerdown',\n (event) => {\n if (suspended) {\n suppressClick = false;\n return;\n }\n if (isOverlay(event) && !event.composedPath().includes(surface)) return;\n setOptions(false);\n event.preventDefault();\n event.stopImmediatePropagation();\n suppressClick = true;\n if (event.button !== 0 || !editor.classList.contains('hidden')) return;\n gesture = {\n id: event.pointerId,\n x: event.clientX + scrollX,\n y: event.clientY + scrollY,\n clientX: event.clientX,\n clientY: event.clientY,\n dragging: false,\n };\n surface.setPointerCapture(event.pointerId);\n },\n { capture: true, signal: lifecycle.signal },\n );\n window.addEventListener(\n 'pointerup',\n (event) => {\n if (!gesture || gesture.id !== event.pointerId || suspended) return;\n event.preventDefault();\n event.stopImmediatePropagation();\n const current = gesture;\n const area = gestureRect(event.clientX + scrollX, event.clientY + scrollY);\n gesture = null;\n if (surface.hasPointerCapture(event.pointerId))\n surface.releasePointerCapture(event.pointerId);\n if (\n current.dragging ||\n Math.hypot(event.clientX - current.clientX, event.clientY - current.clientY) >= 5\n )\n chooseArea('region', area);\n else {\n const node = hit(event.clientX, event.clientY);\n descendants.length = 0;\n if (node) choose(event.shiftKey && valid(node.parentElement) ? node.parentElement : node);\n else\n chooseArea('point', {\n x: event.clientX + scrollX,\n y: event.clientY + scrollY,\n width: 0,\n height: 0,\n });\n }\n },\n { capture: true, signal: lifecycle.signal },\n );\n function abortGesture() {\n if (!gesture) return;\n if (surface.hasPointerCapture(gesture.id)) surface.releasePointerCapture(gesture.id);\n gesture = null;\n if (editor.classList.contains('hidden')) selection = null;\n draw();\n }\n window.addEventListener('pointercancel', abortGesture, {\n capture: true,\n signal: lifecycle.signal,\n });\n window.addEventListener(\n 'click',\n (event) => {\n if (isOverlay(event) && !event.composedPath().includes(surface)) return;\n if (suspended && !suppressClick) return;\n event.preventDefault();\n event.stopImmediatePropagation();\n suppressClick = false;\n },\n { capture: true, signal: lifecycle.signal },\n );\n function resume() {\n if (!suspended) return;\n suspended = false;\n surface.style.pointerEvents = 'auto';\n hint.textContent = options.copy.select;\n if (selection) {\n editor.classList.remove('hidden');\n hint.classList.add('hidden');\n } else hint.classList.remove('hidden');\n draw();\n }\n window.addEventListener(\n 'keydown',\n (event) => {\n if (event.isComposing || event.keyCode === 229) return;\n if (event.key === 'Escape') {\n event.preventDefault();\n event.stopImmediatePropagation();\n if (optionsPanel.classList.contains('hidden')) dismiss();\n else setOptions(false, true);\n return;\n }\n // The comment editor owns spaces. The page receives normal keys while suspended.\n if (isOverlay(event) && !event.composedPath().includes(surface)) return;\n if (event.code === 'Space' && !event.altKey && !event.ctrlKey && !event.metaKey) {\n event.preventDefault();\n event.stopImmediatePropagation();\n abortGesture();\n suspended = true;\n setOptions(false);\n surface.style.pointerEvents = 'none';\n outline.classList.add('hidden');\n editor.classList.add('hidden');\n hint.classList.remove('hidden');\n hint.textContent = options.copy.interact;\n } else if (!suspended && !isOverlay(event)) {\n event.preventDefault();\n event.stopImmediatePropagation();\n }\n },\n { capture: true, signal: lifecycle.signal },\n );\n window.addEventListener(\n 'keyup',\n (event) => {\n if (event.code === 'Space' && suspended) {\n event.preventDefault();\n event.stopImmediatePropagation();\n resume();\n }\n },\n { capture: true, signal: lifecycle.signal },\n );\n window.addEventListener(\n 'blur',\n () => {\n abortGesture();\n resume();\n },\n { signal: lifecycle.signal },\n );\n doc.addEventListener(\n 'visibilitychange',\n () => {\n if (doc.hidden) {\n abortGesture();\n resume();\n }\n },\n { signal: lifecycle.signal },\n );\n window.addEventListener('pagehide', dismiss, { once: true, signal: lifecycle.signal });\n parent.addEventListener(\n 'click',\n () => {\n if (!target) return;\n const scope = target.getRootNode();\n const node = target.parentElement || (scope instanceof ShadowRoot ? scope.host : null);\n if (valid(node)) {\n setOptions(false);\n descendants.push(target);\n choose(node);\n }\n },\n { signal: lifecycle.signal },\n );\n child.addEventListener(\n 'click',\n () => {\n const node = descendants.pop();\n if (node?.isConnected) {\n setOptions(false);\n choose(node);\n }\n },\n { signal: lifecycle.signal },\n );\n cancel.addEventListener('click', dismiss, { signal: lifecycle.signal });\n function evidence(element: Element): BrowserAnnotationElement {\n const where = locator(element);\n const computed = getComputedStyle(element);\n const styles: Record<string, string> = {};\n for (const name of [\n 'display',\n 'position',\n 'font-size',\n 'font-family',\n 'color',\n 'background-color',\n 'padding',\n 'margin',\n 'gap',\n 'opacity',\n 'font-weight',\n ])\n styles[name] = computed.getPropertyValue(name).slice(0, 1000);\n const source = element\n .closest('[data-web-annotator-source]')\n ?.getAttribute('data-web-annotator-source')\n ?.slice(0, 1000);\n return {\n ...where,\n tag: element.localName,\n text: (element instanceof HTMLElement ? element.innerText : element.textContent || '')\n .replace(/\\s+/g, ' ')\n .trim()\n .slice(0, 400),\n rect: rectInDocument(element),\n styles,\n ...(source ? { source } : {}),\n };\n }\n function candidates(rect: { x: number; y: number; width: number; height: number }) {\n const found = new Set<Element>();\n // Bounded samples also reach open Shadow DOM and avoid scanning the whole page.\n for (let row = 0; row < 5; row++)\n for (let col = 0; col < 5; col++) {\n const node = hit(\n rect.x - scrollX + (rect.width * (col + 0.5)) / 5,\n rect.y - scrollY + (rect.height * (row + 0.5)) / 5,\n );\n if (node) found.add(node);\n }\n return [...found].slice(0, 12).map(evidence);\n }\n function submit(event: Event) {\n event.preventDefault();\n if (\n !selection ||\n (selection.kind === 'element' && !target?.isConnected) ||\n location.href !== originalUrl\n ) {\n showError(options.copy.targetGone);\n return;\n }\n const styleChanges = changes();\n for (const [property, { after }] of Object.entries(styleChanges)) {\n if (\n !CSS.supports(property, after) ||\n (property === 'opacity' && !(Number(after) >= 0 && Number(after) <= 1))\n ) {\n showError(options.copy.invalidStyle);\n setOptions(true);\n fields.get(property)?.input.focus();\n return;\n }\n }\n if (!input.value.trim() && !Object.keys(styleChanges).length) {\n showError(options.copy.empty);\n input.focus();\n return;\n }\n const rect = selection.kind === 'element' ? rectInDocument(target!) : selection.rect;\n const items = selection.kind === 'element' ? [evidence(target!)] : candidates(rect);\n finish({\n intent: intent.value === 'question' ? 'question' : 'comment',\n note: input.value.trim() || options.copy.applyStyles,\n ...(Object.keys(styleChanges).length ? { styleChanges } : {}),\n url: originalUrl,\n title: doc.title.slice(0, 300),\n viewport: { width: innerWidth, height: innerHeight },\n selection: {\n kind: selection.kind,\n rect,\n viewportRect: { ...rect, x: rect.x - scrollX, y: rect.y - scrollY },\n scroll: { x: scrollX, y: scrollY },\n candidates: items,\n },\n });\n }\n editor.addEventListener('submit', submit, { signal: lifecycle.signal });\n input.addEventListener(\n 'keydown',\n (event) => {\n if (event.key === 'Enter' && !event.shiftKey && !event.isComposing && event.keyCode !== 229) {\n event.preventDefault();\n event.stopPropagation();\n submit(event);\n }\n },\n { signal: lifecycle.signal },\n );\n animation = requestAnimationFrame(track);\n return result;\n}\n", "/** Render a provider-captured viewport with its exact saved selection. */\nimport type { BrowserAnnotation, BrowserAnnotationImage } from './page-inspector.ts';\n\n/** Mark the saved rectangle on actual captured pixels and normalize to a bounded JPEG.\n * @param dataUrl - Browser capture of the inspected viewport, after picker cleanup.\n * @param annotation - saved viewport coordinates.\n * @returns image bytes ready for the official Session image attachment path.\n */\nexport async function markScreenshot(\n dataUrl: string,\n annotation: BrowserAnnotation,\n): Promise<BrowserAnnotationImage> {\n const picture = new Image();\n picture.src = dataUrl;\n await picture.decode();\n if (!picture.naturalWidth || !picture.naturalHeight) throw new Error('annotation-image-failed');\n const scale = Math.min(1, 1600 / Math.max(picture.naturalWidth, picture.naturalHeight));\n const canvas = document.createElement('canvas');\n canvas.width = Math.round(picture.naturalWidth * scale);\n canvas.height = Math.round(picture.naturalHeight * scale);\n const context = canvas.getContext('2d');\n if (!context) throw new Error('annotation-image-failed');\n context.drawImage(picture, 0, 0, canvas.width, canvas.height);\n const sx = canvas.width / annotation.viewport.width;\n const sy = canvas.height / annotation.viewport.height;\n const area = annotation.selection.viewportRect;\n context.strokeStyle = '#1683ff';\n context.fillStyle = '#1683ff';\n context.lineWidth = 2;\n const x = area.x * sx,\n y = area.y * sy;\n if (annotation.selection.kind === 'point') {\n if (x < 0 || y < 0 || x > canvas.width || y > canvas.height)\n throw new Error('annotation-image-failed');\n context.beginPath();\n context.arc(x, y, 7, 0, Math.PI * 2);\n context.stroke();\n } else {\n const left = Math.max(1, x),\n top = Math.max(1, y);\n const right = Math.min(canvas.width - 1, x + area.width * sx);\n const bottom = Math.min(canvas.height - 1, y + area.height * sy);\n if (right <= left || bottom <= top) throw new Error('annotation-image-failed');\n context.strokeRect(left, top, right - left, bottom - top);\n }\n const data = canvas.toDataURL('image/jpeg', 0.8).split(',')[1]!;\n if (data.length > 4000000) throw new Error('annotation-image-failed');\n return { mediaType: 'image/jpeg', data, width: canvas.width, height: canvas.height };\n}\n", "/** Electron tag DOM inside a Sidebar-owned, stable content container. */\nimport type { DesktopBrowserReservation } from '../../types.ts'\nimport type { BrowserPresentation } from '../view/BrowserPresentation.ts'\nimport css from '../view/Browser.module.css'\nimport { annotatePage, type BrowserAnnotationOptions } from '../annotation/page-inspector.ts'\nimport { isAnnotationResult, type AnnotationResult } from '../annotation/protocol.ts'\nimport { markScreenshot } from '../annotation/screenshot.ts'\n\n/** The Electron tag API used by its navigation provider. */\nexport interface WebviewElement extends HTMLElement {\n capturePage(): Promise<{ toDataURL(): string }>\n executeJavaScript(code: string): Promise<unknown>\n loadURL(url: string): Promise<void>\n getURL(): string\n getTitle(): string\n canGoBack(): boolean\n canGoForward(): boolean\n clearHistory(): void\n goBack(): void\n goForward(): void\n reload(): void\n isLoading(): boolean\n}\n\n/** Physical attachment notifications; hiding a retained Sidebar body emits neither. */\nexport interface ElectronPresentationEvents {\n readonly mounted: () => void\n readonly unmounted: () => void\n}\n\n/** Owns tag creation and attachment, without measuring or following another element. */\nexport class ElectronWebviewPresentation implements BrowserPresentation {\n private element: WebviewElement | undefined\n private host: HTMLElement | undefined\n\n constructor(private readonly events: ElectronPresentationEvents) {}\n\n /** @param url - controller-known page. @param options - picker configuration. @param signal - lifetime. @returns bounded guest evidence. */\n async annotate(url: string, options: BrowserAnnotationOptions, signal: AbortSignal): Promise<AnnotationResult> {\n const element = this.element\n if (signal.aborted) return { cancelled: true }\n if (element === undefined || element.getURL() !== url) throw new Error('annotation-unavailable')\n const cancel = (): void => {\n void element.executeJavaScript('window.__DSH_PAGE_ANNOTATION_CANCEL__?.()').catch(() => {\n // A destroyed or navigated guest has already removed the picker.\n })\n }\n signal.addEventListener('abort', cancel, { once: true })\n const navigation = (): void => { cancel() }\n element.addEventListener('did-start-navigation', navigation)\n try {\n element.focus()\n const result = await element.executeJavaScript(`(${annotatePage.toString()})(${JSON.stringify(options)})`)\n if (signal.aborted || this.element !== element) return { cancelled: true }\n if (!isAnnotationResult(result)) throw new Error('annotation-invalid')\n if (!('cancelled' in result) && (result.url !== url || element.getURL() !== url)) throw new Error('annotation-page-changed')\n if (!('cancelled' in result)) {\n try {\n const image = await element.capturePage()\n const screenshot = await markScreenshot(image.toDataURL(), result)\n if (signal.aborted || this.element !== element) return { cancelled: true }\n if (element.getURL() !== url || element.isLoading()) throw new Error('annotation-page-changed')\n const view = await element.executeJavaScript('({width:innerWidth,height:innerHeight,x:scrollX,y:scrollY})')\n if (typeof view !== 'object' || view === null || !('width' in view) || !('height' in view) || !('x' in view) || !('y' in view) ||\n view.width !== result.viewport.width || view.height !== result.viewport.height || view.x !== result.selection.scroll.x || view.y !== result.selection.scroll.y) return result\n return { ...result, screenshot }\n } catch (error) {\n if (signal.aborted || this.element !== element) return { cancelled: true }\n if (element.getURL() !== url || element.isLoading()) throw new Error('annotation-page-changed')\n // A capture failure must retain the saved annotation for detail-only submission.\n return result\n }\n }\n return result\n } finally {\n signal.removeEventListener('abort', cancel)\n element.removeEventListener('did-start-navigation', navigation)\n }\n }\n\n /** @param viewportId - committed content container. @returns ends attachment and releases its guest. */\n mount(viewportId: string): () => void {\n const host = document.getElementById(viewportId)\n if (host === null) throw new Error('Electron presentation: content container is not mounted')\n if (this.host !== undefined) this.events.unmounted()\n this.host = host\n this.events.mounted()\n return () => {\n if (this.host !== host) return\n this.events.unmounted()\n this.host = undefined\n }\n }\n\n /**\n * Configure a detached webview for an approved guest reservation.\n * @param reservation - main-approved partition and bootstrap lease.\n * @returns a detached, configured webview.\n */\n createElement(reservation: DesktopBrowserReservation): WebviewElement {\n const element = document.createElement('webview') as WebviewElement\n element.className = css.webview as string\n element.dataset.sidebarBrowserFrame = 'webview'\n element.setAttribute('name', reservation.lease)\n element.setAttribute('partition', reservation.partition)\n element.setAttribute('allowpopups', '')\n element.setAttribute('src', 'about:blank#' + reservation.lease)\n return element\n }\n\n /**\n * Attach a prepared guest, removing any previous guest DOM from the container.\n * @param element - configured guest with its navigation listeners already installed.\n * @throws when no content container is mounted.\n */\n present(element: WebviewElement): void {\n if (this.host === undefined) throw new Error('Electron presentation: cannot attach without a content container')\n this.clear()\n this.element = element\n this.host.append(element)\n }\n\n /**\n * Set the guest element's accessible label.\n * @param title - observed document title.\n */\n show(title: string): void {\n this.element?.setAttribute('aria-label', title)\n }\n\n /** Destroy only the guest DOM; a replacement may use the same mounted container. */\n clear(): void {\n this.element?.remove()\n this.element = undefined\n }\n\n /** Destroy the guest DOM and release its content container. */\n dispose(): void {\n this.clear()\n this.host = undefined\n }\n}\n", "/** Assemble Electron navigation and presentation behind the shared BrowserPage interface. */\nimport type { DesktopBrowserBridge } from '../../types.ts'\nimport type { BrowserPage, BrowserPageOptions } from '../browser/BrowserPage.ts'\nimport { ElectronWebViewImpl } from './ElectronWebViewImpl.ts'\nimport { ElectronWebviewPresentation } from './ElectronWebviewPresentation.ts'\n\n/**\n * Assemble an idle Electron provider; guest creation waits for mounting and navigation.\n * @param options - checkpoint and source-tab callbacks.\n * @param bridge - desktop-only transport.\n * @param workspace - storage account resolver.\n * @returns separate navigation and presentation faces.\n */\nexport function createElectronPage(options: BrowserPageOptions, bridge: DesktopBrowserBridge,\n workspace: (signal: AbortSignal) => Promise<string>): BrowserPage {\n const presentation = new ElectronWebviewPresentation({\n mounted: () => { frame.attach() },\n unmounted: () => { frame.detach() },\n })\n const frame = new ElectronWebViewImpl(options, bridge, workspace, presentation)\n return { frame, presentation }\n}\n", "/** Resolve CWD-keyed Electron storage after the authoritative Workspace list has arrived. */\nimport type { WorkspaceSource } from '@deepseek-ai/dsh-api-workspace-controller/client'\n\n/**\n * Use the Workspace's canonical CWD, not its record id; ungrouped Sessions remain isolated.\n * @param source - authoritative Workspace membership.\n * @param sessionId - owning DSH Session.\n * @param signal - guest initialization lifetime.\n * @returns the storage account for this occurrence.\n */\nexport async function browserWorkspace(source: WorkspaceSource, sessionId: string, signal: AbortSignal): Promise<string> {\n signal.throwIfAborted()\n if (source.getSnapshot().phase !== 'ready') {\n await new Promise<void>((resolve, reject) => {\n const abort = (): void => {\n stop()\n const reason: unknown = signal.reason\n // oxlint-disable-next-line typescript/prefer-promise-reject-errors -- Preserve the caller-owned AbortSignal reason.\n reject(reason)\n }\n const stop = source.subscribe(() => {\n if (source.getSnapshot().phase !== 'ready') return\n stop()\n signal.removeEventListener('abort', abort)\n resolve()\n })\n signal.addEventListener('abort', abort, { once: true })\n })\n }\n signal.throwIfAborted()\n const workspace = source.getSnapshot().items.find(item => item.sessionIds.some(id => id === sessionId))\n return workspace === undefined ? `session:${sessionId}` : `cwd:${workspace.path}`\n}\n", "/** Static Browser tab type and guide declaration. */\nimport type { ShortcutCommandId } from '@deepseek-ai/dsh-client-shortcuts/client'\nimport type { TranslateNS } from '@deepseek-ai/dsh-client-locale/client'\nimport { GuideArtworkBrowser } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { SidebarRightTabDefinition } from '@deepseek-ai/dsh-client-ui-sidebar-right/client'\nimport type {} from './locales.ts'\n\n/** Browser tab kind. */\nexport const BROWSER_KIND = 'browser'\n\n/** Browser implementation identity and keyed Slot dispatch key. */\nexport const BROWSER_ID = '@deepseek-ai/dsh-client-ui-sidebar-browser'\n\n/** Build the Browser type with locale-live copy. */\nexport function browserDefinition(t: TranslateNS<'sidebarBrowser'>): SidebarRightTabDefinition {\n return {\n id: BROWSER_ID,\n kind: BROWSER_KIND,\n multiple: true,\n priority: 'builtin',\n title: () => t('type.label'),\n guide: [{\n id: 'new', commandId: 'browser.new' as ShortcutCommandId, order: 30, title: () => t('guide.title'),\n description: () => t('guide.description'), icon: GuideArtworkBrowser,\n }],\n }\n}\n", "/** Locale-owned Browser tab copy. */\nexport const zh = {\n 'type.label': '\u6D4F\u89C8\u5668',\n 'guide.title': '\u6D4F\u89C8\u5668',\n 'guide.description': '\u6D4F\u89C8\u7F51\u9875',\n 'shortcut.noSession': '\u8BF7\u5148\u6253\u5F00\u4E00\u4E2A\u4F1A\u8BDD',\n 'address.placeholder': '\u8F93\u5165 HTTP(S) \u5730\u5740',\n 'address.changed': 'URL \u5DF2\u53D8\u5316',\n back: '\u540E\u9000',\n forward: '\u524D\u8FDB',\n reload: '\u5237\u65B0',\n go: '\u524D\u5F80',\n external: '\u5728\u7CFB\u7EDF\u6D4F\u89C8\u5668\u4E2D\u6253\u5F00',\n 'sandbox.disable': '\u5173\u95ED\u6C99\u7BB1\u9650\u5236',\n 'sandbox.enable': '\u6062\u590D\u6C99\u7BB1\u9650\u5236',\n 'sandbox.warning': '\u6C99\u7BB1\u9650\u5236\u5DF2\u5173\u95ED\uFF1B\u9875\u9762\u53EF\u4EE5\u5BFC\u822A\u9876\u5C42\u5E94\u7528\uFF0C\u5E76\u4F7F\u7528\u4E0B\u8F7D\u3001\u6A21\u6001\u5BF9\u8BDD\u6846\u4E0E\u8F93\u5165\u9501\u5B9A\u3002',\n start: '\u8F93\u5165 HTTP(S) \u5730\u5740\u5F00\u59CB\u6D4F\u89C8',\n loading: '\u6B63\u5728\u6253\u5F00\u2026',\n 'restore.previous': '\u4E0A\u6B21\u6253\u5F00',\n 'restore.action': '\u6062\u590D\u9875\u9762',\n 'error.empty': '\u8BF7\u8F93\u5165\u5730\u5740\u3002',\n 'error.invalid': '\u8FD9\u4E2A\u5730\u5740\u65E0\u6548\u6216\u8FC7\u957F\u3002',\n 'error.protocol': '\u53EA\u652F\u6301 HTTP \u548C HTTPS \u5730\u5740\uFF1B\u672C\u5730\u6587\u4EF6\u8BF7\u4F7F\u7528\u6587\u6863\u9884\u89C8\u3002',\n 'error.credentials': '\u5730\u5740\u4E0D\u80FD\u5305\u542B\u7528\u6237\u540D\u6216\u5BC6\u7801\u3002',\n 'error.application-origin': '\u4E0D\u80FD\u5728\u5D4C\u5165\u6D4F\u89C8\u5668\u4E2D\u6253\u5F00 DSH \u5E94\u7528\u81EA\u8EAB\u3002',\n 'load.failed': '\u9875\u9762\u52A0\u8F7D\u5931\u8D25\uFF1B\u8BF7\u5237\u65B0\u91CD\u8BD5\u6216\u5728\u7CFB\u7EDF\u6D4F\u89C8\u5668\u4E2D\u6253\u5F00\u3002',\n 'load.failed.detail': '\u9875\u9762\u52A0\u8F7D\u5931\u8D25 ({code}): {description}',\n 'address.unknown': '\u9875\u9762\u5DF2\u8DF3\u8F6C\uFF1B\u5F53\u524D\u8F7D\u4F53\u65E0\u6CD5\u8BFB\u53D6\u65B0\u7684 URL\u3002',\n} satisfies Record<string, string>\n\n/** Browser dictionary key union. */\nexport type SidebarBrowserKey = keyof typeof zh\n\n/** English dictionary with the same keys. */\nexport const en = {\n 'type.label': 'Browser',\n 'guide.title': 'Browser',\n 'guide.description': 'Browse web pages',\n 'shortcut.noSession': 'Open a session first',\n 'address.placeholder': 'Enter an HTTP(S) address',\n 'address.changed': 'URL changed',\n back: 'Back',\n forward: 'Forward',\n reload: 'Reload',\n go: 'Go',\n external: 'Open in system browser',\n 'sandbox.disable': 'Disable sandbox restrictions',\n 'sandbox.enable': 'Restore sandbox restrictions',\n 'sandbox.warning': 'Sandbox restrictions are disabled; the page can navigate the top-level app and use downloads, modal dialogs, and input locks.',\n start: 'Enter an HTTP(S) address to start browsing',\n loading: 'Opening\u2026',\n 'restore.previous': 'Previously opened',\n 'restore.action': 'Restore page',\n 'error.empty': 'Enter an address.',\n 'error.invalid': 'That address is invalid or too long.',\n 'error.protocol': 'Only HTTP and HTTPS addresses are supported; use Document Preview for local files.',\n 'error.credentials': 'Addresses cannot contain a username or password.',\n 'error.application-origin': 'The embedded browser cannot open the DSH application itself.',\n 'load.failed': 'The page could not load; reload or open it in the system browser.',\n 'load.failed.detail': 'Page load failed ({code}): {description}',\n 'address.unknown': 'The page navigated; this carrier cannot read its new URL.',\n} satisfies Record<SidebarBrowserKey, string>\n\ndeclare module '@deepseek-ai/dsh-client-ui-slots' {\n interface LocaleNamespaceMap {\n /** Sidebar Browser labels, navigation controls, and failures. */\n sidebarBrowser: SidebarBrowserKey\n }\n}\n", "/** Persisted Browser tab snapshots shared by the body and title slots. */\nimport { defineStore, type EngineStoreHandle } from '@deepseek-ai/dsh-client-store'\nimport type { TabId } from '@deepseek-ai/dsh-client-ui-dockkit'\nimport type { BrowserTabState } from './BrowserPersistence.ts'\n\n/** All Browser tabs in one Session-scoped store. */\nexport interface BrowserState {\n byTab: Record<TabId, BrowserTabState>\n}\n\ntype BrowserActions = {\n replace: (draft: BrowserState, tabId: TabId, state: BrowserTabState) => void\n forget: (draft: BrowserState, tabId: TabId) => void\n}\n\n/**\n * Declare the Session-scoped Browser persistence store.\n * @returns a fresh store handle for Slot registration.\n */\nexport function createBrowserStore(): EngineStoreHandle<BrowserState, BrowserActions> {\n return defineStore({\n init: (): BrowserState => ({ byTab: {} }),\n persist: 'dsh.sidebar-browser.v1',\n actions: {\n replace: (draft, tabId: TabId, state: BrowserTabState) => { draft.byTab[tabId] = state },\n forget: (draft, tabId: TabId) => {\n const byTab: BrowserState['byTab'] = {}\n for (const [id, state] of Object.entries(draft.byTab) as [TabId, BrowserTabState][]) {\n if (id !== tabId) byTab[id] = state\n }\n draft.byTab = byTab\n },\n },\n })\n}\n\n/** Browser store handle shared by body and title registrations. */\nexport type BrowserStore = ReturnType<typeof createBrowserStore>\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACCA,mBAA6E;AAE7E,sCASO;;;ACmCA,SAAS,oBAAuC;AACrD,SAAO;AAAA,IAAE,QAAQ;AAAA,IAAW,SAAS;AAAA,IAAS,SAAS;AAAA,IAAO,WAAW;AAAA,IAAO,cAAc;AAAA,IAC5F,OAAO;AAAA,IAAW,gBAAgB;AAAA,EAAU;AAChD;;;ACpBO,SAAS,qBAAqB,OAA+D;AAClG,SAAO,UAAU,UAAa,MAAM,QAAQ,IAAI,SAAY,MAAM,QAAQ,MAAM,KAAK;AACvF;AAQO,SAAS,yBAAyB,QAAuB,UAAmC;AACjG,SAAO;AAAA,IAAE,SAAS,CAAC,MAAM;AAAA,IAAG,OAAO;AAAA,IAAG,SAAS,EAAE,QAAQ,SAAS;AAAA,IAChE,YAAY,EAAE,QAAQ,SAAS,SAAS;AAAA,IAAG,SAAS;AAAA,EAAU;AAClE;;;AC3CA;AAAA,EAAC,MAAAA;AAAA,EAUA,SAAAC;AAAA,EAWA,MAAAC;AAAA,EAyBA,YAAAC;AAAA,EAKA,YAAAC;AAAA,EAMA,SAAAC;AAAA,EAYA,WAAAC;AAAA,EAaA,gBAAAC;AAAA,EAaA,gBAAAC;AAAA,EAsBA,OAAAC;AAAA,EASA,SAAAC;AAAA,EAQA,UAAAC;AAAA,EAOA,aAAAC;AAAA,EAOA,SAAAC;AAAA,EAYA,cAAAC;AAAA,EAMA,cAAAC;AAAA,EAQA,YAAAC;AAAA,EAaA,SAAAC;AAAA,EAgBA,OAAAC;AAAA,EAYA,SAAAC;AAAA,EAQA,gBAAAC;AAAA,EAQA,OAAAC;AAAA,EAYA,WAAAC;AAAA;;;AH1NG;AAJJ,IAAM,cAAc,kBAAkB;AAEtC,SAAS,kBAAkB,EAAE,UAAU,GAA+C;AACpF,SACE,6CAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,eAAW,MACrE;AAAA,gDAAC,UAAK,GAAG,qDAAqB,QAAO,gBAAe,aAAa,qDAAqB,gBAAe,SAAQ;AAAA,IAC5G,YACG,4CAAC,UAAK,GAAE,2kBAA0kB,MAAK,gBAAe,IACtmB,4CAAC,UAAK,GAAE,iNAAgN,MAAK,gBAAe,WAAU,sBAAqB;AAAA,KACjR;AAEJ;AASA,SAAS,gBAAgB,KAAyB,UAA8D;AAC9G,QAAM,CAAC,MAAM,OAAO,QAAI,uBAAgE;AACxF,SAAO;AAAA,IAAC,MAAM,aAAa,WAAW,KAAK,QAAQ,OAAO;AAAA,IACxD,CAAC,UAAU;AAAE,cAAQ,EAAE,UAAU,MAAM,CAAC;AAAA,IAAE;AAAA,EAAC;AAC/C;AAGO,SAAS,YAAY,OAAoC;AAC9D,QAAM,EAAE,OAAO,SAAS,SAAS,QAAQ,WAAW,QAAQ,YAAY,iBAAiB,UAAU,YAAY,EAAE,IAAI;AACrH,QAAM,EAAE,IAAI,IAAI,WAAW;AAC3B,8BAAU,MAAM,IAAI,QAAQ,aAAa,EAAE,SAAS,MAAM;AAAE,WAAO,IAAI,EAAE;AAAA,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,SAAS,IAAI,IAAI,MAAM,CAAC;AAC9G,QAAM,QAAQ,SAAS,CAAAC,WAASA,OAAM,MAAM,IAAI,EAAE,CAAC;AACnD,QAAM,cAAU,qBAAO,KAAK;AAC5B,QAAM,iBAAa,qBAAO,IAAI,WAAW,QAAQ,GAAG;AACpD,QAAM,iBAAa,oBAAM;AACzB,QAAM,CAAC,YAAY,aAAa,QAAI,uBAAS,CAAC;AAC9C,QAAM,QAAQ,gBAAgB,IAAI,EAAE;AACpC,QAAM,QAAQ,OAAO,SAAS;AAC9B,QAAM,gBAAgB,UAAU,SAAY,qBAAqB,QAAQ,OAAO,IAAI,MAAM;AAC1F,QAAM,SAAS,MAAM,UAAU;AAC/B,QAAM,CAAC,OAAO,QAAQ,IAAI,gBAAgB,QAAQ,OAAO,WAAW,SAAS,OAAO,mBAAmB,CAAC;AAExG,oCAAgB,MAAM;AACpB,UAAM,OAAO,MAAM;AAAA,MACjB,OAAO,IAAI;AAAA,MAAI,QAAQ,IAAI;AAAA,MAAQ;AAAA,MAAY,mBAAmB,OAAO,SAAS;AAAA,MAClF,SAAS,QAAQ;AAAA,MAAS,YAAY,WAAW;AAAA,MACjD,SAAS,CAAC,QAAQ;AAAE,YAAI,QAAQ,QAAQ,WAAW,EAAE,QAAQ,EAAE,IAAI,GAAG,gBAAgB,MAAM,CAAC;AAAA,MAAE;AAAA,IACjG,CAAC;AACD,kBAAc,WAAS,QAAQ,CAAC;AAChC,WAAO;AAAA,EACT,GAAG,CAAC,OAAO,IAAI,IAAI,IAAI,QAAQ,IAAI,SAAS,YAAY,MAAM,OAAO,CAAC;AAEtE,QAAM,UAAU,MAAM,YAAY;AAClC,QAAM,cAAc,UAAU,SAAY,QAAQ;AAClD,QAAM,YAAY,MAAM;AACxB,QAAM,UAAU,OAAO;AACvB,QAAM,QAAQ,MAAM;AACpB,QAAM,SAAS,CAAC,UAA2B;AAAE,UAAM,eAAe;AAAG,YAAQ,IAAI,IAAI,KAAK;AAAA,EAAE;AAC5F,QAAM,sBAA0C,sBAAQ,OAAO;AAAA,IAC7D,OAAO,IAAI;AAAA,IAAI,KAAK,UAAU,SAAY,MAAM,QAAQ;AAAA,IAAK,SAAS,MAAM,WAAW,eAAe;AAAA,IACtG,UAAU,aAAW,MAAM,SAAS,IAAI,IAAI,OAAO;AAAA,IACnD,kBAAkB,MAAM;AAAE,YAAM,iBAAiB,IAAI,EAAE;AAAA,IAAE;AAAA,EAC3D,IAAI,CAAC,IAAI,IAAI,SAAS,MAAM,QAAQ,KAAK,MAAM,SAAS,YAAY,MAAM,UAAU,MAAM,gBAAgB,CAAC;AAE3G,SACE,6CAAC,SAAI,WAAW,gBAAI,MAClB;AAAA,iDAAC,UAAK,WAAW,gBAAI,SAAS,UAAU,QACtC;AAAA,kDAAC,YAAO,MAAK,UAAS,WAAW,gBAAI,MAAM,cAAY,EAAE,MAAM,GAAG,OAAO,EAAE,MAAM,GAAG,UAAU,CAAC,MAAM,WAAW,SAAS,MAAM;AAAE,eAAO,IAAI,EAAE;AAAA,MAAE,GAAG,sDAAC,iEAA8B,GAAE;AAAA,MACpL,4CAAC,YAAO,MAAK,UAAS,WAAW,gBAAI,MAAM,cAAY,EAAE,SAAS,GAAG,OAAO,EAAE,SAAS,GAAG,UAAU,CAAC,MAAM,cAAc,SAAS,MAAM;AAAE,kBAAU,IAAI,EAAE;AAAA,MAAE,GAAG,sDAAC,kEAA+B,GAAE;AAAA,MAChM,MAAM,WAAW,qCAAqC,eAAe;AAAA,MACtE,4CAAC,2CAAQ,OAAO,EAAE,QAAQ,GAAG,cAAc,IAAI,iBAAiB,MAAM,MAAK,UAAS,SAAS,KAC3F,sDAAC,YAAO,MAAK,UAAS,WAAW,gBAAI,MAAM,cAAY,EAAE,QAAQ,GAAG,qBAAmB,IAAI,iBAAiB,MAAM,UAAU,WAAW,UAAa,eAAe,GAAG,SAAS,MAAM;AAAE,eAAO,IAAI,EAAE;AAAA,MAAE,GAAG,sDAAC,6DAA0B,GAAE,GACxO;AAAA,MACA,6CAAC,SAAI,WAAW,gBAAI,YAClB;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAW,CAAC,gBAAI,SAAS,UAAU,gBAAI,iBAAiB,EAAE,EAAE,KAAK,GAAG;AAAA,YACpE,OAAO;AAAA,YACP,cAAY,EAAE,qBAAqB;AAAA,YACnC,aAAa,EAAE,qBAAqB;AAAA,YACpC,YAAY;AAAA,YACZ,UAAU,CAAC,UAAU;AAAE,uBAAS,MAAM,cAAc,KAAK;AAAA,YAAE;AAAA;AAAA,QAC7D;AAAA,QACC,WAAW,4CAAC,UAAK,WAAW,gBAAI,gBAAiB,YAAE,iBAAiB,GAAE;AAAA,QACvE,4CAAC,YAAO,MAAK,UAAS,WAAW,CAAC,gBAAI,MAAM,gBAAI,SAAS,EAAE,KAAK,GAAG,GAAG,cAAY,EAAE,IAAI,GAAG,OAAO,EAAE,IAAI,GAAG,sDAAC,0DAAuB,GAAE;AAAA,SACvI;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UAAO,MAAK;AAAA,UAAS,WAAW,gBAAI;AAAA,UAAM,cAAY,EAAE,UAAU;AAAA,UAAG,OAAO,EAAE,UAAU;AAAA,UAAG,UAAU,gBAAgB;AAAA,UACpH,SAAS,gBAAgB,SAAY,SAAY,MAAM;AAAE,mBAAO,KAAK,aAAa,UAAU,qBAAqB;AAAA,UAAE;AAAA,UACpH,sDAAC,6DAA0B,MAAM,IAAI;AAAA;AAAA,MAAE;AAAA,MACvC,cAAc,UAAa;AAAA,QAAC;AAAA;AAAA,UAC3B,MAAK;AAAA,UACL,WAAW,CAAC,gBAAI,MAAM,YAAY,KAAK,gBAAI,UAAU,EAAE,KAAK,GAAG;AAAA,UAC/D,cAAY,EAAE,YAAY,oBAAoB,gBAAgB;AAAA,UAC9D,OAAO,EAAE,YAAY,oBAAoB,gBAAgB;AAAA,UACzD,gBAAc,CAAC;AAAA,UACf,SAAS,MAAM;AAAE,uBAAW,IAAI,IAAI,CAAC,SAAS;AAAA,UAAE;AAAA,UACjD,sDAAC,qBAAkB,WAAsB;AAAA;AAAA,MAAE;AAAA,OAC9C;AAAA,IACC,cAAc,SAAS,4CAAC,SAAI,WAAW,gBAAI,gBAAgB,MAAK,UAAU,YAAE,iBAAiB,GAAE;AAAA,IAC/F,UAAU,UAAa,4CAAC,SAAI,WAAW,gBAAI,SAAS,MAAK,UAAU,gBAAM,SAAS,UAAa,MAAM,gBAAgB,SAClH,EAAE,sBAAsB,EAAE,MAAM,OAAO,MAAM,IAAI,GAAG,aAAa,MAAM,YAAY,CAAC,IACpF,EAAE,aAAa,GAAE;AAAA,IACpB,YAAY,UAAa,4CAAC,SAAI,WAAW,gBAAI,SAAS,MAAK,SAAS,YAAE,SAAS,OAAO,EAAE,GAAE;AAAA,IAC3F,6CAAC,SAAI,WAAW,gBAAI,SAAS,aAAW,MAAM,SAC5C;AAAA,kDAAC,SAAI,IAAI,YAAY,WAAW,gBAAI,UAAU,cAAY,EAAE,YAAY,GAAG;AAAA,MAC1E,kBAAkB,UAAa,6CAAC,aAAQ,WAAW,gBAAI,SAAS,cAAY,EAAE,kBAAkB,GAC/F;AAAA,oDAAC,OAAE,WAAW,gBAAI,cAAe,YAAE,kBAAkB,GAAE;AAAA,QACvD,4CAAC,OAAE,WAAW,gBAAI,cAAe,wBAAc,OAAM;AAAA,QACrD,4CAAC,OAAE,WAAW,gBAAI,YAAa,wBAAc,KAAI;AAAA,QACjD,4CAAC,0CAAO,SAAQ,WAAU,MAAK,MAAK,UAAU,eAAe,GAAG,SAAS,MAAM;AAAE,kBAAQ,IAAI,EAAE;AAAA,QAAE,GAC9F,YAAE,gBAAgB,GACrB;AAAA,SACF;AAAA,MACC,kBAAkB,WAAc,WAAW,UAAa,MAAM,YAAY,UAAU,UAAa,4CAAC,SAAI,WAAW,gBAAI,aACpH,sDAAC,SAAI,WAAW,gBAAI,OAAQ,YAAE,WAAW,SAAY,UAAU,SAAS,GAAE,GAC5E;AAAA,OACF;AAAA,IACC,MAAM,WAAW,yCAAyC,eAAe;AAAA,IACzE,WAAW,4CAAC,OAAE,WAAW,gBAAI,OAAQ,YAAE,iBAAiB,GAAE;AAAA,KAC7D;AAEJ;;;AI3IA,IAAAC,mCAAwC;AAa/B,IAAAC,sBAAA;AAHF,SAAS,aAAa,EAAE,YAAY,SAAS,GAAiC;AACnF,QAAM,EAAE,IAAI,IAAI,WAAW;AAC3B,QAAM,QAAQ,SAAS,WAAS,qBAAqB,MAAM,MAAM,IAAI,EAAE,CAAC,CAAC;AACzE,SAAO,8EAAE;AAAA,iDAAC,4DAAwB,WAAW,gBAAI,WAAW;AAAA,IAAG,OAAO,SAAS,IAAI;AAAA,KAAM;AAC3F;;;ACfA,8BAA2E;;;ACEpE,IAAM,yBAAyB,KAAK;AAqBpC,SAAS,oBAAoB,OAAe,mBAAkD;AACnG,QAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,YAAY,GAAI,QAAO,EAAE,IAAI,OAAO,QAAQ,QAAQ;AACxD,MAAI,QAAQ,SAAS,uBAAwB,QAAO,EAAE,IAAI,OAAO,QAAQ,UAAU;AACnF,QAAM,iBAAiB,8CAA8C,KAAK,OAAO;AACjF,QAAM,YAAY,iBAAiB,UAAU,WAAW,OAAO;AAC/D,MAAI;AACJ,MAAI;AAAE,UAAM,IAAI,IAAI,SAAS;AAAA,EAAE,QAAQ;AAAE,WAAO,EAAE,IAAI,OAAO,QAAQ,UAAU;AAAA,EAAE;AACjF,MAAI,IAAI,aAAa,MAAM,IAAI,aAAa,GAAI,QAAO,EAAE,IAAI,OAAO,QAAQ,cAAc;AAC1F,MAAI,IAAI,aAAa,YAAY,IAAI,aAAa,SAAS;AACzD,QAAI,sBAAsB,UAAa,sBAAsB,QAAQ;AACnE,UAAI;AACF,YAAI,IAAI,WAAW,IAAI,IAAI,iBAAiB,EAAE,OAAQ,QAAO,EAAE,IAAI,OAAO,QAAQ,qBAAqB;AAAA,MACzG,QAAQ;AAAA,MAER;AAAA,IACF;AACA,WAAO,EAAE,IAAI,MAAM,QAAQ,EAAE,MAAM,IAAI,aAAa,WAAW,UAAU,QAAQ,KAAK,IAAI,MAAM,OAAO,IAAI,SAAS,EAAE;AAAA,EACxH;AACA,SAAO,EAAE,IAAI,OAAO,QAAQ,WAAW;AACzC;;;ADXO,IAAM,oBAAN,MAA0E;AAAA;AAAA,EAa/E,YAA6B,SAAmC;AAAnC;AAC3B,SAAK,UAAU,QAAQ;AACvB,SAAK,aAAa,QAAQ;AAC1B,SAAK,OAAO,QAAQ,WAAW;AAAA,MAC7B,SAAS,QAAQ;AAAA,MACjB,SAAS,CAAC,UAAU;AAClB,YAAI,KAAK,SAAU;AACnB,aAAK,aAAa;AAClB,aAAK,QAAQ,QAAQ,QAAQ,OAAO,KAAK;AAAA,MAC3C;AAAA,MACA,eAAe,CAAC,UAAU;AACxB,YAAI,KAAK,SAAU;AACnB,cAAM,SAAS,oBAAoB,OAAO,QAAQ,iBAAiB;AACnE,YAAI,CAAC,OAAO,IAAI;AAAE,eAAK,cAAc,OAAO,MAAM;AAAG;AAAA,QAAO;AAC5D,gBAAQ,QAAQ,OAAO,OAAO,GAAG;AAAA,MACnC;AAAA,IACF,CAAC;AACD,SAAK,YAAQ,6CAAoB;AAAA,MAAE,OAAO,KAAK,KAAK,MAAM,YAAY;AAAA,MACpE,eAAe,qBAAqB,KAAK,UAAU;AAAA,MAAG,gBAAgB;AAAA,MAAW,iBAAiB;AAAA,IAAE,CAAC;AACvG,SAAK,cAAc,KAAK,KAAK,MAAM,UAAU,MAAM;AACjD,UAAI,KAAK,SAAU;AACnB,YAAM,UAAU,KAAK,MAAM,YAAY;AACvC,YAAM,QAAQ,KAAK,KAAK,MAAM,YAAY;AAC1C,YAAM,UAAU,MAAM,QAAQ,QAAQ,QAAQ,MAAM,QAAQ;AAC5D,WAAK,MAAM,IAAI;AAAA,QAAE;AAAA,QAAO,eAAe,MAAM,WAAW,SAAY,qBAAqB,KAAK,UAAU,IAAI;AAAA,QAC1G,gBAAgB,UAAU,SAAY,QAAQ;AAAA,QAC9C,iBAAiB,QAAQ,kBAAkB,OAAO,OAAO;AAAA,MAAE,CAAC;AAAA,IAChE,CAAC;AACD,YAAQ,OAAO,iBAAiB,SAAS,KAAK,OAAO,EAAE,MAAM,KAAK,CAAC;AAAA,EACrE;AAAA,EA7B6B;AAAA,EAZZ;AAAA,EACA;AAAA,EACA;AAAA,EACT;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACS,QAAQ,MAAY;AAAE,SAAK,KAAK,QAAQ;AAAA,EAAE;AAAA;AAAA,EAmC3D,cAAc,MAA8B,KAAK,MAAM,YAAY;AAAA;AAAA,EAEnE,YAAY,CAAC,aAAuC,KAAK,MAAM,UAAU,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOjF,MAAM,YAAgC;AACpC,SAAK,aAAa;AAClB,UAAM,UAAU,KAAK,KAAK,aAAa,MAAM,UAAU;AACvD,WAAO,MAAM;AAAE,WAAK,iBAAiB;AAAG,cAAQ;AAAA,IAAE;AAAA,EACpD;AAAA;AAAA,EAGA,MAAM,SAAS,SAA8D;AAC3E,SAAK,iBAAiB;AACtB,UAAM,QAAQ,KAAK,KAAK,MAAM,YAAY;AAC1C,QAAI,KAAK,YAAY,MAAM,WAAW,MAAM,YAAY,aAAa,MAAM,WAAW,UAAa,KAAK,KAAK,aAAa,aAAa,OAAW,OAAM,IAAI,MAAM,wBAAwB;AAC1L,UAAM,WAAW,IAAI,gBAAgB;AACrC,SAAK,aAAa;AAClB,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,KAAK,aAAa,SAAS,MAAM,OAAO,KAAK,SAAS,SAAS,MAAM;AAC/F,aAAO,SAAS,OAAO,UAAU,EAAE,WAAW,KAAK,IAAI;AAAA,IACzD,UAAE;AACA,UAAI,KAAK,eAAe,SAAU,MAAK,aAAa;AAAA,IACtD;AAAA,EACF;AAAA;AAAA,EAGA,mBAAyB;AAAE,SAAK,YAAY,MAAM;AAAG,SAAK,aAAa;AAAA,EAAU;AAAA;AAAA;AAAA;AAAA;AAAA,EAMjF,MAAM,YAAsC;AAC1C,QAAI,KAAK,WAAW,KAAK,SAAU;AACnC,SAAK,UAAU;AACf,QAAI,eAAe,OAAW,MAAK,QAAQ,UAAU;AAAA,EACvD;AAAA;AAAA,EAGA,UAAgB;AACd,UAAM,SAAS,KAAK,MAAM,YAAY,EAAE;AACxC,QAAI,WAAW,OAAW,MAAK,QAAQ,OAAO,GAAG;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ,OAAqB;AAC3B,QAAI,KAAK,SAAU;AACnB,UAAM,SAAS,oBAAoB,OAAO,KAAK,QAAQ,iBAAiB;AACxE,QAAI,CAAC,OAAO,IAAI;AAAE,WAAK,cAAc,OAAO,MAAM;AAAG;AAAA,IAAO;AAC5D,SAAK,QAAQ,MAAM;AAAE,WAAK,KAAK,MAAM,QAAQ,OAAO,MAAM;AAAA,IAAE,CAAC;AAAA,EAC/D;AAAA;AAAA,EAGA,SAAe;AAAE,SAAK,QAAQ,MAAM;AAAE,WAAK,KAAK,MAAM,OAAO;AAAA,IAAE,CAAC;AAAA,EAAE;AAAA;AAAA,EAElE,YAAkB;AAAE,SAAK,QAAQ,MAAM;AAAE,WAAK,KAAK,MAAM,UAAU;AAAA,IAAE,CAAC;AAAA,EAAE;AAAA;AAAA,EAExE,SAAe;AACb,QAAI,KAAK,MAAM,YAAY,EAAE,kBAAkB,OAAW,MAAK,QAAQ;AAAA,QAClE,MAAK,QAAQ,MAAM;AAAE,WAAK,KAAK,MAAM,OAAO;AAAA,IAAE,CAAC;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW,SAAwB;AACjC,UAAM,UAAU,KAAK,KAAK,MAAM;AAChC,QAAI,YAAY,OAAW,MAAK,QAAQ,MAAM;AAAE,cAAQ,WAAW,OAAO;AAAA,IAAE,CAAC;AAAA,EAC/E;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,SAA2C;AAAE,SAAK,UAAU;AAAA,EAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,EAM3E,UAAyB;AACvB,QAAI,KAAK,aAAa,OAAW,QAAO,KAAK;AAC7C,SAAK,WAAW;AAChB,SAAK,iBAAiB;AACtB,SAAK,QAAQ,OAAO,oBAAoB,SAAS,KAAK,KAAK;AAC3D,SAAK,YAAY;AACjB,SAAK,WAAW,KAAK,KAAK,MAAM,QAAQ;AACxC,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,eAAqB;AAC3B,QAAI,KAAK,eAAe,OAAW,MAAK,QAAQ,QAAQ,KAAK,QAAQ,OAAO,KAAK,UAAU;AAAA,EAC7F;AAAA,EAEQ,cAAc,QAAqC;AACzD,SAAK,MAAM,IAAI,EAAE,GAAG,KAAK,MAAM,YAAY,GAAG,gBAAgB,OAAO,CAAC;AAAA,EACxE;AAAA,EAEQ,QAAQ,KAAuB;AACrC,QAAI,KAAK,SAAU;AACnB,SAAK,iBAAiB;AACtB,UAAM,UAAU,KAAK,MAAM,YAAY;AACvC,SAAK,MAAM,IAAI,EAAE,GAAG,SAAS,gBAAgB,QAAW,iBAAiB,QAAQ,kBAAkB,EAAE,CAAC;AACtG,QAAI;AAAA,EACN;AACF;AAiDO,SAAS,yBAAyB,SAAqC,YAC5E,WAAuD;AACvD,MAAI,iBAAiB;AACrB,QAAM,cAAc,oBAAI,IAIrB;AACH,QAAM,aAAa,CAAC,OAA6C,YAAY,IAAI,EAAE,GAAG;AACtF,SAAO;AAAA,IACL,UAAU,CAAC,IAAI,YAAY,WAAW,EAAE,GAAG,SAAS,OAAO,KAAK,QAAQ,OAAO,IAAI,MAAM,wBAAwB,CAAC;AAAA,IAClH,kBAAkB,QAAM;AAAE,iBAAW,EAAE,GAAG,iBAAiB;AAAA,IAAE;AAAA,IAC7D,YAAY,EAAE,cAAc,SAAO,WAAW,GAAY,EAAE;AAAA,IAC5D,MAAM,SAAS;AACb,YAAM,EAAE,OAAO,OAAO,IAAI;AAC1B,UAAI,OAAO,QAAS,QAAO,MAAM;AAAA,MAAC;AAClC,UAAI,OAAO,YAAY,IAAI,KAAK;AAChC,UAAI,MAAM,WAAW,QAAQ;AAC3B,YAAI,SAAS,QAAW;AACtB,eAAK,OAAO,oBAAoB,SAAS,KAAK,MAAM;AACpD,eAAK,KAAK,WAAW,QAAQ;AAAA,QAC/B;AACA,cAAM,UAAU,IAAI,kBAAkB,EAAE,GAAG,SAAS,SAAS,gBAAgB,WAAW,CAAC;AACzF,cAAM,SAAS,MAAY;AACzB,sBAAY,OAAO,KAAK;AAExB,cAAI,CAAC,UAAU,KAAK,EAAG,gBAAe,OAAO,KAAK;AAAA,QACpD;AACA,eAAO,EAAE,QAAQ,YAAY,SAAS,OAAO;AAC7C,oBAAY,IAAI,OAAO,IAAI;AAC3B,eAAO,iBAAiB,SAAS,QAAQ,EAAE,MAAM,KAAK,CAAC;AAAA,MACzD;AACA,YAAM,OAAO,KAAK,WAAW,MAAM,QAAQ,UAAU;AACrD,WAAK,WAAW,MAAM,QAAQ,UAAU;AACxC,aAAO;AAAA,IACT;AAAA,IACA,SAAS,YAAY;AACnB,YAAM,UAAU,CAAC,GAAG,YAAY,OAAO,CAAC,EAAE,IAAI,CAAC,EAAE,QAAQ,YAAAC,aAAY,OAAO,MAAM;AAChF,eAAO,oBAAoB,SAAS,MAAM;AAC1C,eAAOA,YAAW,QAAQ;AAAA,MAC5B,CAAC;AACD,kBAAY,MAAM;AAClB,YAAM,QAAQ,IAAI,OAAO;AAAA,IAC3B;AAAA,IACA,QAAQ,CAACC,aAAY;AACnB,uBAAiBA;AACjB,iBAAW,EAAE,YAAAD,YAAW,KAAK,YAAY,OAAO,EAAG,CAAAA,YAAW,OAAOC,QAAO;AAAA,IAC9E;AAAA,IACA,SAAS,CAAC,IAAI,UAAU;AAAE,iBAAW,EAAE,GAAG,QAAQ,KAAK;AAAA,IAAE;AAAA,IACzD,SAAS,CAAC,OAAO;AAAE,iBAAW,EAAE,GAAG,QAAQ;AAAA,IAAE;AAAA,IAC7C,QAAQ,CAAC,OAAO;AAAE,iBAAW,EAAE,GAAG,OAAO;AAAA,IAAE;AAAA,IAC3C,WAAW,CAAC,OAAO;AAAE,iBAAW,EAAE,GAAG,UAAU;AAAA,IAAE;AAAA,IACjD,QAAQ,CAAC,OAAO;AAAE,iBAAW,EAAE,GAAG,OAAO;AAAA,IAAE;AAAA,IAC3C,YAAY,CAAC,IAAI,YAAY;AAAE,iBAAW,EAAE,GAAG,WAAW,OAAO;AAAA,IAAE;AAAA,EACrE;AACF;;;AEvSA,IAAAC,2BAAwD;;;ACIjD,IAAM,sBAAsB;AAM5B,IAAM,oBAAN,MAAM,mBAAkB;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKR,YAAY,UAA2B,mBAAkB,MAAM,GAAG;AAChE,SAAK,QAAQ;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,QAAyB;AAC9B,WAAO,EAAE,SAAS,CAAC,GAAG,OAAO,IAAI,SAAS,QAAW,YAAY,EAAE,QAAQ,QAAQ,GAAG,SAAS,OAAU;AAAA,EAC3G;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,QAAQ,OAAqE;AAClF,WAAO,UAAU,UAAa,MAAM,QAAQ,IAAI,SAAY,MAAM,QAAQ,MAAM,KAAK;AAAA,EACvF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,UAAU,OAAiC;AAChD,WAAO,MAAM,WAAW,WAAW,aAAa,MAAM,QAAQ;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,aAAa,OAAiC;AACnD,WAAO,MAAM,WAAW,WAAW,aAC9B,MAAM,SAAS,KACf,MAAM,QAAQ,MAAM,QAAQ,SAAS;AAAA,EAC5C;AAAA;AAAA,EAGA,IAAI,WAA4B;AAC9B,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,IAAI,YAAqB;AACvB,WAAO,mBAAkB,UAAU,KAAK,KAAK;AAAA,EAC/C;AAAA;AAAA,EAGA,IAAI,eAAwB;AAC1B,WAAO,mBAAkB,aAAa,KAAK,KAAK;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAS,QAAgE;AACvE,UAAM,UAAU,CAAC,GAAG,KAAK,MAAM,QAAQ,MAAM,GAAG,KAAK,MAAM,QAAQ,CAAC,GAAG,MAAM;AAC7E,QAAI,QAAQ,SAAS,oBAAqB,SAAQ,OAAO,GAAG,QAAQ,SAAS,mBAAmB;AAChG,WAAO,KAAK,QAAQ,QAAQ,EAAE,GAAG,KAAK,OAAO,SAAS,OAAO,QAAQ,SAAS,EAAE,CAAC;AAAA,EACnF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAmC;AACjC,QAAI,CAAC,KAAK,UAAW,QAAO;AAC5B,UAAM,QAAQ,KAAK,MAAM,QAAQ;AACjC,UAAM,SAAS,KAAK,MAAM,QAAQ,KAAK;AACvC,WAAO,KAAK,QAAQ,QAAQ,EAAE,GAAG,KAAK,OAAO,MAAM,CAAC;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAsC;AACpC,QAAI,CAAC,KAAK,aAAc,QAAO;AAC/B,UAAM,QAAQ,KAAK,MAAM,QAAQ;AACjC,UAAM,SAAS,KAAK,MAAM,QAAQ,KAAK;AACvC,WAAO,KAAK,QAAQ,QAAQ,EAAE,GAAG,KAAK,OAAO,MAAM,CAAC;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAqC;AACnC,UAAM,SAAS,mBAAkB,QAAQ,KAAK,KAAK;AACnD,WAAO,WAAW,SAAY,SAAY,KAAK,QAAQ,QAAQ,KAAK,KAAK;AAAA,EAC3E;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY,UAAwB;AAClC,UAAM,aAAa,KAAK,MAAM;AAC9B,QAAI,WAAW,WAAW,WAAW,WAAW,aAAa,SAAU;AACvE,QAAI,WAAW,WAAW,WAAW;AACnC,WAAK,QAAQ,EAAE,GAAG,KAAK,OAAO,YAAY,EAAE,QAAQ,SAAS,SAAS,EAAE;AAAA,IAC1E,WAAW,WAAW,WAAW,SAAS;AACxC,WAAK,QAAQ,EAAE,GAAG,KAAK,OAAO,YAAY,EAAE,QAAQ,WAAW,SAAS,EAAE;AAAA,IAC5E;AAAA,EACF;AAAA,EAEQ,QACN,QACA,OACyC;AACzC,UAAM,UAAU,EAAE,WAAW,KAAK,MAAM,SAAS,YAAY,KAAK,GAAG,OAAO;AAC5E,SAAK,QAAQ;AAAA,MACX,GAAG;AAAA,MACH;AAAA,MACA,YAAY,EAAE,QAAQ,WAAW,UAAU,QAAQ,SAAS;AAAA,MAC5D,SAAS;AAAA,IACX;AACA,WAAO;AAAA,EACT;AACF;;;ADrIO,IAAM,aAAN,MAAyC;AAAA;AAAA,EAU9C,YAA6B,SAA8C,cAAkC;AAAhF;AAA8C;AACzE,SAAK,aAAa,IAAI,kBAAkB,QAAQ,OAAO;AACvD,SAAK,YAAQ,8CAAoB,EAAE,GAAG,kBAAkB,GAAG,gBAAgB,KAAK,UAAU,CAAC;AAAA,EAC7F;AAAA,EAH6B;AAAA,EAA8C;AAAA,EATlE,UAAiC,EAAE,YAAY,CAAC,YAAY;AAAE,SAAK,WAAW,OAAO;AAAA,EAAE,EAAE;AAAA,EACjF;AAAA,EACA;AAAA,EACT,YAAY;AAAA,EACZ;AAAA,EACA,WAAW;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAYR,aAAa,UAAwB;AACnC,QAAI,KAAK,SAAU;AACnB,SAAK,WAAW,YAAY,QAAQ;AACpC,SAAK,QAAQ;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBAAiB,UAAwB;AACvC,QAAI,KAAK,YAAY,KAAK,WAAW,SAAS,SAAS,aAAa,SAAU;AAC9E,SAAK,QAAQ,EAAE,MAAM,QAAW,aAAa,OAAU;AACvD,SAAK,QAAQ;AAAA,EACf;AAAA;AAAA,EAGA,cAAc,MAAyB,KAAK,MAAM,YAAY;AAAA;AAAA,EAE9D,YAAY,CAAC,aAAuC,KAAK,MAAM,UAAU,QAAQ;AAAA;AAAA,EAGjF,QAAQ,QAA6B;AACnC,QAAI,KAAK,SAAU;AACnB,UAAM,UAAU,kBAAkB,QAAQ,KAAK,WAAW,QAAQ,GAAG,QAAQ,OAAO,MAChF,KAAK,WAAW,OAAO,IAAI,KAAK,WAAW,SAAS,MAAM;AAC9D,SAAK,KAAK,OAAO;AAAA,EACnB;AAAA;AAAA,EAGA,SAAe;AAAE,QAAI,CAAC,KAAK,SAAU,MAAK,KAAK,KAAK,WAAW,KAAK,CAAC;AAAA,EAAE;AAAA;AAAA,EAEvE,YAAkB;AAAE,QAAI,CAAC,KAAK,SAAU,MAAK,KAAK,KAAK,WAAW,QAAQ,CAAC;AAAA,EAAE;AAAA;AAAA,EAE7E,SAAe;AAAE,QAAI,CAAC,KAAK,SAAU,MAAK,KAAK,KAAK,WAAW,OAAO,CAAC;AAAA,EAAE;AAAA;AAAA,EAGzE,UAAyB;AACvB,QAAI,KAAK,aAAa,OAAW,QAAO,KAAK;AAC7C,SAAK,WAAW;AAChB,SAAK,aAAa,QAAQ;AAC1B,SAAK,WAAW,QAAQ,QAAQ;AAChC,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,WAAW,SAAwB;AACzC,QAAI,KAAK,YAAY,YAAY,KAAK,UAAW;AACjD,SAAK,YAAY;AACjB,QAAI,KAAK,MAAM,YAAY,EAAE,WAAW,QAAW;AACjD,WAAK,MAAM,IAAI,EAAE,GAAG,KAAK,MAAM,YAAY,GAAG,gBAAgB,QAAQ,CAAC;AACvE;AAAA,IACF;AACA,SAAK,KAAK,KAAK,WAAW,OAAO,CAAC;AAAA,EACpC;AAAA,EAEQ,KAAK,SAAsE;AACjF,QAAI,YAAY,OAAW;AAC3B,SAAK,QAAQ;AACb,SAAK,QAAQ;AACb,SAAK,aAAa,KAAK,EAAE,QAAQ,QAAQ,QAAQ,UAAU,QAAQ,UAAU,WAAW,KAAK,UAAU,CAAC;AAAA,EAC1G;AAAA,EAEQ,WAA8B;AACpC,UAAM,QAAQ,KAAK,WAAW;AAC9B,UAAM,SAAS,kBAAkB,QAAQ,KAAK;AAC9C,WAAO;AAAA,MAAE;AAAA,MAAQ,SAAS,WAAW,SAAY,UAAU,MAAM,WAAW,WAAW,YAAY,YAAY;AAAA,MAC7G,SAAS,MAAM,WAAW,WAAW,aAAa,KAAK,UAAU;AAAA,MACjE,WAAW,KAAK,WAAW;AAAA,MAAW,cAAc,KAAK,WAAW;AAAA,MACpE,OAAO,KAAK;AAAA,MAAO,gBAAgB,KAAK;AAAA,IAAU;AAAA,EACtD;AAAA,EAEQ,UAAgB;AACtB,SAAK,MAAM,IAAI,KAAK,SAAS,CAAC;AAC9B,SAAK,QAAQ,QAAQ,KAAK,WAAW,QAAQ;AAAA,EAC/C;AACF;;;AEjGA,SAAS,OAAO,OAAkD;AAChE,SAAO,CAAC,CAAC,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AACrE;AACA,SAAS,OAAO,OAAgB,OAAgC;AAC9D,SAAO,OAAO,UAAU,YAAY,MAAM,UAAU;AACtD;AACA,SAAS,OAAO,OAAiC;AAC/C,SAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK;AACnF;AACA,SAAS,KAAK,OAAyB;AACrC,SACE,OAAO,KAAK,KACZ,OAAO,MAAM,CAAC,KACd,OAAO,MAAM,CAAC,KACd,OAAO,MAAM,KAAK,KAClB,OAAO,MAAM,MAAM,KACnB,MAAM,SAAS,KACf,MAAM,UAAU;AAEpB;AAKO,SAAS,mBAAmB,OAA2C;AAC5E,MAAI,CAAC,OAAO,KAAK,EAAG,QAAO;AAC3B,MAAI,MAAM,cAAc,KAAM,QAAO,OAAO,KAAK,KAAK,EAAE,WAAW;AACnE,MACG,MAAM,WAAW,aAAa,MAAM,WAAW,cAChD,CAAC,OAAO,MAAM,MAAM,GAAI,KACxB,CAAC,MAAM,KAAK,KAAK,KACjB,CAAC,OAAO,MAAM,KAAK,IAAI,KACvB,CAAC,OAAO,MAAM,OAAO,GAAG;AAExB,WAAO;AACT,MACE,MAAM,iBAAiB,WACtB,CAAC,OAAO,MAAM,YAAY,KACzB,OAAO,KAAK,MAAM,YAAY,EAAE,SAAS,MACzC,CAAC,OAAO,QAAQ,MAAM,YAAY,EAAE;AAAA,IAClC,CAAC,CAAC,KAAK,MAAM,MACX;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,SAAS,GAAG,KACd,OAAO,MAAM,KACb,OAAO,OAAO,QAAQ,GAAI,KAC1B,OAAO,OAAO,OAAO,GAAI;AAAA,EAC7B;AAEF,WAAO;AACT,MACE,MAAM,eAAe,WACpB,CAAC,OAAO,MAAM,UAAU,KACvB,MAAM,WAAW,cAAc,gBAC/B,CAAC,OAAO,MAAM,WAAW,MAAM,GAAO,KACtC,CAAC,yBAAyB,KAAK,MAAM,WAAW,IAAI,KACpD,CAAC,OAAO,MAAM,WAAW,KAAK,KAC9B,CAAC,OAAO,MAAM,WAAW,MAAM,KAC/B,MAAM,WAAW,SAAS,KAC1B,MAAM,WAAW,QAAQ,QACzB,MAAM,WAAW,UAAU,KAC3B,MAAM,WAAW,SAAS;AAE5B,WAAO;AACT,MAAI;AACF,QAAI,CAAC,CAAC,SAAS,QAAQ,EAAE,SAAS,IAAI,IAAI,MAAM,GAAG,EAAE,QAAQ,EAAG,QAAO;AAAA,EACzE,QAAQ;AACN,WAAO;AAAA,EACT;AACA,MACE,CAAC,OAAO,MAAM,QAAQ,KACtB,CAAC,OAAO,MAAM,SAAS,KAAK,KAC5B,CAAC,OAAO,MAAM,SAAS,MAAM,KAC7B,MAAM,SAAS,SAAS,KACxB,MAAM,SAAS,UAAU;AAEzB,WAAO;AACT,QAAM,YAAY,MAAM;AACxB,MACE,CAAC,OAAO,SAAS,KACjB,CAAC,CAAC,WAAW,UAAU,OAAO,EAAE,SAAS,OAAO,UAAU,IAAI,CAAC,KAC/D,CAAC,KAAK,UAAU,IAAI,KACpB,CAAC,KAAK,UAAU,YAAY,KAC5B,CAAC,OAAO,UAAU,MAAM,KACxB,CAAC,OAAO,UAAU,OAAO,CAAC,KAC1B,CAAC,OAAO,UAAU,OAAO,CAAC,KAC1B,CAAC,MAAM,QAAQ,UAAU,UAAU,KACnC,UAAU,WAAW,SAAS;AAE9B,WAAO;AACT,MAAI,UAAU,SAAS,aAAa,UAAU,WAAW,WAAW,EAAG,QAAO;AAC9E,aAAW,QAAQ,UAAU,YAAY;AACvC,QACE,CAAC,OAAO,IAAI,KACZ,CAAC,OAAO,KAAK,UAAU,IAAI,KAC3B,CAAC,MAAM,QAAQ,KAAK,WAAW,KAC/B,KAAK,YAAY,SAAS,MAC1B,CAAC,KAAK,YAAY,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,CAAC,KAC9C,KAAK,eAAe,KACpB,CAAC,OAAO,KAAK,KAAK,GAAG,KACrB,CAAC,OAAO,KAAK,MAAM,GAAG,KACtB,CAAC,KAAK,KAAK,IAAI,KACf,CAAC,OAAO,KAAK,MAAM,KACnB,OAAO,KAAK,KAAK,MAAM,EAAE,SAAS,MAClC,CAAC,OAAO,QAAQ,KAAK,MAAM,EAAE,MAAM,CAAC,CAAC,KAAK,GAAG,MAAM,OAAO,KAAK,GAAG,KAAK,OAAO,KAAK,GAAI,CAAC,KACvF,KAAK,WAAW,UAAa,CAAC,OAAO,KAAK,QAAQ,GAAI;AAEvD,aAAO;AAAA,EACX;AACA,MAAI;AACF,WAAO,KAAK,UAAU,EAAE,GAAG,OAAO,YAAY,OAAU,CAAC,EAAE,UAAU;AAAA,EACvE,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ACrHO,SAAS,eACd,OACA,KACA,SACA,QAC2B;AAC3B,MAAI,OAAO,QAAS,QAAO,QAAQ,QAAQ,EAAE,WAAW,KAAK,CAAC;AAC9D,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,UAAU,IAAI,eAAe;AACnC,QAAI,QAAQ;AACZ,QAAI,QAAQ;AACZ,UAAM,YAAY,WAAW,MAAM;AACjC,UAAI,CAAC,MAAO,QAAO,QAAW,IAAI,MAAM,wBAAwB,CAAC;AAAA,IACnE,GAAG,GAAI;AACP,aAAS,OAAO,OAA0B,OAAe;AACvD,UAAI,MAAO;AACX,cAAQ;AACR,cAAQ,MAAM,YAAY,EAAE,MAAM,SAAS,CAAC;AAC5C,cAAQ,MAAM,MAAM;AACpB,cAAQ,MAAM,MAAM;AACpB,mBAAa,SAAS;AACtB,aAAO,oBAAoB,SAAS,MAAM;AAC1C,YAAM,oBAAoB,QAAQ,MAAM;AACxC,UAAI,MAAO,QAAO,KAAK;AAAA,UAClB,SAAQ,SAAS,EAAE,WAAW,KAAK,CAAC;AAAA,IAC3C;AACA,aAAS,SAAS;AAChB,aAAO,EAAE,WAAW,KAAK,CAAC;AAAA,IAC5B;AACA,WAAO,iBAAiB,SAAS,QAAQ,EAAE,MAAM,KAAK,CAAC;AACvD,UAAM,iBAAiB,QAAQ,QAAQ,EAAE,MAAM,KAAK,CAAC;AACrD,YAAQ,MAAM,YAAY,CAAC,UAAU;AACnC,UAAI,MAAM,MAAM,UAAU,QAAQ,CAAC,OAAO;AACxC,gBAAQ;AACR,qBAAa,SAAS;AACtB;AAAA,MACF;AACA,UAAI,CAAC,mBAAmB,MAAM,IAAI,GAAG;AACnC,eAAO,QAAW,IAAI,MAAM,oBAAoB,CAAC;AACjD;AAAA,MACF;AACA,UAAI,EAAE,eAAe,MAAM,SAAS,MAAM,KAAK,QAAQ,KAAK;AAC1D,eAAO,QAAW,IAAI,MAAM,yBAAyB,CAAC;AACtD;AAAA,MACF;AACA,aAAO,MAAM,IAAI;AAAA,IACnB;AACA,QAAI;AACF,UAAI,CAAC,MAAM,eAAe;AACxB,eAAO,QAAW,IAAI,MAAM,wBAAwB,CAAC;AACrD;AAAA,MACF;AACA,YAAM,cAAc;AAAA,QAClB,EAAE,SAAS,6BAA6B,MAAM,SAAS,QAAQ;AAAA,QAC/D,IAAI,IAAI,GAAG,EAAE;AAAA,QACb,CAAC,QAAQ,KAAK;AAAA,MAChB;AACA,YAAM,MAAM;AAAA,IACd,SAAS,OAAO;AACd,aAAO,QAAW,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,wBAAwB,CAAC;AAAA,IACxF;AAAA,EACF,CAAC;AACH;;;AChEO,IAAM,sBAAsB;AAgB5B,IAAM,qBAAN,MAAwD;AAAA;AAAA,EAO7D,YAA6B,QAAkC;AAAlC;AAAA,EAAmC;AAAA,EAAnC;AAAA,EANrB;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA;AAAA,EAMnB,SAAS,KAAa,SAAmC,QAAgD;AACvG,QAAI,KAAK,YAAY,OAAW,QAAO,QAAQ,OAAO,IAAI,MAAM,wBAAwB,CAAC;AACzF,WAAO,eAAe,KAAK,SAAS,KAAK,SAAS,MAAM;AAAA,EAC1D;AAAA;AAAA,EAGA,MAAM,YAAgC;AACpC,UAAM,OAAO,SAAS,eAAe,UAAU;AAC/C,QAAI,SAAS,KAAM,OAAM,IAAI,MAAM,8CAA8C;AACjF,SAAK,SAAS,OAAO;AACrB,SAAK,UAAU;AACf,SAAK,OAAO;AACZ,QAAI,KAAK,SAAU,MAAK,OAAO,UAAU;AAAA,QACpC,MAAK,OAAO;AACjB,WAAO,MAAM;AACX,UAAI,KAAK,SAAS,KAAM;AACxB,WAAK,SAAS,OAAO;AACrB,WAAK,UAAU;AACf,WAAK,OAAO;AAAA,IACd;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,KAAK,OAA6B;AAChC,SAAK,WAAW;AAChB,SAAK,OAAO;AAAA,EACd;AAAA;AAAA,EAGA,UAAgB;AACd,SAAK,SAAS,OAAO;AACrB,SAAK,UAAU;AACf,SAAK,OAAO;AACZ,SAAK,WAAW;AAAA,EAClB;AAAA,EAEQ,SAAe;AACrB,UAAM,UAAU,KAAK;AACrB,UAAM,OAAO,KAAK;AAClB,QAAI,YAAY,UAAa,SAAS,OAAW;AACjD,SAAK,SAAS,OAAO;AACrB,UAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,YAAQ,YAAY,gBAAI;AACxB,YAAQ,MAAM,QAAQ,OAAO;AAC7B,YAAQ,QAAQ,QAAQ,OAAO;AAC/B,YAAQ,iBAAiB;AACzB,YAAQ,QAAQ,sBAAsB;AACtC,QAAI,QAAQ,UAAW,SAAQ,aAAa,WAAW,mBAAmB;AAC1E,YAAQ,iBAAiB,QAAQ,MAAM;AACrC,UAAI,KAAK,YAAY,QAAS,MAAK,OAAO,OAAO,QAAQ,QAAQ;AAAA,IACnE,CAAC;AACD,YAAQ,iBAAiB,SAAS,MAAM;AACtC,UAAI,KAAK,YAAY,QAAS,MAAK,OAAO,OAAO,QAAQ,QAAQ;AAAA,IACnE,CAAC;AACD,SAAK,UAAU;AACf,SAAK,WAAW;AAChB,SAAK,OAAO,OAAO;AAAA,EACrB;AACF;;;ACtFO,SAAS,iBAAiB,SAA0C;AACzE,QAAM,eAAe,IAAI,mBAAmB;AAAA,IAC1C,QAAQ,CAAC,aAAa;AAAE,YAAM,aAAa,QAAQ;AAAA,IAAE;AAAA,IACrD,QAAQ,CAAC,aAAa;AAAE,YAAM,iBAAiB,QAAQ;AAAA,IAAE;AAAA,IACzD,WAAW,MAAM;AAAE,YAAM,OAAO;AAAA,IAAE;AAAA,EACpC,CAAC;AACD,QAAM,QAAQ,IAAI,WAAW,SAAS,YAAY;AAClD,SAAO,EAAE,OAAO,aAAa;AAC/B;;;ACjBA,IAAAC,2BAAwD;AAejD,IAAM,sBAAN,MAAkD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBvD,YAA6B,SAA8C,QACxD,WACA,cAA2C;AAFjC;AAA8C;AACxD;AACA;AACjB,SAAK,aAAa,qBAAqB,QAAQ,OAAO;AACtD,SAAK,YAAQ,8CAAoB,kBAAkB,CAAC;AAAA,EACtD;AAAA,EAL6B;AAAA,EAA8C;AAAA,EACxD;AAAA,EACA;AAAA,EAxBF;AAAA,EACA,WAAW,IAAI,gBAAgB;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACS,WAAW,oBAAI,IAAmB;AAAA;AAAA,EAgBnD,cAAc,MAAyB,KAAK,MAAM,YAAY;AAAA;AAAA,EAE9D,YAAY,CAAC,aAAuC,KAAK,MAAM,UAAU,QAAQ;AAAA;AAAA,EAGjF,SAAe;AACb,QAAI,KAAK,SAAS,OAAO,QAAS;AAClC,SAAK,aAAa,IAAI,gBAAgB;AACtC,SAAK,YAAY,KAAK,MAAM,YAAY,EAAE;AAC1C,QAAI,KAAK,YAAY,QAAW;AAC9B,WAAK,MAAM,IAAI;AAAA,QAAE,GAAG,KAAK,MAAM,YAAY;AAAA,QAAG,SAAS;AAAA,QAAa,SAAS;AAAA,QAC3E,WAAW;AAAA,QAAO,cAAc;AAAA,QAAO,OAAO;AAAA,MAAU,CAAC;AAC3D,WAAK,WAAW;AAAA,IAClB;AAAA,EACF;AAAA;AAAA,EAGA,SAAe;AACb,SAAK,YAAY,MAAM;AACvB,SAAK,aAAa;AAClB,SAAK,UAAU,KAAK,MAAM,YAAY,EAAE;AACxC,SAAK,KAAK,UAAU;AAAA,EACtB;AAAA;AAAA,EAGA,QAAQ,QAA6B;AACnC,QAAI,KAAK,SAAS,OAAO,QAAS;AAClC,UAAM,UAAU,KAAK,MAAM,YAAY;AACvC,QAAI,KAAK,SAAS,QAAQ,YAAY,cAAc,QAAQ,QAAQ,QAAQ,OAAO,KAAK;AACtF,WAAK,OAAO;AACZ;AAAA,IACF;AACA,SAAK;AACL,SAAK,UAAU;AACf,SAAK,MAAM,IAAI,EAAE,GAAG,SAAS,QAAQ,SAAS,aAAa,SAAS,MAAM,OAAO,OAAU,CAAC;AAC5F,SAAK,QAAQ,MAAM;AACnB,QAAI,KAAK,MAAO,MAAK,YAAY;AAAA,QAC5B,MAAK,WAAW;AAAA,EACvB;AAAA;AAAA,EAGA,SAAe;AACb,QAAI,KAAK,MAAM,YAAY,EAAE,UAAW,MAAK,SAAS,QAAQ;AAAA,EAChE;AAAA;AAAA,EAGA,YAAkB;AAChB,QAAI,KAAK,MAAM,YAAY,EAAE,aAAc,MAAK,SAAS,WAAW;AAAA,EACtE;AAAA;AAAA,EAGA,SAAe;AACb,UAAM,UAAU,KAAK,MAAM,YAAY;AACvC,QAAI,KAAK,SAAS,OAAO,WAAW,QAAQ,WAAW,OAAW;AAClE,QAAI,CAAC,KAAK,SAAS,QAAQ,UAAU,QAAW;AAC9C,WAAK;AACL,WAAK,UAAU,QAAQ;AACvB,WAAK,MAAM,IAAI,EAAE,GAAG,SAAS,SAAS,MAAM,OAAO,OAAU,CAAC;AAC9D,UAAI,KAAK,MAAO,MAAK,YAAY;AAAA,UAC5B,MAAK,WAAW;AAAA,IACvB,MAAO,MAAK,SAAS,QAAQ;AAAA,EAC/B;AAAA;AAAA,EAGA,UAAyB;AACvB,QAAI,KAAK,aAAa,OAAW,QAAO,KAAK;AAC7C,SAAK,SAAS,MAAM;AACpB,SAAK,UAAU;AACf,SAAK,WAAW,QAAQ,IAAI,CAAC,KAAK,UAAU,GAAG,KAAK,YAAY,CAAC,EAC9D,KAAK,MAAM,QAAQ,IAAI,KAAK,QAAQ,CAAC,EAAE,KAAK,MAAM;AAAA,IAAC,CAAC;AACvD,SAAK,aAAa,QAAQ;AAC1B,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,SAAS,SAAkD;AACjE,QAAI,KAAK,SAAS,OAAO,WAAW,CAAC,KAAK,SAAS,KAAK,YAAY,OAAW;AAC/E,SAAK;AACL,SAAK,UAAU;AACf,SAAK,MAAM,IAAI,EAAE,GAAG,KAAK,MAAM,YAAY,GAAG,SAAS,MAAM,OAAO,OAAU,CAAC;AAC/E,QAAI;AAAE,WAAK,QAAQ,OAAO,EAAE;AAAA,IAAE,SACvB,OAAO;AAAE,WAAK,cAAc,KAAK;AAAA,IAAE;AAAA,EAC5C;AAAA,EAEQ,aAAmB;AACzB,UAAM,aAAa,KAAK;AACxB,QAAI,eAAe,UAAa,KAAK,iBAAiB,UAAa,KAAK,YAAY,UAAa,KAAK,SAAS,OAAO,QAAS;AAC/H,UAAM,SAAS,YAAY,IAAI,CAAC,KAAK,SAAS,QAAQ,WAAW,MAAM,CAAC;AACxE,SAAK,eAAe,KAAK,YAAY,MAAM,EAAE,MAAM,OAAO,UAAmB;AAC3E,YAAM,KAAK,UAAU;AACrB,UAAI,CAAC,OAAO,QAAS,MAAK,cAAc,KAAK;AAAA,IAC/C,CAAC,EAAE,QAAQ,MAAM;AACf,WAAK,eAAe;AACpB,UAAI,KAAK,eAAe,cAAc,KAAK,YAAY,OAAW,MAAK,WAAW;AAAA,IACpF,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,YAAY,kBAA8C;AACtE,SAAK,iBAAiB,MAAM,KAAK,UAAU,gBAAgB;AAC3D,QAAI,iBAAiB,QAAS;AAC9B,UAAM,cAAc,MAAM,KAAK,OAAO,QAAQ,KAAK,YAAY;AAE/D,QAAI,iBAAiB,SAAS;AAAE,YAAM,KAAK,QAAQ,YAAY,KAAK;AAAG;AAAA,IAAO;AAC9E,SAAK,QAAQ,YAAY;AACzB,SAAK,gBAAgB,IAAI,gBAAgB;AACzC,UAAM,SAAS,YAAY,IAAI,CAAC,kBAAkB,KAAK,cAAc,MAAM,CAAC;AAC5E,UAAM,UAAU,KAAK,aAAa,cAAc,WAAW;AAC3D,SAAK,UAAU;AACf,UAAM,kBAAkB,KAAK,OAAO,gBAAgB,YAAY,OAAO,CAAC,QAAQ;AAC9E,UAAI,KAAK,YAAY,WAAW,CAAC,OAAO,QAAS,MAAK,QAAQ,cAAc,GAAG;AAAA,IACjF,CAAC;AACD,WAAO,iBAAiB,SAAS,iBAAiB,EAAE,MAAM,KAAK,CAAC;AAChE,YAAQ,iBAAiB,aAAa,MAAM;AAC1C,WAAK,QAAQ;AACb,WAAK,QAAQ,KAAK,MAAM,YAAY,EAAE,YAAY,WAAW;AAC7D,WAAK,YAAY;AAAA,IACnB,GAAG,EAAE,OAAO,CAAC;AACb,YAAQ,iBAAiB,gBAAgB,MAAM;AAAE,WAAK,QAAQ,IAAI;AAAA,IAAE,GAAG,EAAE,OAAO,CAAC;AACjF,YAAQ,iBAAiB,wBAAwB,CAAC,UAAU;AAC1D,UAAK,MAA0B,YAAa,MAAK,QAAQ,IAAI;AAAA,IAC/D,GAAG,EAAE,OAAO,CAAC;AACb,YAAQ,iBAAiB,wBAAwB,CAAC,UAAU;AAC1D,UAAK,MAA0B,aAAa;AAC1C,aAAK,MAAM,IAAI,EAAE,GAAG,KAAK,MAAM,YAAY,GAAG,SAAS,MAAM,OAAO,OAAU,CAAC;AAAA,MACjF;AAAA,IACF,GAAG,EAAE,OAAO,CAAC;AACb,eAAW,QAAQ,CAAC,qBAAqB,oBAAoB,oBAAoB,GAAG;AAClF,cAAQ,iBAAiB,MAAM,MAAM;AACnC,aAAK,QAAQ,SAAS,wBAAwB,KAAK,MAAM,YAAY,EAAE,YAAY,UAAU;AAAA,MAC/F,GAAG,EAAE,OAAO,CAAC;AAAA,IACf;AACA,YAAQ,iBAAiB,iBAAiB,CAAC,UAAU;AACnD,YAAM,UAAU;AAChB,UAAI,QAAQ,eAAe,QAAQ,cAAc,IAAI;AACnD,aAAK,OAAO,EAAE,MAAM,QAAQ,WAAW,aAAa,QAAQ,iBAAiB,CAAC;AAAA,MAChF;AAAA,IACF,GAAG,EAAE,OAAO,CAAC;AACb,eAAW,QAAQ,CAAC,uBAAuB,WAAW,GAAG;AACvD,cAAQ,iBAAiB,MAAM,MAAM;AAAE,aAAK,KAAK,UAAU;AAAG,aAAK,OAAO;AAAA,MAAE,GAAG,EAAE,OAAO,CAAC;AAAA,IAC3F;AACA,SAAK,aAAa,QAAQ,OAAO;AAAA,EACnC;AAAA,EAEQ,cAAoB;AAC1B,UAAM,SAAS,KAAK;AACpB,UAAM,UAAU,KAAK;AACrB,QAAI,CAAC,KAAK,SAAS,WAAW,UAAa,YAAY,OAAW;AAClE,UAAM,WAAW,KAAK;AACtB,SAAK,UAAU;AACf,SAAK,QAAQ,QAAQ,OAAO,GAAG,EAAE,MAAM,CAAC,UAAmB;AACzD,UAAI,KAAK,YAAY,WAAW,KAAK,SAAS,OAAO,WAAW,KAAK,aAAa,SAAU;AAC5F,UAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,UAAU,SAAS,MAAM,SAAS,cAAe;AACpG,UAAI,KAAK,MAAM,YAAY,EAAE,UAAU,OAAW,MAAK,cAAc,KAAK;AAAA,IAC5E,CAAC;AAAA,EACH;AAAA,EAEQ,QAAQ,WAA0B;AACxC,QAAI,CAAC,KAAK,SAAS,KAAK,YAAY,UAAa,KAAK,SAAS,OAAO,QAAS;AAC/E,QAAI;AAAE,WAAK,aAAa,KAAK,SAAS,SAAS;AAAA,IAAE,SAC1C,OAAO;AAAE,WAAK,cAAc,KAAK;AAAA,IAAE;AAAA,EAC5C;AAAA,EAEQ,aAAa,SAAyB,WAA0B;AACtE,UAAM,UAAU,KAAK,MAAM,YAAY;AACvC,UAAM,SAAS,YAAY,oBAAoB,QAAQ,OAAO,CAAC,IAAI;AACnE,QAAI,QAAQ,MAAM,KAAK,eAAe;AAEpC,cAAQ,aAAa;AACrB,WAAK,gBAAgB;AAAA,IACvB;AACA,QAAI,SAAS,QAAQ;AACrB,QAAI,UAAU,QAAQ;AACtB,QAAI,QAAQ,IAAI;AACd,eAAS,EAAE,GAAG,OAAO,QAAQ,OAAO,QAAQ,SAAS,KAAK,OAAO,OAAO,MAAM;AAC9E,gBAAU;AACV,WAAK,aAAa,KAAK,OAAO,KAAK;AAAA,IACrC;AACA,UAAM,UAAU,QAAQ,UAAU,UAAa,QAAQ,UAAU;AACjE,UAAM,YAAY,QAAQ,UAAU;AACpC,UAAM,eAAe,QAAQ,aAAa;AAC1C,QAAI,QAAQ,QAAQ,QAAQ,QAAQ,OAAO,QAAQ,UAAU,QAAQ,QAAQ,SAAS,YAAY,QAAQ,WACrG,YAAY,QAAQ,WAAW,cAAc,QAAQ,aAAa,iBAAiB,QAAQ,cAAc;AAC5G,WAAK,MAAM,IAAI,EAAE,GAAG,SAAS,QAAQ,SAAS,SAAS,WAAW,aAAa,CAAC;AAAA,IAClF;AACA,QAAI,QAAQ,MAAM,WAAW,OAAW,MAAK,QAAQ,MAAM;AAAA,EAC7D;AAAA,EAEQ,QAAQ,QAA6B;AAC3C,QAAI,OAAO,QAAQ,KAAK,YAAY,OAAO,OAAO,UAAU,KAAK,WAAW,MAAO;AACnF,SAAK,aAAa;AAClB,SAAK,QAAQ,QAAQ,yBAAyB,QAAQ,KAAK,QAAQ,CAAC;AAAA,EACtE;AAAA,EAEQ,OAAO,QAA0B,EAAE,MAAM,QAAW,aAAa,OAAU,GAAS;AAC1F,QAAI,KAAK,SAAS,OAAO,QAAS;AAClC,UAAM,UAAU,KAAK,MAAM,YAAY;AACvC,SAAK,MAAM,IAAI;AAAA,MAAE,GAAG;AAAA,MAAS,SAAS;AAAA,MAAO;AAAA,MAC3C,WAAW,KAAK,SAAS,QAAQ;AAAA,MAAW,cAAc,KAAK,SAAS,QAAQ;AAAA,IAAa,CAAC;AAAA,EAClG;AAAA,EAEQ,cAAc,OAAsB;AAC1C,YAAQ,MAAM,oCAAoC,KAAK;AACvD,SAAK,OAAO;AAAA,EACd;AAAA,EAEQ,YAA2B;AACjC,SAAK,eAAe,MAAM;AAC1B,SAAK,gBAAgB;AACrB,SAAK,aAAa,MAAM;AACxB,SAAK,UAAU;AACf,SAAK,QAAQ;AACb,SAAK,gBAAgB;AACrB,UAAM,QAAQ,KAAK;AACnB,SAAK,QAAQ;AACb,WAAO,UAAU,SAAY,QAAQ,QAAQ,IAAI,KAAK,QAAQ,KAAK;AAAA,EACrE;AAAA,EAEQ,QAAQ,OAA6C;AAC3D,UAAM,WAAW,KAAK,OAAO,QAAQ,KAAK,EACvC,MAAM,CAAC,UAAmB;AAAE,cAAQ,MAAM,wCAAwC,KAAK;AAAA,IAAE,CAAC,EAC1F,QAAQ,MAAM;AAAE,WAAK,SAAS,OAAO,QAAQ;AAAA,IAAE,CAAC;AACnD,SAAK,SAAS,IAAI,QAAQ;AAC1B,WAAO;AAAA,EACT;AACF;;;ACxLO,SAAS,aACd,SACkD;AAClD,SAAO,iCAAiC;AACxC,QAAM,MAAM;AACZ,QAAM,cAAc,SAAS;AAC7B,QAAM,gBAAgB,IAAI;AAC1B,QAAM,OAAO,IAAI,cAAc,KAAK;AACpC,OAAK,aAAa,4BAA4B,EAAE;AAChD,OAAK,MAAM,UAAU;AACrB,QAAM,SAAS,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AACjD,QAAM,QAAQ,IAAI,cAAc,OAAO;AACvC,QAAM,cAAc;AAAA,qCACe,QAAQ,OAAO,SAAS,OAAO;AAAA;AAAA;AAAA;AAAA,8EAIU,QAAQ,OAAO,YAAY,MAAM,UAAU,QAAQ,OAAO,YAAY,SAAS,0BAA0B,QAAQ,OAAO,YAAY,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iDAM1K,QAAQ,OAAO,YAAY,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,6CAKxC,QAAQ,OAAO,YAAY,SAAS;AAAA;AAAA;AAAA,4BAGrD,QAAQ,OAAO,YAAY,SAAS;AAAA,sCAC1B,QAAQ,OAAO,YAAY,SAAS;AAAA,sCACpC,QAAQ,OAAO,YAAY,SAAS,UAAU,QAAQ,OAAO,YAAY,MAAM;AAAA,4CACzE,QAAQ,OAAO,YAAY,SAAS;AAAA;AAAA,kCAE9C,QAAQ,OAAO,YAAY,SAAS;AAAA;AAAA,oHAE8C,QAAQ,OAAO,YAAY,SAAS;AAAA,0FAC9D,QAAQ,OAAO,YAAY,SAAS;AAAA;AAAA;AAAA;AAAA,sHAIR,QAAQ,OAAO,YAAY,SAAS;AAAA,uEACnF,QAAQ,OAAO,YAAY,SAAS;AAAA;AAAA,uCAEpE,QAAQ,OAAO,YAAY,SAAS;AAAA;AAAA,6HAEkD,QAAQ,OAAO,YAAY,SAAS;AAAA,4CACrH,QAAQ,OAAO,YAAY,SAAS;AAAA,oCAC5C,QAAQ,OAAO,YAAY,MAAM;AAAA,wCAC7B,QAAQ,OAAO,YAAY,SAAS;AAAA,qEACP,QAAQ,OAAO,YAAY,SAAS;AAAA,mBACtF,QAAQ,OAAO,YAAY,SAAS;AAAA;AAAA;AAGrD,QAAM,UAAU,IAAI,cAAc,KAAK;AACvC,UAAQ,YAAY;AACpB,QAAM,OAAO,IAAI,cAAc,KAAK;AACpC,OAAK,YAAY;AACjB,OAAK,cAAc,QAAQ,KAAK;AAChC,QAAM,SAAS,IAAI,cAAc,MAAM;AACvC,SAAO,YAAY;AACnB,SAAO,aAAa,cAAc,QAAQ,KAAK,WAAW;AAC1D,QAAM,MAAM,IAAI,cAAc,KAAK;AACnC,MAAI,YAAY;AAEhB,WAAS,KAAK,OAA+D;AAC3E,UAAM,MAAM,IAAI,gBAAgB,8BAA8B,KAAK;AACnE,eAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ;AAAA,MACzC,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,gBAAgB;AAAA,MAChB,kBAAkB;AAAA,MAClB,mBAAmB;AAAA,MACnB,eAAe;AAAA,IACjB,CAAC;AACC,UAAI,aAAa,MAAM,KAAK;AAC9B,eAAW,CAAC,KAAK,UAAU,KAAK,OAAO;AACrC,YAAM,OAAO,IAAI,gBAAgB,8BAA8B,GAAG;AAClE,iBAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,UAAU,EAAG,MAAK,aAAa,MAAM,KAAK;AACrF,UAAI,OAAO,IAAI;AAAA,IACjB;AACA,WAAO;AAAA,EACT;AACA,QAAM,WAAW,IAAI,cAAc,QAAQ;AAC3C,WAAS,OAAO;AAChB,WAAS,YAAY;AACrB,WAAS,QAAQ,QAAQ,KAAK;AAC9B,WAAS,aAAa,cAAc,QAAQ,KAAK,QAAQ;AACzD,WAAS,aAAa,iBAAiB,OAAO;AAC9C,WAAS,aAAa,iBAAiB,QAAQ;AAC/C,WAAS;AAAA,IACP,KAAK;AAAA,MACH,CAAC,QAAQ,EAAE,GAAG,2BAA2B,CAAC;AAAA,MAC1C,CAAC,UAAU,EAAE,IAAI,QAAQ,IAAI,KAAK,GAAG,OAAO,CAAC;AAAA,MAC7C,CAAC,QAAQ,EAAE,GAAG,4BAA4B,CAAC;AAAA,MAC3C,CAAC,UAAU,EAAE,IAAI,QAAQ,IAAI,MAAM,GAAG,OAAO,CAAC;AAAA,IAChD,CAAC;AAAA,EACH;AACA,QAAM,eAAe,IAAI,cAAc,SAAS;AAChD,eAAa,YAAY;AACzB,eAAa,aAAa,QAAQ,QAAQ;AAC1C,eAAa,aAAa,cAAc,QAAQ,KAAK,QAAQ;AAC7D,QAAM,YAAY,IAAI,cAAc,KAAK;AACzC,YAAU,YAAY;AACtB,QAAM,cAAc,IAAI,cAAc,MAAM;AAC5C,cAAY,cAAc,QAAQ,KAAK,UAAU,QAAQ,QAAQ,KAAK;AACtE,QAAM,SAAS,IAAI,cAAc,QAAQ;AACzC,SAAO,aAAa,cAAc,QAAQ,KAAK,UAAU,QAAQ,QAAQ,KAAK,QAAQ;AACtF,aAAW,CAAC,OAAO,KAAK,KAAK;AAAA,IAC3B,CAAC,WAAW,QAAQ,KAAK,OAAO;AAAA,IAChC,CAAC,YAAY,QAAQ,KAAK,QAAQ;AAAA,EACpC,GAAG;AACD,UAAM,SAAS,IAAI,cAAc,QAAQ;AACzC,WAAO,QAAQ;AACf,WAAO,cAAc;AACrB,WAAO,OAAO,MAAM;AAAA,EACtB;AACA,SAAO,QAAQ,QAAQ;AACvB,QAAM,QAAQ,IAAI,cAAc,UAAU;AAC1C,QAAM,cAAc,QAAQ,KAAK;AACjC,QAAM,aAAa,cAAc,QAAQ,KAAK,WAAW;AACzD,QAAM,YAAY;AAClB,QAAM,OAAO,IAAI,cAAc,QAAQ;AACvC,OAAK,OAAO;AACZ,OAAK,YAAY;AACjB,OAAK,WAAW;AAChB,OAAK;AAAA,IACH,KAAK;AAAA,MACH;AAAA,QACE;AAAA,QACA,EAAE,GAAG,oFAAoF;AAAA,MAC3F;AAAA,IACF,CAAC;AAAA,EACH;AACA,OAAK,QAAQ,QAAQ,KAAK;AAC1B,OAAK,aAAa,cAAc,QAAQ,KAAK,IAAI;AACjD,MAAI,OAAO,UAAU,OAAO,IAAI;AAChC,QAAM,cAAc,IAAI,cAAc,MAAM;AAC5C,cAAY,YAAY;AACxB,QAAM,WAAW,IAAI,cAAc,KAAK;AACxC,WAAS,YAAY;AACrB,WAAS,QAAQ,OAAe,OAAe;AAC7C,UAAM,SAAS,IAAI,cAAc,QAAQ;AACzC,WAAO,OAAO;AACd,WAAO,QAAQ;AACf,WAAO,aAAa,cAAc,KAAK;AACvC,WAAO,cAAc,QAAQ,OAAO;AACpC,aAAS,OAAO,MAAM;AACtB,WAAO;AAAA,EACT;AACA,QAAM,SAAS,QAAQ,QAAQ,KAAK,QAAQ,QAAG;AAC/C,QAAM,QAAQ,QAAQ,QAAQ,KAAK,OAAO,QAAG;AAC7C,QAAM,SAAS,QAAQ,QAAQ,KAAK,QAAQ,MAAG;AAC/C,QAAM,QAAQ,IAAI,cAAc,KAAK;AACrC,QAAM,YAAY;AAClB,QAAM,aAAa,QAAQ,OAAO;AAClC,YAAU,OAAO,aAAa,MAAM;AACpC,QAAM,YAAY,IAAI,cAAc,KAAK;AACzC,YAAU,YAAY;AACtB,WAAS,YAAY;AACrB,SAAO,OAAO;AACd,SAAO,cAAc;AACrB,QAAM,cAAc;AACpB,YAAU,OAAO,aAAa,QAAQ;AACtC,QAAM,aAAa,IAAI,cAAc,KAAK;AAC1C,aAAW,YAAY;AACvB,QAAM,YAAY,IAAI,cAAc,GAAG;AACvC,YAAU,YAAY;AACtB,QAAM,SAAS,oBAAI,IAGjB;AACF,aAAW,CAAC,UAAU,KAAK,KAAK;AAAA,IAC9B,CAAC,SAAS,QAAQ,KAAK,KAAK;AAAA,IAC5B,CAAC,oBAAoB,QAAQ,KAAK,UAAU;AAAA,IAC5C,CAAC,WAAW,QAAQ,KAAK,OAAO;AAAA,IAChC,CAAC,eAAe,QAAQ,KAAK,IAAI;AAAA,IACjC,CAAC,aAAa,QAAQ,KAAK,QAAQ;AAAA,IACnC,CAAC,eAAe,QAAQ,KAAK,UAAU;AAAA,IACvC,CAAC,OAAO,QAAQ,KAAK,OAAO;AAAA,EAC9B,GAAG;AACD,UAAM,OAAO,IAAI,cAAc,OAAO;AACtC,SAAK,YAAY;AACjB,UAAM,YAAY,IAAI,cAAc,MAAM;AAC1C,cAAU,cAAc;AACxB,UAAM,QAAQ,IAAI,cAAc,KAAK;AACrC,UAAM,YAAY;AAClB,UAAM,QAAQ,IAAI,cAAc,OAAO;AACvC,UAAM,aAAa,cAAc,KAAM;AACvC,UAAM,QAAQ,WAAW;AACzB,UAAM,YAAY;AAClB,QAAI;AACJ,QAAI,aAAa,WAAW,aAAa,oBAAoB;AAC3D,eAAS,IAAI,cAAc,MAAM;AACjC,aAAO,YAAY;AACnB,aAAO,aAAa,eAAe,MAAM;AACzC,YAAM,OAAO,MAAM;AAAA,IACrB;AACA,UAAM,OAAO,KAAK;AAClB,SAAK,OAAO,WAAW,KAAK;AAC5B,eAAW,OAAO,IAAI;AACtB,WAAO,IAAI,UAAW,EAAE,OAAO,OAAO,QAAQ,IAAI,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC,EAAG,CAAC;AAAA,EACnF;AACA,aAAW,OAAO,SAAS;AAC3B,QAAM,SAAS,IAAI,cAAc,KAAK;AACtC,SAAO,YAAY;AACnB,SAAO,YAAY;AACnB,SAAO,cAAc,QAAQ,KAAK;AAClC,QAAM,eAAe,KAAK,UAAU,IAAI;AACxC,SAAO,OAAO,QAAQ,YAAY;AAClC,eAAa,OAAO,WAAW,YAAY,SAAS;AACpD,SAAO,OAAO,KAAK,cAAc,OAAO,MAAM;AAC9C,SAAO,OAAO,OAAO,SAAS,MAAM,MAAM;AAC1C,QAAM,UAAU,IAAI,cAAc,KAAK;AACvC,UAAQ,MAAM,UACZ;AACF,SAAO,QAAQ,OAAO;AACtB,MAAI,gBAAgB,OAAO,IAAI;AAE/B,MAAI,SAAyB;AAC7B,MAAI,UAA0B;AAC9B,MAAI,YAGO;AACX,MAAI,UAOO;AACX,MAAI,YAAY;AAChB,MAAI,gBAAgB;AACpB,QAAM,cAAyB,CAAC;AAChC,MAAI,YAAY;AAChB,MAAI,QAAQ;AACZ,MAAI;AACJ,QAAM,SAAS,IAAI,QAAiD,CAAC,YAAY;AAC/E,aAAS;AAAA,EACX,CAAC;AACD,QAAM,YAAY,IAAI,gBAAgB;AACtC,WAAS,UAA6D;AACpE,QAAI,WAAW,SAAS,UAAW,QAAO,CAAC;AAC3C,WAAO,OAAO;AAAA,MACZ,CAAC,GAAG,MAAM,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AACpC,YAAI,QAAQ,MAAM,MAAM,MAAM,KAAK;AACnC,aAAK,QAAQ,eAAe,QAAQ,UAAU,gBAAgB,KAAK,KAAK,EAAG,UAAS;AACpF,eAAO,UAAU,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,QAAQ,MAAM,QAAQ,MAAM,CAAC,CAAC;AAAA,MAC9E,CAAC;AAAA,IACH;AAAA,EACF;AACA,WAAS,kBAAkB,SAAyB;AAClD,UAAM,WAAW,UAAU,iBAAiB,OAAO,IAAI;AACvD,eAAW,CAAC,KAAK,KAAK,KAAK,QAAQ;AACjC,YAAM,SAAS,UAAU,iBAAiB,GAAG,KAAK;AAClD,YAAM,MAAM,QAAQ,MAAM;AAC1B,YAAM,MAAM,WAAW,CAAC;AACxB,UAAI,MAAM,OAAQ,OAAM,OAAO,MAAM,aAAa,MAAM;AAAA,IAC1D;AACA,eAAW,UAAU,OAAO,QAAQ,CAAC,OAAO;AAC5C,eAAW,SAAS,OAAO,OAAO;AAChC,YAAM,MAAM,QAAQ,WAAW,GAAG,UAAU,OAAO,UAAU,CAAC,OAAO;AACvE,cAAU,cAAc,UAAU,QAAQ,KAAK,YAAY,QAAQ,KAAK;AAAA,EAC1E;AACA,aAAW,CAAC,KAAK,KAAK,KAAK,QAAQ;AACjC,UAAM,MAAM;AAAA,MACV;AAAA,MACA,MAAM;AACJ,YAAI,MAAM,UAAU,IAAI,SAAS,KAAK,MAAM,MAAM,KAAK;AACrD,gBAAM,OAAO,MAAM,aAAa,MAAM,MAAM;AAC9C,eAAO,QAAQ;AACf,cAAM,UAAU,IAAI,QAAQ;AAC5B,aAAK;AAAA,MACP;AAAA,MACA,EAAE,QAAQ,UAAU,OAAO;AAAA,IAC7B;AACA,UAAM,MAAM;AAAA,MACV;AAAA,MACA,CAAC,UAAU;AACT,YAAI,MAAM,QAAQ,WAAW,CAAC,MAAM,eAAe,MAAM,YAAY,KAAK;AACxE,gBAAM,eAAe;AACrB,gBAAM,gBAAgB;AACtB,iBAAO,KAAK;AAAA,QACd;AAAA,MACF;AAAA,MACA,EAAE,QAAQ,UAAU,OAAO;AAAA,IAC7B;AAAA,EACF;AACA,QAAM,WAAW,IAAI,eAAe,IAAI;AAExC,WAAS,OAAO,OAAgD;AAC9D,QAAI,MAAO;AACX,YAAQ;AACR,cAAU,MAAM;AAChB,yBAAqB,SAAS;AAC9B,aAAS,WAAW;AACpB,SAAK,OAAO;AACZ,QAAI,OAAO,mCAAmC;AAC5C,aAAO,OAAO;AAChB,QAAI,yBAAyB,eAAe,cAAc;AACxD,oBAAc,MAAM,EAAE,eAAe,KAAK,CAAC;AAC7C,WAAO,KAAK;AAAA,EACd;AACA,WAAS,UAAU;AACjB,WAAO,EAAE,WAAW,KAAK,CAAC;AAAA,EAC5B;AACA,SAAO,iCAAiC;AACxC,WAAS,UAAU,SAAiB;AAClC,UAAM,cAAc;AACpB,UAAM,UAAU,OAAO,QAAQ;AAAA,EACjC;AACA,WAAS,MAAM,SAA6C;AAC1D,WACE,CAAC,CAAC,WACF,YAAY,IAAI,QAChB,YAAY,IAAI,mBAChB,CAAC,QAAQ,QAAQ,4BAA4B;AAAA,EAEjD;AACA,WAAS,IAAI,GAAW,GAA2B;AACjD,YAAQ,MAAM,gBAAgB;AAC9B,WAAO,MAAM,gBAAgB;AAC7B,QAAI,OAAO,IAAI,iBAAiB,GAAG,CAAC;AACpC,WAAO,MAAM,YAAY;AACvB,YAAM,QAAQ,KAAK,WAAW,iBAAiB,GAAG,CAAC;AACnD,UAAI,CAAC,SAAS,UAAU,KAAM;AAC9B,aAAO;AAAA,IACT;AACA,YAAQ,MAAM,gBAAgB,YAAY,SAAS;AACnD,WAAO,MAAM,gBAAgB;AAC7B,WAAO,MAAM,IAAI,IAAI,OAAO;AAAA,EAC9B;AACA,WAAS,eAAe,SAAkB;AACxC,UAAMC,QAAO,QAAQ,sBAAsB;AAC3C,WAAO,EAAE,GAAGA,MAAK,IAAI,SAAS,GAAGA,MAAK,IAAI,SAAS,OAAOA,MAAK,OAAO,QAAQA,MAAK,OAAO;AAAA,EAC5F;AACA,WAAS,YAAY,GAAW,GAAW;AACzC,WAAO;AAAA,MACL,GAAG,KAAK,IAAI,QAAS,GAAG,CAAC;AAAA,MACzB,GAAG,KAAK,IAAI,QAAS,GAAG,CAAC;AAAA,MACzB,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,QAAS,CAAC,CAAC;AAAA,MAC3C,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,QAAS,CAAC,CAAC;AAAA,IAC9C;AAAA,EACF;AACA,WAAS,SAAS,SAA0B;AAC1C,UAAM,QAAQ,QAAQ,YAAY;AAClC,QAAI,QAAQ,IAAI;AACd,YAAM,KAAK,MAAM,IAAI,OAAO,QAAQ,EAAE;AACtC,UAAI,MAAM,iBAAiB,EAAE,EAAE,WAAW,EAAG,QAAO;AAAA,IACtD;AACA,UAAM,SAAmB,CAAC;AAC1B,QAAI,OAAuB;AAC3B,WAAO,MAAM;AACX,UAAI,OAAO,KAAK;AAChB,YAAM,QAAQ,KAAK,gBACf,MAAM,KAAK,KAAK,cAAc,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,cAAc,KAAM,SAAS,IACrF,CAAC;AACL,UAAI,MAAM,SAAS,EAAG,SAAQ,gBAAgB,MAAM,QAAQ,IAAI,IAAI,CAAC;AACrE,aAAO,QAAQ,IAAI;AACnB,YAAM,OAAO,OAAO,KAAK,KAAK;AAC9B,UAAI,MAAM,iBAAiB,IAAI,EAAE,WAAW,KAAK,MAAM,cAAc,IAAI,MAAM;AAC7E,eAAO;AACT,aAAO,KAAK;AAAA,IACd;AACA,WAAO,OAAO,KAAK,KAAK;AAAA,EAC1B;AACA,WAAS,QAAQ,SAAkB;AACjC,UAAM,cAAwB,CAAC;AAC/B,QAAI,QAAQ,QAAQ,YAAY;AAChC,WAAO,iBAAiB,YAAY;AAClC,kBAAY,QAAQ,SAAS,MAAM,IAAI,CAAC;AACxC,cAAQ,MAAM,KAAK,YAAY;AAAA,IACjC;AACA,WAAO;AAAA,MACL,UAAU,SAAS,OAAO;AAAA,MAC1B;AAAA,MACA,YAAa,QAAQ,YAAY,EAA4B;AAAA,QAC3D,SAAS,OAAO;AAAA,MAClB,EAAE;AAAA,IACJ;AAAA,EACF;AACA,WAAS,OAAO;AACd,QAAI,MAAO;AACX,QAAI,SAAS,SAAS,aAAa;AACjC,cAAQ;AACR;AAAA,IACF;AACA,QAAI,UAAW;AACf,UAAM,OAAO,UAAU;AACvB,QAAI,WAAW,SAAS,aAAa,CAAC,QAAQ,aAAa;AACzD,cAAQ,UAAU,IAAI,QAAQ;AAC9B,gBAAU,QAAQ,KAAK,UAAU;AACjC,WAAK,WAAW,aAAa,WAAW;AACxC;AAAA,IACF;AACA,SAAK,WAAW,aAAa,WAC3B,CAAC,aAAc,CAAC,MAAM,MAAM,KAAK,KAAK,CAAC,OAAO,KAAK,QAAQ,CAAC,EAAE;AAChE,UAAM,eACJ,WAAW,SAAS,aAAa,SAC7B,eAAe,MAAM,IACrB,WAAW,SAAS,MAAM,cAAc,eAAe,IAAI,IAAI;AACrE,QAAI,CAAC,cAAc;AACjB,cAAQ,UAAU,IAAI,QAAQ;AAC9B;AAAA,IACF;AACA,UAAMA,QAAO;AAAA,MACX,MAAM,aAAa,IAAI;AAAA,MACvB,KAAK,aAAa,IAAI;AAAA,MACtB,OAAO,aAAa;AAAA,MACpB,QAAQ,aAAa;AAAA,MACrB,QAAQ,aAAa,IAAI,UAAU,aAAa;AAAA,IAClD;AACA,YAAQ,UAAU,OAAO,QAAQ;AACjC,WAAO,OAAO,QAAQ,OAAO;AAAA,MAC3B,MAAM,GAAGA,MAAK,QAAQ,WAAW,SAAS,UAAU,IAAI,EAAE;AAAA,MAC1D,KAAK,GAAGA,MAAK,OAAO,WAAW,SAAS,UAAU,IAAI,EAAE;AAAA,MACxD,OAAO,GAAG,WAAW,SAAS,UAAU,KAAKA,MAAK,KAAK;AAAA,MACvD,QAAQ,GAAG,WAAW,SAAS,UAAU,KAAKA,MAAK,MAAM;AAAA,MACzD,aAAa,WAAW,SAAS,WAAW,WAAW;AAAA,IACzD,CAAC;AACD,QAAI,OAAO,UAAU,SAAS,QAAQ,EAAG;AACzC,UAAM,QAAQ,OAAO,sBAAsB,EAAE;AAC7C,UAAM,SAAS,OAAO,sBAAsB,EAAE;AAC9C,UAAM,OAAO,KAAK,IAAI,IAAI,KAAK,IAAIA,MAAK,MAAM,aAAa,QAAQ,EAAE,CAAC;AACtE,UAAM,QAAQA,MAAK,SAAS;AAC5B,UAAM,QAAQA,MAAK,MAAM,SAAS;AAClC,UAAM,MAAM,KAAK;AAAA,MACf;AAAA,MACA,KAAK;AAAA,QACH,QAAQ,UAAU,cAAc,KAAK,QAAQ,SAAS,KAAK,QAAQA,MAAK,MAAM;AAAA,QAC9E,cAAc,SAAS;AAAA,MACzB;AAAA,IACF;AACA,WAAO,OAAO,OAAO,OAAO,EAAE,MAAM,GAAG,IAAI,MAAM,KAAK,GAAG,GAAG,KAAK,CAAC;AAAA,EACpE;AACA,WAAS,WAAW,MAAe,eAAe,OAAO;AACvD,iBAAa,UAAU,OAAO,UAAU,CAAC,IAAI;AAC7C,WAAO,UAAU,OAAO,YAAY,IAAI;AACxC,WAAO,UAAU,OAAO,UAAU,CAAC,IAAI;AACvC,aAAS,aAAa,iBAAiB,OAAO,IAAI,CAAC;AACnD,SAAK;AACL,QAAI,KAAM,UAAS,MAAM,EAAE,eAAe,KAAK,CAAC;AAAA,aACvC,aAAc,UAAS,MAAM,EAAE,eAAe,KAAK,CAAC;AAAA,EAC/D;AACA,WAAS;AAAA,IACP;AAAA,IACA,MAAM;AACJ,iBAAW,aAAa,UAAU,SAAS,QAAQ,CAAC;AAAA,IACtD;AAAA,IACA,EAAE,QAAQ,UAAU,OAAO;AAAA,EAC7B;AACA,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AACJ,iBAAW,KAAK;AAChB,YAAM,MAAM,EAAE,eAAe,KAAK,CAAC;AAAA,IACrC;AAAA,IACA,EAAE,QAAQ,UAAU,OAAO;AAAA,EAC7B;AACA,QAAM;AAAA,IACJ;AAAA,IACA,MAAM;AACJ,YAAM,MAAM,SAAS;AACrB,YAAM,MAAM,SAAS,GAAG,KAAK,IAAI,KAAK,MAAM,YAAY,CAAC;AACzD,YAAM,UAAU,IAAI,QAAQ;AAC5B,WAAK;AAAA,IACP;AAAA,IACA,EAAE,QAAQ,UAAU,OAAO;AAAA,EAC7B;AACA,WAAS,QAAQ;AACf,SAAK;AACL,QAAI,CAAC,MAAO,aAAY,sBAAsB,KAAK;AAAA,EACrD;AACA,WAAS,OAAO,SAAkB;AAChC,QAAI,CAAC,MAAM,OAAO,EAAG;AACrB,aAAS,WAAW;AACpB,aAAS;AACT,gBAAY,EAAE,MAAM,WAAW,MAAM,eAAe,OAAO,EAAE;AAC7D,aAAS,QAAQ,OAAO;AACxB,SAAK,UAAU,IAAI,QAAQ;AAC3B,WAAO,UAAU,OAAO,QAAQ;AAChC,UAAM,UAAU,IAAI,QAAQ;AAC5B,UAAM,QAAQ,QAAQ,OAAO;AAC7B,gBAAY,cAAc,IAAI,QAAQ,SAAS;AAC/C,gBAAY,QAAQ,CAAC,GAAG,MAAM,aAAa,MAAM,QAAQ,EAAE,KAAK,UAAK;AACrE,sBAAkB,OAAO;AACzB,WAAO,WACL,CAAC,MAAM,QAAQ,aAAa,KAAK,EAAE,QAAQ,YAAY,aAAa;AACtE,UAAM,WAAW,YAAY,WAAW;AACxC,SAAK;AACL,QAAI,CAAC,UAAW,aAAY,sBAAsB,KAAK;AACvD,UAAM,MAAM,EAAE,eAAe,KAAK,CAAC;AAAA,EACrC;AACA,WAAS,WACP,MACAA,OACA;AACA,aAAS,WAAW;AACpB,aAAS;AACT,gBAAY,EAAE,MAAM,MAAAA,MAAK;AACzB,SAAK,UAAU,IAAI,QAAQ;AAC3B,WAAO,UAAU,OAAO,QAAQ;AAChC,UAAM,UAAU,IAAI,QAAQ;AAC5B,gBAAY,cACV,SAAS,WACL,GAAG,QAAQ,KAAK,MAAM,SAAM,KAAK,MAAMA,MAAK,KAAK,CAAC,SAAM,KAAK,MAAMA,MAAK,MAAM,CAAC,KAC/E,QAAQ,KAAK;AACnB,WAAO,WAAW,MAAM,WAAW;AACnC,gBAAY,QAAQ;AACpB,sBAAkB,IAAI;AACtB,SAAK;AACL,QAAI,CAAC,UAAW,aAAY,sBAAsB,KAAK;AACvD,UAAM,MAAM,EAAE,eAAe,KAAK,CAAC;AAAA,EACrC;AACA,WAAS,UAAU,OAAc;AAC/B,WAAO,MAAM,aAAa,EAAE,SAAS,IAAI;AAAA,EAC3C;AACA,SAAO;AAAA,IACL;AAAA,IACA,CAAC,UAAU;AACT,UAAI,aAAa,CAAC,OAAO,UAAU,SAAS,QAAQ,EAAG;AACvD,UAAI,WAAW,QAAQ,OAAO,MAAM,WAAW;AAC7C,gBAAQ,aACN,KAAK,MAAM,MAAM,UAAU,QAAQ,SAAS,MAAM,UAAU,QAAQ,OAAO,KAAK;AAClF,YAAI,QAAQ,UAAU;AACpB,sBAAY;AAAA,YACV,MAAM;AAAA,YACN,MAAM,YAAY,MAAM,UAAU,SAAS,MAAM,UAAU,OAAO;AAAA,UACpE;AACA,eAAK;AACL;AAAA,QACF;AAAA,MACF;AACA,YAAM,OAAO,IAAI,MAAM,SAAS,MAAM,OAAO;AAC7C,gBAAU,MAAM,YAAY,MAAM,MAAM,iBAAiB,IAAI,IAAI,KAAM,gBAAgB;AACvF,WAAK;AAAA,IACP;AAAA,IACA,EAAE,SAAS,MAAM,QAAQ,UAAU,OAAO;AAAA,EAC5C;AACA,SAAO;AAAA,IACL;AAAA,IACA,CAAC,UAAU;AACT,UAAI,WAAW;AACb,wBAAgB;AAChB;AAAA,MACF;AACA,UAAI,UAAU,KAAK,KAAK,CAAC,MAAM,aAAa,EAAE,SAAS,OAAO,EAAG;AACjE,iBAAW,KAAK;AAChB,YAAM,eAAe;AACrB,YAAM,yBAAyB;AAC/B,sBAAgB;AAChB,UAAI,MAAM,WAAW,KAAK,CAAC,OAAO,UAAU,SAAS,QAAQ,EAAG;AAChE,gBAAU;AAAA,QACR,IAAI,MAAM;AAAA,QACV,GAAG,MAAM,UAAU;AAAA,QACnB,GAAG,MAAM,UAAU;AAAA,QACnB,SAAS,MAAM;AAAA,QACf,SAAS,MAAM;AAAA,QACf,UAAU;AAAA,MACZ;AACA,cAAQ,kBAAkB,MAAM,SAAS;AAAA,IAC3C;AAAA,IACA,EAAE,SAAS,MAAM,QAAQ,UAAU,OAAO;AAAA,EAC5C;AACA,SAAO;AAAA,IACL;AAAA,IACA,CAAC,UAAU;AACT,UAAI,CAAC,WAAW,QAAQ,OAAO,MAAM,aAAa,UAAW;AAC7D,YAAM,eAAe;AACrB,YAAM,yBAAyB;AAC/B,YAAM,UAAU;AAChB,YAAM,OAAO,YAAY,MAAM,UAAU,SAAS,MAAM,UAAU,OAAO;AACzE,gBAAU;AACV,UAAI,QAAQ,kBAAkB,MAAM,SAAS;AAC3C,gBAAQ,sBAAsB,MAAM,SAAS;AAC/C,UACE,QAAQ,YACR,KAAK,MAAM,MAAM,UAAU,QAAQ,SAAS,MAAM,UAAU,QAAQ,OAAO,KAAK;AAEhF,mBAAW,UAAU,IAAI;AAAA,WACtB;AACH,cAAM,OAAO,IAAI,MAAM,SAAS,MAAM,OAAO;AAC7C,oBAAY,SAAS;AACrB,YAAI,KAAM,QAAO,MAAM,YAAY,MAAM,KAAK,aAAa,IAAI,KAAK,gBAAgB,IAAI;AAAA;AAEtF,qBAAW,SAAS;AAAA,YAClB,GAAG,MAAM,UAAU;AAAA,YACnB,GAAG,MAAM,UAAU;AAAA,YACnB,OAAO;AAAA,YACP,QAAQ;AAAA,UACV,CAAC;AAAA,MACL;AAAA,IACF;AAAA,IACA,EAAE,SAAS,MAAM,QAAQ,UAAU,OAAO;AAAA,EAC5C;AACA,WAAS,eAAe;AACtB,QAAI,CAAC,QAAS;AACd,QAAI,QAAQ,kBAAkB,QAAQ,EAAE,EAAG,SAAQ,sBAAsB,QAAQ,EAAE;AACnF,cAAU;AACV,QAAI,OAAO,UAAU,SAAS,QAAQ,EAAG,aAAY;AACrD,SAAK;AAAA,EACP;AACA,SAAO,iBAAiB,iBAAiB,cAAc;AAAA,IACrD,SAAS;AAAA,IACT,QAAQ,UAAU;AAAA,EACpB,CAAC;AACD,SAAO;AAAA,IACL;AAAA,IACA,CAAC,UAAU;AACT,UAAI,UAAU,KAAK,KAAK,CAAC,MAAM,aAAa,EAAE,SAAS,OAAO,EAAG;AACjE,UAAI,aAAa,CAAC,cAAe;AACjC,YAAM,eAAe;AACrB,YAAM,yBAAyB;AAC/B,sBAAgB;AAAA,IAClB;AAAA,IACA,EAAE,SAAS,MAAM,QAAQ,UAAU,OAAO;AAAA,EAC5C;AACA,WAAS,SAAS;AAChB,QAAI,CAAC,UAAW;AAChB,gBAAY;AACZ,YAAQ,MAAM,gBAAgB;AAC9B,SAAK,cAAc,QAAQ,KAAK;AAChC,QAAI,WAAW;AACb,aAAO,UAAU,OAAO,QAAQ;AAChC,WAAK,UAAU,IAAI,QAAQ;AAAA,IAC7B,MAAO,MAAK,UAAU,OAAO,QAAQ;AACrC,SAAK;AAAA,EACP;AACA,SAAO;AAAA,IACL;AAAA,IACA,CAAC,UAAU;AACT,UAAI,MAAM,eAAe,MAAM,YAAY,IAAK;AAChD,UAAI,MAAM,QAAQ,UAAU;AAC1B,cAAM,eAAe;AACrB,cAAM,yBAAyB;AAC/B,YAAI,aAAa,UAAU,SAAS,QAAQ,EAAG,SAAQ;AAAA,YAClD,YAAW,OAAO,IAAI;AAC3B;AAAA,MACF;AAEA,UAAI,UAAU,KAAK,KAAK,CAAC,MAAM,aAAa,EAAE,SAAS,OAAO,EAAG;AACjE,UAAI,MAAM,SAAS,WAAW,CAAC,MAAM,UAAU,CAAC,MAAM,WAAW,CAAC,MAAM,SAAS;AAC/E,cAAM,eAAe;AACrB,cAAM,yBAAyB;AAC/B,qBAAa;AACb,oBAAY;AACZ,mBAAW,KAAK;AAChB,gBAAQ,MAAM,gBAAgB;AAC9B,gBAAQ,UAAU,IAAI,QAAQ;AAC9B,eAAO,UAAU,IAAI,QAAQ;AAC7B,aAAK,UAAU,OAAO,QAAQ;AAC9B,aAAK,cAAc,QAAQ,KAAK;AAAA,MAClC,WAAW,CAAC,aAAa,CAAC,UAAU,KAAK,GAAG;AAC1C,cAAM,eAAe;AACrB,cAAM,yBAAyB;AAAA,MACjC;AAAA,IACF;AAAA,IACA,EAAE,SAAS,MAAM,QAAQ,UAAU,OAAO;AAAA,EAC5C;AACA,SAAO;AAAA,IACL;AAAA,IACA,CAAC,UAAU;AACT,UAAI,MAAM,SAAS,WAAW,WAAW;AACvC,cAAM,eAAe;AACrB,cAAM,yBAAyB;AAC/B,eAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,EAAE,SAAS,MAAM,QAAQ,UAAU,OAAO;AAAA,EAC5C;AACA,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AACJ,mBAAa;AACb,aAAO;AAAA,IACT;AAAA,IACA,EAAE,QAAQ,UAAU,OAAO;AAAA,EAC7B;AACA,MAAI;AAAA,IACF;AAAA,IACA,MAAM;AACJ,UAAI,IAAI,QAAQ;AACd,qBAAa;AACb,eAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,EAAE,QAAQ,UAAU,OAAO;AAAA,EAC7B;AACA,SAAO,iBAAiB,YAAY,SAAS,EAAE,MAAM,MAAM,QAAQ,UAAU,OAAO,CAAC;AACrF,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AACJ,UAAI,CAAC,OAAQ;AACb,YAAM,QAAQ,OAAO,YAAY;AACjC,YAAM,OAAO,OAAO,kBAAkB,iBAAiB,aAAa,MAAM,OAAO;AACjF,UAAI,MAAM,IAAI,GAAG;AACf,mBAAW,KAAK;AAChB,oBAAY,KAAK,MAAM;AACvB,eAAO,IAAI;AAAA,MACb;AAAA,IACF;AAAA,IACA,EAAE,QAAQ,UAAU,OAAO;AAAA,EAC7B;AACA,QAAM;AAAA,IACJ;AAAA,IACA,MAAM;AACJ,YAAM,OAAO,YAAY,IAAI;AAC7B,UAAI,MAAM,aAAa;AACrB,mBAAW,KAAK;AAChB,eAAO,IAAI;AAAA,MACb;AAAA,IACF;AAAA,IACA,EAAE,QAAQ,UAAU,OAAO;AAAA,EAC7B;AACA,SAAO,iBAAiB,SAAS,SAAS,EAAE,QAAQ,UAAU,OAAO,CAAC;AACtE,WAAS,SAAS,SAA4C;AAC5D,UAAM,QAAQ,QAAQ,OAAO;AAC7B,UAAM,WAAW,iBAAiB,OAAO;AACzC,UAAM,SAAiC,CAAC;AACxC,eAAW,QAAQ;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACE,aAAO,IAAI,IAAI,SAAS,iBAAiB,IAAI,EAAE,MAAM,GAAG,GAAI;AAC9D,UAAM,SAAS,QACZ,QAAQ,6BAA6B,GACpC,aAAa,2BAA2B,GACxC,MAAM,GAAG,GAAI;AACjB,WAAO;AAAA,MACL,GAAG;AAAA,MACH,KAAK,QAAQ;AAAA,MACb,OAAO,mBAAmB,cAAc,QAAQ,YAAY,QAAQ,eAAe,IAChF,QAAQ,QAAQ,GAAG,EACnB,KAAK,EACL,MAAM,GAAG,GAAG;AAAA,MACf,MAAM,eAAe,OAAO;AAAA,MAC5B;AAAA,MACA,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,IAC7B;AAAA,EACF;AACA,WAAS,WAAWA,OAA+D;AACjF,UAAM,QAAQ,oBAAI,IAAa;AAE/B,aAASC,OAAM,GAAGA,OAAM,GAAGA;AACzB,eAAS,MAAM,GAAG,MAAM,GAAG,OAAO;AAChC,cAAM,OAAO;AAAA,UACXD,MAAK,IAAI,UAAWA,MAAK,SAAS,MAAM,OAAQ;AAAA,UAChDA,MAAK,IAAI,UAAWA,MAAK,UAAUC,OAAM,OAAQ;AAAA,QACnD;AACA,YAAI,KAAM,OAAM,IAAI,IAAI;AAAA,MAC1B;AACF,WAAO,CAAC,GAAG,KAAK,EAAE,MAAM,GAAG,EAAE,EAAE,IAAI,QAAQ;AAAA,EAC7C;AACA,WAAS,OAAO,OAAc;AAC5B,UAAM,eAAe;AACrB,QACE,CAAC,aACA,UAAU,SAAS,aAAa,CAAC,QAAQ,eAC1C,SAAS,SAAS,aAClB;AACA,gBAAU,QAAQ,KAAK,UAAU;AACjC;AAAA,IACF;AACA,UAAM,eAAe,QAAQ;AAC7B,eAAW,CAAC,UAAU,EAAE,MAAM,CAAC,KAAK,OAAO,QAAQ,YAAY,GAAG;AAChE,UACE,CAAC,IAAI,SAAS,UAAU,KAAK,KAC5B,aAAa,aAAa,EAAE,OAAO,KAAK,KAAK,KAAK,OAAO,KAAK,KAAK,IACpE;AACA,kBAAU,QAAQ,KAAK,YAAY;AACnC,mBAAW,IAAI;AACf,eAAO,IAAI,QAAQ,GAAG,MAAM,MAAM;AAClC;AAAA,MACF;AAAA,IACF;AACA,QAAI,CAAC,MAAM,MAAM,KAAK,KAAK,CAAC,OAAO,KAAK,YAAY,EAAE,QAAQ;AAC5D,gBAAU,QAAQ,KAAK,KAAK;AAC5B,YAAM,MAAM;AACZ;AAAA,IACF;AACA,UAAMD,QAAO,UAAU,SAAS,YAAY,eAAe,MAAO,IAAI,UAAU;AAChF,UAAM,QAAQ,UAAU,SAAS,YAAY,CAAC,SAAS,MAAO,CAAC,IAAI,WAAWA,KAAI;AAClF,WAAO;AAAA,MACL,QAAQ,OAAO,UAAU,aAAa,aAAa;AAAA,MACnD,MAAM,MAAM,MAAM,KAAK,KAAK,QAAQ,KAAK;AAAA,MACzC,GAAI,OAAO,KAAK,YAAY,EAAE,SAAS,EAAE,aAAa,IAAI,CAAC;AAAA,MAC3D,KAAK;AAAA,MACL,OAAO,IAAI,MAAM,MAAM,GAAG,GAAG;AAAA,MAC7B,UAAU,EAAE,OAAO,YAAY,QAAQ,YAAY;AAAA,MACnD,WAAW;AAAA,QACT,MAAM,UAAU;AAAA,QAChB,MAAAA;AAAA,QACA,cAAc,EAAE,GAAGA,OAAM,GAAGA,MAAK,IAAI,SAAS,GAAGA,MAAK,IAAI,QAAQ;AAAA,QAClE,QAAQ,EAAE,GAAG,SAAS,GAAG,QAAQ;AAAA,QACjC,YAAY;AAAA,MACd;AAAA,IACF,CAAC;AAAA,EACH;AACA,SAAO,iBAAiB,UAAU,QAAQ,EAAE,QAAQ,UAAU,OAAO,CAAC;AACtE,QAAM;AAAA,IACJ;AAAA,IACA,CAAC,UAAU;AACT,UAAI,MAAM,QAAQ,WAAW,CAAC,MAAM,YAAY,CAAC,MAAM,eAAe,MAAM,YAAY,KAAK;AAC3F,cAAM,eAAe;AACrB,cAAM,gBAAgB;AACtB,eAAO,KAAK;AAAA,MACd;AAAA,IACF;AAAA,IACA,EAAE,QAAQ,UAAU,OAAO;AAAA,EAC7B;AACA,cAAY,sBAAsB,KAAK;AACvC,SAAO;AACT;;;AC14BA,eAAsB,eACpB,SACA,YACiC;AACjC,QAAM,UAAU,IAAI,MAAM;AAC1B,UAAQ,MAAM;AACd,QAAM,QAAQ,OAAO;AACrB,MAAI,CAAC,QAAQ,gBAAgB,CAAC,QAAQ,cAAe,OAAM,IAAI,MAAM,yBAAyB;AAC9F,QAAM,QAAQ,KAAK,IAAI,GAAG,OAAO,KAAK,IAAI,QAAQ,cAAc,QAAQ,aAAa,CAAC;AACtF,QAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,SAAO,QAAQ,KAAK,MAAM,QAAQ,eAAe,KAAK;AACtD,SAAO,SAAS,KAAK,MAAM,QAAQ,gBAAgB,KAAK;AACxD,QAAM,UAAU,OAAO,WAAW,IAAI;AACtC,MAAI,CAAC,QAAS,OAAM,IAAI,MAAM,yBAAyB;AACvD,UAAQ,UAAU,SAAS,GAAG,GAAG,OAAO,OAAO,OAAO,MAAM;AAC5D,QAAM,KAAK,OAAO,QAAQ,WAAW,SAAS;AAC9C,QAAM,KAAK,OAAO,SAAS,WAAW,SAAS;AAC/C,QAAM,OAAO,WAAW,UAAU;AAClC,UAAQ,cAAc;AACtB,UAAQ,YAAY;AACpB,UAAQ,YAAY;AACpB,QAAM,IAAI,KAAK,IAAI,IACjB,IAAI,KAAK,IAAI;AACf,MAAI,WAAW,UAAU,SAAS,SAAS;AACzC,QAAI,IAAI,KAAK,IAAI,KAAK,IAAI,OAAO,SAAS,IAAI,OAAO;AACnD,YAAM,IAAI,MAAM,yBAAyB;AAC3C,YAAQ,UAAU;AAClB,YAAQ,IAAI,GAAG,GAAG,GAAG,GAAG,KAAK,KAAK,CAAC;AACnC,YAAQ,OAAO;AAAA,EACjB,OAAO;AACL,UAAM,OAAO,KAAK,IAAI,GAAG,CAAC,GACxB,MAAM,KAAK,IAAI,GAAG,CAAC;AACrB,UAAM,QAAQ,KAAK,IAAI,OAAO,QAAQ,GAAG,IAAI,KAAK,QAAQ,EAAE;AAC5D,UAAM,SAAS,KAAK,IAAI,OAAO,SAAS,GAAG,IAAI,KAAK,SAAS,EAAE;AAC/D,QAAI,SAAS,QAAQ,UAAU,IAAK,OAAM,IAAI,MAAM,yBAAyB;AAC7E,YAAQ,WAAW,MAAM,KAAK,QAAQ,MAAM,SAAS,GAAG;AAAA,EAC1D;AACA,QAAM,OAAO,OAAO,UAAU,cAAc,GAAG,EAAE,MAAM,GAAG,EAAE,CAAC;AAC7D,MAAI,KAAK,SAAS,IAAS,OAAM,IAAI,MAAM,yBAAyB;AACpE,SAAO,EAAE,WAAW,cAAc,MAAM,OAAO,OAAO,OAAO,QAAQ,OAAO,OAAO;AACrF;;;ACjBO,IAAM,8BAAN,MAAiE;AAAA,EAItE,YAA6B,QAAoC;AAApC;AAAA,EAAqC;AAAA,EAArC;AAAA,EAHrB;AAAA,EACA;AAAA;AAAA,EAKR,MAAM,SAAS,KAAa,SAAmC,QAAgD;AAC7G,UAAM,UAAU,KAAK;AACrB,QAAI,OAAO,QAAS,QAAO,EAAE,WAAW,KAAK;AAC7C,QAAI,YAAY,UAAa,QAAQ,OAAO,MAAM,IAAK,OAAM,IAAI,MAAM,wBAAwB;AAC/F,UAAM,SAAS,MAAY;AACzB,WAAK,QAAQ,kBAAkB,2CAA2C,EAAE,MAAM,MAAM;AAAA,MAExF,CAAC;AAAA,IACH;AACA,WAAO,iBAAiB,SAAS,QAAQ,EAAE,MAAM,KAAK,CAAC;AACvD,UAAM,aAAa,MAAY;AAAE,aAAO;AAAA,IAAE;AAC1C,YAAQ,iBAAiB,wBAAwB,UAAU;AAC3D,QAAI;AACF,cAAQ,MAAM;AACd,YAAM,SAAS,MAAM,QAAQ,kBAAkB,IAAI,aAAa,SAAS,CAAC,KAAK,KAAK,UAAU,OAAO,CAAC,GAAG;AACzG,UAAI,OAAO,WAAW,KAAK,YAAY,QAAS,QAAO,EAAE,WAAW,KAAK;AACzE,UAAI,CAAC,mBAAmB,MAAM,EAAG,OAAM,IAAI,MAAM,oBAAoB;AACrE,UAAI,EAAE,eAAe,YAAY,OAAO,QAAQ,OAAO,QAAQ,OAAO,MAAM,KAAM,OAAM,IAAI,MAAM,yBAAyB;AAC3H,UAAI,EAAE,eAAe,SAAS;AAC5B,YAAI;AACF,gBAAM,QAAQ,MAAM,QAAQ,YAAY;AACxC,gBAAM,aAAa,MAAM,eAAe,MAAM,UAAU,GAAG,MAAM;AACjE,cAAI,OAAO,WAAW,KAAK,YAAY,QAAS,QAAO,EAAE,WAAW,KAAK;AACzE,cAAI,QAAQ,OAAO,MAAM,OAAO,QAAQ,UAAU,EAAG,OAAM,IAAI,MAAM,yBAAyB;AAC9F,gBAAM,OAAO,MAAM,QAAQ,kBAAkB,6DAA6D;AAC1G,cAAI,OAAO,SAAS,YAAY,SAAS,QAAQ,EAAE,WAAW,SAAS,EAAE,YAAY,SAAS,EAAE,OAAO,SAAS,EAAE,OAAO,SACrH,KAAK,UAAU,OAAO,SAAS,SAAS,KAAK,WAAW,OAAO,SAAS,UAAU,KAAK,MAAM,OAAO,UAAU,OAAO,KAAK,KAAK,MAAM,OAAO,UAAU,OAAO,EAAG,QAAO;AAC3K,iBAAO,EAAE,GAAG,QAAQ,WAAW;AAAA,QACjC,SAAS,OAAO;AACd,cAAI,OAAO,WAAW,KAAK,YAAY,QAAS,QAAO,EAAE,WAAW,KAAK;AACzE,cAAI,QAAQ,OAAO,MAAM,OAAO,QAAQ,UAAU,EAAG,OAAM,IAAI,MAAM,yBAAyB;AAE9F,iBAAO;AAAA,QACT;AAAA,MACF;AACA,aAAO;AAAA,IACT,UAAE;AACA,aAAO,oBAAoB,SAAS,MAAM;AAC1C,cAAQ,oBAAoB,wBAAwB,UAAU;AAAA,IAChE;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,YAAgC;AACpC,UAAM,OAAO,SAAS,eAAe,UAAU;AAC/C,QAAI,SAAS,KAAM,OAAM,IAAI,MAAM,yDAAyD;AAC5F,QAAI,KAAK,SAAS,OAAW,MAAK,OAAO,UAAU;AACnD,SAAK,OAAO;AACZ,SAAK,OAAO,QAAQ;AACpB,WAAO,MAAM;AACX,UAAI,KAAK,SAAS,KAAM;AACxB,WAAK,OAAO,UAAU;AACtB,WAAK,OAAO;AAAA,IACd;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,cAAc,aAAwD;AACpE,UAAM,UAAU,SAAS,cAAc,SAAS;AAChD,YAAQ,YAAY,gBAAI;AACxB,YAAQ,QAAQ,sBAAsB;AACtC,YAAQ,aAAa,QAAQ,YAAY,KAAK;AAC9C,YAAQ,aAAa,aAAa,YAAY,SAAS;AACvD,YAAQ,aAAa,eAAe,EAAE;AACtC,YAAQ,aAAa,OAAO,iBAAiB,YAAY,KAAK;AAC9D,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAQ,SAA+B;AACrC,QAAI,KAAK,SAAS,OAAW,OAAM,IAAI,MAAM,kEAAkE;AAC/G,SAAK,MAAM;AACX,SAAK,UAAU;AACf,SAAK,KAAK,OAAO,OAAO;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,KAAK,OAAqB;AACxB,SAAK,SAAS,aAAa,cAAc,KAAK;AAAA,EAChD;AAAA;AAAA,EAGA,QAAc;AACZ,SAAK,SAAS,OAAO;AACrB,SAAK,UAAU;AAAA,EACjB;AAAA;AAAA,EAGA,UAAgB;AACd,SAAK,MAAM;AACX,SAAK,OAAO;AAAA,EACd;AACF;;;AChIO,SAAS,mBAAmB,SAA6B,QAC9D,WAAkE;AAClE,QAAM,eAAe,IAAI,4BAA4B;AAAA,IACnD,SAAS,MAAM;AAAE,YAAM,OAAO;AAAA,IAAE;AAAA,IAChC,WAAW,MAAM;AAAE,YAAM,OAAO;AAAA,IAAE;AAAA,EACpC,CAAC;AACD,QAAM,QAAQ,IAAI,oBAAoB,SAAS,QAAQ,WAAW,YAAY;AAC9E,SAAO,EAAE,OAAO,aAAa;AAC/B;;;ACXA,eAAsB,iBAAiB,QAAyB,WAAmB,QAAsC;AACvH,SAAO,eAAe;AACtB,MAAI,OAAO,YAAY,EAAE,UAAU,SAAS;AAC1C,UAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAC3C,YAAM,QAAQ,MAAY;AACxB,aAAK;AACL,cAAM,SAAkB,OAAO;AAE/B,eAAO,MAAM;AAAA,MACf;AACA,YAAM,OAAO,OAAO,UAAU,MAAM;AAClC,YAAI,OAAO,YAAY,EAAE,UAAU,QAAS;AAC5C,aAAK;AACL,eAAO,oBAAoB,SAAS,KAAK;AACzC,gBAAQ;AAAA,MACV,CAAC;AACD,aAAO,iBAAiB,SAAS,OAAO,EAAE,MAAM,KAAK,CAAC;AAAA,IACxD,CAAC;AAAA,EACH;AACA,SAAO,eAAe;AACtB,QAAM,YAAY,OAAO,YAAY,EAAE,MAAM,KAAK,UAAQ,KAAK,WAAW,KAAK,QAAM,OAAO,SAAS,CAAC;AACtG,SAAO,cAAc,SAAY,WAAW,SAAS,KAAK,OAAO,UAAU,IAAI;AACjF;;;AC7BA,IAAAE,mCAAoC;AAK7B,IAAM,eAAe;AAGrB,IAAM,aAAa;AAGnB,SAAS,kBAAkB,GAA6D;AAC7F,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,OAAO,MAAM,EAAE,YAAY;AAAA,IAC3B,OAAO,CAAC;AAAA,MACN,IAAI;AAAA,MAAO,WAAW;AAAA,MAAoC,OAAO;AAAA,MAAI,OAAO,MAAM,EAAE,aAAa;AAAA,MACjG,aAAa,MAAM,EAAE,mBAAmB;AAAA,MAAG,MAAM;AAAA,IACnD,CAAC;AAAA,EACH;AACF;;;ACzBO,IAAM,KAAK;AAAA,EAChB,cAAc;AAAA,EACd,eAAe;AAAA,EACf,qBAAqB;AAAA,EACrB,sBAAsB;AAAA,EACtB,uBAAuB;AAAA,EACvB,mBAAmB;AAAA,EACnB,MAAM;AAAA,EACN,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,IAAI;AAAA,EACJ,UAAU;AAAA,EACV,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,OAAO;AAAA,EACP,SAAS;AAAA,EACT,oBAAoB;AAAA,EACpB,kBAAkB;AAAA,EAClB,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,EAClB,qBAAqB;AAAA,EACrB,4BAA4B;AAAA,EAC5B,eAAe;AAAA,EACf,sBAAsB;AAAA,EACtB,mBAAmB;AACrB;AAMO,IAAM,KAAK;AAAA,EAChB,cAAc;AAAA,EACd,eAAe;AAAA,EACf,qBAAqB;AAAA,EACrB,sBAAsB;AAAA,EACtB,uBAAuB;AAAA,EACvB,mBAAmB;AAAA,EACnB,MAAM;AAAA,EACN,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,IAAI;AAAA,EACJ,UAAU;AAAA,EACV,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,OAAO;AAAA,EACP,SAAS;AAAA,EACT,oBAAoB;AAAA,EACpB,kBAAkB;AAAA,EAClB,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,EAClB,qBAAqB;AAAA,EACrB,4BAA4B;AAAA,EAC5B,eAAe;AAAA,EACf,sBAAsB;AAAA,EACtB,mBAAmB;AACrB;;;AC5DA,IAAAC,2BAAoD;AAkB7C,SAAS,qBAAsE;AACpF,aAAO,sCAAY;AAAA,IACjB,MAAM,OAAqB,EAAE,OAAO,CAAC,EAAE;AAAA,IACvC,SAAS;AAAA,IACT,SAAS;AAAA,MACP,SAAS,CAAC,OAAO,OAAc,UAA2B;AAAE,cAAM,MAAM,KAAK,IAAI;AAAA,MAAM;AAAA,MACvF,QAAQ,CAAC,OAAO,UAAiB;AAC/B,cAAM,QAA+B,CAAC;AACtC,mBAAW,CAAC,IAAI,KAAK,KAAK,OAAO,QAAQ,MAAM,KAAK,GAAiC;AACnF,cAAI,OAAO,MAAO,OAAM,EAAE,IAAI;AAAA,QAChC;AACA,cAAM,QAAQ;AAAA,MAChB;AAAA,IACF;AAAA,EACF,CAAC;AACH;;;AtBSO,IAAM,SAAS,CAAC,SAAS,UAAU,gBAAgB,kBAAkB;AAGrE,SAAS,MAAM,KAAoB;AACxC,QAAM,YAAY;AAClB,QAAM,IAAI,IAAI,OAAO,KAAK,SAAS;AACnC,MAAI,OAAO,CAAC,WAAW,GAAG,CAACC,SAAQ;AACjC,IAAAA,KAAI,OAAO,MAAMA,KAAI,UAAU,SAAS;AAAA,MACtC,IAAI;AAAA,MAAoC,OAAO,MAAM,EAAE,aAAa;AAAA,MAAG,SAAS,CAAC,WAAW,iBAAiB;AAAA,MAC7G,UAAU;AAAA,QACR,iBAAiB,EAAE,MAAM,QAAQ,WAAW,CAAC,SAAS,EAAE;AAAA,QACxD,mBAAmB,EAAE,MAAM,QAAQ,WAAW,CAAC,SAAS,EAAE;AAAA,QAC1D,iBAAiB,EAAE,MAAM,QAAQ,WAAW,CAAC,SAAS,EAAE;AAAA,QACxD,aAAa,EAAE,MAAM,QAAQ,WAAW,CAAC,WAAW,KAAK,EAAE;AAAA,QAC3D,eAAe,EAAE,MAAM,QAAQ,WAAW,CAAC,WAAW,KAAK,EAAE;AAAA,MAC/D;AAAA;AAAA;AAAA,MAGA,SAAS,CAAC,QAAQ,YAAY,UAAU;AAAA,MAAG,QAAQ,CAAC;AAAA,MACpD,SAAS,CAAC,EAAE,QAAQ,QAAQ,MAAM;AAChC,cAAM,SAASA,KAAI,aAAa,cAAc,OAAO;AACrD,YAAI,WAAW,OAAW,QAAO,EAAE,QAAQ,WAAW,QAAQ,EAAE,oBAAoB,EAAE;AACtF,eAAO,EAAE,QAAQ,WAAW,KAAK,MAAM;AAAE,UAAAA,KAAI,aAAa,kBAAkB,WAAW,MAAM;AAAA,QAAE,EAAE;AAAA,MACnG;AAAA;AAAA,IAEF,CAAC,GAAG,8BAA8B;AAAA,EACpC,CAAC;AACD,QAAM,QAAQ,mBAAmB;AACjC,QAAM,WAAW,IAAI,aAAa;AAClC,QAAM,UAAW,WAEd;AACH,QAAM,UAAU,SAAS,oBAAoB,IAAI,QAAQ,UAAU;AACnE,MAAI,OAAO,MAAM,IAAI,OAAO,SAAS,WAAW,EAAE,IAAI,GAAG,CAAC,GAAG,yBAAyB;AACtF,MAAI,OAAO,MAAM,IAAI,iBAAiB,SAAS,EAAE,GAAG,kBAAkB,CAAC,GAAG,aAAa,YAAY,OAAU,CAAC,GAAG,yBAAyB;AAC1I,QAAM,gBAAgB,CAAC,OAAgB,YAAoF;AACzH,UAAM,cAAc,oBAAI,IAAoD;AAC5E,UAAM,OAAO,MAAM,YAAY;AAC7B,YAAM,UAAU,CAAC,GAAG,YAAY,OAAO,CAAC,EAAE,IAAI,gBAAc,WAAW,QAAQ,CAAC;AAChF,kBAAY,MAAM;AAClB,YAAM,QAAQ,IAAI,OAAO;AAAA,IAC3B,GAAG,2BAA2B;AAC9B,UAAM,OAAO,MAAM,MAAM,MAAM,OAAO,0BAA0B,MAAM,MAAM,MAAM,SAAS;AAAA,MACzF,MAAM;AAAA,MAA0B,KAAK;AAAA,MAAY,QAAQ;AAAA,MAAW;AAAA,MACpE,UAAU;AAAA,QACR,qCAAqC,EAAE,MAAM,QAAQ,OAAO,UAAU;AAAA,QACtE,yCAAyC,EAAE,MAAM,QAAQ,OAAO,UAAU;AAAA,MAC5E;AAAA,MACA,QAAQ,CAAC,WAAW,YAAY;AAC9B,cAAM,WAAW,YAAY,IAAI,SAAS;AAC1C,YAAI,aAAa,QAAW;AAC1B,mBAAS,OAAO,OAAO;AACvB,iBAAO;AAAA,QACT;AACA,cAAM,aAAa,yBAAyB,SAAS,QAAQ,SAAS,GAAG,WACvE,SAAS,YAAY,EAAE,KAAK,SAAO,IAAI,cAAc,aAAa,IAAI,UAAU,KAAK,CAAC;AACxF,oBAAY,IAAI,WAAW,UAAU;AACrC,eAAO;AAAA,MACT;AAAA,IACF,GAAG,WAAW,CAAC,GAAG,yBAAyB;AAAA,EAC7C;AACA,MAAI,YAAY,OAAW,eAAc,KAAK,MAAM,gBAAgB;AAAA,MAC/D,KAAI,OAAO,CAAC,YAAY,GAAG,CAAC,UAAU;AACzC,kBAAc,OAAO,eAAa,aAAW;AAAA,MAAmB;AAAA,MAAS;AAAA,MACvE,YAAU,iBAAiB,MAAM,WAAW,MAAM,WAAW,MAAM;AAAA,IAAC,CAAC;AAAA,EACzE,CAAC;AACD,MAAI,OAAO,MAAM,IAAI,MAAM,OAAO,gCAAgC,MAAM,IAAI,MAAM,SAAS;AAAA,IACzF,MAAM;AAAA,IAAgC,KAAK;AAAA,IAAY;AAAA,EACzD,GAAG,YAAY,CAAC,GAAG,0BAA0B;AAC/C;",
|
|
6
|
+
"names": ["root", "toolbar", "tool", "sandboxOff", "addressBox", "address", "addressGo", "addressUnknown", "addressChanged", "frame", "content", "viewport", "placeholder", "restore", "restoreLabel", "restoreTitle", "restoreUrl", "webview", "start", "failure", "sandboxWarning", "limit", "titleIcon", "state", "import_dsh_client_ui_primitives", "import_jsx_runtime", "controller", "actions", "import_dsh_client_store", "import_dsh_client_store", "rect", "row", "import_dsh_client_ui_primitives", "import_dsh_client_store", "ctx"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../.host-source/packages/client/ui-sidebar-browser/src/index.ts"],
|
|
4
|
+
"sourcesContent": ["/** Host companion for the Sidebar Browser Client plugin. */\n\n/** Mount the browser-only plugin through the Client loader. */\nexport function apply(): void {}\n"],
|
|
5
|
+
"mappings": ";AAGO,SAAS,QAAc;AAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@deepseek-ai/dsh-client-ui-sidebar-browser",
|
|
3
|
+
"version": "0.2.0-rc.2",
|
|
4
|
+
"description": "DSH Web Annotator's patched browser provider; derived from DeepSeek Harness",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"main": "./lib/index.js",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": "./lib/index.js",
|
|
10
|
+
"./client": "./lib/client.js",
|
|
11
|
+
"./package.json": "./package.json"
|
|
12
|
+
},
|
|
13
|
+
"dsh": {
|
|
14
|
+
"client": {
|
|
15
|
+
"inject": [
|
|
16
|
+
"@deepseek-ai/dsh-api-workspace-controller",
|
|
17
|
+
"@deepseek-ai/dsh-client-ui-sidebar-right",
|
|
18
|
+
"@deepseek-ai/dsh-client-ui-session"
|
|
19
|
+
],
|
|
20
|
+
"platform": "web"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"packageName": "dsh-web-annotator",
|
|
3
|
+
"packageVersion": "0.2.0-alpha.12",
|
|
4
|
+
"targetHarness": "0.2.0-rc.2",
|
|
5
|
+
"upstreamCommit": "639ed015397290b3745d163aafe02ffee4aa3f84",
|
|
6
|
+
"patchSha256": "b8701aa99139478e2b17a78a3d75bc22d2bce9d6c6952d1f2551271d7211a63f",
|
|
7
|
+
"runtimeHashes": {
|
|
8
|
+
"browser-provider/lib/client.css": "2da0c7baf268e11fba81f6c172f94f47d1ccb2a4e1f9a4f296d8172a20aa2a55",
|
|
9
|
+
"browser-provider/lib/client.css.map": "67b1fff806bd92bc7a80447e76a436ee2c1ce23817dc7f5126afb1e7933892af",
|
|
10
|
+
"browser-provider/lib/client.js": "cf89d42018609f464463b81a6de4f346a56030026388ce46f0c547d7ae884a7b",
|
|
11
|
+
"browser-provider/lib/client.js.map": "d9f205aafd28ca94aa57e6f566b43a48c828eedc194583e894026f238abfc030",
|
|
12
|
+
"browser-provider/lib/index.js": "883ba0466c5906f301548b6f60593d47519ec8015f1e9e2c2972a4d00ad876d0",
|
|
13
|
+
"browser-provider/lib/index.js.map": "8a589af30ee9fcdd97f86b53214d77c68562a1a069738bc93d845dc4dbe03ab9",
|
|
14
|
+
"chat-provider/lib/client.css": "0d0439412fff59b9d5f65b9441086844b41fa5224bc3a03094d8f9ab14867a91",
|
|
15
|
+
"chat-provider/lib/client.css.map": "9914f95675f4d575a9414397d9d170abc321813cb0119047bed44129b2f4c80d",
|
|
16
|
+
"chat-provider/lib/client.js": "13b89e8d582c0e384d6415be3d405c3a4ec458607c81d539038287decb252517",
|
|
17
|
+
"chat-provider/lib/client.js.map": "847b11ee52bcbd9f50cecb2bf8fbb4bf03152bc28cfdbc647073a1745742a08e",
|
|
18
|
+
"chat-provider/lib/index.js": "e1e458b21554d8f1e1f68dda055e9e3f701e75023ca1daacad17362c1628fdca",
|
|
19
|
+
"chat-provider/lib/index.js.map": "62227ff2a6cac92a6d60411a19037d674f27dfc3b66c026ebbcecb83a5cd2043",
|
|
20
|
+
"layout-provider/lib/client.css": "d55e6c9cb912d40803df8c191ad11a4c6580ed1260f28959c427f45e422fecf4",
|
|
21
|
+
"layout-provider/lib/client.css.map": "39423755991a466425fda353524691e559f00440e5fce14a988f92b01b7eca66",
|
|
22
|
+
"layout-provider/lib/client.js": "dcd38412e09b44093d5ce6318febbd406c8a84732ee431f1f3bb94456e0fbe2a",
|
|
23
|
+
"layout-provider/lib/client.js.map": "7e39fb1c8acd84efc687be872fa38392bb2d759ecd5b5fe2b73fc26a9a2d1cfb",
|
|
24
|
+
"layout-provider/lib/index.js": "8280400eb0261e41a38616c211657dc10ae8670fae75b201bba8d58f43759488",
|
|
25
|
+
"layout-provider/lib/index.js.map": "9fdcc2bf5369c510df63d19d5cf62e5863792b17ba31e5f377019df2011411c2"
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 DeepSeek
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|