@benz-ai-x/dsh-research-graph 0.1.5-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","names":["useState","useRef","styles","createContext","useContext","styles","useState","useRef","useState","useRef","styles","createContext","useContext","useState","useRef","styles","object","string","finite","useState","useRef","styles","styles","useRef","useState","useId","useCallback","useMemo","useState","useRef","styles","useState","useRef","styles","useState","useRef","useMemo","styles","useState","useRef","styles","styles","useState","useRef","useMemo","PACKAGE_NAME","recordOf","stringOf","parseRequest","parseResult","PACKAGE_NAME","parseRequest","parseResult","invalid","object","sequence","string","array","source","parseRequest","parseResult","PACKAGE_NAME","requestSchema","resultSchema","invalid","object","string","PACKAGE_NAME","invalid","object","array","PACKAGE_NAME","uuid","object","text","invalid","count","identity","array","object","count","text","array","object","PACKAGE_NAME"],"sources":["../src/session-merge.ts","../src/client/build-info.ts","../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs","../src/client/dialog-focus.ts","../src/client/KnowledgeExtraction.tsx","../src/client/ResearchReuse.tsx","../src/client/KnowledgeExport.tsx","../src/client/knowledge-citations.ts","../src/client/Knowledge.tsx","../src/client/viewport.ts","../src/client/working-position.ts","../src/client/SessionHistory.tsx","../src/client/layout.ts","../src/client/clusters.ts","../src/client/graph-model.ts","../src/client/layout-store.ts","../src/client/preview-placement.ts","../src/client/snap.ts","../src/client/canvas-presentation.ts","../src/client/GraphCanvas.tsx","../src/client/KnowledgeSearch.tsx","../src/client/DiscussionSearch.tsx","../src/client/knowledge-graph.ts","../src/client/TopicGraph.tsx","../src/client/ResearchTopics.tsx","../src/client/GraphView.tsx","../src/client/knowledge-locales.ts","../src/client/research-reuse-locales.ts","../src/client/locales.ts","../src/client/session-digest-remote.ts","../src/client/session-merge-remote.ts","../src/session-history-codec.ts","../src/client/session-history-remote.ts","../src/session-search-codec.ts","../src/client/session-search-remote.ts","../src/research-topic-codec.ts","../src/client/research-topics-remote.ts","../src/wire-primitives.ts","../src/knowledge-codec.ts","../src/knowledge-extraction-codec.ts","../src/knowledge-export-codec.ts","../src/client/knowledge-remote.ts","../src/research-reuse-codec.ts","../src/client/research-reuse-remote.ts","../src/client/index.ts"],"sourcesContent":["/** Host-side Session Merge application interface and orchestration. */\n\n/** Stable workflow stages exposed to retryable browser errors. */\nexport type SessionMergeStage = 'validating' | 'creating' | 'naming' | 'submitting' | 'opening'\n\n/** Stable failure categories consumed by the browser UI. */\nexport type SessionMergeErrorCode =\n | 'invalid-source-count'\n | 'duplicate-source'\n | 'invalid-instruction'\n | 'invalid-source'\n | 'cross-workspace-source'\n | 'target-create-failed'\n | 'target-name-failed'\n | 'snapshot-submit-failed'\n | 'target-open-failed'\n\n/** Domain error whose fields are safe to transport across the Remote boundary. */\nexport class SessionMergeError extends Error {\n constructor(\n readonly code: SessionMergeErrorCode,\n message: string,\n readonly stage: SessionMergeStage,\n readonly targetSessionId?: string,\n ) {\n super(message)\n this.name = 'SessionMergeError'\n }\n}\n\nfunction failureMessage(error: unknown, fallback: string): string {\n return error instanceof Error && error.message !== '' ? error.message : fallback\n}\n\nconst SESSION_REFERENCE_URI = /dsh-session:[^\\s)]+/iu\n\n/** Whether free-form text would be parsed as an additional Harness Session reference. */\nexport function containsSessionReferenceUri(value: string): boolean {\n return SESSION_REFERENCE_URI.test(value)\n}\n\n/** Harness system boundaries accepted by the Session Merge module. */\nexport interface SessionMergeSource {\n readonly sessionId: string\n readonly title: string\n readonly cwd: string\n readonly workspaceId?: string\n readonly canvas: boolean\n}\n\n/** Location inherited by a newly created Merge Session. */\nexport interface SessionMergeTargetLocation {\n readonly cwd: string\n readonly workspaceId?: string\n}\n\n/** Request submitted to the Host after the target is created and named. */\nexport interface SessionMergeSubmission {\n readonly targetSessionId: string\n readonly sourceIds: readonly string[]\n readonly instruction: string\n readonly operationId: string\n}\n\n/** Harness system boundaries accepted by the Session Merge module. */\nexport interface SessionMergeDependencies {\n readonly inspectSource: (\n sessionId: string,\n signal: AbortSignal,\n ) => Promise<SessionMergeSource>\n readonly createTarget: (\n location: SessionMergeTargetLocation,\n signal: AbortSignal,\n ) => Promise<string>\n readonly renameTarget: (\n targetSessionId: string,\n title: string,\n signal: AbortSignal,\n ) => Promise<void>\n readonly submitMerge: (\n request: SessionMergeSubmission,\n signal: AbortSignal,\n ) => Promise<void>\n readonly openTarget: (targetSessionId: string) => void\n readonly createOperationId: () => string\n}\n\n/** Public application seam exercised by the Host Remote and tests alike. */\nexport interface SessionMergeModule {\n mergeSessions(\n sourceIds: readonly string[],\n instruction: string,\n signal: AbortSignal,\n ): Promise<string>\n retryMerge(\n targetSessionId: string,\n sourceIds: readonly string[],\n instruction: string,\n signal: AbortSignal,\n ): Promise<string>\n}\n\ninterface ValidatedMergeRequest {\n readonly sources: readonly SessionMergeSource[]\n readonly sourceIds: readonly string[]\n readonly instruction: string\n readonly location: SessionMergeTargetLocation\n}\n\n/** Create one Session Merge application module. */\nexport function createSessionMergeModule(\n dependencies: SessionMergeDependencies,\n): SessionMergeModule {\n async function validate(\n sourceIds: readonly string[],\n instruction: string,\n signal: AbortSignal,\n ): Promise<ValidatedMergeRequest> {\n signal.throwIfAborted()\n if (sourceIds.length < 2 || sourceIds.length > 3) {\n throw new SessionMergeError(\n 'invalid-source-count',\n 'Session Merge requires two or three source Sessions',\n 'validating',\n )\n }\n if (new Set(sourceIds).size !== sourceIds.length) {\n throw new SessionMergeError(\n 'duplicate-source',\n 'Session Merge sources must be distinct',\n 'validating',\n )\n }\n const normalizedInstruction = instruction.trim()\n if (normalizedInstruction === '') {\n throw new SessionMergeError(\n 'invalid-instruction',\n 'Session Merge instruction must not be blank',\n 'validating',\n )\n }\n if (containsSessionReferenceUri(normalizedInstruction)) {\n throw new SessionMergeError(\n 'invalid-instruction',\n 'Session Merge instruction must not contain dsh-session references',\n 'validating',\n )\n }\n const sources = await Promise.all(sourceIds.map(async sourceId =>\n await dependencies.inspectSource(sourceId, signal)))\n signal.throwIfAborted()\n const invalid = sources.find(source => !source.canvas)\n if (invalid !== undefined) {\n throw new SessionMergeError(\n 'invalid-source',\n `Session ${JSON.stringify(invalid.sessionId)} is not a Canvas Session`,\n 'validating',\n )\n }\n const cwdSet = new Set(sources.map(source => source.cwd))\n const workspaceIds = [...new Set(sources.flatMap(source =>\n source.workspaceId === undefined ? [] : [source.workspaceId]))]\n if (cwdSet.size !== 1 || workspaceIds.length > 1) {\n throw new SessionMergeError(\n 'cross-workspace-source',\n 'Session Merge sources must belong to one Workspace or working directory',\n 'validating',\n )\n }\n const first = sources[0]\n /* v8 ignore next -- source-count validation above guarantees an entry */\n if (first === undefined) throw new Error('Session Merge lost its validated sources')\n return {\n sources,\n sourceIds,\n instruction: normalizedInstruction,\n location: {\n cwd: first.cwd,\n ...(workspaceIds[0] === undefined ? {} : { workspaceId: workspaceIds[0] }),\n },\n }\n }\n\n async function complete(\n targetSessionId: string,\n request: ValidatedMergeRequest,\n signal: AbortSignal,\n ): Promise<string> {\n const title = `Merge: ${request.sources.map(source => source.title).join(' + ')}`\n try {\n await dependencies.renameTarget(targetSessionId, title, signal)\n } catch (error) {\n if (signal.aborted) throw error\n throw new SessionMergeError(\n 'target-name-failed',\n failureMessage(error, 'Failed to name the Merge Session'),\n 'naming',\n targetSessionId,\n )\n }\n signal.throwIfAborted()\n try {\n await dependencies.submitMerge({\n targetSessionId,\n sourceIds: request.sourceIds,\n instruction: request.instruction,\n operationId: dependencies.createOperationId(),\n }, signal)\n } catch (error) {\n if (signal.aborted) throw error\n throw new SessionMergeError(\n 'snapshot-submit-failed',\n failureMessage(error, 'Failed to capture source Session snapshots'),\n 'submitting',\n targetSessionId,\n )\n }\n signal.throwIfAborted()\n try {\n dependencies.openTarget(targetSessionId)\n } catch (error) {\n throw new SessionMergeError(\n 'target-open-failed',\n failureMessage(error, 'Failed to open the Merge Session'),\n 'opening',\n targetSessionId,\n )\n }\n return targetSessionId\n }\n\n return {\n async mergeSessions(sourceIds, instruction, signal) {\n const request = await validate(sourceIds, instruction, signal)\n let targetSessionId: string\n try {\n targetSessionId = await dependencies.createTarget(request.location, signal)\n } catch (error) {\n if (signal.aborted) throw error\n throw new SessionMergeError(\n 'target-create-failed',\n failureMessage(error, 'Failed to create the Merge Session'),\n 'creating',\n )\n }\n signal.throwIfAborted()\n return await complete(targetSessionId, request, signal)\n },\n async retryMerge(targetSessionId, sourceIds, instruction, signal) {\n const request = await validate(sourceIds, instruction, signal)\n return await complete(targetSessionId, request, signal)\n },\n }\n}\n","/** Build metadata injected into the browser bundle by tsdown. */\ndeclare const __SESSION_GRAPH_VERSION__: string\ndeclare const __SESSION_GRAPH_BUILD_ID__: string\n\n/** Published package identity shown in the Graph header tooltip. */\nexport const SESSION_GRAPH_PACKAGE_NAME = '@benz-ai-x/dsh-research-graph'\n\n/** Package version from package.json at build time. */\nexport const SESSION_GRAPH_VERSION = __SESSION_GRAPH_VERSION__\n\n/** Content-derived identifier for the exact local browser build. */\nexport const SESSION_GRAPH_BUILD_ID = __SESSION_GRAPH_BUILD_ID__\n\n/** Compact user-visible version badge. */\nexport const SESSION_GRAPH_BUILD_LABEL =\n `Research Graph v${SESSION_GRAPH_VERSION} · ${SESSION_GRAPH_BUILD_ID}`\n\n/** Complete native-tooltip text for the version badge. */\nexport const SESSION_GRAPH_BUILD_TITLE =\n `${SESSION_GRAPH_PACKAGE_NAME} v${SESSION_GRAPH_VERSION} · build ${SESSION_GRAPH_BUILD_ID}`\n","function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","import type { KeyboardEvent } from 'react'\n\n/** Keep keyboard focus inside the dialog at either end of its controls. */\nexport function retainDialogFocus(event: KeyboardEvent<HTMLElement>): void {\n if (event.key !== 'Tab') return\n const controls = [...event.currentTarget.querySelectorAll<HTMLElement>('button, input, select, a[href], [tabindex=\"0\"]')]\n .filter(element => !element.hasAttribute('disabled'))\n const first = controls[0]\n const last = controls[controls.length - 1]\n if (event.shiftKey && document.activeElement === first) { event.preventDefault(); last?.focus() }\n else if (!event.shiftKey && document.activeElement === last) { event.preventDefault(); first?.focus() }\n}\n","import { useEffect, useRef, useState, type ReactElement } from 'react'\nimport type { KnowledgeDiscussionAddress } from '../knowledge.ts'\nimport type { ExtractionPreparation, ExtractionResult } from '../knowledge-extraction.ts'\nimport type { KnowledgeApi } from './knowledge-remote.ts'\nimport type { GraphViewInjected } from './GraphView.tsx'\nimport type { SessionGraphKey } from './locales.ts'\nimport { KnowledgeEditor } from './Knowledge.tsx'\nimport styles from './GraphView.module.css'\n\n/** Each model response appends a new batch, so in-progress edits never get replaced. */\nexport function KnowledgeExtraction({ source, api, topics, read, topicId, changed, t }: {\n readonly source: KnowledgeDiscussionAddress\n readonly api: KnowledgeApi\n readonly topics: GraphViewInjected['topics']\n readonly read: GraphViewInjected['readSessionHistory']\n readonly topicId: string | undefined\n readonly changed: () => void\n readonly t: (key: SessionGraphKey, params?: Record<string, unknown>) => string\n}): ReactElement {\n const [budgetChars, setBudgetChars] = useState(20_000)\n const [prepared, setPrepared] = useState<ExtractionPreparation>()\n const [provider, setProvider] = useState('')\n const [model, setModel] = useState('')\n const [busy, setBusy] = useState(false)\n const [failed, setFailed] = useState<string>()\n const [canceled, setCanceled] = useState(false)\n const [batches, setBatches] = useState<readonly { readonly id: string; readonly result: ExtractionResult; readonly preparation: ExtractionPreparation }[]>([])\n const active = useRef<AbortController>()\n useEffect(() => () => { active.current?.abort() }, [])\n const run = async (generate: boolean): Promise<void> => {\n active.current?.abort()\n const controller = new AbortController()\n active.current = controller\n setBusy(true)\n setFailed(undefined)\n setCanceled(false)\n try {\n if (generate && prepared !== undefined) {\n const result = await api.extract({ preparationId: prepared.preparationId, provider, model }, controller.signal)\n if (!controller.signal.aborted) setBatches(value => [...value, { id: crypto.randomUUID(), result, preparation: prepared }])\n } else {\n setPrepared(undefined)\n const value = await api.prepareExtraction({ source, budgetChars }, controller.signal)\n if (controller.signal.aborted) return\n setPrepared(value)\n setProvider(value.route?.provider ?? '')\n setModel(value.route?.model ?? '')\n }\n } catch (error) {\n if (!controller.signal.aborted) setFailed(error instanceof Error ? error.message : String(error))\n } finally { if (!controller.signal.aborted) setBusy(false) }\n }\n return <div className={styles.knowledgeBody}>\n <h3>{t('extract.selected')}</h3><p>{source.sessionId} · {t('knowledge.sourceRange', { start: source.startSeq, end: source.endSeq })}</p>\n <label>{t('extract.budget')}<input type=\"number\" min={500} max={64_000} step={500} disabled={busy} value={budgetChars}\n onChange={event => { setBudgetChars(event.target.valueAsNumber); setPrepared(undefined) }} /></label>\n <button type=\"button\" disabled={busy || !Number.isSafeInteger(budgetChars) || budgetChars < 500 || budgetChars > 64_000}\n onClick={() => { void run(false) }}>{t('extract.preview')}</button>\n {prepared === undefined ? null : <>\n <h3>{t('extract.included')}</h3>\n <p>{t('knowledge.sourceRange', { start: prepared.included.source.startSeq, end: prepared.included.source.endSeq })} · {prepared.materialText.length}/{prepared.budgetChars}</p>\n <pre className={styles.historyText}>{prepared.materialText}</pre>\n <h4>{t('extract.omitted')}</h4>\n {prepared.omitted.length === 0 ? <p>{t('extract.noneOmitted')}</p> : <ul>{prepared.omitted.map(range => <li key={range.startSeq}>\n {t('knowledge.sourceRange', { start: range.startSeq, end: range.endSeq })}</li>)}</ul>}\n <p>{t('extract.hint')}</p>\n <label>{t('extract.provider')}<input disabled={busy} maxLength={200} value={provider} onChange={event => { setProvider(event.target.value) }} /></label>\n <label>{t('extract.model')}<input disabled={busy} maxLength={200} value={model} onChange={event => { setModel(event.target.value) }} /></label>\n <button type=\"button\" disabled={busy || provider.trim() === '' || model.trim() === ''} onClick={() => { void run(true) }}>\n {t(batches.length === 0 ? 'extract.generate' : 'extract.append')}</button>\n <p>{t('extract.preserve')}</p><p>{t('extract.snapshot')}</p>\n </>}\n {busy ? <p role=\"status\">{t('extract.generating')} <button type=\"button\" onClick={() => {\n active.current?.abort()\n setBusy(false)\n setCanceled(true)\n }}>{t('extract.cancel')}</button></p> : null}\n {canceled ? <p role=\"status\">{t('search.canceled')}</p> : null}\n {failed === undefined ? null : <p role=\"alert\">{t('knowledge.error')} {failed}</p>}\n {batches.map(batch => <section key={batch.id}>\n <h3>{batch.result.provider} / {batch.result.model}</h3>\n {batch.result.drafts.map(draft => <KnowledgeEditor key={draft.cardId} cardId={undefined} source={undefined} topicId={topicId}\n draft={draft} preparation={batch.preparation} api={api} topics={topics} read={read} t={t} changed={changed}\n close={() => { setBatches(value => value.map(item => item.id !== batch.id ? item : { ...item,\n result: { ...item.result, drafts: item.result.drafts.filter(card => card.cardId !== draft.cardId) } })) }} />)}\n </section>)}\n </div>\n}\n","import { createContext, useContext, useEffect, useRef, useState, type ReactElement, type ReactNode } from 'react'\nimport type { SessionId } from '@deepseek-ai/dsh-session/types'\nimport type { WorkspaceView } from '@deepseek-ai/dsh-api-workspace-controller/client'\nimport type { ResearchMaterialSelection, ResearchReuseRecord } from '../research-reuse.ts'\nimport type { ResearchReuseApi } from './research-reuse-remote.ts'\nimport type { SessionGraphKey } from './locales.ts'\nimport { retainDialogFocus } from './dialog-focus.ts'\nimport styles from './GraphView.module.css'\n\ntype Translate = (key: SessionGraphKey, params?: Record<string, unknown>) => string\ntype ReuseMode = 'compose' | 'history'\ninterface MaterialEntry { readonly selection: ResearchMaterialSelection; readonly label: string }\ninterface ReuseContextValue {\n readonly add: (selection: ResearchMaterialSelection, label: string) => void\n readonly count: number\n readonly open: () => void\n readonly history: () => void\n}\nconst ReuseContext = createContext<ReuseContextValue | undefined>(undefined)\nexport function useResearchReuse(): ReuseContextValue | undefined { return useContext(ReuseContext) }\n\nexport function ResearchReuseEntry({ t }: { readonly t: Translate }): ReactElement | null {\n const reuse = useResearchReuse()\n return reuse === undefined ? null : <>\n <button type=\"button\" className={styles.searchEntry} onClick={reuse.open}>{t('reuse.materials', { count: reuse.count })}</button>\n <button type=\"button\" className={styles.searchEntry} onClick={reuse.history}>{t('reuse.history')}</button>\n </>\n}\n\n/** Keeps the draft and uncertain attempt alive while its dialogs are closed. */\nexport function ResearchReuseProvider({ api, workspaces, viewedId, openSession, children, t }: {\n readonly api: ResearchReuseApi\n readonly workspaces: readonly WorkspaceView[]\n readonly viewedId: SessionId\n readonly openSession: (id: SessionId) => void\n readonly children: ReactNode\n readonly t: Translate\n}): ReactElement {\n const [materials, setMaterials] = useState<readonly MaterialEntry[]>([])\n const [mode, setMode] = useState<ReuseMode>()\n const [question, setQuestion] = useState('')\n const [workspaceId, setWorkspaceId] = useState('')\n const [preview, setPreview] = useState<ResearchReuseRecord>()\n const [uncertain, setUncertain] = useState(false)\n const [records, setRecords] = useState<readonly ResearchReuseRecord[]>()\n const [notice, setNotice] = useState<SessionGraphKey>()\n const [busy, setBusy] = useState(false)\n const [failed, setFailed] = useState<string>()\n const attempt = useRef<{ readonly payload: string; readonly operationId: string }>()\n const active = useRef<AbortController>()\n const trigger = useRef<HTMLElement>()\n useEffect(() => () => { active.current?.abort() }, [])\n const show = (next: ReuseMode): void => {\n if (document.activeElement instanceof HTMLElement) trigger.current = document.activeElement\n setFailed(undefined)\n setNotice(undefined)\n setMode(next)\n if (next === 'compose' && uncertain && preview !== undefined) {\n void perform(signal => recover(preview, signal, 'compose', false))\n }\n }\n const close = (): void => {\n active.current?.abort()\n setBusy(false)\n setMode(undefined)\n queueMicrotask(() => { trigger.current?.focus() })\n }\n const change = (): void => {\n active.current?.abort()\n setBusy(false)\n setFailed(undefined)\n setPreview(undefined)\n }\n const perform = async (operation: (signal: AbortSignal) => Promise<void>): Promise<void> => {\n active.current?.abort()\n const controller = new AbortController()\n active.current = controller\n setBusy(true)\n setFailed(undefined)\n try { await operation(controller.signal) } catch (error) {\n if (!controller.signal.aborted) setFailed(error instanceof Error ? error.message : String(error))\n } finally { if (!controller.signal.aborted) setBusy(false) }\n }\n const history = (): void => {\n show('history')\n setRecords(undefined)\n void perform(async signal => {\n const found = await api.forSession({ sessionId: viewedId }, signal)\n if (!signal.aborted) setRecords(found)\n })\n }\n const receive = (saved: ResearchReuseRecord, destination: ReuseMode, navigate: boolean): void => {\n if (destination === 'history') setRecords(value => value?.map(item => item.operationId === saved.operationId ? saved : item))\n else { setPreview(saved); setUncertain(false) }\n if (saved.stage !== 'accepted') setFailed(saved.error ?? t('reuse.error'))\n else {\n setFailed(undefined)\n if (destination === 'compose') setNotice('reuse.sent')\n if (navigate) openSession(saved.targetSessionId as SessionId)\n }\n }\n const recover = async (record: ResearchReuseRecord, signal: AbortSignal, destination: ReuseMode, navigate: boolean): Promise<void> => {\n const saved = await api.read({ operationId: record.operationId }, signal)\n if (signal.aborted) return\n if (saved === null) throw new Error(t('reuse.recoveryUnavailable'))\n receive(saved, destination, navigate)\n }\n const submit = (record: ResearchReuseRecord): void => {\n const destination = mode ?? 'compose'\n if (destination === 'compose') setUncertain(true)\n void perform(async signal => {\n let saved: ResearchReuseRecord\n try { saved = await api.submit({ operationId: record.operationId }, signal) } catch {\n signal.throwIfAborted()\n await recover(record, signal, destination, destination === 'compose')\n return\n }\n if (!signal.aborted) receive(saved, destination, destination === 'compose')\n })\n }\n const locked = busy || uncertain || preview?.targetCreated === true\n const add = (selection: ResearchMaterialSelection, label: string): void => {\n if (uncertain) { setNotice('reuse.uncertain'); return }\n if (busy) return\n if (preview?.targetCreated) { setNotice('reuse.created'); return }\n if (materials.some(item => JSON.stringify(item.selection) === JSON.stringify(selection))) { setNotice('reuse.duplicate'); return }\n if (materials.length >= 3) { setNotice('reuse.limit'); return }\n change()\n setMaterials(value => [...value, { selection, label }])\n setNotice('reuse.added')\n }\n const move = (index: number, direction: number): void => {\n change()\n setMaterials(value => {\n const next = [...value]\n const other = index + direction\n if (next[index] === undefined || next[other] === undefined) return value\n const item = next[index]!\n next[index] = next[other]!\n next[other] = item\n return next\n })\n }\n return <ReuseContext.Provider value={{ add, count: materials.length, open: () => { show('compose') }, history }}>\n <div className={styles.knowledgeRoot} aria-hidden={mode !== undefined || undefined}\n ref={element => { if (element !== null) element.inert = mode !== undefined }}>{children}\n {notice === undefined ? null : <span className={styles.reuseNotice} role=\"status\">{t(notice)}</span>}\n </div>\n {mode === undefined ? null : <section className={styles.knowledgeDialog} role=\"dialog\" aria-modal=\"true\"\n aria-label={t(mode === 'compose' ? 'reuse.title' : 'reuse.history')} onKeyDown={event => {\n if (event.key === 'Escape') { event.stopPropagation(); close() }\n retainDialogFocus(event)\n }}>\n <div className={styles.searchHeader}><h2>{t(mode === 'compose' ? 'reuse.title' : 'reuse.history')}</h2>\n <button type=\"button\" autoFocus onClick={close}>{t('reuse.close')}</button></div>\n <div className={styles.knowledgeBody}>\n {mode === 'compose' ? <>\n <p>{t('reuse.boundary')}</p>\n {materials.length === 0 ? <p role=\"status\">{t('reuse.empty')}</p> : <ol>{materials.map((item, index) => <li key={JSON.stringify(item.selection)}>\n <strong>{item.label}</strong>\n <button type=\"button\" disabled={locked || index === 0} onClick={() => { move(index, -1) }}>{t('reuse.up')}</button>\n <button type=\"button\" disabled={locked || index === materials.length - 1} onClick={() => { move(index, 1) }}>{t('reuse.down')}</button>\n <button type=\"button\" disabled={locked} onClick={() => { change(); setMaterials(value => value.filter((_, i) => i !== index)) }}>{t('reuse.remove')}</button>\n </li>)}</ol>}\n <label>{t('reuse.question')}<textarea value={question} disabled={locked} maxLength={4000} rows={3}\n onChange={event => { change(); setQuestion(event.target.value) }} /></label>\n <label>{t('reuse.workspace')}<select value={workspaceId} disabled={locked} onChange={event => { change(); setWorkspaceId(event.target.value) }}>\n <option value=\"\">{t('reuse.chooseWorkspace')}</option>{workspaces.map(item => <option key={item.workspaceId} value={item.workspaceId}>{item.title || item.path}</option>)}\n </select></label>\n <button type=\"button\" disabled={locked || materials.length < 1 || materials.length > 3 || question.trim() === '' || !workspaces.some(item => item.workspaceId === workspaceId)}\n onClick={() => {\n const base = { materials: materials.map(item => item.selection), question: question.trim(), workspaceId }\n const payload = JSON.stringify(base)\n if (attempt.current?.payload !== payload) attempt.current = { payload, operationId: crypto.randomUUID() }\n const operationId = attempt.current.operationId\n void perform(async signal => {\n const value = await api.prepare({ ...base, operationId }, signal)\n if (!signal.aborted) setPreview(value)\n })\n }}>{t('reuse.preview')}</button>\n {preview === undefined ? null : <>\n <ResearchReuseSnapshot record={preview} t={t} />\n {uncertain ? <div role=\"status\"><p>{t('reuse.uncertain')}</p><p>{preview.targetSessionId}</p>\n <button type=\"button\" disabled={busy} onClick={() => {\n void perform(signal => recover(preview, signal, 'compose', false))\n }}>{t('reuse.recover')}</button></div> : null}\n {preview.stage === 'accepted' ? null : <button type=\"button\" disabled={busy} onClick={() => { submit(preview) }}>\n {t(!uncertain && preview.error === undefined ? 'reuse.confirm' : 'reuse.retry')}</button>}\n {preview.targetCreated ? <button type=\"button\" onClick={() => { openSession(preview.targetSessionId as SessionId) }}>{t('reuse.open')}</button> : null}\n </>}\n </> : <>\n {records?.length === 0 ? <p>{t('reuse.noHistory')}</p> : records?.map(record => <section key={record.operationId}>\n <ResearchReuseSnapshot record={record} t={t} />\n {record.stage === 'accepted' ? null : <button type=\"button\" disabled={busy} onClick={() => { submit(record) }}>{t('reuse.retry')}</button>}\n </section>)}\n {failed === undefined ? null : <button type=\"button\" disabled={busy} onClick={history}>{t('reuse.retryHistory')}</button>}\n </>}\n {busy ? <p role=\"status\">{t('reuse.busy')}</p> : null}\n {failed === undefined ? null : <p role=\"alert\">{t('reuse.error')} {failed}</p>}\n </div>\n </section>}\n </ReuseContext.Provider>\n}\n\nfunction ResearchReuseSnapshot({ record, t }: { readonly record: ResearchReuseRecord; readonly t: Translate }): ReactElement {\n return <section>\n <h3>{t(record.stage === 'accepted' ? 'reuse.sent' : record.targetCreated ? 'reuse.created' : 'reuse.frozen')}</h3>\n <p>{record.workspace.title} · {record.workspace.cwd}</p>\n <p>{t('reuse.budget', { size: record.promptText.length, budget: record.budgetChars })}</p>\n {record.stage === 'accepted' ? <><h4>{t('reuse.relation')}</h4><ul>{record.materials.map((material, index) => <li key={index}>\n {material.kind === 'card' ? `${material.content.title} · ${t('knowledge.versionNumber', { number: material.revisionNumber })}`\n : `${material.source.title} · ${t('knowledge.sourceRange', { start: material.source.source.startSeq, end: material.source.source.endSeq })}`} → {record.targetSessionId}\n </li>)}</ul><p>{t('reuse.answer')}</p></> : <p>{t('reuse.pending')}</p>}\n <pre className={styles.historyText}>{record.promptText}</pre>\n </section>\n}\n","import { useEffect, useRef, useState, type ReactElement } from 'react'\nimport type { KnowledgeExportResult } from '../knowledge-export.ts'\nimport type { KnowledgeApi } from './knowledge-remote.ts'\nimport type { SessionGraphKey } from './locales.ts'\nimport styles from './GraphView.module.css'\n\nexport interface ExportChoice { readonly cardId: string; readonly title: string }\n\n/** Holds the exact preview bytes independently of subsequent card changes. */\nexport function KnowledgeExport({ cards, api, t }: {\n readonly cards: readonly ExportChoice[]\n readonly api: KnowledgeApi\n readonly t: (key: SessionGraphKey, params?: Record<string, unknown>) => string\n}): ReactElement {\n const [selected, setSelected] = useState(() => cards.map(card => card.cardId))\n const [preview, setPreview] = useState<KnowledgeExportResult>()\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState<string>()\n const active = useRef<AbortController>()\n const urls = useRef(new Map<string, ReturnType<typeof setTimeout>>())\n useEffect(() => () => {\n active.current?.abort()\n for (const [url, timer] of urls.current) { clearTimeout(timer); URL.revokeObjectURL(url) }\n urls.current.clear()\n }, [])\n const prepare = async (): Promise<void> => {\n active.current?.abort()\n const controller = new AbortController()\n active.current = controller\n setBusy(true)\n setError(undefined)\n try {\n const value = await api.prepareExport({ cardIds: selected }, controller.signal)\n if (!controller.signal.aborted) setPreview(value)\n } catch (error) {\n if (!controller.signal.aborted) setError(error instanceof Error ? error.message : t('export.error'))\n } finally { if (!controller.signal.aborted) setBusy(false) }\n }\n const download = (): void => {\n if (preview === undefined) return\n setError(undefined)\n let link: HTMLAnchorElement | undefined\n try {\n const url = URL.createObjectURL(new Blob([preview.markdown], { type: 'text/markdown;charset=utf-8' }))\n urls.current.set(url, setTimeout(() => { URL.revokeObjectURL(url); urls.current.delete(url) }, 1_000))\n link = document.createElement('a')\n link.href = url\n link.download = preview.filename\n document.body.append(link)\n link.click()\n } catch (error) { setError(error instanceof Error ? error.message : t('export.error')) } finally { link?.remove() }\n }\n return <div className={styles.knowledgeBody}>\n <p>{t('export.hint')}</p>\n <fieldset disabled={busy} className={styles.exportChoices}><legend>{t('export.choose')}</legend>\n {cards.map(card => <label key={card.cardId}><input type=\"checkbox\" checked={selected.includes(card.cardId)} onChange={event => {\n setSelected(current => event.target.checked ? cards.filter(item => item.cardId === card.cardId || current.includes(item.cardId)).map(item => item.cardId) : current.filter(id => id !== card.cardId))\n setPreview(undefined)\n setError(undefined)\n }} />{card.title}</label>)}\n </fieldset>\n <div className={styles.topicControls}>\n <button type=\"button\" disabled={busy || selected.length === 0 || selected.length > 50} onClick={() => { void prepare() }}>{t('export.preview')}</button>\n <button type=\"button\" disabled={busy || preview === undefined} onClick={download}>{t('export.download')}</button>\n {busy ? <><span role=\"status\">{t('export.loading')}</span><button type=\"button\" onClick={() => {\n active.current?.abort()\n setBusy(false)\n }}>{t('topic.cancel')}</button></> : null}\n </div>\n {error === undefined ? null : <div role=\"alert\"><p>{t('export.error')}</p><p>{error}</p></div>}\n {preview === undefined ? null : <>\n <p>{preview.filename} · {t('export.frozen')}</p>\n <ul>{preview.cards.map(card => <li key={card.cardId}>{card.title} · {t('knowledge.versionNumber', { number: card.number })}</li>)}</ul>\n <label>{t('export.markdown')}<textarea className={styles.exportPreview} readOnly value={preview.markdown} rows={22} /></label>\n </>}\n </div>\n}\n","import type { ExtractionPreparation } from '../knowledge-extraction.ts'\nimport type { KnowledgeExtractionAddress, KnowledgeRevision, KnowledgeSourceAddress } from '../knowledge.ts'\n\n/** Recover the exact frozen citations for another edit, retaining all unrelated saved sources. */\nexport function editableKnowledgeSources(cardId: string, revision: KnowledgeRevision, preparation?: ExtractionPreparation): readonly KnowledgeSourceAddress[] {\n return revision.sources.map((source, sourceIndex) => {\n const { startSeq, endSeq } = source.source\n const included = preparation?.included\n const turns = included?.source.turns.filter(turn => turn.startSeq >= startSeq && turn.endSeq! <= endSeq)\n if (preparation !== undefined && included?.sessionId === source.sessionId && JSON.stringify(turns) === JSON.stringify(source.source.turns)) {\n return { kind: 'extraction', preparationId: preparation.preparationId, startSeq, endSeq }\n }\n return { kind: 'revision', cardId, revisionId: revision.revisionId, sourceIndex }\n })\n}\n\n/** Change one checkbox without dropping retained sources or expanding a long range into many citations. */\nexport function changeExtractionCitation(preparation: ExtractionPreparation, sources: readonly KnowledgeSourceAddress[], startSeq: number, checked: boolean): readonly KnowledgeSourceAddress[] {\n const editable = (address: KnowledgeSourceAddress): address is KnowledgeExtractionAddress => address.kind === 'extraction' && address.preparationId === preparation.preparationId\n const citations = sources.filter(editable)\n const turns = preparation.included.source.turns\n const selected = new Set(turns.filter(turn => citations.some(address => turn.startSeq >= address.startSeq && turn.endSeq! <= address.endSeq)).map(turn => turn.startSeq))\n if (checked) selected.add(startSeq)\n else selected.delete(startSeq)\n const ranges: KnowledgeExtractionAddress[] = []\n turns.forEach((turn, index) => {\n if (!selected.has(turn.startSeq)) return\n const last = ranges.at(-1)\n if (last !== undefined && turns[index - 1]?.endSeq === last.endSeq) ranges[ranges.length - 1] = { ...last, endSeq: turn.endSeq! }\n else ranges.push({ kind: 'extraction', preparationId: preparation.preparationId, startSeq: turn.startSeq, endSeq: turn.endSeq! })\n })\n return [...sources.filter(address => !editable(address)), ...ranges]\n}\n","import { createContext, useContext, useEffect, useRef, useState, type ReactElement, type ReactNode } from 'react'\nimport type { KnowledgeCard, KnowledgeContent, KnowledgeDiscussionAddress, KnowledgeSave, KnowledgeSourceAddress } from '../knowledge.ts'\nimport type { ResearchTopic } from '../research-topic.ts'\nimport type { GraphViewInjected } from './GraphView.tsx'\nimport type { KnowledgeApi } from './knowledge-remote.ts'\nimport type { SessionGraphKey } from './locales.ts'\nimport { retainDialogFocus } from './dialog-focus.ts'\nimport { SessionHistory } from './SessionHistory.tsx'\nimport styles from './GraphView.module.css'\nimport { KnowledgeExtraction } from './KnowledgeExtraction.tsx'\nimport type { ExtractionDraft, ExtractionPreparation } from '../knowledge-extraction.ts'\nimport { useResearchReuse } from './ResearchReuse.tsx'\nimport { KnowledgeExport, type ExportChoice } from './KnowledgeExport.tsx'\nimport { editableKnowledgeSources, changeExtractionCitation } from './knowledge-citations.ts'\n\ntype Translate = (key: SessionGraphKey, params?: Record<string, unknown>) => string\ninterface KnowledgeContextValue {\n readonly api: KnowledgeApi\n readonly refresh: number\n readonly topicId: string | undefined\n readonly selectTopic: (topicId: string | undefined) => void\n readonly create: (source?: KnowledgeDiscussionAddress) => void\n readonly open: (cardId: string) => void\n readonly extract: (source: KnowledgeDiscussionAddress) => void\n readonly exportCards: (cards: readonly ExportChoice[]) => void\n}\nconst KnowledgeContext = createContext<KnowledgeContextValue | undefined>(undefined)\nexport function useKnowledge(): KnowledgeContextValue | undefined { return useContext(KnowledgeContext) }\n\ninterface KnowledgeDialog {\n readonly id: string\n readonly content: { readonly cardId?: string; readonly source?: KnowledgeDiscussionAddress; readonly extraction?: KnowledgeDiscussionAddress }\n readonly trigger: HTMLElement | undefined\n}\n\n/** Owns explicit card dialogs; source readers only supply an address, never authoritative text. */\nexport function KnowledgeProvider({ api, topics, read, t, children }: {\n readonly api: KnowledgeApi\n readonly topics: GraphViewInjected['topics']\n readonly read: GraphViewInjected['readSessionHistory']\n readonly t: Translate\n readonly children: ReactNode\n}): ReactElement {\n const [dialogs, setDialogs] = useState<readonly KnowledgeDialog[]>([])\n const [exporting, setExporting] = useState<readonly ExportChoice[]>()\n const exportTrigger = useRef<HTMLElement>()\n const [refresh, setRefresh] = useState(0)\n const [topicId, selectTopic] = useState<string>()\n const open = (content: KnowledgeDialog['content']): void => {\n const dialog = { id: crypto.randomUUID(), content, trigger: document.activeElement instanceof HTMLElement ? document.activeElement : undefined }\n setDialogs(current => [...current, dialog])\n }\n const close = (): void => {\n const trigger = dialogs.at(-1)?.trigger\n setDialogs(current => current.slice(0, -1))\n queueMicrotask(() => { trigger?.focus() })\n }\n const closeExport = (): void => {\n setExporting(undefined)\n queueMicrotask(() => { exportTrigger.current?.focus() })\n }\n return <KnowledgeContext.Provider value={{ api, refresh, topicId, selectTopic,\n create: source => { open(source === undefined ? {} : { source }) }, open: cardId => { open({ cardId }) },\n extract: extraction => { open({ extraction }) }, exportCards: cards => {\n if (document.activeElement instanceof HTMLElement) exportTrigger.current = document.activeElement\n setExporting(cards)\n } }}>\n <div className={styles.knowledgeRoot} aria-hidden={dialogs.length > 0 || exporting !== undefined || undefined}\n ref={element => { if (element !== null) element.inert = dialogs.length > 0 || exporting !== undefined }}>{children}</div>\n {dialogs.map(({ id, content: dialog }, index) => {\n const covered = index !== dialogs.length - 1 || exporting !== undefined\n const title = dialog.extraction !== undefined ? 'extract.title' : 'knowledge.title'\n return <section key={id} className={styles.knowledgeDialog} role=\"dialog\" aria-modal={!covered} aria-label={t(title)}\n aria-hidden={covered || undefined} ref={element => { if (element !== null) element.inert = covered }}\n onKeyDown={event => {\n if (event.key === 'Escape') { event.stopPropagation(); close() }\n retainDialogFocus(event)\n }}>\n <div className={styles.searchHeader}><h2>{t(title)}</h2><button type=\"button\" autoFocus onClick={close}>{t('knowledge.close')}</button></div>\n {dialog.extraction === undefined ? <KnowledgeEditor cardId={dialog.cardId} source={dialog.source} topicId={topicId}\n api={api} topics={topics} read={read} t={t} close={close} changed={() => { setRefresh(value => value + 1) }} />\n : <KnowledgeExtraction source={dialog.extraction} topicId={topicId} api={api} topics={topics} read={read} t={t}\n changed={() => { setRefresh(value => value + 1) }} />}\n </section>\n })}\n {exporting === undefined ? null : <section className={styles.knowledgeDialog} role=\"dialog\" aria-modal=\"true\" aria-label={t('export.title')}\n onKeyDown={event => {\n if (event.key === 'Escape') { event.stopPropagation(); closeExport() }\n retainDialogFocus(event)\n }}>\n <div className={styles.searchHeader}><h2>{t('export.title')}</h2><button type=\"button\" autoFocus onClick={closeExport}>{t('export.close')}</button></div>\n <KnowledgeExport cards={exporting} api={api} t={t} />\n </section>}\n </KnowledgeContext.Provider>\n}\n\nconst EMPTY_CONTENT: KnowledgeContent = {\n title: '', question: '', conclusion: '', rationale: '', openQuestions: '', kind: 'conclusion', status: 'draft',\n}\nconst TEXT_FIELDS = ['title', 'question', 'conclusion', 'rationale', 'openQuestions'] as const\n\nexport function KnowledgeEditor({ cardId, source, topicId, api, topics, read, close, changed, draft, preparation, t }: {\n readonly cardId: string | undefined\n readonly source: KnowledgeDiscussionAddress | undefined\n readonly topicId: string | undefined\n readonly api: KnowledgeApi\n readonly topics: GraphViewInjected['topics']\n readonly read: GraphViewInjected['readSessionHistory']\n readonly close: () => void\n readonly changed: () => void\n readonly t: Translate\n readonly draft?: ExtractionDraft\n readonly preparation?: ExtractionPreparation\n}): ReactElement {\n const [identity] = useState(() => cardId ?? draft?.cardId ?? crypto.randomUUID())\n const reuse = useResearchReuse()\n const knowledge = useKnowledge()\n const [card, setCard] = useState<KnowledgeCard>()\n const [version, setVersion] = useState('')\n const [content, setContent] = useState<KnowledgeContent>(draft?.content ?? EMPTY_CONTENT)\n const [sources, setSources] = useState<readonly KnowledgeSourceAddress[]>(draft?.sources ?? (source === undefined ? [] : [source]))\n const [invalidCitations, setInvalidCitations] = useState(draft?.invalidCitations ?? 0)\n const [citationReading, setCitationReading] = useState<number>()\n const [selectedTopic, setSelectedTopic] = useState(topicId ?? '')\n const [topicList, setTopicList] = useState<readonly ResearchTopic[]>([])\n const [topicError, setTopicError] = useState(false)\n const [editing, setEditing] = useState(cardId === undefined)\n const [loading, setLoading] = useState(cardId !== undefined)\n const [busy, setBusy] = useState(false)\n const [failed, setFailed] = useState(false)\n const [reload, setReload] = useState(0)\n const [reading, setReading] = useState<number>()\n const attempt = useRef<{ readonly payload: string; readonly revisionId: string }>()\n const write = useRef<AbortController>()\n useEffect(() => () => { write.current?.abort() }, [])\n useEffect(() => {\n const controller = new AbortController()\n setTopicError(false)\n void topics.list(controller.signal).then(value => {\n if (!controller.signal.aborted) setTopicList(value)\n }, () => { if (!controller.signal.aborted) setTopicError(true) })\n if (cardId !== undefined) {\n setLoading(true)\n setFailed(false)\n void api.read({ cardId }, controller.signal).then(value => {\n if (controller.signal.aborted) return\n if (value === null) throw new Error('Card unavailable')\n setCard(value)\n setVersion(value.revisions.at(-1)!.revisionId)\n }).catch(() => { if (!controller.signal.aborted) setFailed(true) })\n .finally(() => { if (!controller.signal.aborted) setLoading(false) })\n }\n return () => { controller.abort() }\n }, [api, topics, cardId, reload])\n const revision = card?.revisions.find(item => item.revisionId === version) ?? card?.revisions.at(-1)\n const commit = async (operation: (signal: AbortSignal) => Promise<KnowledgeCard>): Promise<void> => {\n if (write.current !== undefined) return\n const controller = new AbortController()\n write.current = controller\n setBusy(true)\n setFailed(false)\n try {\n const saved = await operation(controller.signal)\n if (controller.signal.aborted) return\n setCard(saved)\n setVersion(saved.revisions.at(-1)!.revisionId)\n setEditing(false)\n setReading(undefined)\n attempt.current = undefined\n changed()\n } catch { if (!controller.signal.aborted) setFailed(true) } finally {\n if (!controller.signal.aborted) { setBusy(false); write.current = undefined }\n }\n }\n return <div className={styles.knowledgeBody}>\n {loading ? <p role=\"status\">{t('topic.loading')}</p> : null}\n {failed || topicError ? <div role=\"alert\">{t('knowledge.error')}\n {(!editing && card === undefined) || topicError ? <button type=\"button\" onClick={() => { setReload(value => value + 1) }}>{t('topic.retry')}</button> : null}</div> : null}\n {loading ? null : <>\n <label>{t('knowledge.topic')}<select value={selectedTopic} disabled={busy} onChange={event => { setSelectedTopic(event.target.value) }}>\n <option value=\"\">{t('knowledge.noTopic')}</option>\n {topicList.map(topic => <option key={topic.topicId} value={topic.topicId}>{topic.title}</option>)}\n </select></label>\n {editing ? <form className={styles.knowledgeForm} onSubmit={event => {\n event.preventDefault()\n const base = { cardId: identity, content: { ...content, title: content.title.trim() }, sources,\n ...(selectedTopic === '' ? {} : { topicId: selectedTopic }) }\n const payload = JSON.stringify(base)\n if (attempt.current?.payload !== payload) attempt.current = { payload, revisionId: crypto.randomUUID() }\n const request: KnowledgeSave = { ...base, revisionId: attempt.current.revisionId }\n void commit(signal => api.save(request, signal))\n }}>\n {draft !== undefined && sources.length === 0 ? <p role=\"status\">{t('extract.verify')}</p> : null}\n {invalidCitations > 0 ? <p role=\"alert\">{t('extract.invalid', { count: invalidCitations })}</p> : null}\n {TEXT_FIELDS.map(field => <label key={field}>{t(`knowledge.field.${field}`)}\n {field === 'title' ? <input value={content[field]} maxLength={120} disabled={busy}\n onChange={event => { setContent(value => ({ ...value, [field]: event.target.value })) }} />\n : <textarea value={content[field]} maxLength={24_000} rows={3} disabled={busy}\n onChange={event => { setContent(value => ({ ...value, [field]: event.target.value })) }} />}</label>)}\n <label>{t('knowledge.kind')}<select value={content.kind} disabled={busy}\n onChange={event => { setContent(value => ({ ...value, kind: event.target.value as KnowledgeContent['kind'] })) }}>\n {(['conclusion', 'method', 'hypothesis', 'question'] as const).map(kind => <option key={kind} value={kind}>{t(`knowledge.kind.${kind}`)}</option>)}\n </select></label>\n <label>{t('knowledge.status')}<select value={content.status} disabled={busy}\n onChange={event => { setContent(value => ({ ...value, status: event.target.value as KnowledgeContent['status'] })) }}>\n {(['draft', 'confirmed'] as const).map(status => <option key={status} value={status}>{t(`knowledge.status.${status}`)}</option>)}\n </select></label>\n <p>{t('knowledge.sourceHint')}</p>\n {preparation?.included.source.turns.map(turn => <div key={turn.startSeq}>\n <label><input type=\"checkbox\" disabled={busy} checked={sources.some(address => address.kind === 'extraction' && address.preparationId === preparation.preparationId\n && turn.startSeq >= address.startSeq && turn.endSeq! <= address.endSeq)} onChange={event => {\n setSources(changeExtractionCitation(preparation, sources, turn.startSeq, event.target.checked))\n setInvalidCitations(0)\n }} />{t('extract.citation', { turn: turn.turn })}</label>\n <button type=\"button\" onClick={() => { setCitationReading(turn.startSeq) }}>{t('extract.review')}</button>\n {citationReading !== turn.startSeq ? null : <SessionHistory key={turn.startSeq} sessionId={preparation.included.sessionId}\n source={{ startSeq: turn.startSeq, endSeq: turn.endSeq!, turns: [turn] }} read={read} t={t} />}\n </div>)}\n {sources.length === 0 ? <p>{t('knowledge.noSources')}</p> : sources.map((address, index) => <div key={index}>\n <span>{address.kind === 'discussion' ? `${address.sessionId} · ${t('knowledge.sourceRange', { start: address.startSeq, end: address.endSeq })}`\n : address.kind === 'revision' ? `${address.cardId} · ${address.revisionId} · ${address.sourceIndex + 1}`\n : t('knowledge.sourceRange', { start: address.startSeq, end: address.endSeq })}</span>\n <button type=\"button\" disabled={busy} onClick={() => { setSources(value => value.filter((_, i) => i !== index)) }}>{t('knowledge.removeSource')}</button>\n </div>)}\n <div className={styles.topicControls}><button type=\"submit\" disabled={busy || content.title.trim() === ''}>{t('knowledge.save')}</button>\n <button type=\"button\" disabled={busy} onClick={() => { if (card === undefined) close(); else { setEditing(false); setFailed(false) } }}>{t('knowledge.cancel')}</button></div>\n </form> : revision === undefined ? null : <>\n <label>{t('knowledge.version')}<select value={version} onChange={event => { setVersion(event.target.value); setReading(undefined) }}>\n {card!.revisions.map(item => <option key={item.revisionId} value={item.revisionId}>{t('knowledge.versionNumber', { number: item.number })}</option>)}\n </select></label>\n <h3>{revision.content.title}</h3>\n <p>{t(`knowledge.kind.${revision.content.kind}`)} · {t(`knowledge.status.${revision.content.status}`)} · {t('knowledge.savedAt', { time: new Date(revision.savedAt).toLocaleString() })}</p>\n {TEXT_FIELDS.filter(field => field !== 'title').map(field => revision.content[field] === '' ? null : <section key={field}>\n <h4>{t(`knowledge.field.${field}`)}</h4><p className={styles.historyText}>{revision.content[field]}</p></section>)}\n <div className={styles.topicControls}><button type=\"button\" disabled={busy} onClick={() => {\n setContent(revision.content)\n setSources(editableKnowledgeSources(identity, revision, preparation))\n setFailed(false)\n setEditing(true)\n }}>{t('knowledge.edit')}</button>\n {reuse === undefined ? null : <button type=\"button\" onClick={() => {\n reuse.add({ kind: 'card', cardId: identity, revisionId: revision.revisionId },\n `${revision.content.title} · ${t('knowledge.versionNumber', { number: revision.number })}`)\n }}>{t('reuse.addCard')}</button>}\n {knowledge === undefined ? null : <button type=\"button\" onClick={() => {\n knowledge.exportCards([{ cardId: identity, title: revision.content.title }])\n }}>{t('export.title')}</button>}\n {selectedTopic === '' ? null : <button type=\"button\" disabled={busy} onClick={() => {\n void commit(signal => api.membership({ cardId: identity, topicId: selectedTopic, attached: !card!.topicIds.includes(selectedTopic) }, signal))\n }}>{t(card!.topicIds.includes(selectedTopic) ? 'knowledge.detach' : 'knowledge.attach')}</button>}</div>\n <p>{t('knowledge.detached')}</p>\n <h4>{t('knowledge.source')}</h4>\n {revision.sources.length === 0 ? <p>{t('knowledge.noSources')}</p> : revision.sources.map((item, index) => <section key={index} className={styles.knowledgeSource}>\n <strong>{item.title}</strong><div className={styles.historyIdentity}>{item.sessionId} · {item.cwd}</div>\n <div>{t('knowledge.sourceRange', { start: item.source.startSeq, end: item.source.endSeq })}</div>\n <details><summary>{t('knowledge.excerpt')}</summary>{item.source.turns.map(turn => <article key={turn.startSeq}>\n <h5>{t('history.turn', { turn: turn.turn })} · {new Date(turn.startedAt).toLocaleString()}</h5>\n {turn.messages.map(message => <p key={message.seq} className={styles.historyText}><strong>{t(message.role === 'user' ? 'history.user' : 'history.assistant')}</strong>{'\\n'}{message.text}</p>)}\n </article>)}</details>\n <button type=\"button\" onClick={() => { setReading(index) }}>{t('knowledge.readSource')}</button>\n {reading !== index ? null : <SessionHistory key={`${revision.revisionId}:${index}`} sessionId={item.sessionId} source={item.source} read={read} t={t} />}\n </section>)}\n </>}\n </>}\n {busy ? <p role=\"status\">{t('topic.saving')}</p> : null}\n </div>\n}\n","/**\n * Pure free-viewport math: screen = content × scale + pan, with anchored\n * zoom, screen-space panning, and content fitting. React-free; GraphCanvas\n * owns the interaction handlers and feeds every gesture through these\n * functions so the geometry is pinned by unit tests.\n * @module @benz-ai-x/dsh-research-graph/src/client/viewport\n */\nimport type { ContentBounds } from './layout.ts'\n\n/** Zoom-out floor as a fraction of 1. */\nexport const SCALE_MIN = 0.2\n/** Zoom-in ceiling as a fraction of 1. */\nexport const SCALE_MAX = 3\n\n/** One viewport state: content-to-screen scale plus screen-space translation. */\nexport interface Viewport {\n readonly scale: number\n readonly panX: number\n readonly panY: number\n}\n\n/** The identity viewport: 100% at the origin.\n * @returns the initial viewport.\n */\nexport function initialViewport(): Viewport {\n return { scale: 1, panX: 0, panY: 0 }\n}\n\n/**\n * Clamp one scale into the fixed bounds.\n * @param scale - requested scale.\n * @returns the clamped scale.\n */\nexport function clampScale(scale: number): number {\n return Math.min(SCALE_MAX, Math.max(SCALE_MIN, scale))\n}\n\n/**\n * Zoom by a multiplicative factor while keeping the content point under the\n * anchor fixed (the content under the cursor does not drift).\n * @param viewport - the current viewport.\n * @param anchorX - anchor position in screen px.\n * @param anchorY - anchor position in screen px.\n * @param factor - multiplicative zoom factor (>1 zooms in).\n * @returns the next viewport.\n */\nexport function zoomAt(\n viewport: Viewport,\n anchorX: number,\n anchorY: number,\n factor: number,\n): Viewport {\n const scale = clampScale(viewport.scale * factor)\n const contentX = (anchorX - viewport.panX) / viewport.scale\n const contentY = (anchorY - viewport.panY) / viewport.scale\n return {\n scale,\n panX: anchorX - contentX * scale,\n panY: anchorY - contentY * scale,\n }\n}\n\n/**\n * Pan by screen-space deltas; the scale is untouched.\n * @param viewport - the current viewport.\n * @param dx - horizontal screen delta in px.\n * @param dy - vertical screen delta in px.\n * @returns the next viewport.\n */\nexport function panBy(viewport: Viewport, dx: number, dy: number): Viewport {\n return { scale: viewport.scale, panX: viewport.panX + dx, panY: viewport.panY + dy }\n}\n\n/** One measured viewport surface extent in screen px. */\nexport interface ViewportSize {\n readonly width: number\n readonly height: number\n}\n\n/**\n * Preserve the content point at the viewport center while its surface changes\n * size. Scale stays untouched; pan moves by half the screen-size delta.\n * @param viewport - the current viewport.\n * @param previous - the previous surface size.\n * @param next - the next surface size.\n * @returns the center-preserving viewport.\n */\nexport function resizeViewport(\n viewport: Viewport,\n previous: ViewportSize,\n next: ViewportSize,\n): Viewport {\n return {\n scale: viewport.scale,\n panX: viewport.panX + (next.width - previous.width) / 2,\n panY: viewport.panY + (next.height - previous.height) / 2,\n }\n}\n\n/**\n * Fit the content box into the view box with symmetric padding, centered.\n * The fit scale is clamped to the floor and to 100% (tiny content never\n * zooms past identity).\n * @param content - complete content bounds in canvas coordinates.\n * @param viewWidth - viewport element extent in px.\n * @param viewHeight - viewport element extent in px.\n * @param padding - symmetric inset in px.\n * @returns the fitted viewport.\n */\nexport function fitViewport(\n content: ContentBounds,\n viewWidth: number,\n viewHeight: number,\n padding: number,\n): Viewport {\n const roomWidth = Math.max(1, viewWidth - 2 * padding)\n const roomHeight = Math.max(1, viewHeight - 2 * padding)\n const scale = clampScale(Math.min(\n roomWidth / Math.max(1, content.width),\n roomHeight / Math.max(1, content.height),\n 1,\n ))\n return {\n scale,\n panX: (viewWidth - content.width * scale) / 2 - content.x * scale,\n panY: (viewHeight - content.height * scale) / 2 - content.y * scale,\n }\n}\n\n/** The content-to-minimap projection: scale plus centering offsets. */\nexport interface MinimapProjection {\n readonly scale: number\n readonly offsetX: number\n readonly offsetY: number\n}\n\n/**\n * Project the content box into the minimap room, contain-fit and centered,\n * capped at 100%. Empty content centers the identity projection.\n * @param content - complete content bounds in canvas coordinates.\n * @param roomWidth - minimap drawing room in px.\n * @param roomHeight - minimap drawing room in px.\n * @returns the projection applied to content coordinates.\n */\nexport function minimapProjection(\n content: ContentBounds,\n roomWidth: number,\n roomHeight: number,\n): MinimapProjection {\n if (content.width <= 0 || content.height <= 0) {\n return {\n scale: 1,\n offsetX: roomWidth / 2 - content.x,\n offsetY: roomHeight / 2 - content.y,\n }\n }\n const scale = Math.min(roomWidth / content.width, roomHeight / content.height, 1)\n return {\n scale,\n offsetX: (roomWidth - content.width * scale) / 2 - content.x * scale,\n offsetY: (roomHeight - content.height * scale) / 2 - content.y * scale,\n }\n}\n","import type { DiscussionSearchScope } from '../session-search.ts'\nimport type { SessionDiscussionRange } from '../session-history.ts'\nimport type { Viewport } from './viewport.ts'\nimport { SCALE_MAX, SCALE_MIN } from './viewport.ts'\n\n/** Browser presentation only: identities and cursors, never source text or saved knowledge. */\nexport interface WorkingPosition {\n readonly viewport?: Viewport\n readonly selected?: string | null\n readonly query?: string\n readonly tab?: 'digest' | 'history'\n readonly history?: Readonly<Record<string, number>>\n readonly historyRange?: Readonly<Record<string, SessionDiscussionRange>>\n readonly historyScroll?: Readonly<Record<string, number>>\n readonly topicId?: string\n readonly searchType?: 'discussion' | 'knowledge'\n readonly discussion?: { readonly query: string; readonly scope: DiscussionSearchScope; readonly includeArchived: boolean }\n readonly knowledge?: { readonly query: string; readonly inTopic: boolean }\n}\n\nexport function workingPositionKey(hostId: string, scope: string, topicId?: string): string {\n return JSON.stringify([hostId, scope, topicId ?? null])\n}\n\nconst object = (value: unknown): value is Record<string, unknown> => value !== null && typeof value === 'object' && !Array.isArray(value)\nconst string = (value: unknown, max = 1000): value is string => typeof value === 'string' && value.length <= max && !value.includes('\\0')\nconst finite = (value: unknown): value is number => typeof value === 'number' && Number.isFinite(value)\n\nexport function loadWorkingPosition(key: string | undefined): WorkingPosition {\n if (key === undefined) return {}\n try {\n const value: unknown = JSON.parse(globalThis.localStorage.getItem(`dsh.session-graph.position.${key}`) ?? 'null')\n if (!object(value) || value.v !== 1) return {}\n const viewport = value.viewport\n const discussion = value.discussion\n const scope = object(discussion) ? discussion.scope : undefined\n const validScope = object(scope) && (scope.kind === 'all'\n || (scope.kind === 'workspace' && string(scope.workspaceId)) || (scope.kind === 'directory' && string(scope.cwd)))\n const history = object(value.history) ? Object.fromEntries(Object.entries(value.history)\n .filter(([id, seq]) => string(id) && Number.isSafeInteger(seq) && (seq as number) >= 0)) as Record<string, number> : undefined\n const historyScroll = object(value.historyScroll) ? Object.fromEntries(Object.entries(value.historyScroll)\n .filter(([id, top]) => string(id) && finite(top) && top >= 0)) as Record<string, number> : undefined\n const historyRange = object(value.historyRange) ? Object.fromEntries(Object.entries(value.historyRange)\n .filter(([id, range]) => string(id) && object(range) && Number.isSafeInteger(range.startSeq)\n && Number.isSafeInteger(range.endSeq) && (range.startSeq as number) >= 0 && (range.endSeq as number) > (range.startSeq as number))\n .map(([id, range]) => [id, { startSeq: (range as SessionDiscussionRange).startSeq, endSeq: (range as SessionDiscussionRange).endSeq }])) : undefined\n return {\n ...(object(viewport) && finite(viewport.scale) && viewport.scale >= SCALE_MIN && viewport.scale <= SCALE_MAX\n && finite(viewport.panX) && finite(viewport.panY) ? { viewport: viewport as unknown as Viewport } : {}),\n ...(value.selected === null || string(value.selected) ? { selected: value.selected } : {}),\n ...(string(value.query, 256) ? { query: value.query } : {}),\n ...(value.tab === 'digest' || value.tab === 'history' ? { tab: value.tab } : {}),\n ...(history === undefined ? {} : { history }),\n ...(historyRange === undefined ? {} : { historyRange }),\n ...(historyScroll === undefined ? {} : { historyScroll }),\n ...(string(value.topicId) ? { topicId: value.topicId } : {}),\n ...(value.searchType === 'discussion' || value.searchType === 'knowledge' ? { searchType: value.searchType } : {}),\n ...(object(discussion) && string(discussion.query, 256) && validScope && typeof discussion.includeArchived === 'boolean'\n ? { discussion: { query: discussion.query, scope: scope as unknown as DiscussionSearchScope, includeArchived: discussion.includeArchived } } : {}),\n ...(object(value.knowledge) && string(value.knowledge.query, 200) && typeof value.knowledge.inTopic === 'boolean'\n ? { knowledge: { query: value.knowledge.query, inTopic: value.knowledge.inTopic } } : {}),\n }\n } catch { return {} }\n}\n\nexport function saveWorkingPosition(key: string | undefined, patch: WorkingPosition): void {\n if (key === undefined) return\n try { globalThis.localStorage.setItem(`dsh.session-graph.position.${key}`, JSON.stringify({ ...loadWorkingPosition(key), ...patch, v: 1 })) } catch {\n // Storage denial/quota only disables restoration; the live view remains usable.\n }\n}\n","import { useEffect, useLayoutEffect, useRef, useState, type ReactElement } from 'react'\nimport type {\n SessionDiscussionSource, SessionHistoryRequest, SessionHistoryResult, SessionHistoryTurn,\n} from '../session-history.ts'\nimport type { GraphViewInjected } from './GraphView.tsx'\nimport type { SessionGraphKey } from './locales.ts'\nimport styles from './GraphView.module.css'\nimport { useKnowledge } from './Knowledge.tsx'\nimport { useResearchReuse } from './ResearchReuse.tsx'\nimport { loadWorkingPosition, saveWorkingPosition } from './working-position.ts'\n\n/** The Selected Session's explicitly opened discussion reader. */\nexport function SessionHistory({ sessionId, anchorSeq, highlightSeq, source, retainedSource, workingKey, onUnavailable, read, t }: {\n readonly sessionId: string\n readonly anchorSeq?: number\n readonly highlightSeq?: number\n readonly source?: SessionDiscussionSource\n /** Topic provenance is a fallback; an explicitly opened source still wins. */\n readonly retainedSource?: SessionDiscussionSource\n readonly workingKey?: string | undefined\n readonly onUnavailable?: (() => void) | undefined\n readonly read: GraphViewInjected['readSessionHistory']\n readonly t: (key: SessionGraphKey, params?: Record<string, unknown>) => string\n}): ReactElement {\n const knowledge = useKnowledge()\n const reuse = useResearchReuse()\n const [result, setResult] = useState<SessionHistoryResult | undefined>(() => {\n const excerpt = source ?? retainedSource\n return excerpt === undefined ? undefined : {\n kind: 'excerpt', sessionId, turns: excerpt.turns, hasEarlier: false, hasLater: false,\n }\n })\n const element = useRef<HTMLElement>(null)\n const initialScroll = useRef(anchorSeq === undefined && source === undefined ? loadWorkingPosition(workingKey).historyScroll?.[sessionId] : undefined)\n const unavailable = useRef(onUnavailable)\n unavailable.current = onUnavailable\n const [request, setRequest] = useState<SessionHistoryRequest>(() => {\n if (source !== undefined) return { sessionId, source }\n if (anchorSeq !== undefined) return { sessionId, anchorSeq }\n const position = loadWorkingPosition(workingKey)\n const range = position.historyRange?.[sessionId]\n const anchor = position.history?.[sessionId]\n if (range !== undefined && range.startSeq === anchor) return { sessionId, range }\n if (anchor !== undefined) return { sessionId, anchorSeq: anchor }\n return { sessionId, ...(retainedSource === undefined ? {} : { source: retainedSource }) }\n })\n const [loading, setLoading] = useState(true)\n const [selection, setSelection] = useState<SessionDiscussionSource>()\n const [failed, setFailed] = useState(false)\n const [canceled, setCanceled] = useState(false)\n const [incompleteRange, setIncompleteRange] = useState(false)\n const activeRead = useRef<AbortController>()\n const loadedTurns = useRef(new Map<number, SessionHistoryTurn>())\n useEffect(() => {\n const controller = new AbortController()\n activeRead.current = controller\n setLoading(true)\n setFailed(false)\n setCanceled(false)\n void read(request, controller.signal).then(value => {\n if (controller.signal.aborted) return\n if (value.kind === 'original') {\n for (const turn of value.turns) loadedTurns.current.set(turn.startSeq, turn)\n const anchor = value.turns[0]?.startSeq\n const position = loadWorkingPosition(workingKey)\n const history = { ...position.history }\n const historyRange = { ...position.historyRange }\n const endSeq = value.turns.at(-1)?.endSeq\n if (anchor === undefined) delete history[sessionId]\n else history[sessionId] = anchor\n if ((request.source !== undefined || request.range !== undefined) && anchor !== undefined && endSeq != null) {\n historyRange[sessionId] = { startSeq: anchor, endSeq }\n } else delete historyRange[sessionId]\n saveWorkingPosition(workingKey, { history, historyRange })\n } else if (value.kind === 'unavailable' && (request.anchorSeq !== undefined || request.range !== undefined) && workingKey !== undefined) {\n const history = { ...loadWorkingPosition(workingKey).history }\n const historyRange = { ...loadWorkingPosition(workingKey).historyRange }\n const historyScroll = { ...loadWorkingPosition(workingKey).historyScroll }\n delete history[sessionId]\n delete historyRange[sessionId]\n delete historyScroll[sessionId]\n saveWorkingPosition(workingKey, { history, historyRange, historyScroll })\n unavailable.current?.()\n }\n setResult(value)\n setLoading(false)\n }).catch(() => {\n if (controller.signal.aborted) return\n setFailed(true)\n setLoading(false)\n })\n return () => { controller.abort() }\n }, [request, read])\n useLayoutEffect(() => {\n if (loading || result?.kind !== 'original') return\n const panel = element.current?.closest<HTMLElement>('[data-working-scroll]')\n if (panel == null) return\n if (initialScroll.current !== undefined) {\n panel.scrollTop = initialScroll.current\n initialScroll.current = undefined\n }\n const remember = (): void => {\n saveWorkingPosition(workingKey, { historyScroll: { ...loadWorkingPosition(workingKey).historyScroll, [sessionId]: panel.scrollTop } })\n }\n panel.addEventListener('scroll', remember, { passive: true })\n return () => { panel.removeEventListener('scroll', remember) }\n }, [workingKey, sessionId, result, loading])\n\n const select = (turn: SessionHistoryTurn): void => {\n if (turn.endSeq === null || loading || result?.kind !== 'original') return\n setIncompleteRange(false)\n if (selection !== undefined && turn.startSeq >= selection.startSeq && turn.endSeq <= selection.endSeq) {\n setSelection(undefined)\n return\n }\n const startSeq = Math.min(selection?.startSeq ?? turn.startSeq, turn.startSeq)\n const endSeq = Math.max(selection?.endSeq ?? turn.endSeq, turn.endSeq)\n const turns = [...loadedTurns.current.values()]\n .filter(item => item.startSeq >= startSeq && item.startSeq <= endSeq)\n .sort((a, b) => a.startSeq - b.startSeq)\n if (turns.some((item, index) => {\n const previous = turns[index - 1]\n return item.endSeq === null || (previous !== undefined && item.turn !== previous.turn + 1)\n })) {\n setIncompleteRange(true)\n return\n }\n setSelection({ startSeq, endSeq, turns })\n }\n\n return (\n <section ref={element} aria-label={t('history.title')} className={styles.history}>\n <div className={styles.historyIdentity}>{sessionId}</div>\n <p className={styles.historyHint}>{t('history.scope')}</p>\n {loading ? <div role=\"status\">\n <p>{t('history.loading')}</p>\n <button type=\"button\" onClick={() => {\n activeRead.current?.abort()\n setLoading(false)\n setCanceled(true)\n }}>{t('history.cancel')}</button>\n </div> : null}\n {canceled ? <p role=\"status\">{t('history.canceled')}</p> : null}\n {failed ? <p role=\"alert\">{t('history.error')}</p> : null}\n {!loading && !failed && result?.kind === 'unavailable' ? <p role=\"alert\">{t('history.unavailable')}</p> : null}\n {result?.kind === 'excerpt' ? (\n <div role=\"status\"><strong>{t('history.excerpt')}</strong>{loading ? null : <p>{t('history.excerptHint')}</p>}</div>\n ) : null}\n {!loading && !failed && result?.kind === 'original' && result.turns.length === 0 ? <p>{t('history.empty')}</p> : null}\n {!loading && (failed || canceled || result?.kind === 'unavailable' || result?.kind === 'excerpt') ? (\n <button type=\"button\" onClick={() => { setRequest({ ...request }) }}>{t('history.retry')}</button>\n ) : null}\n <div className={styles.historyPager}>\n <button type=\"button\" disabled={loading} onClick={() => { setRequest({ ...request }) }}>{t('history.refresh')}</button>\n <button type=\"button\" disabled={loading || !result?.hasEarlier} onClick={() => {\n const beforeSeq = result?.turns[0]?.startSeq\n if (beforeSeq !== undefined) setRequest({ sessionId, beforeSeq })\n }}>{t('history.earlier')}</button>\n <button type=\"button\" disabled={loading || !result?.hasLater} onClick={() => {\n const afterSeq = result?.turns.at(-1)?.startSeq\n if (afterSeq !== undefined) setRequest({ sessionId, afterSeq })\n }}>{t('history.later')}</button>\n </div>\n {selection === undefined ? <p className={styles.historyHint}>{t('history.selectHint')}</p> : (\n <div className={styles.historySelection}>\n <strong>{t('history.selected', { first: selection.turns[0]?.turn, last: selection.turns.at(-1)?.turn })}</strong>\n <div className={styles.historyIdentity}>{t('history.boundary', { start: selection.startSeq, end: selection.endSeq })}</div>\n <button type=\"button\" disabled={loading} onClick={() => { setRequest({ sessionId, source: selection }) }}>{t('history.review')}</button>\n {knowledge === undefined ? null : <button type=\"button\" disabled={loading || result?.kind !== 'original'} onClick={() => {\n knowledge.create({ kind: 'discussion', sessionId, startSeq: selection.startSeq, endSeq: selection.endSeq })\n }}>{t('knowledge.create')}</button>}\n {knowledge === undefined ? null : <button type=\"button\" disabled={loading || result?.kind !== 'original'} onClick={() => {\n knowledge.extract({ kind: 'discussion', sessionId, startSeq: selection.startSeq, endSeq: selection.endSeq })\n }}>{t('extract.title')}</button>}\n {reuse === undefined ? null : <><button type=\"button\" disabled={loading || result?.kind !== 'original' || selection.turns.length !== 1} onClick={() => {\n reuse.add({ kind: 'turn', sessionId, startSeq: selection.startSeq, endSeq: selection.endSeq },\n `${sessionId} · ${t('history.turn', { turn: selection.turns[0]!.turn })}`)\n }}>{t('reuse.addTurn')}</button>{selection.turns.length !== 1 ? <p>{t('reuse.singleTurn')}</p> : null}</>}\n <button type=\"button\" onClick={() => {\n setSelection(undefined)\n setIncompleteRange(false)\n }}>{t('history.clear')}</button>\n </div>\n )}\n {incompleteRange ? <p role=\"status\">{t('history.incompleteRange')}</p> : null}\n {result?.turns.map(turn => (\n <article key={turn.startSeq}>\n <h3>{t('history.turn', { turn: turn.turn })}</h3>\n <label>\n <input type=\"checkbox\" disabled={loading || turn.endSeq === null || result.kind !== 'original'}\n checked={selection !== undefined && turn.startSeq >= selection.startSeq && turn.startSeq <= selection.endSeq}\n onChange={() => { select(turn) }} />\n {t('history.selectTurn', { turn: turn.turn })}\n </label>\n {turn.endSeq === null ? <p>{t('history.unfinished')}</p> : null}\n {turn.messages.map(message => (\n <div key={message.seq} className={message.seq === highlightSeq ? styles.historyMatch : undefined}>\n <strong>{t(message.role === 'user' ? 'history.user' : 'history.assistant')}</strong>\n <p className={styles.historyText}>{message.text}</p>\n </div>\n ))}\n </article>\n ))}\n </section>\n )\n}\n","/**\n * Deterministic top-to-bottom forest layout over the derived session graph.\n * Fixed metrics only — no measurement or graph-layout dependency: leaves consume\n * columns in depth-first display order and each parent centers on the\n * midpoint of its first and last child column, so identical graphs lay out\n * identically.\n * @module @benz-ai-x/dsh-research-graph/src/client/layout\n */\nimport type { GraphEdge, GraphNode, SessionGraph } from './graph-model.ts'\n\n/** Node card width in px. */\nexport const NODE_W = 240\n/** Node card height in px. */\nexport const CARD_H = 56\n/** Horizontal distance between consecutive leaf columns in px. */\nexport const COL_PITCH = 280\n/** Vertical distance between consecutive depth rows in px. */\nexport const DEPTH_PITCH = 120\n/** Vertical gap between stacked cluster frames in px. */\nexport const CLUSTER_GAP = 72\n/** Vertical distance between rows of a collapsed cluster in content px. */\nexport const COLLAPSED_ROW = 64\n\n/** One positioned node card. */\nexport interface LaidOutNode {\n readonly node: GraphNode\n readonly key: string\n readonly x: number\n readonly y: number\n}\n\n/** One positioned edge with its bezier path. */\nexport interface LaidOutEdge {\n readonly edge: GraphEdge\n readonly path: string\n}\n\n/** One axis-aligned content box in canvas coordinates. */\nexport interface ContentBounds {\n readonly x: number\n readonly y: number\n readonly width: number\n readonly height: number\n}\n\n/** The positioned graph plus its complete node-card bounds. */\nexport interface LaidOutGraph extends ContentBounds {\n readonly nodes: readonly LaidOutNode[]\n readonly edges: readonly LaidOutEdge[]\n}\n\n/** Minimum bezier control-arm length in px, so narrow gaps still curve. */\nconst EDGE_BEND_MIN = 40\n\n/**\n * Measure the complete node-card bounds, including negative coordinates.\n * @param nodes - the positioned node cards.\n * @returns their axis-aligned bounds, or a zero box when empty.\n */\nexport function nodeBounds(nodes: readonly LaidOutNode[]): ContentBounds {\n if (nodes.length === 0) return { x: 0, y: 0, width: 0, height: 0 }\n const x = Math.min(...nodes.map(node => node.x))\n const y = Math.min(...nodes.map(node => node.y))\n const right = Math.max(...nodes.map(node => node.x + NODE_W))\n const bottom = Math.max(...nodes.map(node => node.y + CARD_H))\n return { x, y, width: right - x, height: bottom - y }\n}\n\n/**\n * The branch-edge path from one node's bottom-edge midpoint to the other's\n * top-edge midpoint: a vertical cubic bezier whose control arms reach half\n * the vertical gap, floored at {@link EDGE_BEND_MIN}. The curve arrives at\n * the child vertically, matching the downward arrowhead's orientation.\n * @param from - the parent node's laid position.\n * @param to - the child node's laid position.\n * @returns the SVG path data.\n */\nexport function edgePath(from: { x: number; y: number }, to: { x: number; y: number }): string {\n const startX = from.x + NODE_W / 2\n const startY = from.y + CARD_H\n const endX = to.x + NODE_W / 2\n const endY = to.y\n const bend = Math.max(EDGE_BEND_MIN, Math.abs(endY - startY) / 2)\n return `M ${startX} ${startY} C ${startX} ${startY + bend}, ${endX} ${endY - bend}, ${endX} ${endY}`\n}\n\n/**\n * Lay out the session graph.\n *\n * Each Session Cluster's Branch-connected Canvas Sessions are laid out in a local frame (depth\n * rows, leaves on allocated columns, parents centered on their first/last\n * child midpoint), then the cluster frames stack top to bottom in display\n * order. Each vertical allocation reserves the taller of its expanded tree\n * and collapsed column so compaction cannot overlap the following cluster. Edges curve\n * from the parent's bottom-edge midpoint to the child's top-edge midpoint\n * (see {@link edgePath}).\n * @param graph - the derived graph.\n * @returns the positioned nodes, edge paths, and canvas bounds.\n */\nexport function layoutSessionGraph(graph: SessionGraph): LaidOutGraph {\n const nodes: LaidOutNode[] = []\n\n // Lay out every cluster in its own local frame, measuring each extent.\n const frames = graph.clusters.map((cluster) => {\n let column = 0\n const local: LaidOutNode[] = []\n const xByKey = new Map<string, number>()\n const stack = [{ key: String(cluster.rootId), depth: 0, exit: false }]\n let entry = stack.pop()\n while (entry !== undefined) {\n const { key, depth } = entry\n const node = graph.nodes.get(key)\n if (node === undefined) throw new Error(`session-graph layout: node \"${key}\" referenced but not derived`)\n const children = graph.children.get(key) ?? []\n if (!entry.exit) {\n stack.push({ key, depth, exit: true })\n for (let index = children.length - 1; index >= 0; index -= 1) {\n stack.push({ key: children[index]!, depth: depth + 1, exit: false })\n }\n } else {\n const x = children.length === 0\n ? column++ * COL_PITCH\n : (xByKey.get(children[0]!)! + xByKey.get(children[children.length - 1]!)!) / 2\n xByKey.set(key, x)\n local.push({ node, key, x, y: depth * DEPTH_PITCH })\n }\n entry = stack.pop()\n }\n // Every cluster contributes at least its root or throws.\n const expandedHeight = Math.max(...local.map(entry => entry.y)) + CARD_H\n const compactHeight = (cluster.memberIds.length - 1) * COLLAPSED_ROW + CARD_H\n return { local, stackHeight: Math.max(expandedHeight, compactHeight) }\n })\n\n // Stack the cluster frames top to bottom in display order.\n let offsetY = 0\n for (const frame of frames) {\n for (const entry of frame.local) {\n nodes.push({ ...entry, y: entry.y + offsetY })\n }\n offsetY += frame.stackHeight + CLUSTER_GAP\n }\n\n const byKey = new Map(nodes.map(laid => [laid.key, laid]))\n const edges: LaidOutEdge[] = []\n for (const edge of graph.edges) {\n const from = byKey.get(edge.from)\n const to = byKey.get(edge.to)\n if (from === undefined || to === undefined) {\n throw new Error(`session-graph layout: edge \"${edge.id}\" endpoint not laid out`)\n }\n edges.push({ edge, path: edgePath(from, to) })\n }\n\n return { nodes, edges, ...nodeBounds(nodes) }\n}\n\n/**\n * Re-derive every edge path from the supplied node positions. An edge whose\n * endpoint is not in the node set, or that the caller flags to keep, passes\n * through with its path untouched.\n * @param edges - the edges to redraw.\n * @param byKey - the supplied node positions keyed by node id.\n * @param keepPath - predicate marking edges to pass through untouched.\n * @returns the edges with redrawn paths.\n */\nexport function redrawEdges(\n edges: readonly LaidOutEdge[],\n byKey: ReadonlyMap<string, LaidOutNode>,\n keepPath: (from: LaidOutNode, to: LaidOutNode) => boolean,\n): LaidOutEdge[] {\n return edges.map(({ edge, path }): LaidOutEdge => {\n const from = byKey.get(edge.from)\n const to = byKey.get(edge.to)\n if (from === undefined || to === undefined || keepPath(from, to)) {\n return { edge, path }\n }\n return { edge, path: edgePath(from, to) }\n })\n}\n\n/**\n * Overlay manually dragged positions onto an auto layout: every node with a\n * stored position moves there, the edge paths re-derive from the new\n * endpoints, and the node-card bounds re-derive from the complete result.\n * Unknown ids in the stored map are ignored (their sessions left the scope).\n * @param laid - the auto-laid-out graph.\n * @param positions - manually dragged positions keyed by session id.\n * @returns the laid-out graph with the manual positions applied.\n */\nexport function applyPositions(\n laid: LaidOutGraph,\n positions: Readonly<Record<string, { x: number; y: number }>>,\n): LaidOutGraph {\n const known = new Set(laid.nodes.map(node => node.key))\n const overrides = new Map(\n Object.entries(positions).filter(([key]) => known.has(key)),\n )\n if (overrides.size === 0) return laid\n const nodes = laid.nodes.map((laidNode) => {\n const moved = overrides.get(laidNode.key)\n return moved === undefined ? laidNode : { ...laidNode, x: moved.x, y: moved.y }\n })\n const byKey = new Map(nodes.map(node => [node.key, node]))\n const edges = redrawEdges(laid.edges, byKey, () => false)\n return {\n nodes,\n edges,\n ...nodeBounds(nodes),\n }\n}\n","/**\n * Pure cluster-frame geometry, collapse layout, and whole-cluster offsets\n * over the laid-out graph: the frame box around each cluster's laid-out node\n * positions, the compact column a collapsed cluster stacks into, the offset\n * a dragged cluster carries, and the palette cycle that colors frames by\n * cluster order.\n * @module @benz-ai-x/dsh-research-graph/src/client/clusters\n */\nimport type { ClusterInfo } from './graph-model.ts'\nimport type { ContentBounds, LaidOutGraph, LaidOutNode } from './layout.ts'\nimport { CARD_H, COLLAPSED_ROW, NODE_W, nodeBounds, redrawEdges } from './layout.ts'\n\n/** Frame inset around the member nodes in content px. */\nexport const FRAME_PAD = 16\n/** Frame title-band height in content px. */\nexport const FRAME_TITLE_H = 32\n/** Alias token names cycled across clusters for frame accents. */\nexport const CLUSTER_COLORS: readonly string[] = [\n '--dsw-alias-brand-primary',\n '--dsw-alias-state-business-primary',\n '--dsw-alias-state-success-primary',\n '--dsw-alias-state-warn-primary',\n '--dsw-alias-state-error-primary',\n]\n/** Dot color for sessions with no cluster (isolated roots). */\nexport const NEUTRAL_DOT = '--dsw-alias-label-dimmed'\n\n/** One rendered cluster frame box. */\nexport interface LaidOutFrame {\n readonly clusterId: string\n readonly label: string\n readonly x: number\n readonly y: number\n readonly width: number\n readonly height: number\n readonly collapsed: boolean\n /** Palette index into {@link CLUSTER_COLORS}. */\n readonly colorIndex: number\n}\n\n/**\n * Compute the frame boxes for the laid-out clusters from the supplied node\n * positions. Every cluster frames — isolated singletons included — so every\n * session sits inside a named, draggable group; a collapsed cluster frames\n * only its compact column, and a cluster whose root matches no laid-out\n * node (a stale reference) is skipped.\n * @param laid - the laid-out graph (collapse already applied).\n * @param clusters - the derived cluster partitioning.\n * @param collapsed - the collapsed cluster root ids.\n * @returns the frame boxes in cluster order.\n */\nexport function clusterFrames(\n laid: LaidOutGraph,\n clusters: readonly ClusterInfo[],\n collapsed: ReadonlySet<string> = new Set(),\n): LaidOutFrame[] {\n const frames: LaidOutFrame[] = []\n const byCluster = new Map<string, LaidOutNode[]>()\n for (const node of laid.nodes) {\n const members = byCluster.get(node.node.clusterId)\n if (members === undefined) byCluster.set(node.node.clusterId, [node])\n else members.push(node)\n }\n let colorIndex = 0\n for (const cluster of clusters) {\n const members = byCluster.get(cluster.rootId) ?? []\n if (members.length === 0) continue\n const minX = Math.min(...members.map(node => node.x))\n const maxX = Math.max(...members.map(node => node.x + NODE_W))\n const minY = Math.min(...members.map(node => node.y))\n const maxY = Math.max(...members.map(node => node.y + CARD_H))\n frames.push({\n clusterId: cluster.rootId,\n label: cluster.label,\n x: minX - FRAME_PAD,\n y: minY - FRAME_PAD - FRAME_TITLE_H,\n width: maxX - minX + 2 * FRAME_PAD,\n height: maxY - minY + 2 * FRAME_PAD + FRAME_TITLE_H,\n collapsed: collapsed.has(cluster.rootId),\n colorIndex,\n })\n colorIndex = (colorIndex + 1) % CLUSTER_COLORS.length\n }\n return frames\n}\n\n/**\n * Measure the visible canvas content, including node cards and cluster frames.\n * @param laid - the graph's complete node-card bounds.\n * @param frames - the rendered cluster frames.\n * @returns the union bounds used by Fit and the minimap.\n */\nexport function contentBounds(\n laid: LaidOutGraph,\n frames: readonly LaidOutFrame[],\n): ContentBounds {\n const boxes: readonly ContentBounds[] = [laid, ...frames]\n const x = Math.min(...boxes.map(box => box.x))\n const y = Math.min(...boxes.map(box => box.y))\n const right = Math.max(...boxes.map(box => box.x + box.width))\n const bottom = Math.max(...boxes.map(box => box.y + box.height))\n return { x, y, width: right - x, height: bottom - y }\n}\n\n/**\n * Overlay whole-cluster drag offsets onto a laid-out graph: every member of\n * an offset cluster shifts by the delta, the intra-cluster edge paths\n * re-derive from the shifted endpoints, and the node-card bounds re-derive\n * from the complete result. Unknown cluster ids and zero deltas are ignored;\n * the input graph is returned untouched when nothing moves.\n * @param laid - the laid-out graph (positions and collapse already applied).\n * @param offsets - whole-cluster drag deltas keyed by cluster root id.\n * @returns the laid-out graph with the cluster offsets applied.\n */\nexport function applyOffsets(\n laid: LaidOutGraph,\n offsets: Readonly<Record<string, { dx: number; dy: number }>>,\n): LaidOutGraph {\n const active = new Map(\n Object.entries(offsets).filter(([, offset]) => offset.dx !== 0 || offset.dy !== 0),\n )\n if (active.size === 0) return laid\n if (!laid.nodes.some(node => active.has(node.node.clusterId))) return laid\n const nodes = laid.nodes.map((node): LaidOutNode => {\n const offset = active.get(node.node.clusterId)\n if (offset === undefined) return node\n return { ...node, x: node.x + offset.dx, y: node.y + offset.dy }\n })\n const byKey = new Map(nodes.map(node => [node.key, node]))\n const edges = redrawEdges(laid.edges, byKey, (from, to) =>\n !active.has(from.node.clusterId) && !active.has(to.node.clusterId))\n return {\n nodes,\n edges,\n ...nodeBounds(nodes),\n }\n}\n\n/**\n * Re-lay the members of every collapsed cluster into one compact column at\n * that cluster's laid-out node-bounds origin and drop its intra-cluster edges;\n * uncollapsed clusters keep their positions. The input graph is returned\n * untouched when nothing is collapsed.\n * @param laid - the laid-out graph.\n * @param clusters - the derived cluster partitioning (member order pins the\n * compact stacking order).\n * @param collapsed - the collapsed cluster root ids.\n * @returns the collapsed layout.\n */\nexport function applyCollapse(\n laid: LaidOutGraph,\n clusters: readonly ClusterInfo[],\n collapsed: ReadonlySet<string>,\n): LaidOutGraph {\n if (collapsed.size === 0) return laid\n // Rows follow the cluster's member order (root first), not the layout's\n // post-order node array.\n const rowOfKey = new Map<string, number>()\n for (const cluster of clusters) {\n if (!collapsed.has(cluster.rootId)) continue\n cluster.memberIds.forEach((memberId, index) => { rowOfKey.set(memberId, index) })\n }\n const origins = new Map<string, { x: number; y: number }>()\n for (const node of laid.nodes) {\n if (!collapsed.has(node.node.clusterId)) continue\n const origin = origins.get(node.node.clusterId)\n origins.set(node.node.clusterId, {\n x: Math.min(origin?.x ?? node.x, node.x),\n y: Math.min(origin?.y ?? node.y, node.y),\n })\n }\n const nodes = laid.nodes.map((node): LaidOutNode => {\n const row = rowOfKey.get(node.key)\n const origin = origins.get(node.node.clusterId)\n if (row === undefined || origin === undefined) return node\n return {\n ...node,\n x: origin.x,\n y: origin.y + row * COLLAPSED_ROW,\n }\n })\n if (!laid.nodes.some(node => rowOfKey.has(node.key))) return laid\n const byKey = new Map(nodes.map(node => [node.key, node]))\n const retained = laid.edges.filter(({ edge }) => {\n const from = byKey.get(edge.from)\n return edge.kind !== 'branch'\n || from === undefined\n || !collapsed.has(from.node.clusterId)\n })\n const edges = redrawEdges(retained, byKey, () => false)\n return { nodes, edges, ...nodeBounds(nodes) }\n}\n","/**\n * Pure derivation of the scope-bound Session Graph from the sessions-list\n * snapshot: graph-scope resolution, Session Cluster partitioning, Branch\n * edge rules, and Subagent Summary aggregation. Subagent Sessions\n * stay off the canvas — their presence folds into every canvas ancestor's\n * badge counts along the uninterrupted chain. React-free; the view memoizes\n * over these functions and the layout module consumes their output.\n * @module @benz-ai-x/dsh-research-graph/src/client/graph-model\n */\nimport type { SessionListState, SessionSummary } from '@deepseek-ai/dsh-api-session-controller/client'\nimport type { WorkspaceSnapshot } from '@deepseek-ai/dsh-api-workspace-controller/client'\nimport type { SessionId } from '@deepseek-ai/dsh-session/types'\nimport type { SessionMergeProjectionSource } from '../session-merge-projection.ts'\nimport type { ResearchTopicSnapshot, ResearchTopicSource } from '../research-topic.ts'\nimport type { SessionArrangementIdentity } from './layout-store.ts'\nimport type { KnowledgeCard } from '../knowledge.ts'\nimport type { SessionDiscussionSource } from '../session-history.ts'\n\n/**\n * The graph scope the view renders. Formal Workspace membership follows the\n * host's own rule — `sessionIds` accounting is authoritative — with two display-only\n * extensions: same-cwd rows join the member set (a directory's work shows\n * together even when the host accounts it separately), and an unaccounted\n * cwd yields a label-less bucket rather than no graph at all.\n */\ninterface GraphScopeBase {\n /** Workspace title, or undefined for a Directory Scope. */\n readonly label: string | undefined\n /** Canonical directory path of the scope. */\n readonly path: string\n /** Stable persistence identity for this scope's Session Arrangement. */\n readonly arrangement: SessionArrangementIdentity\n /** Member session ids (archived rows already excluded). */\n readonly members: ReadonlySet<SessionId>\n}\n\n/** A named graph scope resolved from Harness Workspace membership or path. */\nexport interface WorkspaceGraphScope extends GraphScopeBase {\n readonly kind: 'workspace'\n readonly label: string\n readonly workspaceId: string\n}\n\n/** An unnamed graph scope resolved only from the Viewed Session's directory. */\nexport interface DirectoryGraphScope extends GraphScopeBase {\n readonly kind: 'directory'\n readonly label: undefined\n}\n\n/** The Workspace Scope or Directory Scope rendered for one Viewed Session. */\nexport type GraphScope = WorkspaceGraphScope | DirectoryGraphScope\n\n/** Display facts shared by both kinds of canvas node. */\ninterface GraphNodeBase {\n readonly id: string\n readonly clusterId: string\n readonly title: string\n readonly updatedAt: number\n}\n\n/** One canvas node: a visible session with its folded subagent badge totals. */\nexport interface SessionGraphNode extends GraphNodeBase {\n readonly kind?: 'session'\n readonly id: SessionId\n /** Owning cluster's root session id. */\n readonly clusterId: SessionId\n readonly blank: boolean\n readonly displayStatus: DisplayStatus | undefined\n readonly viewed: boolean\n /** Subagent descendants reachable through an uninterrupted subagent-origin chain. */\n readonly subagentCount: number\n readonly runningSubagents: number\n /** The parent Canvas Session id for an attached Branch. */\n readonly branchFrom: SessionId | undefined\n /** Captured source snapshots when this node is an explicit Merge Session. */\n readonly mergeSources: readonly SessionMergeProjectionSource[]\n /** Present only for an explicit Research Topic reference. */\n readonly topicSource?: ResearchTopicSource\n readonly retainedSource?: SessionDiscussionSource\n}\n\n/** Knowledge nodes have card identities and cannot be passed to Session actions. */\nexport interface KnowledgeGraphNode extends GraphNodeBase {\n readonly kind: 'knowledge'\n readonly id: `card:${string}`\n readonly card: KnowledgeCard\n}\nexport type GraphNode = SessionGraphNode | KnowledgeGraphNode\n\n/** The one activity label presented when source activity facts overlap. */\nexport type DisplayStatus = 'running' | 'waiting-input' | 'completed'\n\n/** One typed relationship between two Canvas Sessions. */\nexport interface GraphEdge {\n readonly id: string\n readonly kind: 'branch' | 'merge' | 'source'\n readonly from: string\n readonly to: string\n}\n\n/**\n * One Session Cluster: a Root Session, its Branch descendants, and the\n * folded Subagent Session chains summarized under those Canvas Sessions.\n * Isolated Canvas Sessions form single-member clusters.\n */\nexport interface ClusterInfo {\n readonly rootId: string\n readonly label: string\n readonly memberIds: readonly string[]\n}\n\n/** The derived graph: cluster partitioning plus the canvas node forest. */\nexport interface SessionGraph<Node extends GraphNode = GraphNode> {\n /** Clusters in display order (root recency descending, id tiebreak). */\n readonly clusters: readonly ClusterInfo[]\n /** Canvas node data keyed by session id. */\n readonly nodes: ReadonlyMap<string, Node>\n /** Attached Branch children in display order (updatedAt descending, id tiebreak). */\n readonly children: ReadonlyMap<string, readonly string[]>\n readonly edges: readonly GraphEdge[]\n /** Count of Canvas Sessions in the graph scope. */\n readonly sessionCount: number\n}\n\n/**\n * Resolve the graph scope the graph of one Viewed Session renders.\n * Preference order: the workspace accounting the session in `sessionIds`,\n * then a workspace whose path equals the session cwd, then a cwd-only\n * bucket. Archived rows never join the member set. A session with neither\n * membership nor cwd has no scope (the view shows its empty state).\n * @param sessionId - the viewed session.\n * @param list - the sessions-list snapshot.\n * @param workspaces - the workspaces-list snapshot.\n * @returns the scope, or undefined when unresolvable.\n */\nexport function resolveGraphScope(\n sessionId: SessionId,\n list: SessionListState,\n workspaces: WorkspaceSnapshot,\n): GraphScope | undefined {\n const viewed = list.byId[sessionId]\n const byAccounting = workspaces.items.find(workspace => workspace.sessionIds.includes(sessionId))\n const byCwd = viewed?.cwd !== undefined\n ? workspaces.items.find(workspace => workspace.path === viewed.cwd)\n : undefined\n const workspace = byAccounting ?? byCwd\n const path = workspace?.path ?? viewed?.cwd\n if (path === undefined) return undefined\n const archived = new Set(workspaces.archivedSessionIds)\n const accounted = new Set(workspace?.sessionIds)\n const members = new Set<SessionId>()\n for (const row of Object.values(list.byId)) {\n if (archived.has(row.id)) continue\n if (workspace !== undefined\n ? accounted.has(row.id) || row.cwd === workspace.path\n : row.cwd === path) {\n members.add(row.id)\n }\n }\n if (workspace === undefined) {\n return {\n kind: 'directory',\n label: undefined,\n path,\n arrangement: { key: path, legacyKey: undefined },\n members,\n }\n }\n return {\n kind: 'workspace',\n label: workspace.title,\n workspaceId: workspace.workspaceId,\n path,\n arrangement: { key: `workspace:${workspace.workspaceId}`, legacyKey: path },\n members,\n }\n}\n\n/** Badge totals indexed under every canvas ancestor an uninterrupted subagent chain reaches. */\ninterface BadgeSummary {\n count: number\n runningCount: number\n}\n\n/**\n * Index subagent badge totals over the visible rows. Semantics match the\n * runtime's `indexSubagentDescendants`: a descendant credits every ancestor\n * it reaches through an uninterrupted Subagent Derivation chain, and a\n * Branch terminates propagation (a Branch child's subagents belong to that\n * Branch's own subtree). Cycles fail soft via the seen set.\n * @param visible - the visible session rows keyed by id.\n * @returns badge and running totals keyed by ancestor id.\n */\nfunction indexBadges(\n visible: ReadonlyMap<SessionId, SessionSummary>,\n): ReadonlyMap<SessionId, BadgeSummary> {\n const indexed = new Map<SessionId, BadgeSummary>()\n for (const descendant of visible.values()) {\n if (descendant.origin !== 'subagent') continue\n const seen = new Set<SessionId>()\n let current: SessionSummary | undefined = descendant\n /* jscpd:ignore-start — deliberate semantic twin of the runtime's\n indexSubagentDescendants walk: the client bundle purity gate forbids\n the cross-plugin value import, and the badge semantics must stay\n pinned to the runtime's chain-walk shape. */\n while (current?.origin === 'subagent' && current.parentId !== undefined\n && !seen.has(current.id)) {\n seen.add(current.id)\n const badge = indexed.get(current.parentId)\n if (badge === undefined) {\n indexed.set(current.parentId, { count: 1, runningCount: descendant.running ? 1 : 0 })\n } else {\n badge.count += 1\n if (descendant.running) badge.runningCount += 1\n }\n current = visible.get(current.parentId)\n }\n /* jscpd:ignore-end */\n }\n return indexed\n}\n\n/** Display order: updatedAt descending, then id ascending as the deterministic tiebreak. */\nfunction byRecency(a: SessionSummary, b: SessionSummary): number {\n // Map-keyed ids are unique, so the tiebreak never sees equal ids.\n return b.updatedAt - a.updatedAt || (a.id < b.id ? -1 : 1)\n}\n\n/**\n * Derive the session graph for one scope.\n *\n * Rules: blank rows are excluded except the Viewed Session; subagent-origin\n * rows never render as canvas nodes (they fold into ancestor badges); a\n * Branch edge requires the parent to be a visible Canvas Session (a Branch\n * taken inside a Subagent Session renders as a new Root Session); every\n * canvas node carries the badge totals of its own uninterrupted subagent\n * chain. Session Clusters partition Canvas Sessions by Root Session.\n * @param list - the sessions-list snapshot.\n * @param scope - the resolved graph scope, or undefined for the empty state.\n * @param viewedId - the Viewed Session (kept when blank, highlighted).\n * @param pendingInteractions - pending UI interactions keyed by Session id.\n * @returns the derived graph.\n */\nexport function deriveSessionGraph(\n list: SessionListState,\n scope: GraphScope | undefined,\n viewedId: SessionId | undefined,\n pendingInteractions: ReadonlyMap<SessionId, unknown>,\n): SessionGraph<SessionGraphNode> {\n const visible = new Map<SessionId, SessionSummary>()\n if (scope !== undefined) {\n for (const row of Object.values(list.byId)) {\n if (!scope.members.has(row.id)) continue\n if (row.blank && row.id !== viewedId) continue\n visible.set(row.id, row)\n }\n }\n\n return deriveRowsGraph(visible, viewedId, pendingInteractions)\n}\n\n/** Project explicit references without widening the scope-bound Canvas rules. */\nexport function deriveTopicGraph(\n snapshot: ResearchTopicSnapshot,\n list: SessionListState,\n viewedId: SessionId | undefined,\n pendingInteractions: ReadonlyMap<SessionId, unknown>,\n): SessionGraph<SessionGraphNode> {\n const sources = new Map(snapshot.sources.map(source => [source.sessionId, source]))\n const visible = new Map<SessionId, SessionSummary>()\n for (const reference of snapshot.topic.references) {\n const source = sources.get(reference.sessionId)\n const row = source?.status === 'listed' ? list.byId[reference.sessionId as SessionId] : undefined\n const parent = source?.parentSessionId\n visible.set(reference.sessionId as SessionId, {\n id: reference.sessionId as SessionId,\n displayTitle: row?.displayTitle.trim() || reference.title,\n blank: false, running: row?.running ?? false, updatedAt: row?.updatedAt ?? 0,\n ...(row?.completed === undefined ? {} : { completed: row.completed }),\n ...(parent === undefined || sources.get(parent)?.status !== 'listed' ? {} : { parentId: parent as SessionId }),\n ...(row?.projectionValues === undefined ? {} : { projectionValues: row.projectionValues }),\n })\n }\n return deriveRowsGraph(visible, viewedId, pendingInteractions, sources)\n}\n\nfunction deriveRowsGraph(\n visible: ReadonlyMap<SessionId, SessionSummary>,\n viewedId: SessionId | undefined,\n pendingInteractions: ReadonlyMap<SessionId, unknown>,\n sources?: ReadonlyMap<string, ResearchTopicSource>,\n): SessionGraph<SessionGraphNode> {\n\n const badges = indexBadges(visible)\n const nodes = new Map<string, SessionGraphNode>()\n const children = new Map<string, string[]>()\n const edges: GraphEdge[] = []\n const clusters: ClusterInfo[] = []\n const branchParent = new Map<SessionId, SessionId>()\n const branchChildren = new Map<SessionId, SessionSummary[]>()\n for (const row of visible.values()) {\n if (row.origin === 'subagent' || row.parentId === undefined) continue\n const parent = visible.get(row.parentId)\n if (parent === undefined || parent.origin === 'subagent') continue\n branchParent.set(row.id, parent.id)\n const siblings = branchChildren.get(parent.id)\n if (siblings === undefined) branchChildren.set(parent.id, [row])\n else siblings.push(row)\n }\n for (const siblings of branchChildren.values()) siblings.sort(byRecency)\n\n /** Place one member; the caller walks descendants with an explicit stack. */\n const placeMember = (row: SessionSummary, clusterRootId: SessionId, members: SessionId[]): void => {\n const badge = badges.get(row.id)\n const pending = pendingInteractions.has(row.id)\n nodes.set(row.id, {\n id: row.id,\n clusterId: clusterRootId,\n title: row.displayTitle,\n blank: row.blank,\n displayStatus: row.running ? 'running'\n : pending ? 'waiting-input'\n : row.completed === true ? 'completed' : undefined,\n viewed: row.id === viewedId,\n updatedAt: row.updatedAt,\n subagentCount: badge?.count ?? 0,\n runningSubagents: badge?.runningCount ?? 0,\n branchFrom: branchParent.get(row.id),\n mergeSources: row.projectionValues?.sessionGraphMerge?.sources ?? [],\n ...(sources?.get(row.id) === undefined ? {} : { topicSource: sources.get(row.id)! }),\n })\n members.push(row.id)\n const childKeys: string[] = []\n const branchRows = branchChildren.get(row.id) ?? []\n for (const child of branchRows) {\n childKeys.push(child.id)\n edges.push({\n id: `branch:${row.id}->${child.id}`,\n kind: 'branch',\n from: row.id,\n to: child.id,\n })\n }\n if (childKeys.length > 0) children.set(row.id, childKeys)\n }\n\n const roots = [...visible.values()]\n .filter(row => row.origin !== 'subagent' && !branchParent.has(row.id))\n .sort(byRecency)\n for (const root of roots) {\n const members: SessionId[] = []\n const pending = [root]\n let row = pending.pop()\n while (row !== undefined) {\n placeMember(row, root.id, members)\n const descendants = branchChildren.get(row.id) ?? []\n for (let index = descendants.length - 1; index >= 0; index -= 1) pending.push(descendants[index]!)\n row = pending.pop()\n }\n clusters.push({ rootId: root.id, label: root.displayTitle, memberIds: members })\n }\n\n for (const target of nodes.values()) {\n for (const source of target.mergeSources) {\n if (!nodes.has(source.sessionId)) continue\n edges.push({\n id: `merge:${source.sessionId}->${target.id}`,\n kind: 'merge',\n from: source.sessionId,\n to: target.id,\n })\n }\n }\n\n const orderedClusters = orderClustersByMerge(clusters, nodes, edges)\n\n return {\n clusters: orderedClusters,\n nodes,\n children,\n edges,\n sessionCount: nodes.size,\n }\n}\n\n/** Stable topological order: source clusters precede their Merge targets. */\nfunction orderClustersByMerge(\n clusters: readonly ClusterInfo[],\n nodes: ReadonlyMap<string, GraphNode>,\n edges: readonly GraphEdge[],\n): readonly ClusterInfo[] {\n const index = new Map(clusters.map((cluster, position) => [cluster.rootId, position]))\n const byId = new Map(clusters.map(cluster => [cluster.rootId, cluster]))\n const outgoing = new Map<string, Set<string>>()\n const indegree = new Map(clusters.map(cluster => [cluster.rootId, 0]))\n for (const edge of edges) {\n if (edge.kind !== 'merge') continue\n const from = nodes.get(edge.from)?.clusterId\n const to = nodes.get(edge.to)?.clusterId\n if (from === undefined || to === undefined || from === to) continue\n const targets = outgoing.get(from) ?? new Set<string>()\n if (targets.has(to)) continue\n targets.add(to)\n outgoing.set(from, targets)\n indegree.set(to, (indegree.get(to) ?? 0) + 1)\n }\n const ready = clusters\n .filter(cluster => indegree.get(cluster.rootId) === 0)\n .map(cluster => cluster.rootId)\n const ordered: ClusterInfo[] = []\n while (ready.length > 0) {\n const next = ready.shift()\n /* v8 ignore next -- ready is non-empty */\n if (next === undefined) break\n const cluster = byId.get(next)\n /* v8 ignore next -- ready ids come from clusters */\n if (cluster === undefined) continue\n ordered.push(cluster)\n for (const target of outgoing.get(next) ?? []) {\n const remaining = (indegree.get(target) ?? 0) - 1\n indegree.set(target, remaining)\n if (remaining !== 0) continue\n ready.push(target)\n ready.sort((left, right) => (index.get(left) ?? 0) - (index.get(right) ?? 0))\n }\n }\n return ordered.length === clusters.length ? ordered : clusters\n}\n\n/**\n * The Branch Lineage of one Canvas Session: itself, its Branch ancestors\n * up the {@link SessionGraphNode.branchFrom} chain, and its Branch descendants down\n * the tree — never siblings. The canvas emphasizes this lineage while\n * dimming the rest. Cycles fail soft via the seen set; an unknown key\n * yields an empty set.\n * @param nodes - the canvas nodes.\n * @param key - the node id to center on.\n * @returns the Branch Lineage ids.\n */\nexport function branchLineage(nodes: Iterable<GraphNode>, key: string): ReadonlySet<string> {\n const byId = new Map<string, GraphNode>()\n const childrenOf = new Map<string, string[]>()\n for (const node of nodes) {\n byId.set(node.id, node)\n if (node.kind === 'knowledge' || node.branchFrom === undefined) continue\n const list = childrenOf.get(node.branchFrom)\n if (list === undefined) childrenOf.set(node.branchFrom, [node.id])\n else list.push(node.id)\n }\n const seen = new Set<string>()\n let current = byId.get(key)\n while (current !== undefined && !seen.has(current.id)) {\n seen.add(current.id)\n current = current.kind === 'knowledge' || current.branchFrom === undefined ? undefined : byId.get(current.branchFrom)\n }\n const stack = [key]\n let next = stack.pop()\n while (next !== undefined) {\n for (const child of childrenOf.get(next) ?? []) {\n if (seen.has(child)) continue\n seen.add(child)\n stack.push(child)\n }\n next = stack.pop()\n }\n return seen\n}\n\n/**\n * The title-filter match set: ids of nodes whose title contains the query\n * (case-insensitive, surrounding whitespace ignored). A blank query yields\n * null — the filter is inactive and nothing dims; a non-blank query with\n * no hits yields an empty set (the whole canvas dims).\n * @param nodes - the canvas nodes.\n * @param query - the raw filter input.\n * @returns the matching ids, or null when the filter is inactive.\n */\nexport function matchFilter(nodes: Iterable<GraphNode>, query: string): ReadonlySet<string> | null {\n const needle = query.trim().toLowerCase()\n if (needle === '') return null\n const matched = new Set<string>()\n for (const node of nodes) {\n if (node.title.toLowerCase().includes(needle)) matched.add(node.id)\n }\n return matched\n}\n","/**\n * Session Arrangement persistence for the Session Graph, scoped by Workspace\n * identity or Directory Scope path and stored in localStorage: node positions, cluster\n * offsets, and collapsed cluster roots as one record. Reads fail soft — a\n * corrupt or foreign payload yields undefined and the view falls back to\n * the auto layout — while writes replace the whole scope record (removed\n * sessions and expanded clusters drop out on the next save). Browser storage\n * denial and quota failures are presentation failures and never break the view.\n * @module @benz-ai-x/dsh-research-graph/src/client/layout-store\n */\n\n/** One manually dragged node position in content px. */\nexport interface NodePosition {\n readonly x: number\n readonly y: number\n}\n\n/** One whole-cluster drag delta in content px. */\nexport interface ClusterOffset {\n readonly dx: number\n readonly dy: number\n}\n\n/** The persisted Session Arrangement of one graph scope. */\nexport interface LayoutState {\n readonly positions: Record<string, NodePosition>\n readonly collapsed: readonly string[]\n readonly offsets: Record<string, ClusterOffset>\n}\n\n/** The primary persistence key and optional pre-identity key for one Session Arrangement. */\nexport interface SessionArrangementIdentity {\n readonly key: string\n readonly legacyKey: string | undefined\n}\n\n/** Persisted layout payload; `v` guards future format changes. */\ninterface LayoutRecord {\n readonly v: 1\n readonly positions: Record<string, NodePosition>\n readonly collapsed?: readonly string[]\n readonly offsets?: Record<string, ClusterOffset>\n}\n\n/** localStorage key prefix shared by every scope. */\nconst KEY_PREFIX = 'dsh.session-graph.layout.'\n\nfunction storageKey(scopeKey: string): string {\n return `${KEY_PREFIX}${scopeKey}`\n}\n\n/**\n * Load the Session Arrangement of one graph scope.\n * @param scopeKey - the Workspace identity or Directory Scope path.\n * @param storage - the storage backend (localStorage in the app).\n * @returns the layout state, or undefined when absent or corrupt (the\n * caller falls back to the auto layout). Malformed entries and coordinates\n * that are not finite numbers are omitted from an otherwise valid record.\n */\nexport function loadLayout(\n scopeKey: string,\n storage?: Storage,\n): LayoutState | undefined {\n try {\n const raw = (storage ?? globalThis.localStorage).getItem(storageKey(scopeKey))\n if (raw === null) return undefined\n const parsed: unknown = JSON.parse(raw)\n if (typeof parsed !== 'object' || parsed === null) return undefined\n const { v, positions: rawPositions, collapsed, offsets: rawOffsets } = parsed as {\n v?: unknown\n positions?: unknown\n collapsed?: unknown\n offsets?: unknown\n }\n if (v !== 1 || typeof rawPositions !== 'object' || rawPositions === null) {\n return undefined\n }\n const positions: Record<string, NodePosition> = {}\n for (const [key, value] of Object.entries(rawPositions)) {\n if (typeof value !== 'object' || value === null) continue\n const { x, y } = value as { x?: unknown; y?: unknown }\n if (typeof x !== 'number' || !Number.isFinite(x)\n || typeof y !== 'number' || !Number.isFinite(y)) continue\n positions[key] = { x, y }\n }\n const collapsedIds = Array.isArray(collapsed)\n ? collapsed.filter((entry): entry is string => typeof entry === 'string')\n : []\n // Offsets joined the record later: an absent or malformed field is an\n // empty map, never a corrupt record.\n const offsets: Record<string, ClusterOffset> = {}\n if (typeof rawOffsets === 'object' && rawOffsets !== null) {\n for (const [key, value] of Object.entries(rawOffsets)) {\n if (typeof value !== 'object' || value === null) continue\n const { dx, dy } = value as { dx?: unknown; dy?: unknown }\n if (typeof dx !== 'number' || !Number.isFinite(dx)\n || typeof dy !== 'number' || !Number.isFinite(dy)) continue\n offsets[key] = { dx, dy }\n }\n }\n return { positions, collapsed: collapsedIds, offsets }\n } catch {\n // A corrupt payload is display data, not authority: the auto layout\n // replaces it on the next save.\n return undefined\n }\n}\n\n/**\n * Replace the Session Arrangement of one graph scope.\n * @param scopeKey - the Workspace identity or Directory Scope path.\n * @param state - the complete layout state to persist.\n * @param storage - the storage backend (localStorage in the app).\n */\nexport function saveLayout(\n scopeKey: string,\n state: LayoutState,\n storage?: Storage,\n): void {\n try {\n const record: LayoutRecord = {\n v: 1,\n positions: { ...state.positions },\n collapsed: [...state.collapsed],\n offsets: { ...state.offsets },\n }\n const backend = storage ?? globalThis.localStorage\n backend.setItem(\n storageKey(scopeKey),\n JSON.stringify(record),\n )\n } catch {\n // The live arrangement remains usable even when persistence is denied or full.\n }\n}\n\n/**\n * Load a Session Arrangement through its scope identity. When a named\n * Workspace has no identity-keyed record yet, copy a valid legacy path-keyed\n * record into that identity and leave the legacy record recoverable.\n * @param identity - the graph scope's current and optional legacy keys.\n * @param storage - the storage backend (localStorage in the app).\n * @returns the current or migrated arrangement, or undefined when neither is valid.\n */\nexport function loadArrangement(\n identity: SessionArrangementIdentity,\n storage?: Storage,\n): LayoutState | undefined {\n const identified = loadLayout(identity.key, storage)\n if (identified !== undefined || identity.legacyKey === undefined) return identified\n const legacy = loadLayout(identity.legacyKey, storage)\n if (legacy !== undefined) saveLayout(identity.key, legacy, storage)\n return legacy\n}\n","/** Screen-space rectangle used to anchor a hover preview. */\nexport interface PreviewAnchor {\n readonly x: number\n readonly y: number\n readonly width: number\n readonly height: number\n}\n\n/** Screen-space size in CSS pixels. */\nexport interface PreviewSize {\n readonly width: number\n readonly height: number\n}\n\n/** One resolved preview position and the side it occupies. */\nexport interface PreviewPlacement {\n readonly x: number\n readonly y: number\n readonly side: 'right' | 'left' | 'bottom' | 'top'\n}\n\n/** Canvas edges unavailable to a preview, in screen px. */\nexport interface PreviewInsets {\n readonly top: number\n readonly right: number\n readonly bottom: number\n readonly left: number\n}\n\n/** Inputs for placing a Canvas Session hover preview. */\nexport interface PreviewPlacementInput {\n readonly anchor: PreviewAnchor\n readonly preview: PreviewSize\n readonly surface: PreviewSize\n readonly insets?: Partial<PreviewInsets>\n}\n\n/** Place a hover preview beside its Canvas Session in screen space. */\nexport function placePreview({\n anchor, preview, surface, insets = {},\n}: PreviewPlacementInput): PreviewPlacement {\n const topBound = insets.top ?? 12\n const leftBound = insets.left ?? 12\n const rightBound = surface.width - (insets.right ?? 12)\n const bottomBound = surface.height - (insets.bottom ?? 12)\n const right = anchor.x + anchor.width + 12\n const y = Math.min(\n Math.max(anchor.y, topBound),\n Math.max(topBound, bottomBound - preview.height),\n )\n if (right + preview.width <= rightBound) {\n return {\n x: right,\n y,\n side: 'right',\n }\n }\n const left = anchor.x - preview.width - 12\n if (left >= leftBound) {\n return {\n x: left,\n y,\n side: 'left',\n }\n }\n const centeredX = anchor.x + (anchor.width - preview.width) / 2\n const x = Math.min(\n Math.max(centeredX, leftBound),\n Math.max(leftBound, rightBound - preview.width),\n )\n const bottom = anchor.y + anchor.height + 12\n if (bottom + preview.height <= bottomBound) {\n return { x, y: bottom, side: 'bottom' }\n }\n return {\n x,\n y: Math.max(topBound, anchor.y - preview.height - 12),\n side: 'top',\n }\n}\n","/**\n * Drag-alignment snapping: while a node is dragged, its left and top edges\n * snap to the left and top edges of nearby nodes, and the canvas shows the\n * corresponding alignment guides. React-free; GraphCanvas feeds every drag\n * move through {@link snapPosition} so the threshold behavior is pinned by\n * unit tests.\n * @module @benz-ai-x/dsh-research-graph/src/client/snap\n */\n\n/** The snapped position plus the alignment guides to display. */\nexport interface SnapResult {\n readonly x: number\n readonly y: number\n /** Vertical guide position (the snapped left edge), or null when unsnapped. */\n readonly guideX: number | null\n /** Horizontal guide position (the snapped top edge), or null when unsnapped. */\n readonly guideY: number | null\n}\n\n/**\n * Snap one dragged top-left to the nearest node edges, each axis\n * independently: a candidate within the threshold snaps and reports its\n * guide, the nearest candidate wins, and an axis with no candidate in range\n * keeps the raw coordinate.\n * @param dragged - the raw dragged top-left in content px.\n * @param others - the other nodes' top-left positions in content px.\n * @param threshold - the snap distance in content px.\n * @returns the snapped position and active guides.\n */\nexport function snapPosition(\n dragged: { x: number; y: number },\n others: readonly { x: number; y: number }[],\n threshold: number,\n): SnapResult {\n let x = dragged.x\n let y = dragged.y\n let guideX: number | null = null\n let guideY: number | null = null\n let bestX = threshold\n let bestY = threshold\n for (const other of others) {\n const dx = Math.abs(other.x - dragged.x)\n if (dx <= bestX) {\n bestX = dx\n x = other.x\n guideX = other.x\n }\n const dy = Math.abs(other.y - dragged.y)\n if (dy <= bestY) {\n bestY = dy\n y = other.y\n guideY = other.y\n }\n }\n return { x, y, guideX, guideY }\n}\n","/** Pure presentation pipeline from automatic layout plus one Session Arrangement. */\n\nimport { applyCollapse, applyOffsets, clusterFrames, contentBounds } from './clusters.ts'\nimport type { ClusterInfo } from './graph-model.ts'\nimport { applyPositions } from './layout.ts'\nimport type { ContentBounds, LaidOutGraph } from './layout.ts'\nimport type { ClusterOffset, NodePosition } from './layout-store.ts'\nimport type { LaidOutFrame } from './clusters.ts'\n\n/** All inputs needed to project one automatic graph into its current presentation. */\nexport interface CanvasPresentationInput {\n readonly laid: LaidOutGraph\n readonly clusters: readonly ClusterInfo[]\n readonly positions: Readonly<Record<string, NodePosition>>\n readonly collapsed: ReadonlySet<string>\n readonly offsets: Readonly<Record<string, ClusterOffset>>\n}\n\n/** Current visible geometry plus the untouched automatic fit target. */\nexport interface CanvasPresentation {\n readonly shown: LaidOutGraph\n readonly frames: readonly LaidOutFrame[]\n readonly bounds: ContentBounds\n readonly automaticBounds: ContentBounds\n}\n\n/**\n * Apply the Session Arrangement in its domain order: node positions, cluster\n * collapse, then whole-cluster offsets. Frame and fit bounds are derived only\n * after the visible geometry is complete.\n */\nexport function deriveCanvasPresentation({\n laid,\n clusters,\n positions,\n collapsed,\n offsets,\n}: CanvasPresentationInput): CanvasPresentation {\n const positioned = applyPositions(laid, positions)\n const compacted = applyCollapse(positioned, clusters, collapsed)\n const shown = applyOffsets(compacted, offsets)\n const frames = clusterFrames(shown, clusters, collapsed)\n const automaticFrames = clusterFrames(laid, clusters)\n return {\n shown,\n frames,\n bounds: contentBounds(shown, frames),\n automaticBounds: contentBounds(laid, automaticFrames),\n }\n}\n","/**\n * The free-viewport canvas: a dot-grid surface with wheel-anchored zoom,\n * background-drag panning, the zoom controls (− / level / + / fit / relayout\n * / reset / locate), a title filter, and the minimap, rendering the laid-out\n * graph inside one transformed content layer. Hovering emphasizes one\n * branch lineage (or one edge's endpoints) while the rest dims; a dwell\n * opens the node detail card; drags snap to sibling edges behind alignment\n * guides; programmatic jumps glide while gestures stay immediate. Every\n * gesture resolves through the pure viewport math module.\n */\nimport clsx from 'clsx'\nimport {\n useCallback, useEffect, useId, useMemo, useRef, useState, type ReactElement,\n} from 'react'\nimport type { SessionId } from '@deepseek-ai/dsh-session/types'\nimport type { SessionDigest } from '../session-digest.ts'\nimport { SessionHistory } from './SessionHistory.tsx'\nimport { containsSessionReferenceUri } from '../session-merge.ts'\nimport { CLUSTER_COLORS } from './clusters.ts'\nimport type { ClusterInfo, DisplayStatus, GraphNode, SessionGraphNode } from './graph-model.ts'\nimport { branchLineage, matchFilter } from './graph-model.ts'\nimport {\n CARD_H, NODE_W, type ContentBounds, type LaidOutGraph, type LaidOutNode,\n} from './layout.ts'\nimport {\n type ClusterOffset, loadArrangement, saveLayout, type NodePosition,\n type SessionArrangementIdentity, type LayoutState,\n} from './layout-store.ts'\nimport type { SessionGraphKey } from './locales.ts'\nimport { placePreview } from './preview-placement.ts'\nimport { snapPosition } from './snap.ts'\nimport type { GraphViewInjected } from './GraphView.tsx'\nimport type { LaidOutFrame } from './clusters.ts'\nimport { deriveCanvasPresentation } from './canvas-presentation.ts'\nimport {\n fitViewport, initialViewport, minimapProjection, panBy, resizeViewport, zoomAt,\n} from './viewport.ts'\nimport styles from './GraphView.module.css'\nimport { loadWorkingPosition, saveWorkingPosition } from './working-position.ts'\n\n/** Screen movement below this many px stays a click, not a drag. */\nconst DRAG_THRESHOLD = 3\n\n/** Translation seat over the sessionGraph namespace. */\ntype Translate = (key: SessionGraphKey, params?: Record<string, unknown>) => string\n\ninterface MergeFailure {\n readonly code: string | undefined\n readonly stage: string | undefined\n readonly message: string\n readonly targetSessionId: SessionId | undefined\n}\n\ntype MergeRunState =\n | { readonly phase: 'idle' }\n | { readonly phase: 'submitting' }\n | { readonly phase: 'error'; readonly failure: MergeFailure }\n\n/** Preserve only the stable, user-actionable fields exposed by SessionMergeError. */\nfunction mergeFailureOf(error: unknown): MergeFailure {\n if (!(error instanceof Error)) {\n return { code: undefined, stage: undefined, message: String(error), targetSessionId: undefined }\n }\n const details = error as Error & {\n readonly code?: unknown\n readonly stage?: unknown\n readonly targetSessionId?: unknown\n }\n return {\n code: typeof details.code === 'string' ? details.code : undefined,\n stage: typeof details.stage === 'string' ? details.stage : undefined,\n message: error.message,\n targetSessionId: typeof details.targetSessionId === 'string'\n ? details.targetSessionId as SessionId\n : undefined,\n }\n}\n\nfunction mergeFailureKey(failure: MergeFailure): SessionGraphKey {\n if (failure.stage === 'validating') return 'merge.errorValidation'\n if (failure.stage === 'creating') return 'merge.errorCreating'\n if (failure.stage === 'naming') return 'merge.errorNaming'\n if (failure.stage === 'submitting') return 'merge.errorSubmitting'\n if (failure.stage === 'opening') return 'merge.errorOpening'\n return 'merge.errorUnknown'\n}\n\n/** Grid dot spacing in content px. */\nconst GRID = 24\n/** Fit-view inset in screen px. */\nconst FIT_PADDING = 48\n/** One control-button zoom step as a multiplicative factor. */\nconst CONTROL_STEP = 1.2\n/** Below this scale the card text is unreadable; the LOD pass fades it. */\nconst LOD_SCALE = 0.45\n/** Drag-alignment snap distance in screen px (scaled into content px). */\nconst SNAP_PX = 6\n/** Hover dwell in ms before the node detail card opens. */\nconst PREVIEW_DELAY = 400\n/** Node detail card width in screen px. */\nconst PREVIEW_W = 240\n/** Conservative detail-card height used for collision-free placement. */\nconst PREVIEW_H = 112\n/** Screen inset occupied by the filter and canvas controls. */\nconst PREVIEW_TOP_INSET = 56\n/** Right-side canvas inset occupied by the Selected Session inspector. */\nconst INSPECTOR_RIGHT_INSET = 444\n\n/** Restore one record key to its pre-gesture value, removing a previously absent key. */\nfunction restoreEntry<T>(\n record: Readonly<Record<string, T>>,\n key: string,\n previous: T | undefined,\n): Record<string, T> {\n if (previous !== undefined) return { ...record, [key]: previous }\n return Object.fromEntries(Object.entries(record).filter(([entryKey]) => entryKey !== key))\n}\n\n/** Localized compact relative time, bucketed exactly like the sidebar rows. */\nfunction timeLabel(updatedAt: number, now: number, t: Translate): string {\n const MIN = 60_000\n const HOUR = 3_600_000\n const DAY = 86_400_000\n const diff = Math.max(0, now - updatedAt)\n if (diff < MIN) return t('time.now')\n if (diff < HOUR) return t('time.minutes', { n: Math.floor(diff / MIN) })\n if (diff < DAY) return t('time.hours', { n: Math.floor(diff / HOUR) })\n if (diff < 30 * DAY) return t('time.days', { n: Math.floor(diff / DAY) })\n if (diff < 365 * DAY) return t('time.months', { n: Math.floor(diff / (30 * DAY)) })\n return t('time.years', { n: Math.floor(diff / (365 * DAY)) })\n}\n\n/** Translate the single Display Status derived from overlapping activity facts. */\nfunction displayStatusLabel(status: DisplayStatus | undefined, t: Translate): string {\n if (status === 'running') return t('preview.status.running')\n if (status === 'waiting-input') return t('preview.status.pending')\n if (status === 'completed') return t('preview.status.completed')\n return ''\n}\n\n/** Node pointer-gesture callbacks owned by the canvas (drag + click routing). */\ninterface NodeGestureHandlers {\n onPointerDown: (event: React.PointerEvent<HTMLElement>) => void\n onPointerMove: (event: React.PointerEvent<HTMLElement>) => void\n onPointerUp: (event: React.PointerEvent<HTMLElement>) => void\n onPointerCancel: (event: React.PointerEvent<HTMLElement>) => void\n onClick: () => void\n onDoubleClick: () => void\n}\n\n/** One Canvas Session card: title-first hierarchy, state, metadata, and terminals. */\nfunction NodeCard({\n laid, now, t, gestures, clusterColor, selected, onHoverBadge, badgeHovered,\n dimClass, onHoverNode, mergeOrder,\n}: {\n laid: LaidOutNode\n now: number\n t: Translate\n gestures: NodeGestureHandlers\n clusterColor: string\n selected: boolean\n mergeOrder: number | undefined\n onHoverBadge: (key: string | null) => void\n badgeHovered: boolean\n dimClass: string | null | undefined\n onHoverNode: (key: string | null) => void\n}) {\n const { node, key, x, y } = laid\n const session = node.kind === 'knowledge' ? undefined : node\n const source = session?.topicSource\n const badge = session !== undefined && session.subagentCount > 0\n ? `${t('node.subagents', { count: session.subagentCount })}${session.runningSubagents > 0 ? ` (${t('node.running', { count: session.runningSubagents })})` : ''}`\n : ''\n return (\n <>\n <button\n type=\"button\"\n className={clsx(\n styles.node,\n styles.sessionNode,\n node.kind === 'knowledge' ? styles.knowledgeNode : null,\n selected ? styles.nodeSelected : null,\n mergeOrder === undefined ? null : styles.nodeMergeSelected,\n session?.displayStatus === 'waiting-input' ? styles.nodePending : null,\n badgeHovered ? styles.badgeHovered : null,\n dimClass,\n )}\n style={{ left: `${x}px`, top: `${y}px` }}\n data-node-id={key}\n data-node-kind={node.kind ?? 'session'}\n data-display-status={session?.displayStatus}\n data-merge-selected={mergeOrder}\n aria-current={session?.viewed ? 'true' : undefined}\n aria-selected={selected || mergeOrder !== undefined}\n onPointerDown={gestures.onPointerDown}\n onPointerMove={gestures.onPointerMove}\n onPointerUp={gestures.onPointerUp}\n onPointerCancel={gestures.onPointerCancel}\n onClick={gestures.onClick}\n onDoubleClick={gestures.onDoubleClick}\n onMouseEnter={() => { onHoverNode(key) }}\n onMouseLeave={() => { onHoverNode(null) }}\n >\n <span\n className={clsx(styles.dot, session?.displayStatus === 'running' ? styles.dotPulse : null)}\n style={{ background: `var(${clusterColor})` }}\n />\n <span className={styles.body}>\n <span className={styles.title}>\n {session?.blank ? t('node.newSession') : node.title}\n </span>\n <span className={styles.nodeMeta}>\n {node.kind === 'knowledge' ? <span>{t('knowledge.title')} · {t(`knowledge.status.${node.card.revisions.at(-1)!.content.status}`)}</span> : null}\n <span className={clsx(styles.time, source === undefined ? null : styles.topicSourceLabel)}\n title={source?.workspace?.title || source?.cwd}>{source === undefined ? timeLabel(node.updatedAt, now, t)\n : source.workspace?.title || source.cwd || t('topic.noWorkspace')}</span>\n {source?.archived ? <span className={styles.badge}>{t('search.archived')}</span> : null}\n {source?.status === 'unavailable' ? <span className={styles.badge}>{t('topic.unavailable')}</span> : null}\n {badge !== ''\n ? (\n <span\n className={styles.badge}\n onMouseEnter={() => { onHoverBadge(key) }}\n onMouseLeave={() => { onHoverBadge(null) }}\n >\n {badge}\n </span>\n )\n : null}\n </span>\n </span>\n {mergeOrder === undefined\n ? null\n : <span className={styles.mergeSelectionOrder} aria-hidden=\"true\">{mergeOrder}</span>}\n </button>\n <span\n className={clsx(styles.nodePort, dimClass)}\n style={{ left: `${x + NODE_W / 2}px`, top: `${y}px` }}\n data-session-port={node.kind === 'knowledge' ? undefined : 'input'}\n data-port-id={`${key}:input`}\n aria-hidden=\"true\"\n />\n <span\n className={clsx(styles.nodePort, dimClass)}\n style={{ left: `${x + NODE_W / 2}px`, top: `${y + CARD_H}px` }}\n data-session-port={node.kind === 'knowledge' ? undefined : 'output'}\n data-port-id={`${key}:output`}\n aria-hidden=\"true\"\n />\n </>\n )\n}\n\n/** The Selected Session summary and its explicit navigation/Branch actions. */\ninterface ReadyDigestEntry {\n readonly digest: SessionDigest\n readonly sourceUpdatedAt: number\n}\n\ninterface DigestScrollDrag {\n readonly pointerId: number\n readonly startY: number\n readonly startScrollTop: number\n moved: boolean\n}\n\ntype DigestEntry =\n | { readonly phase: 'generating'; readonly requestId: number; readonly previous?: ReadyDigestEntry }\n | { readonly phase: 'ready'; readonly value: ReadyDigestEntry }\n | { readonly phase: 'empty'; readonly sourceUpdatedAt: number }\n | {\n readonly phase: 'error'\n readonly code?: string\n readonly message?: string\n readonly previous?: ReadyDigestEntry\n }\n\nfunction priorReady(entry: DigestEntry | undefined): ReadyDigestEntry | undefined {\n if (entry?.phase === 'ready') return entry.value\n if (entry?.phase === 'generating' || entry?.phase === 'error') return entry.previous\n return undefined\n}\n\nfunction safeDigestFailure(error: unknown): { readonly code?: string; readonly message?: string } {\n if (!(error instanceof Error)) return {}\n const code = typeof (error as Error & { code?: unknown }).code === 'string'\n ? (error as Error & { code: string }).code\n : undefined\n const message = code === 'model-route-unavailable' || code === 'invalid-model-output'\n ? error.message\n : undefined\n return {\n ...(code === undefined ? {} : { code }),\n ...(message === undefined ? {} : { message }),\n }\n}\n\nfunction digestErrorLabel(code: string | undefined, t: Translate): string {\n if (code === 'model-route-unavailable') return t('digest.errorRoute')\n if (code === 'invalid-model-output') return t('digest.errorOutput')\n return t('digest.error')\n}\n\n/** The structured, explicitly generated digest inside the Selected Session inspector. */\nfunction DigestSection({\n node, entry, now, t, onGenerate,\n}: {\n node: SessionGraphNode\n entry: DigestEntry | undefined\n now: number\n t: Translate\n onGenerate: (refresh: boolean) => void\n}): ReactElement {\n const scrollDragRef = useRef<DigestScrollDrag | null>(null)\n const ready = priorReady(entry)\n const emptyStale = entry?.phase === 'empty' && node.updatedAt > entry.sourceUpdatedAt\n const stale = (ready !== undefined && node.updatedAt > ready.sourceUpdatedAt) || emptyStale\n const renderReady = ready === undefined\n ? null\n : (\n <div\n className={styles.digestBody}\n data-testid=\"session-digest-scroll\"\n onPointerDown={(event) => {\n if (event.button !== 0\n || event.currentTarget.scrollHeight <= event.currentTarget.clientHeight) return\n event.stopPropagation()\n event.preventDefault()\n scrollDragRef.current = {\n pointerId: event.pointerId,\n startY: event.clientY,\n startScrollTop: event.currentTarget.scrollTop,\n moved: false,\n }\n if (typeof event.currentTarget.setPointerCapture === 'function') {\n event.currentTarget.setPointerCapture(event.pointerId)\n }\n }}\n onPointerMove={(event) => {\n const drag = scrollDragRef.current\n if (drag === null || drag.pointerId !== event.pointerId) return\n event.stopPropagation()\n const delta = drag.startY - event.clientY\n if (!drag.moved && Math.abs(delta) < DRAG_THRESHOLD) return\n drag.moved = true\n event.preventDefault()\n event.currentTarget.dataset.dragging = 'true'\n event.currentTarget.scrollTop = drag.startScrollTop + delta\n }}\n onPointerUp={(event) => {\n const drag = scrollDragRef.current\n if (drag === null || drag.pointerId !== event.pointerId) return\n event.stopPropagation()\n scrollDragRef.current = null\n delete event.currentTarget.dataset.dragging\n if (typeof event.currentTarget.releasePointerCapture === 'function'\n && (typeof event.currentTarget.hasPointerCapture !== 'function'\n || event.currentTarget.hasPointerCapture(event.pointerId))) {\n event.currentTarget.releasePointerCapture(event.pointerId)\n }\n }}\n onPointerCancel={(event) => {\n if (scrollDragRef.current?.pointerId !== event.pointerId) return\n event.stopPropagation()\n scrollDragRef.current = null\n delete event.currentTarget.dataset.dragging\n }}\n onLostPointerCapture={(event) => {\n if (scrollDragRef.current?.pointerId !== event.pointerId) return\n scrollDragRef.current = null\n delete event.currentTarget.dataset.dragging\n }}\n >\n <p className={styles.digestOverview}>{ready.digest.overview}</p>\n {ready.digest.keyOutcomes.length === 0\n ? null\n : (\n <div className={styles.digestGroup}>\n <div className={styles.digestGroupTitle}>{t('digest.outcomes')}</div>\n <ul>{ready.digest.keyOutcomes.map((item, index) => <li key={`${String(index)}:${item}`}>{item}</li>)}</ul>\n </div>\n )}\n {ready.digest.openItems.length === 0\n ? null\n : (\n <div className={styles.digestGroup}>\n <div className={styles.digestGroupTitle}>{t('digest.openItems')}</div>\n <ul>{ready.digest.openItems.map((item, index) => <li key={`${String(index)}:${item}`}>{item}</li>)}</ul>\n </div>\n )}\n <div className={styles.digestMeta}>\n <span>{t('digest.turns', { count: ready.digest.sourceTurnCount })}</span>\n <span>·</span>\n <span>{timeLabel(ready.digest.generatedAt, now, t)}</span>\n </div>\n </div>\n )\n\n return (\n <section\n className={styles.digestSection}\n aria-label={t('digest.title')}\n data-testid=\"session-digest-section\"\n >\n <div className={styles.digestHeader}>\n <h3 className={styles.digestTitle}>{t('digest.title')}</h3>\n <div className={styles.digestBadges}>\n {ready?.digest.generatedWhileRunning === true\n ? <span className={styles.digestSnapshot}>{t('digest.snapshot')}</span>\n : null}\n {stale ? <span className={styles.digestStale}>{t('digest.stale')}</span> : null}\n </div>\n </div>\n {entry === undefined && !node.blank\n ? (\n <div className={styles.digestEmptyState}>\n <p>{t('digest.intro')}</p>\n <button type=\"button\" className={styles.digestAction} onClick={() => { onGenerate(false) }}>\n {t('digest.generate')}\n </button>\n </div>\n )\n : null}\n {node.blank || entry?.phase === 'empty'\n ? <p className={styles.digestQuiet}>{t('digest.empty')}</p>\n : null}\n {emptyStale\n ? (\n <button type=\"button\" className={styles.digestAction} onClick={() => { onGenerate(false) }}>\n {t('digest.generate')}\n </button>\n )\n : null}\n {entry?.phase === 'generating'\n ? (\n <div className={styles.digestGenerating} role=\"status\" aria-live=\"polite\">\n <span className={styles.digestSpinner} aria-hidden=\"true\" />\n <span>{ready === undefined ? t('digest.generating') : t('digest.refreshing')}</span>\n </div>\n )\n : null}\n {renderReady}\n {entry?.phase === 'ready'\n ? (\n <button type=\"button\" className={styles.digestAction} onClick={() => { onGenerate(true) }}>\n {stale ? t('digest.refresh') : t('digest.regenerate')}\n </button>\n )\n : null}\n {entry?.phase === 'error'\n ? (\n <div\n className={styles.digestFailure}\n role=\"alert\"\n data-error-code={entry.code}\n title={entry.message}\n >\n <span>{digestErrorLabel(entry.code, t)}</span>\n <button type=\"button\" className={styles.digestAction} onClick={() => { onGenerate(ready !== undefined) }}>\n {t('digest.retry')}\n </button>\n </div>\n )\n : null}\n </section>\n )\n}\n\nfunction SelectedSessionPanel({\n node, branchedFrom, mergeSourceTitles, now, t, onOpen, onBranch, onGenerateDigest, onReadHistory, onClose, onAddToTopic, workingKey, onUnavailable,\n}: {\n node: SessionGraphNode | undefined\n branchedFrom: string | undefined\n mergeSourceTitles: ReadonlyMap<string, string>\n now: number\n t: Translate\n onOpen: GraphViewInjected['openSession']\n onBranch: GraphViewInjected['branchSession']\n onGenerateDigest: GraphViewInjected['generateSessionDigest']\n onReadHistory: GraphViewInjected['readSessionHistory']\n onClose: () => void\n onAddToTopic: ((id: SessionId) => void) | undefined\n workingKey: string | undefined\n onUnavailable: () => void\n}): ReactElement | null {\n const [tab, setTab] = useState<'digest' | 'history'>(() => loadWorkingPosition(workingKey).tab ?? 'digest')\n useEffect(() => { saveWorkingPosition(workingKey, { tab }) }, [workingKey, tab])\n const tabId = useId()\n const digestTab = useRef<HTMLButtonElement>(null)\n const historyTab = useRef<HTMLButtonElement>(null)\n const [branchErrorFor, setBranchErrorFor] = useState<SessionId | null>(null)\n const [digestBySession, setDigestBySession] = useState<Record<string, DigestEntry>>({})\n const activeDigestRequests = useRef(new Map<string, {\n readonly requestId: number\n readonly controller: AbortController\n }>())\n const nextDigestRequestId = useRef(0)\n const previousSelectedId = useRef<SessionId | undefined>(undefined)\n\n useEffect(() => {\n const previous = previousSelectedId.current\n const current = node?.id\n previousSelectedId.current = current\n if (previous === undefined || previous === current) return\n const active = activeDigestRequests.current.get(previous)\n if (active === undefined) return\n active.controller.abort()\n activeDigestRequests.current.delete(previous)\n setDigestBySession(entries => {\n const entry = entries[previous]\n if (entry?.phase !== 'generating' || entry.requestId !== active.requestId) return entries\n const next = { ...entries }\n if (entry.previous === undefined) delete next[previous]\n else next[previous] = { phase: 'ready', value: entry.previous }\n return next\n })\n }, [node?.id])\n\n useEffect(() => () => {\n for (const active of activeDigestRequests.current.values()) active.controller.abort()\n activeDigestRequests.current.clear()\n }, [])\n\n const generateDigest = useCallback((refresh: boolean): void => {\n if (node === undefined || node.blank) return\n const sessionId = node.id\n const existing = activeDigestRequests.current.get(sessionId)\n existing?.controller.abort()\n const requestId = nextDigestRequestId.current + 1\n nextDigestRequestId.current = requestId\n const controller = new AbortController()\n activeDigestRequests.current.set(sessionId, { requestId, controller })\n let previous: ReadyDigestEntry | undefined\n setDigestBySession(entries => {\n previous = priorReady(entries[sessionId])\n return {\n ...entries,\n [sessionId]: {\n phase: 'generating',\n requestId,\n ...(previous === undefined ? {} : { previous }),\n },\n }\n })\n void onGenerateDigest(sessionId, { refresh }, controller.signal)\n .then(result => {\n if (activeDigestRequests.current.get(sessionId)?.requestId !== requestId) return\n setDigestBySession(entries => ({\n ...entries,\n [sessionId]: result.kind === 'empty'\n ? { phase: 'empty', sourceUpdatedAt: node.updatedAt }\n : {\n phase: 'ready',\n value: { digest: result.digest, sourceUpdatedAt: node.updatedAt },\n },\n }))\n })\n .catch(error => {\n if (controller.signal.aborted\n || activeDigestRequests.current.get(sessionId)?.requestId !== requestId) return\n const failure = safeDigestFailure(error)\n setDigestBySession(entries => ({\n ...entries,\n [sessionId]: {\n phase: 'error',\n ...failure,\n ...(previous === undefined ? {} : { previous }),\n },\n }))\n })\n .finally(() => {\n if (activeDigestRequests.current.get(sessionId)?.requestId === requestId) {\n activeDigestRequests.current.delete(sessionId)\n }\n })\n }, [node, onGenerateDigest])\n\n if (node === undefined) return null\n const status = displayStatusLabel(node.displayStatus, t)\n return (\n <div\n className={styles.panel}\n role=\"complementary\"\n aria-label={t('panel.title')}\n data-canvas-overlay=\"\"\n data-testid=\"session-graph-panel\"\n data-working-scroll=\"\"\n >\n <div className={styles.panelHeader}>\n <div className={styles.panelHeading}>{t('panel.title')}</div>\n <button\n type=\"button\"\n className={styles.panelClose}\n aria-label={t('panel.close')}\n onClick={onClose}\n >\n ×\n </button>\n </div>\n <div className={styles.panelTitle}>{node.blank ? t('node.newSession') : node.title}</div>\n <div className={styles.panelMeta}>\n <span>{timeLabel(node.updatedAt, now, t)}</span>\n {status === ''\n ? null\n : <span className={styles.panelStatus} data-display-status={node.displayStatus}>{status}</span>}\n {node.subagentCount > 0\n ? <span>{t('panel.subagents', { count: node.subagentCount })}</span>\n : null}\n </div>\n {branchedFrom === undefined\n ? null\n : <div className={styles.panelRelation}>{t('node.branchedFrom', { name: branchedFrom })}</div>}\n {node.mergeSources.length === 0\n ? null\n : (\n <section className={styles.mergeRelations} aria-labelledby=\"session-graph-merge-sources\">\n <div id=\"session-graph-merge-sources\" className={styles.mergeRelationsTitle}>\n {t('panel.mergeSources')}\n </div>\n <ol>\n {node.mergeSources.map((source, index) => (\n <li key={source.sessionId}>\n <span className={styles.mergeSourceOrder}>{index + 1}</span>\n <span className={styles.mergeRelationSource}>\n {mergeSourceTitles.get(source.sessionId)\n ?? t('panel.mergeUnavailable', { id: source.sessionId })}\n </span>\n <span className={styles.mergeRelationSnapshot}>\n {source.capturedThroughSeq === null\n ? t('panel.mergeCompleteSnapshot')\n : t('panel.mergeCapturedThrough', { seq: source.capturedThroughSeq })}\n </span>\n </li>\n ))}\n </ol>\n </section>\n )}\n <div\n role=\"tablist\"\n aria-label={t('panel.title')}\n className={styles.historyTabs}\n onKeyDown={event => {\n let next: typeof tab\n if (event.key === 'Home') next = 'digest'\n else if (event.key === 'End') next = 'history'\n else if (event.key === 'ArrowLeft' || event.key === 'ArrowRight') {\n next = tab === 'digest' ? 'history' : 'digest'\n } else return\n event.preventDefault()\n event.stopPropagation()\n setTab(next)\n const nextTab = next === 'digest' ? digestTab : historyTab\n nextTab.current?.focus()\n }}\n >\n <button\n ref={digestTab}\n id={`${tabId}-digest`}\n type=\"button\"\n role=\"tab\"\n aria-selected={tab === 'digest'}\n aria-controls={`${tabId}-content`}\n tabIndex={tab === 'digest' ? 0 : -1}\n onClick={() => { setTab('digest') }}\n >\n {t('digest.title')}\n </button>\n <button\n ref={historyTab}\n id={`${tabId}-history`}\n type=\"button\"\n role=\"tab\"\n aria-selected={tab === 'history'}\n aria-controls={`${tabId}-content`}\n tabIndex={tab === 'history' ? 0 : -1}\n onClick={() => { setTab('history') }}\n >\n {t('history.tab')}\n </button>\n </div>\n <div id={`${tabId}-content`} role=\"tabpanel\" aria-labelledby={`${tabId}-${tab}`}>\n {tab === 'history'\n ? <SessionHistory key={node.id} sessionId={node.id} workingKey={workingKey} onUnavailable={onUnavailable} read={onReadHistory} t={t} />\n : <DigestSection\n node={node}\n entry={digestBySession[node.id]}\n now={now}\n t={t}\n onGenerate={generateDigest}\n />}\n </div>\n <div className={styles.panelActions}>\n {onAddToTopic === undefined ? null : <button type=\"button\" className={styles.panelSecondaryAction}\n onClick={() => { onAddToTopic(node.id) }}>{t('topic.add')}</button>}\n <button\n type=\"button\"\n className={styles.panelPrimaryAction}\n onClick={() => { onOpen(node.id) }}\n >\n {t('panel.open')}\n </button>\n <button\n type=\"button\"\n className={styles.panelSecondaryAction}\n onClick={() => {\n void onBranch(node.id)\n .then(() => {\n setBranchErrorFor(failedId => failedId === node.id ? null : failedId)\n })\n .catch(() => { setBranchErrorFor(node.id) })\n }}\n >\n {t('panel.branch')}\n </button>\n </div>\n {branchErrorFor === node.id\n ? <div className={styles.panelError} role=\"alert\">{t('panel.branchError')}</div>\n : null}\n </div>\n )\n}\n\n/** Minimap box size in screen px. */\nconst MINIMAP_W = 180\nconst MINIMAP_H = 120\n/** Minimap inner inset in px. */\nconst MINIMAP_PAD = 8\n\n/**\n * The bottom-right minimap: a contain-fit projection of the whole canvas\n * (cluster frames, node cards, and the live viewport rectangle). Pointing\n * or dragging on the map recenters the main viewport on the mapped content\n * point.\n * @param props - the laid graph, frames, complete content bounds, viewport,\n * view size, recenter verb, and translate seat.\n * @returns the minimap element.\n */\nfunction Minimap({\n shown, frames, bounds, viewport, viewSize, onRecenter, t,\n}: {\n shown: LaidOutGraph\n frames: readonly LaidOutFrame[]\n bounds: ContentBounds\n viewport: ReturnType<typeof initialViewport>\n viewSize: { width: number; height: number }\n onRecenter: (contentX: number, contentY: number) => void\n t: Translate\n}): ReactElement {\n const roomWidth = MINIMAP_W - 2 * MINIMAP_PAD\n const roomHeight = MINIMAP_H - 2 * MINIMAP_PAD\n const projection = minimapProjection(bounds, roomWidth, roomHeight)\n const toMapX = (x: number): number => MINIMAP_PAD + projection.offsetX + x * projection.scale\n const toMapY = (y: number): number => MINIMAP_PAD + projection.offsetY + y * projection.scale\n // The visible content region, in content coordinates.\n const view = {\n x: -viewport.panX / viewport.scale,\n y: -viewport.panY / viewport.scale,\n width: viewSize.width / viewport.scale,\n height: viewSize.height / viewport.scale,\n }\n const recenterFromEvent = (event: React.PointerEvent<SVGSVGElement>): void => {\n const rect = event.currentTarget.getBoundingClientRect()\n const mapX = event.clientX - rect.left\n const mapY = event.clientY - rect.top\n onRecenter(\n (mapX - MINIMAP_PAD - projection.offsetX) / projection.scale,\n (mapY - MINIMAP_PAD - projection.offsetY) / projection.scale,\n )\n }\n return (\n <svg\n className={styles.minimap}\n width={MINIMAP_W}\n height={MINIMAP_H}\n role=\"group\"\n aria-label={t('canvas.minimap')}\n data-testid=\"session-graph-minimap\"\n onPointerDown={(event) => {\n if (typeof event.currentTarget.setPointerCapture === 'function') {\n event.currentTarget.setPointerCapture(event.pointerId)\n }\n recenterFromEvent(event)\n }}\n onPointerMove={(event) => {\n if (event.buttons === 0) return\n recenterFromEvent(event)\n }}\n >\n {frames.map(frame => (\n <rect\n key={`f-${frame.clusterId}`}\n x={toMapX(frame.x)}\n y={toMapY(frame.y)}\n width={frame.width * projection.scale}\n height={frame.height * projection.scale}\n className={styles.minimapFrame}\n />\n ))}\n {shown.nodes.map(({ key, x, y }) => (\n <rect\n key={`n-${key}`}\n x={toMapX(x)}\n y={toMapY(y)}\n width={NODE_W_MAP}\n height={CARD_H_MAP}\n className={styles.minimapNode}\n />\n ))}\n {view.width * projection.scale < MINIMAP_W - 2 * MINIMAP_PAD - 2\n || view.height * projection.scale < MINIMAP_H - 2 * MINIMAP_PAD - 2\n ? (\n <rect\n x={toMapX(view.x)}\n y={toMapY(view.y)}\n width={view.width * projection.scale}\n height={view.height * projection.scale}\n className={styles.minimapView}\n data-testid=\"session-graph-minimap-viewport\"\n />\n )\n : null}\n </svg>\n )\n}\n\n/** Minimap node rect size in px (scaled-down card footprint). */\nconst NODE_W_MAP = 10\nconst CARD_H_MAP = 4\n\n/**\n * Render the free-viewport canvas over the laid-out graph.\n * @param laid - the auto-laid-out graph.\n * @param arrangement - the graph scope identity for Session Arrangement persistence.\n * @param now - current epoch ms for relative-time labels.\n * @param t - the namespace translate seat.\n * @param onOpen - open one session node (navigation verb).\n * @returns the canvas element.\n */\nexport function GraphCanvas({\n laid, clusters, arrangement, now, t, onOpen, onBranch, onGenerateDigest, onReadHistory,\n onMerge, onRetryMerge, topic, onAddToTopic, workingKey,\n}: {\n laid: LaidOutGraph\n clusters: readonly ClusterInfo[]\n arrangement: SessionArrangementIdentity\n now: number\n t: Translate\n onOpen: GraphViewInjected['openSession']\n onBranch: GraphViewInjected['branchSession']\n onGenerateDigest: GraphViewInjected['generateSessionDigest']\n onReadHistory: GraphViewInjected['readSessionHistory']\n onMerge: GraphViewInjected['mergeSessions']\n onRetryMerge: GraphViewInjected['retrySessionMerge']\n onAddToTopic?: (id: SessionId) => void\n topic?: {\n readonly arrangement: LayoutState\n readonly onArrange: (state: LayoutState) => void\n readonly renderInspector: (node: GraphNode | undefined, onClose: () => void, onUnavailable: () => void) => ReactElement | null\n readonly openCard?: (cardId: string) => void\n }\n workingKey?: string\n}): ReactElement {\n const [restored] = useState(() => loadWorkingPosition(workingKey))\n const surfaceRef = useRef<HTMLDivElement | null>(null)\n const [viewport, setViewport] = useState(() => restored.viewport ?? initialViewport())\n const [viewSize, setViewSize] = useState({ width: 0, height: 0 })\n const viewSizeRef = useRef(viewSize)\n useEffect(() => {\n const surface = surfaceRef.current\n if (surface === null) return\n const measure = (): void => {\n const rect = surface.getBoundingClientRect()\n const next = { width: rect.width, height: rect.height }\n const previous = viewSizeRef.current\n if (next.width === previous.width && next.height === previous.height) return\n viewSizeRef.current = next\n setViewSize(next)\n if (previous.width > 0 && previous.height > 0) {\n setViewport(current => resizeViewport(current, previous, next))\n }\n }\n measure()\n if (typeof ResizeObserver !== 'undefined') {\n const observer = new ResizeObserver(measure)\n observer.observe(surface)\n return () => { observer.disconnect() }\n }\n window.addEventListener('resize', measure)\n return () => { window.removeEventListener('resize', measure) }\n }, [])\n const dragRef = useRef<{ pointerId: number; lastX: number; lastY: number } | null>(null)\n const [positions, setPositions] = useState<Record<string, NodePosition>>({})\n const [collapsed, setCollapsed] = useState<readonly string[]>([])\n const [offsets, setOffsets] = useState<Record<string, ClusterOffset>>({})\n const [restoredArrangementKey, setRestoredArrangementKey] = useState<string | null>(null)\n const positionsRef = useRef(positions)\n positionsRef.current = positions\n const collapsedRef = useRef(collapsed)\n collapsedRef.current = collapsed\n const offsetsRef = useRef(offsets)\n offsetsRef.current = offsets\n const nodeDragRef = useRef<{\n pointerId: number\n key: string\n cluster: string\n grabX: number\n grabY: number\n startX: number\n startY: number\n moved: boolean\n previous: NodePosition | undefined\n } | null>(null)\n const clusterDragRef = useRef<{\n pointerId: number\n clusterId: string\n lastX: number\n lastY: number\n startX: number\n startY: number\n moved: boolean\n previous: ClusterOffset | undefined\n } | null>(null)\n const suppressClickRef = useRef(false)\n const [selected, setSelected] = useState<string | null>(restored.selected ?? null)\n const restoringSelection = useRef(restored.selected)\n const [unavailableSelection, setUnavailableSelection] = useState(false)\n useEffect(() => {\n if (selected === null) return\n const node = laid.nodes.find(entry => entry.key === selected)?.node\n const restoring = restoringSelection.current === selected\n restoringSelection.current = undefined\n if (node !== undefined && !(restoring && node.kind !== 'knowledge' && node.topicSource?.status === 'unavailable' && node.retainedSource === undefined)) return\n setSelected(null)\n setUnavailableSelection(true)\n }, [selected, laid])\n const [mergeMode, setMergeMode] = useState(false)\n const [mergeSources, setMergeSources] = useState<readonly SessionId[]>([])\n const [mergeInstruction, setMergeInstruction] = useState('')\n const [mergeRun, setMergeRun] = useState<MergeRunState>({ phase: 'idle' })\n const mergeRequestRef = useRef<AbortController | null>(null)\n useEffect(() => () => { mergeRequestRef.current?.abort() }, [])\n const [badgeHover, setBadgeHover] = useState<string | null>(null)\n // Alignment guides of the in-flight node drag (content px), null at rest.\n const [guides, setGuides] = useState<{ x: number | null; y: number | null } | null>(null)\n // The last cluster whose title band was grabbed: its frame paints above\n // overlapping frames (bring-to-front, the canvas convention).\n const [raisedCluster, setRaisedCluster] = useState<string | null>(null)\n // The node whose hover dwell elapsed: its detail card is showing.\n const [previewKey, setPreviewKey] = useState<string | null>(null)\n const previewTimer = useRef<number | null>(null)\n useEffect(() => () => {\n if (previewTimer.current !== null) window.clearTimeout(previewTimer.current)\n }, [])\n\n /** Cancel a pending preview and hide the visible one, if any. */\n const hidePreview = (): void => {\n if (previewTimer.current !== null) window.clearTimeout(previewTimer.current)\n previewTimer.current = null\n setPreviewKey(null)\n }\n\n /** Node hover enter: emphasize the lineage now, arm the detail card. */\n const nodeEnter = (key: string): void => {\n setHoverNode(key)\n if (selected === key) {\n hidePreview()\n return\n }\n if (previewTimer.current !== null) window.clearTimeout(previewTimer.current)\n previewTimer.current = window.setTimeout(() => { setPreviewKey(key) }, PREVIEW_DELAY)\n }\n\n /** Node hover leave: drop the emphasis and the detail card together. */\n const nodeLeave = (): void => {\n setHoverNode(null)\n hidePreview()\n }\n const [hoverNode, setHoverNode] = useState<string | null>(null)\n const [hoverEdge, setHoverEdge] = useState<string | null>(null)\n const [query, setQuery] = useState(restored.query ?? '')\n useEffect(() => { saveWorkingPosition(workingKey, { viewport, selected, query }) }, [workingKey, viewport, selected, query])\n // Set for the duration of one programmatic viewport jump (fit, locate,\n // 100%): the content layer CSS-transitions the transform. Gestures\n // (wheel, drags, minimap) never set it — they must stay immediate.\n const [animating, setAnimating] = useState(false)\n const animationTimer = useRef<number | null>(null)\n useEffect(() => () => {\n if (animationTimer.current !== null) window.clearTimeout(animationTimer.current)\n }, [])\n\n /** Mark the viewport jump that follows for a smooth CSS transition. */\n const glide = (): void => {\n setAnimating(true)\n if (animationTimer.current !== null) window.clearTimeout(animationTimer.current)\n animationTimer.current = window.setTimeout(() => { setAnimating(false) }, 280)\n }\n\n // Restore the Session Arrangement on scope entry; a corrupt or absent\n // record leaves the automatic arrangement in place.\n useEffect(() => {\n const stored = topic?.arrangement ?? loadArrangement(arrangement)\n setPositions(stored?.positions ?? {})\n setCollapsed(stored?.collapsed ?? [])\n setOffsets(stored?.offsets ?? {})\n setRestoredArrangementKey(arrangement.key)\n }, [arrangement.key, arrangement.legacyKey])\n\n const collapsedSet = useMemo(() => new Set(collapsed), [collapsed])\n // Fit once on scope entry so the whole graph is visible (manual layouts\n // fit the manual bounds, the auto grid fits its own).\n const fittedRef = useRef(false)\n useEffect(() => {\n fittedRef.current = restored.viewport !== undefined\n }, [arrangement.key])\n\n // Arrow-key navigation: move focus to the geometrically nearest node in\n // the pressed direction, following the layout as it stands.\n const moveFocus = (direction: 'left' | 'right' | 'up' | 'down'): void => {\n const active = document.activeElement?.closest('[data-node-id]') as HTMLElement | null\n const from = active !== null\n ? shown.nodes.find(entry => entry.key === active.dataset.nodeId)\n : shown.nodes.find(entry => entry.node.kind !== 'knowledge' && entry.node.viewed) ?? shown.nodes[0]\n if (from === undefined) return\n let best: { key: string; distance: number } | undefined\n for (const entry of shown.nodes) {\n if (entry.key === from.key) continue\n const dx = entry.x - from.x\n const dy = entry.y - from.y\n const aligned = direction === 'left' ? dx < -4\n : direction === 'right' ? dx > 4\n : direction === 'up' ? dy < -4\n : dy > 4\n if (!aligned) continue\n const distance = Math.hypot(dx, dy)\n if (best === undefined || distance < best.distance) best = { key: entry.key, distance }\n }\n if (best === undefined) return\n document.querySelector<HTMLElement>(`[data-node-id=\"${best.key}\"]`)?.focus()\n }\n const { shown, frames, bounds, automaticBounds } = useMemo(\n () => deriveCanvasPresentation({\n laid,\n clusters,\n positions,\n collapsed: collapsedSet,\n offsets,\n }),\n [laid, positions, clusters, collapsedSet, offsets],\n )\n const shownByKey = useMemo(() => new Map(shown.nodes.map(node => [node.key, node])), [shown])\n useEffect(() => {\n if (restoredArrangementKey !== arrangement.key || fittedRef.current) return\n // The conversation shell measures its composer after the first paint.\n // Read the resulting graph surface on the following settled frame.\n let settledFrame: number | undefined\n const layoutFrame = window.requestAnimationFrame(() => {\n settledFrame = window.requestAnimationFrame(() => {\n const rect = surfaceRef.current?.getBoundingClientRect()\n if (rect === undefined) return\n fittedRef.current = true\n setViewport(fitViewport(bounds, rect.width, rect.height, FIT_PADDING))\n })\n })\n return () => {\n window.cancelAnimationFrame(layoutFrame)\n if (settledFrame !== undefined) window.cancelAnimationFrame(settledFrame)\n }\n // bounds must not retrigger the one-shot fit after the scope changed (the\n // fittedRef guard above owns that).\n }, [arrangement.key, bounds, restoredArrangementKey])\n // One palette slot per cluster, by cluster order — the single source for\n // node dots and frame accents alike.\n const colorOfCluster = useMemo(() => {\n const map = new Map<string, string>()\n clusters.forEach((cluster, index) => {\n map.set(cluster.rootId, CLUSTER_COLORS[index % CLUSTER_COLORS.length] ?? '--dsw-alias-border-l2')\n })\n return map\n }, [clusters])\n // The incoming Branch edge names each member's Branch source.\n const branchSource = useMemo(() => {\n const titleOf = new Map(shown.nodes.map(entry => [entry.key, entry.node.title]))\n const map = new Map<string, string>()\n for (const { edge } of shown.edges) {\n if (edge.kind !== 'branch') continue\n const title = titleOf.get(edge.from)\n if (title !== undefined) map.set(edge.to, title)\n }\n return map\n }, [shown])\n\n // The title filter's match set (null while the query is blank).\n const filterMatches = useMemo(\n () => matchFilter(shown.nodes.map(entry => entry.node), query),\n [shown, query],\n )\n\n // Branch Lineage emphasis: an active filter wins, followed by transient\n // edge/node hover. Selection remains as the stable fallback when the\n // pointer leaves so the inspector and canvas tell the same story.\n const emphasis = useMemo((): {\n keys: ReadonlySet<string>\n mode: 'filter' | 'context'\n } | null => {\n if (filterMatches !== null) return { keys: filterMatches, mode: 'filter' }\n if (hoverEdge !== null) {\n const found = shown.edges.find(entry => entry.edge.id === hoverEdge)\n return found === undefined\n ? null\n : { keys: new Set([found.edge.from, found.edge.to]), mode: 'context' }\n }\n const focusKey = hoverNode ?? selected\n if (focusKey === null) return null\n const set = branchLineage(shown.nodes.map(entry => entry.node), focusKey)\n return set.size === 0 ? null : { keys: set, mode: 'context' }\n }, [filterMatches, hoverEdge, hoverNode, selected, shown])\n const dimStyle = emphasis?.mode === 'filter' ? styles.dimFilter : styles.dimContext\n const emphasizedClusters = useMemo(() => new Set(shown.nodes\n .filter(entry => emphasis?.keys.has(entry.key))\n .map(entry => entry.node.clusterId)), [shown, emphasis])\n const dimmed = (key: string): boolean => emphasis !== null && !emphasis.keys.has(key)\n const edgeDimmed = (from: string, to: string): boolean =>\n emphasis !== null && !(emphasis.keys.has(from) && emphasis.keys.has(to))\n const frameDimmed = (clusterId: string): boolean =>\n emphasis !== null && !emphasizedClusters.has(clusterId as SessionId)\n\n /** Persist one layout revision, pruned to the live node and cluster ids. */\n const persist = (\n nextPositions: Record<string, NodePosition>,\n nextCollapsed: readonly string[],\n nextOffsets: Record<string, ClusterOffset>,\n ): void => {\n const knownNodes = new Set(shown.nodes.map(node => node.key))\n const knownClusters = new Set<string>(clusters.map(cluster => cluster.rootId))\n const state: LayoutState = {\n positions: Object.fromEntries(\n Object.entries(nextPositions).filter(([key]) => knownNodes.has(key)),\n ),\n collapsed: nextCollapsed.filter(rootId => knownClusters.has(rootId)),\n offsets: Object.fromEntries(\n Object.entries(nextOffsets).filter(([key]) => knownClusters.has(key)),\n ),\n }\n if (topic === undefined) saveLayout(arrangement.key, state)\n else topic.onArrange(state)\n }\n\n const toContent = (screenX: number, screenY: number): { x: number; y: number } => {\n const rect = surfaceRef.current?.getBoundingClientRect()\n if (rect === undefined) return { x: screenX, y: screenY }\n return {\n x: (screenX - rect.left - viewport.panX) / viewport.scale,\n y: (screenY - rect.top - viewport.panY) / viewport.scale,\n }\n }\n\n const nodeGestures = (id: string, clusterId: string, originX: number, originY: number): NodeGestureHandlers => ({\n onPointerDown: (event) => {\n hidePreview()\n // A new pointer sequence cannot be the prior drag's trailing click.\n // Clear a suppression token that no browser click consumed.\n suppressClickRef.current = false\n if (mergeMode) return\n // Collapsed members are pinned to the compact column; they click but\n // never drag.\n if (collapsedSet.has(clusterId)) return\n const point = toContent(event.clientX, event.clientY)\n nodeDragRef.current = {\n pointerId: event.pointerId,\n key: id,\n cluster: clusterId,\n grabX: point.x - originX,\n grabY: point.y - originY,\n startX: event.clientX,\n startY: event.clientY,\n moved: false,\n previous: positionsRef.current[id],\n }\n if (typeof event.currentTarget.setPointerCapture === 'function') {\n event.currentTarget.setPointerCapture(event.pointerId)\n }\n },\n onPointerMove: (event) => {\n const drag = nodeDragRef.current\n if (drag === null || drag.pointerId !== event.pointerId) return\n if (!drag.moved\n && Math.hypot(event.clientX - drag.startX, event.clientY - drag.startY) < DRAG_THRESHOLD) {\n return\n }\n drag.moved = true\n const point = toContent(event.clientX, event.clientY)\n // Snap the raw landing spot to nearby node edges and show the guides.\n const snapped = snapPosition(\n { x: point.x - drag.grabX, y: point.y - drag.grabY },\n shown.nodes.filter(entry => entry.key !== drag.key),\n SNAP_PX / viewport.scale,\n )\n setGuides({ x: snapped.guideX, y: snapped.guideY })\n // The positions record lives in the cluster's local frame: the whole\n //-cluster offset applies on top at render time, so it comes off here.\n const offset = offsetsRef.current[drag.cluster]\n setPositions(current => ({\n ...current,\n [drag.key]: {\n x: snapped.x - (offset?.dx ?? 0),\n y: snapped.y - (offset?.dy ?? 0),\n },\n }))\n },\n onPointerUp: (event) => {\n const drag = nodeDragRef.current\n if (drag === null || drag.pointerId !== event.pointerId) return\n nodeDragRef.current = null\n setGuides(null)\n if (!drag.moved) return\n suppressClickRef.current = true\n persist(positionsRef.current, collapsedRef.current, offsetsRef.current)\n },\n onPointerCancel: (event) => {\n const drag = nodeDragRef.current\n if (drag === null || drag.pointerId !== event.pointerId) return\n nodeDragRef.current = null\n suppressClickRef.current = false\n setGuides(null)\n setPositions(current => restoreEntry(current, drag.key, drag.previous))\n },\n onClick: () => {\n if (suppressClickRef.current) {\n suppressClickRef.current = false\n return\n }\n hidePreview()\n if (mergeMode) {\n if (mergeRun.phase === 'submitting'\n || (mergeRun.phase === 'error' && mergeRun.failure.targetSessionId !== undefined)) return\n const node = shownByKey.get(id)?.node\n if (node === undefined || node.kind === 'knowledge') return\n setMergeSources(current => current.includes(node.id)\n ? current.filter(sourceId => sourceId !== node.id)\n : current.length < 3 ? [...current, node.id] : current)\n setMergeRun({ phase: 'idle' })\n return\n }\n setSelected(id)\n },\n onDoubleClick: () => {\n if (mergeMode) return\n const node = shownByKey.get(id)?.node\n if (node?.kind === 'knowledge') topic?.openCard?.(node.card.cardId)\n else if (node !== undefined) onOpen(node.id)\n },\n })\n\n // Wheel is non-passive so the canvas can swallow the gesture before the\n // page scrolls; React's synthetic listener cannot opt out.\n useEffect(() => {\n const surface = surfaceRef.current\n if (surface === null) return\n const onWheel = (event: WheelEvent): void => {\n if (event.target instanceof Element\n && event.target.closest('[data-canvas-overlay]') !== null) return\n event.preventDefault()\n const rect = surface.getBoundingClientRect()\n setViewport(current => zoomAt(\n current,\n event.clientX - rect.left,\n event.clientY - rect.top,\n event.deltaY < 0 ? CONTROL_STEP : 1 / CONTROL_STEP,\n ))\n }\n surface.addEventListener('wheel', onWheel, { passive: false })\n return () => { surface.removeEventListener('wheel', onWheel) }\n }, [])\n\n const onPointerDown = useCallback((event: React.PointerEvent<HTMLDivElement>): void => {\n // Nodes, cluster title bands, form controls, and the minimap own their\n // own pointer gestures; the background pans and takes focus so the zoom\n // keys keep working. The guard must name every draggable: whoever does\n // not match gets its pointer capture stolen by the surface.\n if ((event.target as HTMLElement).closest('[data-canvas-overlay], [data-node-id], [data-cluster-title], input, button, select, textarea, svg') !== null) return\n hidePreview()\n setSelected(null)\n dragRef.current = { pointerId: event.pointerId, lastX: event.clientX, lastY: event.clientY }\n event.currentTarget.focus()\n if (typeof event.currentTarget.setPointerCapture === 'function') {\n event.currentTarget.setPointerCapture(event.pointerId)\n }\n }, [])\n\n const onPointerMove = useCallback((event: React.PointerEvent<HTMLDivElement>): void => {\n const drag = dragRef.current\n if (drag === null || drag.pointerId !== event.pointerId) return\n // Deltas are computed eagerly: the state updater runs after this\n // handler completes, past the lastX/lastY mutation below.\n const dx = event.clientX - drag.lastX\n const dy = event.clientY - drag.lastY\n drag.lastX = event.clientX\n drag.lastY = event.clientY\n setViewport(current => panBy(current, dx, dy))\n }, [])\n\n const endDrag = useCallback((event: React.PointerEvent<HTMLDivElement>): void => {\n if (dragRef.current?.pointerId === event.pointerId) dragRef.current = null\n }, [])\n\n const zoomFromCenter = (factor: number): void => {\n const rect = surfaceRef.current?.getBoundingClientRect()\n if (rect === undefined) return\n setViewport(current => zoomAt(current, rect.width / 2, rect.height / 2, factor))\n }\n\n /** Fit one complete content box into the current surface. */\n const fitBounds = (target: ContentBounds): void => {\n const rect = surfaceRef.current?.getBoundingClientRect()\n if (rect === undefined) return\n glide()\n setViewport(fitViewport(target, rect.width, rect.height, FIT_PADDING))\n }\n\n const fit = (): void => { fitBounds(bounds) }\n\n /** Re-run the auto layout: manual positions and cluster offsets clear, collapsed clusters keep. */\n const relayout = (): void => {\n setPositions({})\n setOffsets({})\n persist({}, collapsedRef.current, {})\n }\n\n /** Back to the initial state: manual layout and collapse cleared, then fit. */\n const reset = (): void => {\n setPositions({})\n setCollapsed([])\n setOffsets({})\n persist({}, [], {})\n fitBounds(automaticBounds)\n }\n\n /** Center the viewport on one content point (the minimap verb). */\n const recenter = (contentX: number, contentY: number): void => {\n const rect = surfaceRef.current?.getBoundingClientRect()\n if (rect === undefined) return\n setViewport(current => ({\n ...current,\n panX: rect.width / 2 - contentX * current.scale,\n panY: rect.height / 2 - contentY * current.scale,\n }))\n }\n\n /** Center the viewport on one node's card (filter Enter, locate button). */\n const locateNode = (key: string): void => {\n const found = shown.nodes.find(entry => entry.key === key)\n if (found === undefined) return\n glide()\n recenter(found.x + NODE_W / 2, found.y + CARD_H / 2)\n }\n\n /** The selected node's summary panel actions. */\n const selectedNode = selected !== null\n ? shown.nodes.find(entry => entry.node.id === selected)?.node\n : undefined\n\n // The map earns its space only when some graph content is outside the\n // visible surface. Keep it during the unmeasured first paint, then let\n // fit/recenter/gesture renders decide from the live viewport geometry.\n const screenBounds = {\n left: viewport.panX + bounds.x * viewport.scale,\n top: viewport.panY + bounds.y * viewport.scale,\n right: viewport.panX + (bounds.x + bounds.width) * viewport.scale,\n bottom: viewport.panY + (bounds.y + bounds.height) * viewport.scale,\n }\n const showMinimap = viewSize.width <= 0 || viewSize.height <= 0\n || screenBounds.left < -1\n || screenBounds.top < -1\n || screenBounds.right > viewSize.width + 1\n || screenBounds.bottom > viewSize.height + 1\n\n const toggleCluster = (rootId: string): void => {\n const next = collapsedSet.has(rootId)\n ? collapsed.filter(entry => entry !== rootId)\n : [...collapsed, rootId]\n setCollapsed(next)\n persist(positionsRef.current, next, offsetsRef.current)\n }\n\n const closeMerge = (): void => {\n if (mergeRun.phase === 'submitting') return\n mergeRequestRef.current?.abort()\n mergeRequestRef.current = null\n setMergeMode(false)\n setMergeSources([])\n setMergeRun({ phase: 'idle' })\n }\n\n const submitMerge = (): void => {\n if (mergeSources.length < 2 || mergeSources.length > 3\n || mergeInstruction.trim() === '' || containsSessionReferenceUri(mergeInstruction)\n || mergeRun.phase === 'submitting') return\n const controller = new AbortController()\n mergeRequestRef.current?.abort()\n mergeRequestRef.current = controller\n const failedTarget = mergeRun.phase === 'error'\n ? mergeRun.failure.targetSessionId\n : undefined\n setMergeRun({ phase: 'submitting' })\n const request = failedTarget === undefined\n ? onMerge(mergeSources, mergeInstruction, controller.signal)\n : onRetryMerge(failedTarget, mergeSources, mergeInstruction, controller.signal)\n void request\n .then(() => {\n if (mergeRequestRef.current !== controller || controller.signal.aborted) return\n mergeRequestRef.current = null\n setMergeMode(false)\n setMergeSources([])\n setMergeRun({ phase: 'idle' })\n })\n .catch(error => {\n if (mergeRequestRef.current !== controller || controller.signal.aborted) return\n mergeRequestRef.current = null\n setMergeRun({ phase: 'error', failure: mergeFailureOf(error) })\n })\n }\n\n /** Frame title-band gestures: drag the whole cluster by its title band. */\n const clusterGestures = (clusterId: string): {\n onPointerDown: (event: React.PointerEvent<HTMLElement>) => void\n onPointerMove: (event: React.PointerEvent<HTMLElement>) => void\n onPointerUp: (event: React.PointerEvent<HTMLElement>) => void\n onPointerCancel: (event: React.PointerEvent<HTMLElement>) => void\n } => ({\n onPointerDown: (event) => {\n // The collapse toggle owns its own click; it never starts a drag.\n if ((event.target as HTMLElement).closest('button') !== null) return\n setRaisedCluster(clusterId)\n clusterDragRef.current = {\n pointerId: event.pointerId,\n clusterId,\n lastX: event.clientX,\n lastY: event.clientY,\n startX: event.clientX,\n startY: event.clientY,\n moved: false,\n previous: offsetsRef.current[clusterId],\n }\n if (typeof event.currentTarget.setPointerCapture === 'function') {\n event.currentTarget.setPointerCapture(event.pointerId)\n }\n },\n onPointerMove: (event) => {\n const drag = clusterDragRef.current\n if (drag === null || drag.pointerId !== event.pointerId) return\n if (!drag.moved\n && Math.hypot(event.clientX - drag.startX, event.clientY - drag.startY) < DRAG_THRESHOLD) {\n return\n }\n drag.moved = true\n // Deltas eagerly before setState, then the ref catches up (same\n // updater-ordering rule as the background pan).\n const dx = (event.clientX - drag.lastX) / viewport.scale\n const dy = (event.clientY - drag.lastY) / viewport.scale\n drag.lastX = event.clientX\n drag.lastY = event.clientY\n setOffsets((current) => {\n const base = current[drag.clusterId] ?? { dx: 0, dy: 0 }\n return {\n ...current,\n [drag.clusterId]: { dx: base.dx + dx, dy: base.dy + dy },\n }\n })\n },\n onPointerUp: (event) => {\n const drag = clusterDragRef.current\n if (drag === null || drag.pointerId !== event.pointerId) return\n clusterDragRef.current = null\n if (!drag.moved) return\n persist(positionsRef.current, collapsedRef.current, offsetsRef.current)\n },\n onPointerCancel: (event) => {\n const drag = clusterDragRef.current\n if (drag === null || drag.pointerId !== event.pointerId) return\n clusterDragRef.current = null\n setOffsets(current => restoreEntry(current, drag.clusterId, drag.previous))\n },\n })\n\n /** Back to exactly 100%, animated (the readout button and the 0 key). */\n const zoomToIdentity = (): void => {\n glide()\n zoomFromCenter(1 / viewport.scale)\n }\n\n return (\n <div\n ref={surfaceRef}\n className={styles.viewport}\n role=\"group\"\n aria-label={t('canvas.description')}\n tabIndex={-1}\n style={{\n backgroundImage: 'radial-gradient(var(--dsw-alias-border-l2) 1px, transparent 1px)',\n backgroundSize: `${GRID * viewport.scale}px ${GRID * viewport.scale}px`,\n backgroundPosition: `${viewport.panX}px ${viewport.panY}px`,\n }}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={endDrag}\n onPointerCancel={endDrag}\n onKeyDown={(event) => {\n // Text fields own their keys (typing, caret moves, Escape).\n if ((event.target as HTMLElement).closest('input, textarea, select') !== null) return\n if (event.key === 'Escape') {\n hidePreview()\n setSelected(null)\n return\n }\n const direction = event.key === 'ArrowLeft' ? 'left'\n : event.key === 'ArrowRight' ? 'right'\n : event.key === 'ArrowUp' ? 'up'\n : event.key === 'ArrowDown' ? 'down'\n : undefined\n if (direction !== undefined) {\n event.preventDefault()\n moveFocus(direction)\n return\n }\n // Canvas-app zoom family: +/− step, 0 back to 100%, 1 fit.\n if (event.key === '+' || event.key === '=') {\n event.preventDefault()\n zoomFromCenter(CONTROL_STEP)\n return\n }\n if (event.key === '-' || event.key === '_') {\n event.preventDefault()\n zoomFromCenter(1 / CONTROL_STEP)\n return\n }\n if (event.key === '0') {\n event.preventDefault()\n zoomToIdentity()\n return\n }\n if (event.key === '1') {\n event.preventDefault()\n fit()\n }\n }}\n >\n <div\n className={clsx(\n styles.content,\n viewport.scale < LOD_SCALE ? styles.lowZoom : null,\n animating ? styles.animated : null,\n )}\n style={{\n width: `${shown.width}px`,\n height: `${shown.height}px`,\n transform: `translate(${viewport.panX}px, ${viewport.panY}px) scale(${viewport.scale})`,\n }}\n >\n {frames.map(frame => (\n <div\n key={frame.clusterId}\n className={clsx(\n styles.frame,\n frameDimmed(frame.clusterId) ? dimStyle : null,\n raisedCluster === frame.clusterId ? styles.frameRaised : null,\n )}\n data-cluster-id={frame.clusterId}\n style={{\n left: `${frame.x}px`,\n top: `${frame.y}px`,\n width: `${frame.width}px`,\n height: `${frame.height}px`,\n }}\n >\n <div\n className={styles.frameTitle}\n data-cluster-title={frame.clusterId}\n {...clusterGestures(frame.clusterId)}\n >\n <button\n type=\"button\"\n className={styles.frameToggle}\n aria-expanded={!frame.collapsed}\n aria-label={t(frame.collapsed ? 'cluster.expand' : 'cluster.collapse')}\n onClick={() => { toggleCluster(frame.clusterId) }}\n >\n {frame.collapsed ? '▸' : '▾'}\n </button>\n <span\n className={styles.frameSwatch}\n style={{ background: `var(${CLUSTER_COLORS[frame.colorIndex]})` }}\n />\n <span className={styles.frameLabel}>{frame.label}</span>\n </div>\n </div>\n ))}\n <svg\n className={styles.edges}\n width={shown.width}\n height={shown.height}\n viewBox={`${shown.x} ${shown.y} ${shown.width} ${shown.height}`}\n style={{ left: `${shown.x}px`, top: `${shown.y}px` }}\n aria-hidden=\"true\"\n >\n {shown.edges.map(({ edge, path }) => {\n const to = shownByKey.get(edge.to)\n if (to === undefined) return null\n const cx = to.x + NODE_W / 2\n const merge = edge.kind === 'merge'\n return (\n <g\n key={edge.id}\n className={clsx(\n styles.edgeGroup,\n edgeDimmed(edge.from, edge.to) ? dimStyle : null,\n hoverEdge === edge.id ? styles.edgeHot : null,\n )}\n >\n <path\n className={styles.edgeHit}\n d={path}\n data-edge-id={edge.id}\n onMouseEnter={() => { setHoverEdge(edge.id) }}\n onMouseLeave={() => { setHoverEdge(null) }}\n />\n <path\n className={edge.kind === 'source' ? styles.edgeSource : merge ? styles.edgeMerge : styles.edgeBranch}\n data-edge-kind={edge.kind}\n d={path}\n />\n <path\n className={merge ? styles.edgeMergeArrow : styles.edgeBranchArrow}\n d={`M ${cx - 6} ${to.y - 9} L ${cx} ${to.y} L ${cx + 6} ${to.y - 9} Z`}\n />\n </g>\n )\n })}\n {badgeHover !== null ? (() => {\n const hovered = shown.nodes.find(entry => entry.key === badgeHover)\n if (hovered === undefined) return null\n const cx = hovered.x + NODE_W / 2\n return (\n <line\n className={styles.edgeDerivation}\n data-edge-kind=\"subagent-derivation\"\n strokeDasharray=\"6 4\"\n x1={cx} y1={hovered.y + CARD_H}\n x2={cx} y2={hovered.y + CARD_H + 24}\n />\n )\n })() : null}\n </svg>\n {guides?.x != null\n ? (\n <div\n className={styles.guideX}\n style={{ left: `${guides.x}px` }}\n data-testid=\"session-graph-guide-x\"\n />\n )\n : null}\n {guides?.y != null\n ? (\n <div\n className={styles.guideY}\n style={{ top: `${guides.y}px` }}\n data-testid=\"session-graph-guide-y\"\n />\n )\n : null}\n {shown.nodes.map(laidNode => (\n <NodeCard\n key={laidNode.key}\n laid={laidNode}\n now={now}\n t={t}\n gestures={nodeGestures(laidNode.node.id, laidNode.node.clusterId, laidNode.x, laidNode.y)}\n selected={selected === laidNode.node.id}\n mergeOrder={laidNode.node.kind !== 'knowledge' && mergeSources.includes(laidNode.node.id)\n ? mergeSources.indexOf(laidNode.node.id) + 1\n : undefined}\n onHoverBadge={setBadgeHover}\n badgeHovered={badgeHover === laidNode.key}\n dimClass={dimmed(laidNode.key) ? dimStyle : null}\n onHoverNode={(key) => {\n if (key === null) nodeLeave()\n else nodeEnter(key)\n }}\n clusterColor={colorOfCluster.get(laidNode.node.clusterId)\n ?? (laidNode.node.clusterId === laidNode.node.id ? '--dsw-alias-label-dimmed' : '--dsw-alias-border-l2')}\n />\n ))}\n </div>\n <div className={styles.filterBox}>\n <input\n className={styles.filterInput}\n value={query}\n placeholder={t('filter.placeholder')}\n aria-label={t('filter.placeholder')}\n aria-describedby={filterMatches === null ? undefined : 'session-graph-filter-status'}\n onChange={(event) => { setQuery(event.target.value) }}\n onKeyDown={(event) => {\n if (event.key === 'Enter' && filterMatches !== null) {\n const first = shown.nodes.find(entry => filterMatches.has(entry.key))\n if (first !== undefined) locateNode(first.key)\n }\n if (event.key === 'Escape') {\n setQuery('')\n event.currentTarget.blur()\n }\n }}\n />\n {query !== ''\n ? (\n <button type=\"button\" aria-label={t('filter.clear')} onClick={() => { setQuery('') }}>\n ×\n </button>\n )\n : null}\n {filterMatches !== null\n ? (\n <span\n id=\"session-graph-filter-status\"\n className={styles.filterStatus}\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >\n {filterMatches.size === 0\n ? t('filter.none')\n : t('filter.matches', { count: filterMatches.size })}\n </span>\n )\n : null}\n </div>\n <div className={styles.controls} role=\"group\" aria-label={t('toolbar.label')}>\n <button type=\"button\" aria-label={t('toolbar.zoomOut')} onClick={() => { zoomFromCenter(1 / CONTROL_STEP) }}>−</button>\n <button type=\"button\" aria-label={t('toolbar.zoomLevel')} onClick={zoomToIdentity}>\n {`${Math.round(viewport.scale * 100)}%`}\n </button>\n <button type=\"button\" aria-label={t('toolbar.zoomIn')} onClick={() => { zoomFromCenter(CONTROL_STEP) }}>+</button>\n <span className={styles.controlDivider} aria-hidden=\"true\" />\n <button type=\"button\" aria-label={t('toolbar.fit')} onClick={fit}>{t('toolbar.fit')}</button>\n <button type=\"button\" aria-label={t('toolbar.relayout')} onClick={relayout}>{t('toolbar.relayout')}</button>\n <button type=\"button\" aria-label={t('toolbar.reset')} onClick={reset}>{t('toolbar.reset')}</button>\n <span className={styles.controlDivider} aria-hidden=\"true\" />\n <button\n type=\"button\"\n aria-label={t('toolbar.locate')}\n onClick={() => {\n const viewed = shown.nodes.find(entry => entry.node.kind !== 'knowledge' && entry.node.viewed)\n if (viewed !== undefined) locateNode(viewed.key)\n }}\n >\n {t('toolbar.locate')}\n </button>\n <span className={styles.controlDivider} aria-hidden=\"true\" />\n {topic === undefined ? <button\n type=\"button\"\n className={styles.mergeToolbarAction}\n aria-label={t('toolbar.merge')}\n aria-pressed={mergeMode}\n disabled={mergeRun.phase === 'submitting'}\n onClick={() => {\n if (mergeMode) {\n closeMerge()\n return\n }\n hidePreview()\n setSelected(null)\n setMergeSources([])\n setMergeInstruction(t('merge.defaultInstruction'))\n setMergeRun({ phase: 'idle' })\n setMergeMode(true)\n }}\n >\n {t('toolbar.merge')}\n </button> : null}\n </div>\n {mergeMode\n ? (\n <div\n className={clsx(styles.panel, styles.mergePanel)}\n role=\"dialog\"\n aria-label={t('merge.title')}\n data-canvas-overlay=\"\"\n >\n <div className={styles.panelHeader}>\n <div className={styles.panelHeading}>{t('merge.title')}</div>\n <button\n type=\"button\"\n className={styles.panelClose}\n aria-label={t('merge.close')}\n disabled={mergeRun.phase === 'submitting'}\n onClick={closeMerge}\n >\n ×\n </button>\n </div>\n <p className={styles.mergeIntro}>{t('merge.intro')}</p>\n {mergeRun.phase === 'submitting'\n ? (\n <div className={styles.mergeProgress} role=\"status\" aria-live=\"polite\">\n <span className={styles.digestSpinner} aria-hidden=\"true\" />\n <span>{t('merge.submitting')}</span>\n </div>\n )\n : (\n <div className={styles.mergeCount} role=\"status\" aria-live=\"polite\">\n {t('merge.selectedCount', { count: mergeSources.length })}\n </div>\n )}\n {mergeRun.phase === 'error'\n ? (\n <div\n className={styles.mergeFailure}\n role=\"alert\"\n data-error-code={mergeRun.failure.code}\n data-error-stage={mergeRun.failure.stage}\n title={mergeRun.failure.message}\n >\n <span>{t(mergeFailureKey(mergeRun.failure))}</span>\n {mergeRun.failure.targetSessionId === undefined\n ? null\n : <span>{t('merge.targetKept')}</span>}\n </div>\n )\n : null}\n <ol className={styles.mergeSourceList}>\n {mergeSources.map((sourceId, index) => {\n const source = shown.nodes.find(entry => entry.node.id === sourceId)?.node\n return (\n <li key={sourceId}>\n <span className={styles.mergeSourceOrder}>{index + 1}</span>\n <span>{source?.title ?? sourceId}</span>\n <button\n type=\"button\"\n disabled={mergeRun.phase === 'submitting'\n || (mergeRun.phase === 'error'\n && mergeRun.failure.targetSessionId !== undefined)}\n aria-label={t('merge.remove', { name: source?.title ?? sourceId })}\n onClick={() => {\n setMergeSources(current => current.filter(id => id !== sourceId))\n if (mergeRun.phase === 'error') setMergeRun({ phase: 'idle' })\n }}\n >\n ×\n </button>\n </li>\n )\n })}\n </ol>\n <label className={styles.mergeInstructionLabel}>\n <span>{t('merge.instruction')}</span>\n <textarea\n value={mergeInstruction}\n aria-label={t('merge.instruction')}\n rows={4}\n disabled={mergeRun.phase === 'submitting'\n || (mergeRun.phase === 'error'\n && mergeRun.failure.targetSessionId !== undefined)}\n onChange={(event) => {\n setMergeInstruction(event.target.value)\n if (mergeRun.phase === 'error') setMergeRun({ phase: 'idle' })\n }}\n />\n {containsSessionReferenceUri(mergeInstruction)\n ? (\n <span className={styles.mergeInstructionError} role=\"alert\">\n {t('merge.referenceInstruction')}\n </span>\n )\n : null}\n </label>\n {mergeRun.phase === 'error' && mergeRun.failure.targetSessionId !== undefined\n ? (\n <button\n type=\"button\"\n className={styles.mergeOpenTarget}\n onClick={() => { onOpen(mergeRun.failure.targetSessionId!) }}\n >\n {t('merge.openTarget')}\n </button>\n )\n : null}\n <div className={styles.panelActions}>\n <button\n type=\"button\"\n className={styles.panelSecondaryAction}\n disabled={mergeRun.phase === 'submitting'}\n onClick={closeMerge}\n >\n {t('merge.cancel')}\n </button>\n <button\n type=\"button\"\n className={styles.panelPrimaryAction}\n disabled={mergeSources.length < 2 || mergeInstruction.trim() === ''\n || containsSessionReferenceUri(mergeInstruction)\n || mergeRun.phase === 'submitting'}\n onClick={submitMerge}\n >\n {mergeRun.phase === 'error' ? t('merge.retry') : t('merge.submit')}\n </button>\n </div>\n </div>\n )\n : null}\n {topic === undefined ? <SelectedSessionPanel\n workingKey={workingKey}\n onUnavailable={() => { setSelected(null); setUnavailableSelection(true) }}\n onAddToTopic={onAddToTopic}\n node={mergeMode || selectedNode?.kind === 'knowledge' ? undefined : selectedNode}\n branchedFrom={selected === null ? undefined : branchSource.get(selected)}\n mergeSourceTitles={new Map(shown.nodes.map(entry => [entry.key, entry.node.title]))}\n now={now}\n t={t}\n onOpen={onOpen}\n onBranch={onBranch}\n onGenerateDigest={onGenerateDigest}\n onReadHistory={onReadHistory}\n onClose={() => { setSelected(null) }}\n /> : topic.renderInspector(selectedNode, () => { setSelected(null) }, () => { setSelected(null); setUnavailableSelection(true) })}\n {unavailableSelection ? <div className={styles.reuseNotice} data-canvas-overlay=\"\" role=\"status\">{t('position.unavailable')}\n <button type=\"button\" onClick={() => { setUnavailableSelection(false) }}>{t('panel.close')}</button></div> : null}\n {showMinimap\n ? (\n <Minimap\n shown={shown}\n frames={frames}\n bounds={bounds}\n viewport={viewport}\n viewSize={viewSize}\n onRecenter={recenter}\n t={t}\n />\n )\n : null}\n {(() => {\n // The hover detail card lives in screen space and chooses a free side\n // around its node while respecting canvas chrome and the inspector.\n if (previewKey === null) return null\n const entry = shown.nodes.find(item => item.key === previewKey)\n if (entry === undefined) return null\n const placement = placePreview({\n anchor: {\n x: viewport.panX + entry.x * viewport.scale,\n y: viewport.panY + entry.y * viewport.scale,\n width: NODE_W * viewport.scale,\n height: CARD_H * viewport.scale,\n },\n preview: { width: PREVIEW_W, height: PREVIEW_H },\n surface: viewSize,\n insets: {\n top: PREVIEW_TOP_INSET,\n right: selectedNode === undefined ? 12 : INSPECTOR_RIGHT_INSET,\n },\n })\n const session = entry.node.kind === 'knowledge' ? undefined : entry.node\n const status = displayStatusLabel(session?.displayStatus, t)\n const branched = branchSource.get(entry.key)\n return (\n <div\n className={styles.preview}\n style={{ left: `${placement.x}px`, top: `${placement.y}px` }}\n data-testid=\"session-graph-preview\"\n data-placement={placement.side}\n aria-hidden=\"true\"\n >\n <div className={styles.previewTitle}>\n {session?.blank ? t('node.newSession') : entry.node.title}\n </div>\n {status !== '' ? <div className={styles.previewStatus}>{status}</div> : null}\n <div className={styles.previewMeta}>\n {timeLabel(entry.node.updatedAt, now, t)}\n {session !== undefined && session.subagentCount > 0\n ? ` · ${t('panel.subagents', { count: session.subagentCount })}`\n : ''}\n </div>\n {branched !== undefined\n ? <div className={styles.previewMeta}>{t('node.branchedFrom', { name: branched })}</div>\n : null}\n </div>\n )\n })()}\n </div>\n )\n}\n","import { useEffect, useRef, useState, type ReactElement } from 'react'\nimport type { KnowledgeCard } from '../knowledge.ts'\nimport type { SessionGraphKey } from './locales.ts'\nimport { useKnowledge } from './Knowledge.tsx'\nimport styles from './GraphView.module.css'\nimport { loadWorkingPosition, saveWorkingPosition } from './working-position.ts'\n\n/** Shares the search entry while keeping card scope independent of Session directories. */\nexport function KnowledgeSearch({ t, workingKey }: {\n readonly workingKey?: string | undefined\n readonly t: (key: SessionGraphKey, params?: Record<string, unknown>) => string\n}): ReactElement {\n const knowledge = useKnowledge()!\n const [restored] = useState(() => loadWorkingPosition(workingKey).knowledge)\n const [query, setQuery] = useState(restored?.query ?? '')\n const [inTopic, setInTopic] = useState(restored?.inTopic === true && knowledge.topicId !== undefined)\n useEffect(() => { saveWorkingPosition(workingKey, { knowledge: { query, inTopic } }) }, [workingKey, query, inTopic])\n const [cards, setCards] = useState<readonly KnowledgeCard[]>()\n const [busy, setBusy] = useState(false)\n const [failed, setFailed] = useState(false)\n const [canceled, setCanceled] = useState(false)\n const active = useRef<AbortController>()\n useEffect(() => () => { active.current?.abort() }, [])\n const invalidate = (): void => {\n active.current?.abort()\n setCards(undefined)\n setBusy(false)\n setFailed(false)\n setCanceled(false)\n }\n const run = async (): Promise<void> => {\n invalidate()\n const controller = new AbortController()\n active.current = controller\n setBusy(true)\n try {\n const result = await knowledge.api.search({ query,\n ...(inTopic && knowledge.topicId !== undefined ? { topicId: knowledge.topicId } : {}) }, controller.signal)\n if (!controller.signal.aborted) setCards(result)\n } catch { if (!controller.signal.aborted) setFailed(true) } finally {\n if (!controller.signal.aborted) setBusy(false)\n }\n }\n useEffect(() => { if (restored !== undefined) void run() }, [])\n return <div className={styles.knowledgeBody}>\n <form className={styles.searchForm} onSubmit={event => { event.preventDefault(); void run() }}>\n <label>{t('knowledge.query')}<input autoFocus maxLength={200} value={query}\n onChange={event => { invalidate(); setQuery(event.target.value) }} /></label>\n <label>{t('search.scope')}<select value={inTopic ? 'topic' : 'all'} onChange={event => { invalidate(); setInTopic(event.target.value === 'topic') }}>\n <option value=\"all\">{t('knowledge.all')}</option>\n {knowledge.topicId === undefined ? null : <option value=\"topic\">{t('knowledge.currentTopic')}</option>}\n </select></label>\n <button type=\"submit\" disabled={busy}>{t('knowledge.search')}</button>\n <button type=\"button\" onClick={() => { knowledge.create() }}>{t('knowledge.new')}</button>\n {busy ? <button type=\"button\" onClick={() => { invalidate(); setCanceled(true) }}>{t('search.cancel')}</button> : null}\n </form>\n {busy || canceled ? <p role=\"status\">{t(busy ? 'search.loading' : 'search.canceled')}</p> : null}\n {failed ? <p role=\"alert\">{t('knowledge.error')} <button type=\"button\" onClick={() => { void run() }}>{t('search.retry')}</button></p> : null}\n {cards?.length === 0 ? <p role=\"status\">{t('knowledge.empty')}</p> : null}\n <div className={styles.knowledgeResults}>{cards?.map(card => {\n const revision = card.revisions.at(-1)!\n return <button className={styles.searchHit} key={card.cardId} type=\"button\" onClick={() => { knowledge.open(card.cardId) }}>\n <strong>{revision.content.title}</strong><span>{t('knowledge.title')} · {t(`knowledge.status.${revision.content.status}`)} · {t('knowledge.versionNumber', { number: revision.number })}</span>\n <span>{revision.content.conclusion.slice(0, 240)}</span>\n </button>\n })}</div>\n </div>\n}\n","import { useEffect, useLayoutEffect, useRef, useState, type ReactElement } from 'react'\nimport type { SessionId } from '@deepseek-ai/dsh-session/types'\nimport type { WorkspaceView } from '@deepseek-ai/dsh-api-workspace-controller/client'\nimport type { DiscussionSearchHit, DiscussionSearchResult, DiscussionSearchScope } from '../session-search.ts'\nimport type { GraphViewInjected } from './GraphView.tsx'\nimport type { SessionGraphKey } from './locales.ts'\nimport { SessionHistory } from './SessionHistory.tsx'\nimport { retainDialogFocus } from './dialog-focus.ts'\nimport styles from './GraphView.module.css'\nimport { useKnowledge } from './Knowledge.tsx'\nimport { KnowledgeSearch } from './KnowledgeSearch.tsx'\nimport { loadWorkingPosition, saveWorkingPosition } from './working-position.ts'\n\n/** Search chooses a read-only source independently of the scope-bound canvas. */\nexport function DiscussionSearch({ initialScope, workspaces, search, read, open, onClose, onAddToTopic, workingKey, t }: {\n readonly workingKey?: string\n readonly initialScope: DiscussionSearchScope\n readonly workspaces: readonly WorkspaceView[]\n readonly search: GraphViewInjected['searchDiscussion']\n readonly read: GraphViewInjected['readSessionHistory']\n readonly open: GraphViewInjected['openSession']\n readonly onClose: () => void\n readonly onAddToTopic?: (id: SessionId) => void\n readonly t: (key: SessionGraphKey, params?: Record<string, unknown>) => string\n}): ReactElement {\n const knowledge = useKnowledge()\n const [restored] = useState(() => loadWorkingPosition(workingKey))\n const [searchType, setSearchType] = useState<'discussion' | 'knowledge'>(restored.searchType ?? 'discussion')\n const [query, setQuery] = useState(restored.discussion?.query ?? '')\n const [scope, setScope] = useState(restored.discussion?.scope ?? initialScope)\n const [includeArchived, setIncludeArchived] = useState(restored.discussion?.includeArchived ?? false)\n useEffect(() => { saveWorkingPosition(workingKey, { searchType, discussion: { query, scope, includeArchived } }) },\n [workingKey, searchType, query, scope, includeArchived])\n const [result, setResult] = useState<DiscussionSearchResult>()\n const [selected, setSelected] = useState<DiscussionSearchHit>()\n const [busy, setBusy] = useState(false)\n const [failed, setFailed] = useState(false)\n const [canceled, setCanceled] = useState(false)\n const active = useRef<AbortController>()\n const retryCursor = useRef<string>()\n useEffect(() => () => { active.current?.abort() }, [])\n\n const invalidate = (): void => {\n active.current?.abort()\n setBusy(false)\n setFailed(false)\n setCanceled(false)\n setResult(undefined)\n setSelected(undefined)\n retryCursor.current = undefined\n }\n\n const scopeAvailable = scope.kind === 'all' || (scope.kind === 'workspace'\n ? workspaces.some(workspace => workspace.workspaceId === scope.workspaceId)\n : initialScope.kind === 'directory' && initialScope.cwd === scope.cwd)\n useLayoutEffect(() => {\n if (scopeAvailable) return\n invalidate()\n setScope(initialScope.kind === 'workspace' && !workspaces.some(workspace => workspace.workspaceId === initialScope.workspaceId)\n ? { kind: 'all' } : initialScope)\n }, [scopeAvailable, initialScope, workspaces])\n\n const run = async (cursor?: string): Promise<void> => {\n if (query.trim() === '') return\n active.current?.abort()\n const controller = new AbortController()\n active.current = controller\n setBusy(true)\n setFailed(false)\n setCanceled(false)\n retryCursor.current = cursor\n if (cursor === undefined) {\n setResult(undefined)\n setSelected(undefined)\n }\n try {\n const value = await search({ query, scope, includeArchived, ...(cursor === undefined ? {} : { cursor }) }, controller.signal)\n if (controller.signal.aborted) return\n if (value.kind !== 'results') setSelected(undefined)\n setResult(previous => cursor !== undefined && previous?.kind === 'results' && value.kind === 'results'\n ? { ...value, hits: [...previous.hits, ...value.hits] } : value)\n } catch {\n if (controller.signal.aborted) return\n setFailed(true)\n } finally {\n if (!controller.signal.aborted) setBusy(false)\n }\n }\n\n useEffect(() => { if (scopeAvailable && searchType === 'discussion' && restored.discussion?.query.trim()) void run() }, [])\n\n return (\n <section className={styles.searchOverlay} role=\"dialog\" aria-modal=\"true\" aria-label={t('search.title')}\n onKeyDown={event => {\n if (event.key === 'Escape') { event.stopPropagation(); onClose() }\n retainDialogFocus(event)\n }}>\n <div className={styles.searchHeader}>\n <div><h2>{t('search.title')}</h2><p>{t('search.description')}</p></div>\n <button type=\"button\" onClick={onClose}>{t('search.close')}</button>\n </div>\n {knowledge === undefined ? null : <label className={styles.searchForm}>{t('knowledge.searchType')}\n <select value={searchType} onChange={event => { invalidate(); setSearchType(event.target.value as typeof searchType) }}>\n <option value=\"discussion\">{t('knowledge.discussions')}</option><option value=\"knowledge\">{t('knowledge.title')}</option>\n </select></label>}\n {searchType === 'knowledge' ? <KnowledgeSearch workingKey={workingKey} t={t} /> : <>\n <form className={styles.searchForm} onSubmit={event => { event.preventDefault(); void run() }}>\n <label className={styles.searchQuery}>{t('search.query')}\n <input autoFocus value={query} maxLength={256} placeholder={t('search.placeholder')}\n onChange={event => { invalidate(); setQuery(event.target.value) }} />\n </label>\n <label>{t('search.scope')}\n <select value={scope.kind === 'workspace' ? `workspace:${scope.workspaceId}` : scope.kind}\n onChange={event => {\n const value = event.target.value\n invalidate()\n setScope(value === 'all' ? { kind: 'all' }\n : value === 'directory' ? initialScope : { kind: 'workspace', workspaceId: value.slice(10) })\n }}>\n {initialScope.kind === 'directory' ? <option value=\"directory\">{t('search.directory')}</option> : null}\n {workspaces.map(workspace => <option key={workspace.workspaceId} value={`workspace:${workspace.workspaceId}`}>{workspace.title}</option>)}\n <option value=\"all\">{t('search.all')}</option>\n </select>\n </label>\n <label className={styles.searchArchive}><input type=\"checkbox\" checked={includeArchived}\n onChange={event => { invalidate(); setIncludeArchived(event.target.checked) }} />{t('search.includeArchived')}</label>\n <button type=\"submit\" disabled={busy || query.trim() === ''}>{t('search.submit')}</button>\n {busy ? <button type=\"button\" onClick={() => { invalidate(); setCanceled(true) }}>{t('search.cancel')}</button> : null}\n </form>\n <div className={styles.searchStatus} role=\"status\">\n {busy ? t('search.loading') : result?.kind === 'results'\n ? result.hits.length === 0 ? t('search.empty') : t('search.count', { count: result.hits.length })\n : result?.kind === 'disabled' ? t('search.disabled') : result?.kind === 'stale' ? t('search.stale')\n : canceled ? t('search.canceled') : failed ? '' : t('search.start')}\n </div>\n {result?.kind === 'stale' ? <div className={styles.searchNotice}>\n <button type=\"button\" onClick={() => { void run() }}>{t('search.restart')}</button>\n </div> : null}\n {result?.kind === 'disabled' ? <div className={styles.searchNotice}>\n <p>{t('search.setup')}</p>\n <a href={t('search.setupUrl')} target=\"_blank\" rel=\"noreferrer\">{t('search.setupLink')}</a>\n <button type=\"button\" onClick={() => { void run() }}>{t('search.restart')}</button>\n </div> : null}\n {failed ? <div className={styles.searchNotice} role=\"alert\"><p>{t('search.error')}</p>\n <button type=\"button\" onClick={() => { void run(retryCursor.current) }}>{t('search.retry')}</button>\n </div> : null}\n <div className={styles.searchBody}>\n <div className={styles.searchResults} aria-label={t('search.results')}>\n {result?.kind === 'results' ? result.hits.map(hit => (\n <button type=\"button\" key={hit.sessionId} className={styles.searchHit}\n aria-label={t('search.read', { title: hit.title })} aria-pressed={selected?.sessionId === hit.sessionId}\n onClick={() => { setSelected(hit) }}>\n <strong>{hit.title}</strong>\n <span className={styles.searchMeta}>{hit.workspace?.title ?? hit.cwd ?? t('search.noWorkspace')}\n {hit.archived ? ` · ${t('search.archived')}` : ''}</span>\n <time className={styles.searchMeta} dateTime={new Date(hit.time).toISOString()}>{new Date(hit.time).toLocaleString()}</time>\n <span>{hit.snippet}</span>\n </button>\n )) : null}\n {result?.kind === 'results' && result.nextCursor !== undefined ? <button type=\"button\" disabled={busy}\n onClick={() => { void run(result.nextCursor) }}>{t('search.more')}</button> : null}\n </div>\n <aside className={styles.searchInspector} aria-label={t('search.original')}>\n {selected === undefined ? <p className={styles.searchHint}>{t('search.select')}</p> : <>\n <div className={styles.searchSourceHeader}><h3>{selected.title}</h3>\n {onAddToTopic === undefined ? null : <button type=\"button\" onClick={() => { onAddToTopic(selected.sessionId as SessionId) }}>{t('topic.add')}</button>}\n <button type=\"button\" onClick={() => { open(selected.sessionId as SessionId) }}>{t('panel.open')}</button>\n </div>\n <p className={styles.searchMeta}>{t('search.snapshot')}</p>\n <SessionHistory key={`${selected.sessionId}:${selected.eventSeq}`} sessionId={selected.sessionId}\n anchorSeq={selected.turnStartSeq} highlightSeq={selected.eventSeq} read={read} t={t} />\n </>}\n </aside>\n </div>\n </>}\n </section>\n )\n}\n","import type { SessionId } from '@deepseek-ai/dsh-session/types'\nimport type { SessionListState } from '@deepseek-ai/dsh-api-session-controller/client'\nimport type { KnowledgeCard } from '../knowledge.ts'\nimport type { SessionGraph } from './graph-model.ts'\n\n/** Project saved provenance explicitly, including sources outside topic membership. */\nexport function withKnowledgeCards(graph: SessionGraph, cards: readonly KnowledgeCard[], list: SessionListState, archived: ReadonlySet<string>): SessionGraph {\n const nodes = new Map(graph.nodes)\n const clusters = [...graph.clusters]\n const children = new Map(graph.children)\n const edges = [...graph.edges]\n const edgeIds = new Set(edges.map(edge => edge.id))\n for (const card of cards) {\n const revision = card.revisions.at(-1)!\n const id = `card:${card.cardId}` as const\n for (const source of revision.sources) {\n if (!nodes.has(source.sessionId)) {\n const sessionId = source.sessionId as SessionId\n const row = list.byId[sessionId]\n nodes.set(sessionId, {\n id: sessionId, clusterId: sessionId, title: source.title, blank: false, displayStatus: undefined, viewed: false,\n updatedAt: source.source.turns.at(-1)!.startedAt, subagentCount: 0, runningSubagents: 0, branchFrom: undefined, mergeSources: [],\n retainedSource: source.source,\n topicSource: { sessionId, title: source.title, status: row === undefined || row.origin === 'subagent' ? 'unavailable' : 'listed', archived: archived.has(sessionId),\n ...(source.cwd === undefined ? {} : { cwd: source.cwd }) },\n })\n children.set(sessionId, [])\n clusters.push({ rootId: sessionId, label: source.title, memberIds: [sessionId] })\n }\n const edgeId = `source:${source.sessionId}:${id}`\n if (!edgeIds.has(edgeId)) {\n edges.push({ id: edgeId, kind: 'source', from: source.sessionId, to: id })\n edgeIds.add(edgeId)\n }\n }\n nodes.set(id, {\n kind: 'knowledge', card, id, clusterId: id, title: revision.content.title, updatedAt: revision.savedAt,\n })\n children.set(id, [])\n clusters.push({ rootId: id, label: revision.content.title, memberIds: [id] })\n }\n return { ...graph, nodes, clusters, children, edges }\n}\n","import { useEffect, useMemo, useRef, useState, type ReactElement } from 'react'\nimport type { SessionListState } from '@deepseek-ai/dsh-api-session-controller/client'\nimport type { WorkspaceSnapshot } from '@deepseek-ai/dsh-api-workspace-controller/client'\nimport type { SessionId } from '@deepseek-ai/dsh-session/types'\nimport type { ResearchTopic, ResearchTopicSnapshot } from '../research-topic.ts'\nimport type { GraphViewInjected } from './GraphView.tsx'\nimport type { SessionGraphNode } from './graph-model.ts'\nimport type { KnowledgeCard } from '../knowledge.ts'\nimport type { LayoutState } from './layout-store.ts'\nimport type { SessionGraphKey } from './locales.ts'\nimport { deriveTopicGraph } from './graph-model.ts'\nimport { layoutSessionGraph } from './layout.ts'\nimport { GraphCanvas } from './GraphCanvas.tsx'\nimport { SessionHistory } from './SessionHistory.tsx'\nimport styles from './GraphView.module.css'\nimport { useKnowledge } from './Knowledge.tsx'\nimport { withKnowledgeCards } from './knowledge-graph.ts'\nimport { loadWorkingPosition, saveWorkingPosition, workingPositionKey } from './working-position.ts'\n\ntype Translate = (key: SessionGraphKey, params?: Record<string, unknown>) => string\n\nexport interface TopicGraphContext {\n readonly workingKey: string\n readonly sessions: SessionListState\n readonly workspaces: WorkspaceSnapshot\n readonly pendingInteractions: ReadonlyMap<SessionId, unknown>\n readonly viewedId: SessionId\n readonly actions: GraphViewInjected\n}\n\n/** Each mounted topic owns its cancellable metadata read and source inspector. */\nexport function TopicGraph({ topic, context, arrangement, onArrange, remove, busy, t }: {\n readonly topic: ResearchTopic\n readonly context: TopicGraphContext\n readonly arrangement: LayoutState\n readonly onArrange: (state: LayoutState) => void\n readonly remove: (sessionId: string) => void\n readonly busy: boolean\n readonly t: Translate\n}): ReactElement {\n const knowledge = useKnowledge()!\n const workingKey = workingPositionKey(context.actions.hostId, context.workingKey, topic.topicId)\n const [cards, setCards] = useState<readonly KnowledgeCard[]>([])\n const [snapshot, setSnapshot] = useState<ResearchTopicSnapshot>()\n const [phase, setPhase] = useState<'loading' | 'ready' | 'error' | 'canceled'>('loading')\n const [revision, setRevision] = useState(0)\n const active = useRef<AbortController>()\n const membership = JSON.stringify(topic.references.map(reference => reference.sessionId))\n const read = context.actions.topics.read\n const searchCards = knowledge.api.search\n useEffect(() => {\n const controller = new AbortController()\n active.current = controller\n setPhase('loading')\n setSnapshot(undefined)\n void Promise.all([read({ topicId: topic.topicId }, controller.signal),\n searchCards({ query: '', topicId: topic.topicId }, controller.signal)]).then(([value, found]) => {\n if (controller.signal.aborted) return\n setSnapshot(value)\n setCards(found)\n setPhase('ready')\n }, () => { if (!controller.signal.aborted) setPhase('error') })\n return () => { controller.abort() }\n }, [topic.topicId, membership, read, searchCards, revision, knowledge.refresh])\n const graph = useMemo(() => {\n if (snapshot === undefined) return undefined\n const archived = new Set<string>(context.workspaces.archivedSessionIds)\n const workspaceTitles = new Map(context.workspaces.items.map(workspace => [String(workspace.workspaceId), workspace.title]))\n const sources = snapshot.sources.map(source => ({\n ...source,\n archived: context.workspaces.phase === 'ready' ? archived.has(source.sessionId) : source.archived,\n ...(source.workspace === undefined ? {} : { workspace: {\n ...source.workspace, title: workspaceTitles.get(source.workspace.id) || source.workspace.title,\n } }),\n }))\n return withKnowledgeCards(deriveTopicGraph({ sources, topic }, context.sessions, context.viewedId, context.pendingInteractions), cards, context.sessions, archived)\n }, [snapshot, topic, context.sessions, context.workspaces, context.viewedId, context.pendingInteractions, cards])\n const laid = useMemo(() => graph === undefined ? undefined : layoutSessionGraph(graph), [graph])\n const open = (id: SessionId): void => {\n const node = graph?.nodes.get(id)\n const source = node?.kind === 'knowledge' ? undefined : node?.topicSource\n if (source?.status === 'listed' && !source.archived) context.actions.openSession(id)\n }\n return <div className={styles.topicGraph}>\n <div className={styles.topicControls}><button type=\"button\" disabled={phase === 'loading'}\n onClick={() => { setRevision(value => value + 1) }}>{t('topic.refresh')}</button>\n <button type=\"button\" onClick={() => { knowledge.create() }}>{t('knowledge.new')}</button>\n <button type=\"button\" disabled={phase !== 'ready' || cards.length === 0} onClick={() => {\n knowledge.exportCards(cards.map(card => ({ cardId: card.cardId, title: card.revisions.at(-1)!.content.title })))\n }}>{t('export.title')}</button>\n {cards.length > 0 ? <span>{t('knowledge.sourceRelation')}</span> : null}</div>\n {phase === 'loading' ? <div className={styles.topicControls} role=\"status\">{t('topic.loading')} <button type=\"button\" onClick={() => {\n active.current?.abort()\n setPhase('canceled')\n }}>{t('topic.cancel')}</button></div> : null}\n {phase === 'error' || phase === 'canceled' ? <div className={styles.topicControls} role={phase === 'error' ? 'alert' : 'status'}>\n {t(phase === 'error' ? 'topic.readError' : 'topic.canceled')}\n <button type=\"button\" onClick={() => { setRevision(value => value + 1) }}>{t('topic.retry')}</button>\n </div> : null}\n {phase !== 'ready' || graph === undefined || laid === undefined ? null : <>\n {graph.nodes.size === 0 ? <p>{t('topic.noReferences')}</p> : null}\n <GraphCanvas key={`${workingKey}:${membership}`} workingKey={workingKey} laid={laid} clusters={graph.clusters}\n arrangement={{ key: `topic:${topic.topicId}`, legacyKey: undefined }} now={Date.now()} t={t}\n onOpen={open} onBranch={context.actions.branchSession} onGenerateDigest={context.actions.generateSessionDigest}\n onReadHistory={context.actions.readSessionHistory} onMerge={context.actions.mergeSessions} onRetryMerge={context.actions.retrySessionMerge}\n topic={{ arrangement, onArrange, openCard: knowledge.open, renderInspector: (node, onClose, onUnavailable) => node === undefined ? null\n : node.kind === 'knowledge' ? <aside className={`${styles.panel} ${styles.topicSourcePanel}`} data-canvas-overlay=\"\" aria-label={t('knowledge.title')}>\n <div className={styles.panelHeader}><strong>{t('knowledge.title')}</strong>\n <button type=\"button\" onClick={onClose} aria-label={t('panel.close')}>×</button></div>\n <h3>{node.title}</h3><p className={styles.historyText}>{node.card.revisions.at(-1)!.content.conclusion}</p>\n <p>{t('knowledge.versionNumber', { number: node.card.revisions.at(-1)!.number })} · {t(`knowledge.status.${node.card.revisions.at(-1)!.content.status}`)}</p>\n <button type=\"button\" onClick={() => { knowledge.open(node.card.cardId) }}>{t('knowledge.edit')}</button>\n <button type=\"button\" onClick={() => { knowledge.exportCards([{ cardId: node.card.cardId, title: node.title }]) }}>{t('export.title')}</button>\n </aside> : <TopicSourcePanel key={node.id} workingKey={workingKey} node={node} read={context.actions.readSessionHistory} open={open}\n remove={topic.references.some(reference => reference.sessionId === node.id) ? () => { remove(node.id) } : undefined}\n busy={busy} onClose={onClose} onUnavailable={onUnavailable} t={t} /> }} /></>}\n </div>\n}\n\nfunction TopicSourcePanel({ node, read, open, remove, busy, onClose, onUnavailable, workingKey, t }: {\n readonly onUnavailable: () => void\n readonly workingKey: string\n readonly node: SessionGraphNode\n readonly read: GraphViewInjected['readSessionHistory']\n readonly open: GraphViewInjected['openSession']\n readonly remove: (() => void) | undefined\n readonly busy: boolean\n readonly onClose: () => void\n readonly t: Translate\n}): ReactElement {\n const [reading, setReading] = useState(() => loadWorkingPosition(workingKey).selected === node.id && loadWorkingPosition(workingKey).tab === 'history')\n useEffect(() => { saveWorkingPosition(workingKey, { tab: reading ? 'history' : 'digest' }) }, [workingKey, reading])\n const source = node.topicSource\n return <aside className={`${styles.panel} ${styles.topicSourcePanel}`} data-working-scroll=\"\" data-canvas-overlay=\"\" data-testid=\"topic-source-panel\" aria-label={t('topic.source')}>\n <div className={styles.panelHeader}><span className={styles.panelHeading}>{t('topic.source')}</span>\n <button type=\"button\" className={styles.panelClose} aria-label={t('panel.close')} onClick={onClose}>×</button></div>\n <h3 className={styles.panelTitle}>{node.title}</h3>\n <div className={styles.panelMeta}><span>{source?.workspace?.title || source?.cwd || t('topic.noWorkspace')}</span>\n {source?.archived ? <span>{t('search.archived')}</span> : null}</div>\n <div className={styles.topicSourceId}>{node.id}</div>\n {source?.status === 'unavailable' ? <div role=\"status\">{t('topic.unavailable')}</div> : null}\n {source?.archived ? <div role=\"status\">{t('topic.archivedReading')}</div> : null}\n <div className={styles.panelActions}>\n <button type=\"button\" className={styles.panelPrimaryAction} onClick={() => { open(node.id) }} disabled={source?.status !== 'listed' || source.archived}>{t('panel.open')}</button>\n <button type=\"button\" className={styles.panelSecondaryAction} onClick={() => { setReading(value => !value) }}>{t(reading ? 'topic.closeOriginal' : 'topic.readOriginal')}</button>\n {remove === undefined ? null : <button type=\"button\" className={styles.panelSecondaryAction} disabled={busy} onClick={remove}>{t('topic.remove')}</button>}\n </div>\n {reading ? <SessionHistory workingKey={workingKey} onUnavailable={onUnavailable} sessionId={node.id} {...(node.retainedSource === undefined ? {} : { retainedSource: node.retainedSource })} read={read} t={t} /> : null}\n </aside>\n}\n","import { useEffect, useRef, useState, type ReactElement } from 'react'\nimport type { ResearchTopic, ResearchTopicWrite } from '../research-topic.ts'\nimport type { GraphViewInjected } from './GraphView.tsx'\nimport type { SessionGraphKey } from './locales.ts'\nimport { loadLayout, saveLayout, type LayoutState } from './layout-store.ts'\nimport { TopicGraph, type TopicGraphContext } from './TopicGraph.tsx'\nimport styles from './GraphView.module.css'\nimport { useKnowledge } from './Knowledge.tsx'\nimport { loadWorkingPosition, saveWorkingPosition, workingPositionKey } from './working-position.ts'\n\ntype Translate = (key: SessionGraphKey, params?: Record<string, unknown>) => string\n\n/** Owns drafts and durable writes while the topic collection is open. */\nexport function ResearchTopics({ api, context, add, refresh = 0, t }: {\n readonly api: GraphViewInjected['topics']\n readonly context?: TopicGraphContext\n readonly add?: { readonly sessionId: string; readonly done: () => void }\n readonly refresh?: number\n readonly t: Translate\n}): ReactElement {\n const knowledge = useKnowledge()\n const [items, setItems] = useState<readonly ResearchTopic[]>([])\n const [phase, setPhase] = useState<'loading' | 'ready' | 'error'>('loading')\n const [revision, setRevision] = useState(0)\n const [remembered] = useState(() => loadWorkingPosition(context?.workingKey).topicId)\n const [selectedId, setSelectedId] = useState(remembered ?? '')\n const [unavailable, setUnavailable] = useState(false)\n const [title, setTitle] = useState('')\n const [renames, setRenames] = useState<Record<string, string>>({})\n const [arrangements, setArrangements] = useState<Record<string, LayoutState>>({})\n const [busy, setBusy] = useState(false)\n const [failed, setFailed] = useState(false)\n const createAttempt = useRef<{ readonly topicId: string; readonly title: string; readonly rename: boolean }>()\n const writeController = useRef<AbortController>()\n useEffect(() => () => { writeController.current?.abort() }, [])\n useEffect(() => {\n const controller = new AbortController()\n setPhase('loading')\n void api.list(controller.signal).then(value => {\n if (controller.signal.aborted) return\n setItems(value)\n setSelectedId(current => {\n if (value.some(topic => topic.topicId === current)) return current\n if (current !== '' || remembered !== undefined) {\n setUnavailable(true)\n return ''\n }\n return value[0]?.topicId ?? ''\n })\n setPhase('ready')\n }, () => { if (!controller.signal.aborted) setPhase('error') })\n return () => { controller.abort() }\n }, [api, revision, refresh])\n useEffect(() => {\n if (phase === 'ready') saveWorkingPosition(context?.workingKey, { topicId: selectedId })\n }, [context?.workingKey, phase, selectedId])\n\n const write = async (request: ResearchTopicWrite): Promise<ResearchTopic | undefined> => {\n const controller = new AbortController()\n writeController.current = controller\n setBusy(true)\n setFailed(false)\n try {\n let topic = await api.write(request, controller.signal)\n if (controller.signal.aborted) return undefined\n if (request.kind === 'create' && createAttempt.current?.rename && topic.title !== request.title) {\n topic = await api.write({ kind: 'rename', topicId: topic.topicId, title: request.title }, controller.signal)\n if (controller.signal.aborted) return undefined\n }\n setItems(current => current.some(item => item.topicId === topic.topicId)\n ? current.map(item => item.topicId === topic.topicId ? topic : item) : [...current, topic])\n return topic\n } catch {\n if (!controller.signal.aborted) setFailed(true)\n return undefined\n } finally {\n if (!controller.signal.aborted) setBusy(false)\n }\n }\n const selected = items.find(topic => topic.topicId === selectedId)\n const arrangementKey = context === undefined ? undefined : workingPositionKey(context.actions.hostId, context.workingKey, selectedId)\n const draftArrangement = arrangements[selectedId] ?? (arrangementKey === undefined ? undefined : loadLayout(arrangementKey))\n const selectTopic = knowledge?.selectTopic\n useEffect(() => {\n if (context === undefined) return\n selectTopic?.(selected?.topicId)\n return () => { selectTopic?.(undefined) }\n }, [context === undefined, selectTopic, selected?.topicId])\n return <section className={styles.topics} aria-label={t('topic.title')}>\n <p className={styles.topicDescription}>{t('topic.description')}</p>\n {unavailable ? <p role=\"status\">{t('position.topicUnavailable')}</p> : null}\n {phase === 'loading' ? <p role=\"status\">{t('topic.loading')}</p> : phase === 'error' ? <div role=\"alert\">\n {t('topic.readError')} <button type=\"button\" onClick={() => { setRevision(value => value + 1) }}>{t('topic.retry')}</button>\n </div> : <>\n <form className={styles.topicControls} onSubmit={event => {\n event.preventDefault()\n const previous = createAttempt.current\n const name = title.trim()\n createAttempt.current = {\n topicId: previous?.topicId ?? crypto.randomUUID(), title: name,\n // An edited retry may have saved even if its response failed again.\n rename: previous !== undefined && (previous.rename || previous.title !== name),\n }\n void write({ kind: 'create', topicId: createAttempt.current.topicId, title: name }).then(topic => {\n if (topic === undefined) return\n createAttempt.current = undefined\n setTitle('')\n setSelectedId(topic.topicId)\n })\n }}>\n <label>{t('topic.newName')}<input value={title} maxLength={120} disabled={busy}\n onChange={event => { setTitle(event.target.value) }} /></label>\n <button type=\"submit\" disabled={busy || title.trim() === ''}>{t('topic.create')}</button>\n </form>\n {items.length === 0 ? <p>{t('topic.empty')}</p> : <label className={styles.topicSelection}>{t('topic.choose')}\n <select value={selectedId} disabled={busy} onChange={event => { setSelectedId(event.target.value); setFailed(false); setUnavailable(false) }}>\n <option value=\"\">{t('topic.choose')}</option>\n {items.map(topic => <option key={topic.topicId} value={topic.topicId}>{topic.title} ({topic.references.length})</option>)}\n </select>\n </label>}\n {selected === undefined ? null : add !== undefined ? <div className={styles.topicControls}>\n <button type=\"button\" disabled={busy} onClick={() => {\n void write({ kind: 'add', topicId: selected.topicId, sessionIds: [add.sessionId] }).then(topic => {\n if (topic !== undefined) add.done()\n })\n }}>{t('topic.addSelected')}</button>\n </div> : <form className={styles.topicControls} onSubmit={event => {\n event.preventDefault()\n void write({ kind: 'rename', topicId: selected.topicId, title: renames[selected.topicId] ?? selected.title })\n }}>\n <label>{t('topic.name')}<input value={renames[selected.topicId] ?? selected.title} maxLength={120} disabled={busy}\n onChange={event => { setRenames(current => ({ ...current, [selected.topicId]: event.target.value })) }} /></label>\n <button type=\"submit\" disabled={busy || (renames[selected.topicId] ?? selected.title).trim() === ''}>{t('topic.rename')}</button>\n </form>}\n </>}\n {busy ? <p role=\"status\">{t('topic.saving')}</p> : null}\n {failed ? <p role=\"alert\">{t('topic.saveError')}</p> : null}\n {context === undefined || selected === undefined ? null : <div className={styles.topicControls}>\n <button type=\"button\" disabled={phase !== 'ready' || busy || draftArrangement === undefined} onClick={() => {\n const arrangement = draftArrangement\n if (arrangement === undefined) return\n void write({ kind: 'arrange', topicId: selected.topicId, arrangement }).then(saved => {\n if (saved === undefined) return\n if (arrangementKey !== undefined && JSON.stringify(loadLayout(arrangementKey)) === JSON.stringify(arrangement)) {\n try { localStorage.removeItem(`dsh.session-graph.layout.${arrangementKey}`) } catch { /* presentation storage may be denied */ }\n }\n setArrangements(current => {\n if (current[selected.topicId] !== undefined && current[selected.topicId] !== arrangement) return current\n const next = { ...current }\n delete next[selected.topicId]\n return next\n })\n })\n }}>{t('topic.saveArrangement')}</button>\n <span role=\"status\">{t(draftArrangement === undefined ? 'topic.arrangementHint' : 'topic.unsaved')}</span>\n </div>}\n {phase !== 'ready' || selected === undefined || context === undefined ? null : <TopicGraph key={selected.topicId} topic={selected}\n context={context} arrangement={draftArrangement ?? selected.arrangement}\n onArrange={state => {\n if (arrangementKey !== undefined) saveLayout(arrangementKey, state)\n setArrangements(current => ({ ...current, [selected.topicId]: state }))\n }}\n remove={sessionId => { void write({ kind: 'remove', topicId: selected.topicId, sessionId }) }} busy={busy} t={t} />}\n </section>\n}\n","/**\n * The Session Graph tab body: a scope-bound lineage forest of Canvas Sessions\n * (Branch edges within clusters, Merge provenance across clusters, and\n * Subagent Derivations folded into Subagent Summary badges). Derives from the sessions/workspaces\n * standard feeds; selection stays in the graph while double-click and the\n * details panel navigate through the sessions verbs.\n */\nimport { useMemo, useRef, useState, type ReactElement } from 'react'\nimport type { SessionId } from '@deepseek-ai/dsh-session/types'\nimport type { ConvViewProps } from '@deepseek-ai/dsh-client-ui-conversation/client'\nimport type { InjectFace, PropsLocale } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { SessionDigestResult } from '../session-digest.ts'\nimport type { SessionHistoryRequest, SessionHistoryResult } from '../session-history.ts'\nimport type { DiscussionSearchRequest, DiscussionSearchResult } from '../session-search.ts'\nimport type { ResearchTopic, ResearchTopicSnapshot, ResearchTopicWrite } from '../research-topic.ts'\nimport { SESSION_GRAPH_BUILD_LABEL, SESSION_GRAPH_BUILD_TITLE } from './build-info.ts'\nimport { GraphCanvas } from './GraphCanvas.tsx'\nimport { DiscussionSearch } from './DiscussionSearch.tsx'\nimport { ResearchTopics } from './ResearchTopics.tsx'\nimport { KnowledgeProvider, useKnowledge } from './Knowledge.tsx'\nimport type { KnowledgeApi } from './knowledge-remote.ts'\nimport { ResearchReuseEntry, ResearchReuseProvider } from './ResearchReuse.tsx'\nimport type { ResearchReuseApi } from './research-reuse-remote.ts'\nimport { deriveSessionGraph, resolveGraphScope } from './graph-model.ts'\nimport { layoutSessionGraph } from './layout.ts'\nimport { retainDialogFocus } from './dialog-focus.ts'\nimport styles from './GraphView.module.css'\nimport { workingPositionKey } from './working-position.ts'\n\n/** Business face the browser entry injects into the view (navigation verbs). */\nexport interface GraphViewInjected {\n readonly hostId: string\n readonly reuse: ResearchReuseApi\n readonly knowledge: KnowledgeApi\n topics: {\n readonly list: (signal: AbortSignal) => Promise<readonly ResearchTopic[]>\n readonly read: (request: { readonly topicId: string }, signal: AbortSignal) => Promise<ResearchTopicSnapshot>\n readonly write: (request: ResearchTopicWrite, signal: AbortSignal) => Promise<ResearchTopic>\n }\n searchDiscussion: (request: DiscussionSearchRequest, signal: AbortSignal) => Promise<DiscussionSearchResult>\n /** Read addressed discussion text without activating an Agent. */\n readSessionHistory: (request: SessionHistoryRequest, signal: AbortSignal) => Promise<SessionHistoryResult>\n /** Open one session on its own last view (double-click and panel verb). */\n openSession: (id: SessionId) => void\n /** Create a Branch from one session (the panel's New-branch verb). */\n branchSession: (id: SessionId) => Promise<void>\n /** Explicitly generate or refresh one read-only Session Digest. */\n generateSessionDigest: (\n id: SessionId,\n options: { readonly refresh: boolean },\n signal: AbortSignal,\n ) => Promise<SessionDigestResult>\n /** Create, capture, and open one independent Merge Session. */\n mergeSessions: (\n sourceIds: readonly SessionId[],\n instruction: string,\n signal: AbortSignal,\n ) => Promise<SessionId>\n /** Retry a failed Merge using its already-created target Session. */\n retrySessionMerge: (\n targetSessionId: SessionId,\n sourceIds: readonly SessionId[],\n instruction: string,\n signal: AbortSignal,\n ) => Promise<SessionId>\n}\n\n/** The graph view tab's composed props: runtime share + inject face + locale. */\nexport type GraphViewProps =\n ConvViewProps\n & InjectFace<GraphViewInjected>\n & PropsLocale<'sessionGraph'>\n\n/**\n * Render the session graph tab body.\n * @param props - the composed view props (standard kit, inject face, locale seat).\n * @returns the tab body element.\n */\nexport function GraphView(props: GraphViewProps): ReactElement {\n const workspaces = props.useWorkspaces(state => state)\n return <div className={styles.knowledgeBoundary}><ResearchReuseProvider key={props.sessionId} api={props.reuse}\n workspaces={workspaces.items} viewedId={props.sessionId} openSession={props.openSession} t={props.t}>\n <KnowledgeProvider api={props.knowledge}\n topics={props.topics} read={props.readSessionHistory} t={props.t}>\n <GraphViewBody {...props} />\n </KnowledgeProvider></ResearchReuseProvider></div>\n}\n\nfunction GraphViewBody({\n sessionId, useSessions, useSessionPendingInteraction, useWorkspaces,\n hostId, openSession, branchSession, generateSessionDigest, readSessionHistory, searchDiscussion, mergeSessions, retrySessionMerge, topics, knowledge, reuse, t,\n}: GraphViewProps): ReactElement {\n const knowledgeContext = useKnowledge()\n const sessions = useSessions(state => state)\n const pendingInteractions = useSessionPendingInteraction(state => state)\n const workspaces = useWorkspaces(state => state)\n const [searchOpen, setSearchOpen] = useState(false)\n const [topicMode, setTopicMode] = useState(false)\n const [adding, setAdding] = useState<SessionId>()\n const [topicRevision, setTopicRevision] = useState(0)\n const addTrigger = useRef<HTMLElement>()\n const addToTopic = (id: SessionId): void => {\n if (document.activeElement instanceof HTMLElement) addTrigger.current = document.activeElement\n setAdding(id)\n }\n const closePicker = (): void => {\n setAdding(undefined)\n queueMicrotask(() => { addTrigger.current?.focus() })\n }\n const searchButton = useRef<HTMLButtonElement>(null)\n\n const scope = useMemo(\n () => resolveGraphScope(sessionId, sessions, workspaces),\n [sessionId, sessions, workspaces],\n )\n const graph = useMemo(\n () => deriveSessionGraph(sessions, scope, sessionId, pendingInteractions),\n [sessions, scope, sessionId, pendingInteractions],\n )\n const laid = useMemo(() => layoutSessionGraph(graph), [graph])\n\n const now = Date.now()\n const workingKey = workingPositionKey(hostId, scope?.arrangement.key ?? `viewed:${sessionId}`)\n const searchKey = topicMode ? workingPositionKey(hostId, workingKey, knowledgeContext?.topicId ?? 'topic-list') : workingKey\n\n return (\n // The free canvas owns its viewport. Extend the view behind the floating\n // composer so GraphCanvas's live clearance reserves the seat exactly once.\n <div className={styles.root} data-conversation-composer-overlay=\"\">\n <div className={styles.graphBody} aria-hidden={searchOpen || adding !== undefined || undefined}\n ref={element => { if (element !== null) element.inert = searchOpen || adding !== undefined }}>\n <div className={styles.header}>\n <button className={styles.searchEntry} type=\"button\" ref={searchButton} onClick={() => { setSearchOpen(true) }}>{t('search.open')}</button>\n <ResearchReuseEntry t={t} />\n <button className={styles.searchEntry} type=\"button\" aria-pressed={topicMode}\n onClick={() => { setTopicMode(value => !value) }}>{t(topicMode ? 'topic.back' : 'topic.title')}</button>\n <span className={styles.count}>\n {topicMode ? t('topic.title') : scope === undefined ? null : scope.kind === 'workspace'\n ? t('scope.workspaceCount', { name: scope.label, count: graph.sessionCount })\n : t('scope.directoryCount', { count: graph.sessionCount })}\n </span>\n <span className={styles.legend} aria-hidden=\"true\">\n {topicMode ? null : <><span className={styles.legendLineDerivation} />{t('legend.derivation')}</>}\n <span className={styles.legendLineBranch} />\n {t('legend.branch')}\n <span className={styles.legendLineMerge} />\n {t('legend.merge')}\n </span>\n <span className={styles.buildInfo} title={SESSION_GRAPH_BUILD_TITLE}>\n {SESSION_GRAPH_BUILD_LABEL}\n </span>\n </div>\n {topicMode ? <ResearchTopics key={workingKey} api={topics} refresh={topicRevision} context={{ sessions, workspaces, pendingInteractions, viewedId: sessionId,\n workingKey, actions: { hostId, topics, knowledge, reuse, openSession, branchSession, generateSessionDigest, readSessionHistory, searchDiscussion, mergeSessions, retrySessionMerge },\n }} t={t} /> : scope === undefined ? <div className={styles.empty}>{t('empty.outside')}</div>\n : graph.nodes.size === 0 ? <div className={styles.empty}>{t('empty.none')}</div> : <GraphCanvas\n key={workingKey} workingKey={workingKey} laid={laid}\n clusters={graph.clusters}\n arrangement={{ key: workingKey, legacyKey: undefined }}\n now={now}\n t={t}\n onOpen={openSession}\n onBranch={branchSession}\n onGenerateDigest={generateSessionDigest}\n onReadHistory={readSessionHistory}\n onMerge={mergeSessions}\n onRetryMerge={retrySessionMerge}\n onAddToTopic={addToTopic}\n />}\n </div>\n {searchOpen ? <div className={styles.searchLayer} aria-hidden={adding !== undefined || undefined}\n ref={element => { if (element !== null) element.inert = adding !== undefined }}><DiscussionSearch key={searchKey}\n workingKey={searchKey} initialScope={scope === undefined ? { kind: 'all' } : scope.kind === 'workspace' ? { kind: 'workspace', workspaceId: scope.workspaceId } : { kind: 'directory', cwd: scope.path }}\n workspaces={workspaces.items} search={searchDiscussion} read={readSessionHistory} open={openSession} t={t}\n onAddToTopic={addToTopic}\n onClose={() => { setSearchOpen(false); queueMicrotask(() => { searchButton.current?.focus() }) }} /></div> : null}\n {adding === undefined ? null : <section className={styles.searchOverlay} role=\"dialog\" aria-modal=\"true\" aria-label={t('topic.add')}\n onKeyDown={event => {\n if (event.key === 'Escape') { event.stopPropagation(); closePicker() }\n retainDialogFocus(event)\n }}>\n <div className={styles.searchHeader}><div><h2>{t('topic.add')}</h2><p className={styles.topicSourceId}>{adding}</p></div>\n <button type=\"button\" autoFocus onClick={closePicker}>{t('topic.close')}</button></div>\n <ResearchTopics api={topics} add={{ sessionId: adding, done: () => { setTopicRevision(value => value + 1); closePicker() } }} t={t} />\n </section>}\n </div>\n )\n}\n","export const knowledgeZh = {\n 'export.title': '导出 Markdown', 'export.close': '关闭导出', 'export.choose': '选择导出的卡片',\n 'export.preview': '预览 Markdown', 'export.download': '下载 Markdown', 'export.markdown': 'Markdown 预览',\n 'export.hint': '选择 1–50 张卡片,预览将读取它们最新的已保存修订及来源摘录。文件最多 8 MB,不调用模型。',\n 'export.frozen': '下载使用本次预览;重新预览才读取更新后的修订。',\n 'export.error': '导出失败,可保留选择后重试。', 'export.loading': '正在准备导出…',\n 'extract.title': '提炼知识', 'extract.preview': '预览纳入材料', 'extract.budget': '材料字符预算',\n 'extract.selected': '所选范围', 'extract.included': '实际纳入范围', 'extract.omitted': '省略的轮次',\n 'extract.noneOmitted': '所选范围全部纳入', 'extract.provider': '模型提供方', 'extract.model': '模型',\n 'extract.generate': '生成知识草稿', 'extract.append': '追加一组草稿', 'extract.cancel': '取消生成',\n 'extract.generating': '正在生成待审核草稿…', 'extract.verify': '待验证:请核对推论并补充有效来源。',\n 'extract.invalid': '有 {count} 个引用无效,未加入来源。请重新选择有效轮次。',\n 'extract.citation': '引用第 {turn} 轮', 'extract.review': '核对这一轮原文',\n 'extract.hint': '只读取下方纳入的讨论文字,不核查原始工具证据。有效出处不等于推论正确。',\n 'extract.preserve': '再次生成会追加草稿,保留已有编辑;所有卡片都需要逐条审核保存。',\n 'extract.snapshot': '预览固定本次材料,Host 重启后仍可按相同来源保存草稿。调整预算后请重新预览。',\n 'knowledge.close': '关闭卡片', 'knowledge.query': '关键词',\n 'knowledge.title': '知识卡片', 'knowledge.create': '保存为知识卡片', 'knowledge.new': '新建知识卡片',\n 'knowledge.field.title': '卡片标题', 'knowledge.field.question': '核心问题', 'knowledge.field.conclusion': '结论',\n 'knowledge.field.rationale': '理由与适用条件', 'knowledge.field.openQuestions': '待验证事项',\n 'knowledge.kind': '卡片类型', 'knowledge.kind.conclusion': '结论', 'knowledge.kind.method': '方法',\n 'knowledge.kind.hypothesis': '假设', 'knowledge.kind.question': '问题',\n 'knowledge.status': '状态', 'knowledge.status.draft': '草稿', 'knowledge.status.confirmed': '已确认',\n 'knowledge.edit': '编辑卡片', 'knowledge.save': '保存修订', 'knowledge.cancel': '放弃编辑',\n 'knowledge.version': '修订版本', 'knowledge.versionNumber': '第 {number} 版', 'knowledge.savedAt': '保存于 {time}',\n 'knowledge.source': '来源', 'knowledge.sourceRelation': '来源关系', 'knowledge.readSource': '查看来源原文',\n 'knowledge.excerpt': '保存的来源摘录', 'knowledge.noSources': '没有已核验的来源,请人工验证。',\n 'knowledge.sourceRange': '事件 {start}–{end}', 'knowledge.removeSource': '移除此来源',\n 'knowledge.topic': '所属主题', 'knowledge.noTopic': '暂不加入主题', 'knowledge.attach': '加入所选主题',\n 'knowledge.detach': '移出所选主题', 'knowledge.detached': '移出主题后仍保留卡片、修订和来源,可搜索后重新加入。',\n 'knowledge.search': '搜索知识卡片', 'knowledge.searchType': '搜索内容', 'knowledge.discussions': '讨论原文',\n 'knowledge.all': '此 Host 的全部知识', 'knowledge.currentTopic': '当前研究主题', 'knowledge.empty': '没有匹配的知识卡片',\n 'knowledge.error': '操作失败,内容仍保留。请重试。', 'knowledge.unavailable': '知识卡片已不可用。',\n 'knowledge.sourceHint': '按准确的已完成轮次保存来源,原会话不会被修改。',\n} as const\nexport type KnowledgeKey = keyof typeof knowledgeZh\nexport const knowledgeEn: Record<KnowledgeKey, string> = {\n 'export.title': 'Export Markdown', 'export.close': 'Close export', 'export.choose': 'Choose cards to export',\n 'export.preview': 'Preview Markdown', 'export.download': 'Download Markdown', 'export.markdown': 'Markdown preview',\n 'export.hint': 'Select 1–50 cards. Preview reads their latest saved revisions and retained source excerpts. Files are limited to 8 MB. No model is called.',\n 'export.frozen': 'Download uses this preview. Preview again to read updated revisions.',\n 'export.error': 'Export failed. Your selection is kept for retry.', 'export.loading': 'Preparing export…',\n 'extract.title': 'Extract knowledge', 'extract.preview': 'Preview included material', 'extract.budget': 'Material character budget',\n 'extract.selected': 'Selected range', 'extract.included': 'Included range', 'extract.omitted': 'Omitted turns',\n 'extract.noneOmitted': 'Entire selected range included', 'extract.provider': 'Model provider', 'extract.model': 'Model',\n 'extract.generate': 'Generate card drafts', 'extract.append': 'Append another draft batch', 'extract.cancel': 'Cancel generation',\n 'extract.generating': 'Generating drafts for review…', 'extract.verify': 'Needs verification: check the claim and add valid sources.',\n 'extract.invalid': '{count} invalid citations were excluded. Select valid turns to correct them.',\n 'extract.citation': 'Cite turn {turn}', 'extract.review': 'Check this original turn',\n 'extract.hint': 'Only the included discussion text is read. Raw tool evidence is not checked. Valid provenance does not prove a claim.',\n 'extract.preserve': 'Generating again appends drafts and preserves your edits. Review and save each card explicitly.',\n 'extract.snapshot': 'The preview freezes this material so drafts can still use the same sources after Host restart. Preview again after changing the budget.',\n 'knowledge.close': 'Close card', 'knowledge.query': 'Keywords',\n 'knowledge.title': 'Knowledge Cards', 'knowledge.create': 'Save as Knowledge Card', 'knowledge.new': 'New Knowledge Card',\n 'knowledge.field.title': 'Card title', 'knowledge.field.question': 'Core question', 'knowledge.field.conclusion': 'Conclusion',\n 'knowledge.field.rationale': 'Reasons and conditions', 'knowledge.field.openQuestions': 'Open questions',\n 'knowledge.kind': 'Card type', 'knowledge.kind.conclusion': 'Conclusion', 'knowledge.kind.method': 'Method',\n 'knowledge.kind.hypothesis': 'Hypothesis', 'knowledge.kind.question': 'Question',\n 'knowledge.status': 'Status', 'knowledge.status.draft': 'Draft', 'knowledge.status.confirmed': 'Confirmed',\n 'knowledge.edit': 'Edit card', 'knowledge.save': 'Save revision', 'knowledge.cancel': 'Discard edits',\n 'knowledge.version': 'Revision', 'knowledge.versionNumber': 'Revision {number}', 'knowledge.savedAt': 'Saved {time}',\n 'knowledge.source': 'Source', 'knowledge.sourceRelation': 'Source relation', 'knowledge.readSource': 'Read original source',\n 'knowledge.excerpt': 'Saved source excerpt', 'knowledge.noSources': 'No verified sources. Manual verification is needed.',\n 'knowledge.sourceRange': 'Events {start}–{end}', 'knowledge.removeSource': 'Remove this source',\n 'knowledge.topic': 'Research Topic', 'knowledge.noTopic': 'No topic yet', 'knowledge.attach': 'Add to selected topic',\n 'knowledge.detach': 'Remove from selected topic', 'knowledge.detached': 'Removing membership preserves the card, revisions and sources. Search to add it again.',\n 'knowledge.search': 'Search Knowledge Cards', 'knowledge.searchType': 'Search content', 'knowledge.discussions': 'Discussion text',\n 'knowledge.all': 'All knowledge on this Host', 'knowledge.currentTopic': 'Selected Research Topic', 'knowledge.empty': 'No matching Knowledge Cards',\n 'knowledge.error': 'The operation failed. Your content is retained. Try again.', 'knowledge.unavailable': 'This Knowledge Card is unavailable.',\n 'knowledge.sourceHint': 'Sources use exact completed turns. Saving does not change the source Session.',\n}\n","export const reuseZh = {\n 'reuse.noHistory': '本会话没有沿用材料记录。',\n 'reuse.addCard': '将此修订加入材料', 'reuse.addTurn': '将所选轮次加入材料', 'reuse.singleTurn': '原文材料每项只能选一个完整轮次。',\n 'reuse.title': '开始新讨论', 'reuse.materials': '材料({count})', 'reuse.empty': '请加入 1–3 项材料。',\n 'reuse.limit': '最多 3 项材料,请先移除一项。', 'reuse.added': '已加入材料', 'reuse.duplicate': '这项材料已在列表中。',\n 'reuse.up': '上移', 'reuse.down': '下移', 'reuse.remove': '移除材料',\n 'reuse.question': '新问题', 'reuse.workspace': '目标工作区', 'reuse.chooseWorkspace': '请选择目标工作区',\n 'reuse.preview': '预览发送内容', 'reuse.confirm': '确认并开始讨论', 'reuse.close': '关闭材料',\n 'reuse.boundary': '仅带入所选卡片内容或完整轮次;卡片原文需另行加入。宿主常规系统与工作区上下文由 Harness 提供。',\n 'reuse.budget': '实际发送 {size} / {budget} 字符', 'reuse.frozen': '以下预览已固定版本与来源。修改材料、顺序、问题或工作区后须重新预览。',\n 'reuse.busy': '正在处理材料…', 'reuse.error': '操作失败,材料和预览已保留。请重试。',\n 'reuse.created': '目标会话已建立,尚未确认发送。可打开目标或重试相同材料。',\n 'reuse.uncertain': '正在核对提交结果。材料已锁定;恢复目标状态或重试同一次发送。',\n 'reuse.recover': '核对目标状态', 'reuse.recoveryUnavailable': '暂时无法找到提交记录,请恢复连接后重试。',\n 'reuse.sent': '已发送:Host 已确认接收', 'reuse.answer': '模型回答状态请在新会话中查看。',\n 'reuse.retry': '重试发送', 'reuse.open': '打开目标会话', 'reuse.history': '本会话所用材料',\n 'reuse.relation': '沿用关系', 'reuse.pending': '尚未确认使用', 'reuse.retryHistory': '重试读取沿用记录',\n} as const\nexport type ReuseKey = keyof typeof reuseZh\nexport const reuseEn: Record<ReuseKey, string> = {\n 'reuse.noHistory': 'This Session has no material reuse records.',\n 'reuse.addCard': 'Add this revision to materials', 'reuse.addTurn': 'Add selected turn to materials', 'reuse.singleTurn': 'Each original material must be one complete turn.',\n 'reuse.title': 'Start a new discussion', 'reuse.materials': 'Materials ({count})', 'reuse.empty': 'Add 1–3 materials.',\n 'reuse.limit': 'Up to 3 materials. Remove one first.', 'reuse.added': 'Added to materials', 'reuse.duplicate': 'This material is already selected.',\n 'reuse.up': 'Move up', 'reuse.down': 'Move down', 'reuse.remove': 'Remove material',\n 'reuse.question': 'New question', 'reuse.workspace': 'Target Workspace', 'reuse.chooseWorkspace': 'Choose a target Workspace',\n 'reuse.preview': 'Preview message', 'reuse.confirm': 'Confirm and start discussion', 'reuse.close': 'Close materials',\n 'reuse.boundary': 'Only selected card content or full turns are included. Add original text separately. Harness supplies its normal system and Workspace context.',\n 'reuse.budget': 'Sending {size} / {budget} characters', 'reuse.frozen': 'This preview freezes versions and sources. Preview again after changing materials, order, question or Workspace.',\n 'reuse.busy': 'Processing materials…', 'reuse.error': 'The operation failed. Materials and preview are retained. Try again.',\n 'reuse.created': 'The target exists; sending is not confirmed yet. Open it or retry the same materials.',\n 'reuse.uncertain': 'Submission is uncertain. Materials stay locked; recover the target status or retry the same submission.',\n 'reuse.recover': 'Check target status', 'reuse.recoveryUnavailable': 'The submission record is unavailable. Reconnect and try again.',\n 'reuse.sent': 'Sent: Host acknowledged admission', 'reuse.answer': 'See the new Session for the model response state.',\n 'reuse.retry': 'Retry sending', 'reuse.open': 'Open target Session', 'reuse.history': 'Materials used by this Session',\n 'reuse.relation': 'Reuse relation', 'reuse.pending': 'Usage not yet confirmed', 'reuse.retryHistory': 'Retry reading reuse records',\n}\n","/** `sessionGraph` namespace dictionaries (view tab label + graph chrome strings). */\nimport { knowledgeEn, knowledgeZh, type KnowledgeKey } from './knowledge-locales.ts'\nimport { reuseEn, reuseZh, type ReuseKey } from './research-reuse-locales.ts'\n\n/** Dictionary namespace owned by this plugin. */\nexport const NS = 'sessionGraph'\n\n/** The session-graph dictionary key set (the source of truth for both locales). */\nexport type SessionGraphKey =\n | 'position.unavailable' | 'position.topicUnavailable'\n | KnowledgeKey\n | ReuseKey\n | 'topic.title' | 'topic.back' | 'topic.description' | 'topic.loading' | 'topic.readError' | 'topic.retry'\n | 'topic.newName' | 'topic.create' | 'topic.empty' | 'topic.choose' | 'topic.name' | 'topic.rename'\n | 'topic.saving' | 'topic.saveError'\n | 'topic.noWorkspace' | 'topic.unavailable' | 'topic.noReferences' | 'topic.source'\n | 'topic.readOriginal' | 'topic.closeOriginal' | 'topic.remove'\n | 'topic.add' | 'topic.addSelected' | 'topic.close'\n | 'topic.saveArrangement' | 'topic.arrangementHint' | 'topic.unsaved'\n | 'topic.refresh' | 'topic.cancel' | 'topic.canceled' | 'topic.archivedReading'\n | 'search.disabled'\n | 'search.setup'\n | 'search.setupUrl'\n | 'search.setupLink'\n | 'search.restart'\n | 'search.retry'\n | 'search.cancel'\n | 'search.canceled'\n | 'search.more'\n | 'search.stale'\n | 'search.open'\n | 'search.title'\n | 'search.description'\n | 'search.close'\n | 'search.query'\n | 'search.placeholder'\n | 'search.scope'\n | 'search.directory'\n | 'search.all'\n | 'search.includeArchived'\n | 'search.submit'\n | 'search.loading'\n | 'search.empty'\n | 'search.count'\n | 'search.start'\n | 'search.error'\n | 'search.results'\n | 'search.read'\n | 'search.noWorkspace'\n | 'search.archived'\n | 'search.original'\n | 'search.select'\n | 'search.snapshot'\n | 'history.refresh'\n | 'history.cancel'\n | 'history.canceled'\n | 'history.excerpt'\n | 'history.excerptHint'\n | 'history.error'\n | 'history.unavailable'\n | 'history.empty'\n | 'history.retry'\n | 'history.scope'\n | 'history.selectHint'\n | 'history.incompleteRange'\n | 'history.selectTurn'\n | 'history.selected'\n | 'history.boundary'\n | 'history.review'\n | 'history.clear'\n | 'history.unfinished'\n | 'history.loading'\n | 'history.earlier'\n | 'history.later'\n | 'history.tab'\n | 'history.title'\n | 'history.turn'\n | 'history.user'\n | 'history.assistant'\n | 'view.graph'\n | 'scope.workspaceCount'\n | 'scope.directoryCount'\n | 'node.newSession'\n | 'node.running'\n | 'node.subagents'\n | 'node.branchedFrom'\n | 'time.now'\n | 'time.minutes'\n | 'time.hours'\n | 'time.days'\n | 'time.months'\n | 'time.years'\n | 'cluster.expand'\n | 'cluster.collapse'\n | 'toolbar.zoomIn'\n | 'toolbar.zoomOut'\n | 'toolbar.zoomLevel'\n | 'toolbar.label'\n | 'toolbar.fit'\n | 'toolbar.relayout'\n | 'toolbar.reset'\n | 'toolbar.locate'\n | 'toolbar.merge'\n | 'canvas.minimap'\n | 'filter.placeholder'\n | 'filter.clear'\n | 'filter.matches'\n | 'filter.none'\n | 'legend.derivation'\n | 'legend.branch'\n | 'legend.merge'\n | 'merge.title'\n | 'merge.close'\n | 'merge.intro'\n | 'merge.selectedCount'\n | 'merge.instruction'\n | 'merge.referenceInstruction'\n | 'merge.defaultInstruction'\n | 'merge.remove'\n | 'merge.cancel'\n | 'merge.submit'\n | 'merge.submitting'\n | 'merge.retry'\n | 'merge.openTarget'\n | 'merge.targetKept'\n | 'merge.errorValidation'\n | 'merge.errorCreating'\n | 'merge.errorNaming'\n | 'merge.errorSubmitting'\n | 'merge.errorOpening'\n | 'merge.errorUnknown'\n | 'panel.title'\n | 'panel.close'\n | 'panel.open'\n | 'panel.branch'\n | 'panel.branchError'\n | 'panel.subagents'\n | 'panel.mergeSources'\n | 'panel.mergeUnavailable'\n | 'panel.mergeCapturedThrough'\n | 'panel.mergeCompleteSnapshot'\n | 'digest.title'\n | 'digest.intro'\n | 'digest.generate'\n | 'digest.generating'\n | 'digest.refreshing'\n | 'digest.refresh'\n | 'digest.regenerate'\n | 'digest.retry'\n | 'digest.stale'\n | 'digest.snapshot'\n | 'digest.empty'\n | 'digest.error'\n | 'digest.errorRoute'\n | 'digest.errorOutput'\n | 'digest.outcomes'\n | 'digest.openItems'\n | 'digest.turns'\n | 'preview.status.running'\n | 'preview.status.pending'\n | 'preview.status.completed'\n | 'canvas.description'\n | 'empty.outside'\n | 'empty.none'\n\ndeclare module '@deepseek-ai/dsh-client-ui-slots' {\n interface LocaleNamespaceMap {\n /** The session-graph view tab label and graph chrome strings. */\n 'sessionGraph': SessionGraphKey\n }\n}\n\n/** Simplified Chinese dictionary (the key-set source of truth). */\nexport const zh: Record<SessionGraphKey, string> = {\n 'position.unavailable': '上次选中的资料已不可用,已保留视口并清空选择。',\n 'position.topicUnavailable': '上次的研究主题已不可用,请从列表选择主题。',\n ...knowledgeZh,\n ...reuseZh,\n 'topic.refresh': '刷新来源',\n 'topic.saveArrangement': '保存排列',\n 'topic.arrangementHint': '拖动或折叠后,点击“保存排列”保存到此主题。',\n 'topic.unsaved': '排列尚未保存。切换主题会保留本次编辑,离开研究主题前请保存。',\n 'topic.add': '加入研究主题',\n 'topic.addSelected': '加入所选主题',\n 'topic.close': '关闭主题选择',\n 'topic.noWorkspace': '未分配工作区',\n 'topic.unavailable': '来源不可用',\n 'topic.noReferences': '主题中还没有资料。在会话详情或搜索结果中选择“加入研究主题”。',\n 'topic.source': '主题来源',\n 'topic.readOriginal': '阅读原文',\n 'topic.closeOriginal': '关闭原文',\n 'topic.remove': '从主题移除',\n 'topic.title': '研究主题',\n 'topic.back': '工作区图',\n 'topic.description': '将同一 Host 中不同工作区的会话整理到主题中。关联只用于组织资料,不会改变源会话或发送模型上下文。',\n 'topic.loading': '正在读取主题…',\n 'topic.cancel': '取消读取',\n 'topic.canceled': '已取消读取主题。',\n 'topic.archivedReading': '已归档,可在此阅读原文;无法打开归档会话。',\n 'topic.readError': '读取主题失败。请重试。',\n 'topic.retry': '重试',\n 'topic.newName': '新主题名称',\n 'topic.create': '创建主题',\n 'topic.empty': '尚无研究主题。创建一个主题开始整理资料。',\n 'topic.choose': '选择研究主题',\n 'topic.name': '主题名称',\n 'topic.rename': '保存名称',\n 'topic.saving': '正在保存主题…',\n 'topic.saveError': '保存失败,输入已保留,请重试。',\n 'search.disabled': '全文索引尚未启用。',\n 'search.setup': '在当前 profile 的 cordis.patch.yml 覆盖 session-query-sqlite 配置,将 openAt 设为 first-search。重启 Host 后重新搜索。',\n 'search.setupUrl': 'https://github.com/benz-ai-x/dsh-research-graph/blob/main/README.zh.md#enable-discussion-search',\n 'search.setupLink': '查看启用步骤',\n 'search.restart': '重新搜索',\n 'search.retry': '重试搜索',\n 'search.cancel': '取消搜索',\n 'search.canceled': '搜索已取消。',\n 'search.more': '加载更多结果',\n 'search.stale': '结果已过期或范围已变化,请重新搜索。',\n 'search.open': '搜索正文',\n 'search.title': '搜索历史讨论',\n 'search.description': '查找已完成轮次中的用户与助手正文。每个会话显示最近一处命中。',\n 'search.close': '关闭搜索',\n 'search.query': '正文关键词',\n 'search.placeholder': '输入记得的词句…',\n 'search.scope': '搜索范围',\n 'search.directory': '当前目录',\n 'search.all': '当前 Host 的全部会话',\n 'search.includeArchived': '包含归档',\n 'search.submit': '搜索',\n 'search.loading': '正在准备索引并检索讨论…',\n 'search.empty': '所选范围内没有匹配的讨论。',\n 'search.count': '已找到 {count} 个会话',\n 'search.start': '选择范围并输入关键词,然后搜索。',\n 'search.error': '搜索失败,请重试。',\n 'search.results': '搜索结果',\n 'search.read': '查看原文:{title}',\n 'search.noWorkspace': '未归属工作区',\n 'search.archived': '已归档',\n 'search.original': '搜索原文',\n 'search.select': '选择命中片段,在这里核对原文。',\n 'search.snapshot': '左侧片段保留检索时的内容;下方按来源身份重新读取原文。',\n 'history.refresh': '刷新原文',\n 'history.cancel': '取消读取',\n 'history.canceled': '已取消读取',\n 'history.excerpt': '仅存摘录',\n 'history.excerptHint': '原文当前无法读取,下面为本次选择时保留的摘录。',\n 'history.error': '读取失败,请重试。',\n 'history.unavailable': '来源不可用',\n 'history.empty': '此会话暂无讨论轮次',\n 'history.retry': '重试读取',\n 'history.scope': '仅展示用户和助手的讨论文本;不包含附件、工具结果或思考过程。',\n 'history.selectHint': '选择一轮,再点另一轮可选中连续范围;再次点击已选轮次可清除。',\n 'history.incompleteRange': '中间还有未加载或未完成的轮次,请先加载或刷新后再选择。',\n 'history.selectTurn': '选择第 {turn} 轮',\n 'history.selected': '已选择第 {first}–{last} 轮',\n 'history.boundary': '事件 {start}–{end}',\n 'history.review': '复核所选原文',\n 'history.clear': '清除选择',\n 'history.unfinished': '尚未完成,不可选作固定来源',\n 'history.loading': '正在读取原文…',\n 'history.earlier': '加载更早的讨论',\n 'history.later': '加载更晚的讨论',\n 'history.tab': '原文',\n 'history.title': '讨论原文',\n 'history.turn': '第 {turn} 轮',\n 'history.user': '用户',\n 'history.assistant': '助手',\n 'view.graph': '研图',\n 'scope.workspaceCount': '{name} · {count} 个会话',\n 'scope.directoryCount': '目录范围 · {count} 个会话',\n 'node.newSession': '新会话',\n 'node.running': '{count} 运行中',\n 'node.subagents': '{count} 子代理',\n 'node.branchedFrom': '分支自:{name}',\n 'time.now': '刚刚',\n 'time.minutes': '{n}分钟',\n 'time.hours': '{n}小时',\n 'time.days': '{n}天',\n 'time.months': '{n}个月',\n 'time.years': '{n}年',\n 'cluster.expand': '展开会话簇',\n 'cluster.collapse': '收起会话簇',\n 'toolbar.zoomIn': '放大',\n 'toolbar.zoomOut': '缩小',\n 'toolbar.zoomLevel': '缩放至 100%',\n 'toolbar.label': '画布工具',\n 'toolbar.fit': '适应',\n 'toolbar.relayout': '重新布局',\n 'toolbar.reset': '重置布局',\n 'toolbar.locate': '定位',\n 'toolbar.merge': '汇聚会话',\n 'canvas.minimap': '迷你地图',\n 'filter.placeholder': '过滤会话标题',\n 'filter.clear': '清除过滤',\n 'filter.matches': '{count} 个匹配',\n 'filter.none': '无匹配会话',\n 'legend.derivation': '子代理派生',\n 'legend.branch': '分支',\n 'legend.merge': '汇聚',\n 'merge.title': '汇聚会话',\n 'merge.close': '关闭汇聚会话',\n 'merge.intro': '选择 2–3 个会话作为快照来源。目标会话会独立创建,不改变原有分支。',\n 'merge.selectedCount': '已选择 {count}/3',\n 'merge.instruction': '汇聚指令',\n 'merge.referenceInstruction': '请通过会话卡片选择来源,不要在指令中输入 dsh-session 引用。',\n 'merge.defaultInstruction': '综合所选会话的上下文,提炼共识、分歧和待办,并继续完成任务。',\n 'merge.remove': '移除 {name}',\n 'merge.cancel': '取消',\n 'merge.submit': '创建汇聚会话',\n 'merge.submitting': '正在创建汇聚会话…',\n 'merge.retry': '重试',\n 'merge.openTarget': '打开目标会话',\n 'merge.targetKept': '目标会话已保留,可以安全重试。',\n 'merge.errorValidation': '所选会话无法汇聚,请检查来源和指令。',\n 'merge.errorCreating': '创建目标会话失败。',\n 'merge.errorNaming': '目标会话命名失败。',\n 'merge.errorSubmitting': '提交源会话快照失败。',\n 'merge.errorOpening': '汇聚已完成,但无法自动打开目标会话。',\n 'merge.errorUnknown': '汇聚会话失败,请重试。',\n 'panel.title': '会话详情',\n 'panel.close': '关闭会话详情',\n 'panel.open': '打开会话',\n 'panel.branch': '开新分支',\n 'panel.branchError': '无法创建分支,请重试',\n 'panel.subagents': '{count} 子代理',\n 'panel.mergeSources': '汇聚来源',\n 'panel.mergeUnavailable': '不可用会话({id})',\n 'panel.mergeCapturedThrough': '快照至事件 {seq}',\n 'panel.mergeCompleteSnapshot': '完整快照',\n 'digest.title': '会话摘要',\n 'digest.intro': '按需生成本会话的概览、关键结论和待办。',\n 'digest.generate': '生成摘要',\n 'digest.generating': '正在生成摘要…',\n 'digest.refreshing': '正在更新摘要…',\n 'digest.refresh': '更新摘要',\n 'digest.regenerate': '重新生成',\n 'digest.retry': '重试',\n 'digest.stale': '会话有新内容',\n 'digest.snapshot': '运行中快照',\n 'digest.empty': '暂无可总结的会话内容',\n 'digest.error': '摘要生成失败,请重试',\n 'digest.errorRoute': '此会话没有可用的模型路由,请配置兜底模型后重试',\n 'digest.errorOutput': '模型返回的摘要格式无效,请重试',\n 'digest.outcomes': '关键结论',\n 'digest.openItems': '待处理',\n 'digest.turns': '基于 {count} 轮对话',\n 'preview.status.running': '运行中',\n 'preview.status.pending': '等待输入',\n 'preview.status.completed': '已完成',\n 'canvas.description': '会话关系图谱',\n 'empty.outside': '无法确定当前查看会话的工作区或工作目录',\n 'empty.none': '此范围暂无画布会话',\n}\n\n/** English dictionary. */\nexport const en: Record<SessionGraphKey, string> = {\n 'position.unavailable': 'The previously selected material is unavailable. The viewport is kept and selection is cleared.',\n 'position.topicUnavailable': 'The previous research topic is unavailable. Choose a topic from the list.',\n ...knowledgeEn,\n ...reuseEn,\n 'topic.refresh': 'Refresh sources',\n 'topic.saveArrangement': 'Save arrangement',\n 'topic.arrangementHint': 'After dragging or collapsing, save the arrangement to this topic.',\n 'topic.unsaved': 'Unsaved arrangement. Switching topics keeps this draft; save before leaving Research Topics.',\n 'topic.add': 'Add to Research Topic',\n 'topic.addSelected': 'Add to selected topic',\n 'topic.close': 'Close topic picker',\n 'topic.noWorkspace': 'No Workspace',\n 'topic.unavailable': 'Source unavailable',\n 'topic.noReferences': 'No sources yet. Choose “Add to Research Topic” in Session details or a search result.',\n 'topic.source': 'Topic source',\n 'topic.readOriginal': 'Read original',\n 'topic.closeOriginal': 'Close original',\n 'topic.remove': 'Remove from topic',\n 'topic.title': 'Research Topics',\n 'topic.back': 'Workspace graph',\n 'topic.description': 'Organize Sessions from different Workspaces in the same Host. References do not change source Sessions or send model context.',\n 'topic.loading': 'Loading topics…',\n 'topic.cancel': 'Cancel reading',\n 'topic.canceled': 'Topic reading canceled.',\n 'topic.archivedReading': 'Archived sources can be read here; opening their Session is unavailable.',\n 'topic.readError': 'Could not read topics. Please retry.',\n 'topic.retry': 'Retry',\n 'topic.newName': 'New topic name',\n 'topic.create': 'Create topic',\n 'topic.empty': 'No Research Topics yet. Create a topic to start collecting sources.',\n 'topic.choose': 'Choose Research Topic',\n 'topic.name': 'Topic name',\n 'topic.rename': 'Save name',\n 'topic.saving': 'Saving topic…',\n 'topic.saveError': 'Could not save. Your input is preserved; please retry.',\n 'search.disabled': 'Full-text indexing is not enabled.',\n 'search.setup': 'In this profile’s cordis.patch.yml, override session-query-sqlite with openAt: first-search. Restart the Host, then search again.',\n 'search.setupUrl': 'https://github.com/benz-ai-x/dsh-research-graph/blob/main/README.md#enable-discussion-search',\n 'search.setupLink': 'View setup steps',\n 'search.restart': 'Search again',\n 'search.retry': 'Retry search',\n 'search.cancel': 'Cancel search',\n 'search.canceled': 'Search canceled.',\n 'search.more': 'Load more results',\n 'search.stale': 'Results expired or the scope changed. Search again.',\n 'search.open': 'Search discussions',\n 'search.title': 'Search discussion history',\n 'search.description': 'Find user and assistant text in completed turns. Each session shows its latest matching passage.',\n 'search.close': 'Close search',\n 'search.query': 'Discussion keywords',\n 'search.placeholder': 'Words or phrases you remember…',\n 'search.scope': 'Search scope',\n 'search.directory': 'This directory',\n 'search.all': 'All sessions on this Host',\n 'search.includeArchived': 'Include archived',\n 'search.submit': 'Search',\n 'search.loading': 'Preparing the index and searching discussions…',\n 'search.empty': 'No matching discussions in this scope.',\n 'search.count': 'Found {count} sessions',\n 'search.start': 'Choose a scope, enter keywords, and search.',\n 'search.error': 'Search failed. Please try again.',\n 'search.results': 'Search results',\n 'search.read': 'Read original: {title}',\n 'search.noWorkspace': 'No workspace',\n 'search.archived': 'Archived',\n 'search.original': 'Search original',\n 'search.select': 'Select a passage to check the original here.',\n 'search.snapshot': 'The result excerpt is from the search. The reader below rechecks the addressed original.',\n 'history.refresh': 'Refresh discussion',\n 'history.cancel': 'Cancel reading',\n 'history.canceled': 'Reading canceled',\n 'history.excerpt': 'Excerpt only',\n 'history.excerptHint': 'The original is unavailable. This is the excerpt retained when you selected it.',\n 'history.error': 'Reading failed. Please retry.',\n 'history.unavailable': 'Source unavailable',\n 'history.empty': 'This Session has no discussion turns yet',\n 'history.retry': 'Retry reading',\n 'history.scope': 'User and assistant discussion text only; attachments, tool results and reasoning are excluded.',\n 'history.selectHint': 'Select a turn, then another to include the range. Select a checked turn again to clear.',\n 'history.incompleteRange': 'Some turns in this range are not loaded or completed. Load or refresh them before selecting.',\n 'history.selectTurn': 'Select turn {turn}',\n 'history.selected': 'Selected turns {first}–{last}',\n 'history.boundary': 'Events {start}–{end}',\n 'history.review': 'Check selected original',\n 'history.clear': 'Clear selection',\n 'history.unfinished': 'Unfinished; cannot be selected as a fixed source',\n 'history.loading': 'Reading discussion…',\n 'history.earlier': 'Load earlier discussion',\n 'history.later': 'Load later discussion',\n 'history.tab': 'Original',\n 'history.title': 'Discussion text',\n 'history.turn': 'Turn {turn}',\n 'history.user': 'User',\n 'history.assistant': 'Assistant',\n 'view.graph': 'Research Graph',\n 'scope.workspaceCount': '{name} · {count} sessions',\n 'scope.directoryCount': 'Directory scope · {count} sessions',\n 'node.newSession': 'New session',\n 'node.running': '{count} running',\n 'node.subagents': '{count} subagents',\n 'node.branchedFrom': 'branched from: {name}',\n 'time.now': 'now',\n 'time.minutes': '{n}min',\n 'time.hours': '{n}h',\n 'time.days': '{n}d',\n 'time.months': '{n}mo',\n 'time.years': '{n}y',\n 'cluster.expand': 'Expand session cluster',\n 'cluster.collapse': 'Collapse session cluster',\n 'toolbar.zoomIn': 'Zoom in',\n 'toolbar.zoomOut': 'Zoom out',\n 'toolbar.zoomLevel': 'Zoom to 100%',\n 'toolbar.label': 'Canvas tools',\n 'toolbar.fit': 'Fit',\n 'toolbar.relayout': 'Relayout',\n 'toolbar.reset': 'Reset layout',\n 'toolbar.locate': 'Locate',\n 'toolbar.merge': 'Merge sessions',\n 'canvas.minimap': 'Minimap',\n 'filter.placeholder': 'Filter session titles',\n 'filter.clear': 'Clear filter',\n 'filter.matches': 'Matches: {count}',\n 'filter.none': 'No matching sessions',\n 'legend.derivation': 'Subagent derivation',\n 'legend.branch': 'Branch',\n 'legend.merge': 'Merge',\n 'merge.title': 'Merge sessions',\n 'merge.close': 'Close Merge sessions',\n 'merge.intro': 'Select 2–3 sessions as snapshot sources. The target is created independently without changing existing branches.',\n 'merge.selectedCount': '{count}/3 selected',\n 'merge.instruction': 'Merge instruction',\n 'merge.referenceInstruction': 'Select sources on the session cards instead of entering dsh-session references in the instruction.',\n 'merge.defaultInstruction': 'Synthesize the selected session contexts, extract agreements, disagreements, and open work, then continue the task.',\n 'merge.remove': 'Remove {name}',\n 'merge.cancel': 'Cancel',\n 'merge.submit': 'Create Merge session',\n 'merge.submitting': 'Creating Merge session…',\n 'merge.retry': 'Try again',\n 'merge.openTarget': 'Open target session',\n 'merge.targetKept': 'The target session was preserved and can be retried safely.',\n 'merge.errorValidation': 'These sessions cannot be merged. Check the sources and instruction.',\n 'merge.errorCreating': 'The target session could not be created.',\n 'merge.errorNaming': 'The target session could not be named.',\n 'merge.errorSubmitting': 'The source session snapshots could not be submitted.',\n 'merge.errorOpening': 'The Merge completed, but the target session could not be opened automatically.',\n 'merge.errorUnknown': 'The Merge session could not be created. Try again.',\n 'panel.title': 'Session details',\n 'panel.close': 'Close session details',\n 'panel.open': 'Open session',\n 'panel.branch': 'New branch',\n 'panel.branchError': \"Couldn't create the branch. Try again\",\n 'panel.subagents': '{count} subagents',\n 'panel.mergeSources': 'Merge sources',\n 'panel.mergeUnavailable': 'Unavailable session ({id})',\n 'panel.mergeCapturedThrough': 'Snapshot through event {seq}',\n 'panel.mergeCompleteSnapshot': 'Complete snapshot',\n 'digest.title': 'Session digest',\n 'digest.intro': 'Generate an overview, key outcomes, and open items on demand.',\n 'digest.generate': 'Generate digest',\n 'digest.generating': 'Generating digest…',\n 'digest.refreshing': 'Updating digest…',\n 'digest.refresh': 'Update digest',\n 'digest.regenerate': 'Regenerate',\n 'digest.retry': 'Try again',\n 'digest.stale': 'Session has new content',\n 'digest.snapshot': 'Running snapshot',\n 'digest.empty': 'No Session content to summarize yet',\n 'digest.error': \"Couldn't generate the digest. Try again\",\n 'digest.errorRoute': 'This Session has no usable model route. Configure a fallback model and try again',\n 'digest.errorOutput': 'The model returned an invalid digest format. Try again',\n 'digest.outcomes': 'Key outcomes',\n 'digest.openItems': 'Open items',\n 'digest.turns': 'Based on {count} turns',\n 'preview.status.running': 'Running',\n 'preview.status.pending': 'Waiting for input',\n 'preview.status.completed': 'Completed',\n 'canvas.description': 'Session relationship graph',\n 'empty.outside': 'The viewed session has no resolvable workspace or working directory',\n 'empty.none': 'No canvas sessions in this scope yet',\n}\n","/** Strict Client contribution for the package-owned Session Digest Remote. */\n\nimport type { RemoteResult, TypertRemoteContribution } from '@deepseek-ai/dsh-typert-protocol'\nimport type {\n SessionDigest,\n SessionDigestRequest,\n SessionDigestResult,\n} from '../session-digest.ts'\n\ndeclare module '@deepseek-ai/dsh-typert-protocol' {\n interface TypertRemoteMap {\n 'sessionGraphDigest/generate': (\n request: SessionDigestRequest,\n signal?: AbortSignal,\n ) => Promise<RemoteResult<SessionDigestResult>>\n }\n interface TypertRemoteNamespaceMap {\n sessionGraphDigest: { generate: TypertRemoteMap['sessionGraphDigest/generate'] }\n }\n}\n\nconst PACKAGE_NAME = '@benz-ai-x/dsh-research-graph'\n\nfunction recordOf(value: unknown, label: string): Readonly<Record<string, unknown>> {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) {\n throw new TypeError(`${label} must be an object`)\n }\n return value as Readonly<Record<string, unknown>>\n}\n\nfunction stringOf(value: unknown, label: string, allowEmpty = false): string {\n if (typeof value !== 'string' || (!allowEmpty && value.length === 0)) {\n throw new TypeError(`${label} must be ${allowEmpty ? 'a string' : 'a non-empty string'}`)\n }\n return value\n}\n\nfunction numberOf(value: unknown, label: string): number {\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n throw new TypeError(`${label} must be a finite number`)\n }\n return value\n}\n\nfunction stringListOf(value: unknown, label: string): readonly string[] {\n if (!Array.isArray(value)) throw new TypeError(`${label} must be an array`)\n return value.map((item, index) => stringOf(item, `${label}[${String(index)}]`, true))\n}\n\nfunction parseRequest(value: unknown): SessionDigestRequest {\n const record = recordOf(value, 'Session Digest request')\n if (typeof record.refresh !== 'boolean') {\n throw new TypeError('Session Digest request.refresh must be a boolean')\n }\n return {\n sessionId: stringOf(record.sessionId, 'Session Digest request.sessionId'),\n refresh: record.refresh,\n }\n}\n\nfunction parseDigest(value: unknown): SessionDigest {\n const record = recordOf(value, 'Session Digest')\n if (typeof record.generatedWhileRunning !== 'boolean') {\n throw new TypeError('Session Digest generatedWhileRunning must be a boolean')\n }\n return {\n sessionId: stringOf(record.sessionId, 'Session Digest sessionId'),\n sourceRevision: stringOf(record.sourceRevision, 'Session Digest sourceRevision', true),\n sourceTurnCount: numberOf(record.sourceTurnCount, 'Session Digest sourceTurnCount'),\n generatedAt: numberOf(record.generatedAt, 'Session Digest generatedAt'),\n generatedWhileRunning: record.generatedWhileRunning,\n overview: stringOf(record.overview, 'Session Digest overview'),\n keyOutcomes: stringListOf(record.keyOutcomes, 'Session Digest keyOutcomes'),\n openItems: stringListOf(record.openItems, 'Session Digest openItems'),\n }\n}\n\nfunction parseResult(value: unknown): SessionDigestResult {\n const record = recordOf(value, 'Session Digest result')\n if (record.kind === 'empty') return { kind: 'empty' }\n if (record.kind !== 'ready' || typeof record.cached !== 'boolean') {\n throw new TypeError('Session Digest result has an invalid kind or cached flag')\n }\n return { kind: 'ready', cached: record.cached, digest: parseDigest(record.digest) }\n}\n\nconst requestSchema = { parse: parseRequest }\nconst resultSchema = { parse: parseResult }\n\n/** Host-for-Client descriptor mounted explicitly by this package's browser entry. */\nexport const SESSION_DIGEST_REMOTE: TypertRemoteContribution = {\n package: PACKAGE_NAME,\n descriptors: [{\n id: `${PACKAGE_NAME}#sessionGraphDigest/generate`,\n service: 'sessionGraphDigest',\n namespace: 'sessionGraphDigest',\n method: 'generate',\n invocation: { kind: 'direct' },\n parameters: [{\n name: 'request',\n wire: 'request',\n source: 'json',\n codec: {\n mode: 'strict',\n typeSymbol: `${PACKAGE_NAME}#SessionDigestRequest`,\n schema: requestSchema,\n },\n }],\n cancellation: { parameter: 'signal' },\n result: {\n mode: 'strict',\n typeSymbol: `${PACKAGE_NAME}#SessionDigestResult`,\n schema: resultSchema,\n },\n }],\n}\n","/** Strict Client contribution for the package-owned Session Merge Remote. */\n\nimport type { RemoteResult, TypertRemoteContribution } from '@deepseek-ai/dsh-typert-protocol'\nimport type { SessionMergeProjection } from '../session-merge-projection.ts'\nimport type { SessionMergeSubmission } from '../session-merge.ts'\n\ndeclare module '@deepseek-ai/dsh-typert-protocol' {\n interface TypertRemoteMap {\n 'sessionGraphMerge/submit': (\n request: SessionMergeSubmission,\n signal?: AbortSignal,\n ) => Promise<RemoteResult<SessionMergeProjection>>\n }\n interface TypertRemoteNamespaceMap {\n sessionGraphMerge: { submit: TypertRemoteMap['sessionGraphMerge/submit'] }\n }\n}\n\nconst PACKAGE_NAME = '@benz-ai-x/dsh-research-graph'\n\nfunction recordOf(value: unknown, label: string): Readonly<Record<string, unknown>> {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) {\n throw new TypeError(`${label} must be an object`)\n }\n return value as Readonly<Record<string, unknown>>\n}\n\nfunction stringOf(value: unknown, label: string): string {\n if (typeof value !== 'string' || value.trim() === '') {\n throw new TypeError(`${label} must be a non-empty string`)\n }\n return value\n}\n\nfunction sourceIdsOf(value: unknown, label: string): readonly string[] {\n if (!Array.isArray(value) || value.length < 2 || value.length > 3) {\n throw new TypeError(`${label} must contain two or three Session identities`)\n }\n const sourceIds = value.map((item, index) => stringOf(item, `${label}[${String(index)}]`))\n if (new Set(sourceIds).size !== sourceIds.length) {\n throw new TypeError(`${label} must contain distinct Session identities`)\n }\n return sourceIds\n}\n\nfunction parseRequest(value: unknown): SessionMergeSubmission {\n const request = recordOf(value, 'Session Merge request')\n return {\n targetSessionId: stringOf(request.targetSessionId, 'Session Merge targetSessionId'),\n sourceIds: sourceIdsOf(request.sourceIds, 'Session Merge sourceIds'),\n instruction: stringOf(request.instruction, 'Session Merge instruction'),\n operationId: stringOf(request.operationId, 'Session Merge operationId'),\n }\n}\n\nfunction sequenceOf(value: unknown, label: string): number {\n if (!Number.isSafeInteger(value) || (value as number) < 0) {\n throw new TypeError(`${label} must be a non-negative safe integer`)\n }\n return value as number\n}\n\nfunction parseResult(value: unknown): SessionMergeProjection {\n const result = recordOf(value, 'Session Merge result')\n if (!Array.isArray(result.sources) || result.sources.length < 2 || result.sources.length > 3) {\n throw new TypeError('Session Merge result.sources must contain two or three snapshots')\n }\n const sources = result.sources.map((value, index) => {\n const source = recordOf(value, `Session Merge result.sources[${String(index)}]`)\n const captured = source.capturedThroughSeq\n if (!(captured === null || (Number.isSafeInteger(captured) && (captured as number) >= 0))) {\n throw new TypeError('Session Merge capturedThroughSeq must be null or a non-negative integer')\n }\n return {\n sessionId: stringOf(source.sessionId, 'Session Merge source sessionId'),\n capturedThroughSeq: captured as number | null,\n }\n })\n if (new Set(sources.map(source => source.sessionId)).size !== sources.length) {\n throw new TypeError('Session Merge result sources must be distinct')\n }\n return {\n operationId: stringOf(result.operationId, 'Session Merge result.operationId'),\n contextEventSeq: sequenceOf(result.contextEventSeq, 'Session Merge contextEventSeq'),\n sources,\n }\n}\n\n/** Host-for-Client descriptor mounted with the package's other Remote. */\nexport const SESSION_MERGE_REMOTE: TypertRemoteContribution = {\n package: PACKAGE_NAME,\n descriptors: [{\n id: `${PACKAGE_NAME}#sessionGraphMerge/submit`,\n service: 'sessionGraphMerge',\n namespace: 'sessionGraphMerge',\n method: 'submit',\n invocation: { kind: 'direct' },\n parameters: [{\n name: 'request',\n wire: 'request',\n source: 'json',\n codec: {\n mode: 'strict',\n typeSymbol: `${PACKAGE_NAME}#SessionMergeSubmission`,\n schema: { parse: parseRequest },\n },\n }],\n cancellation: { parameter: 'signal' },\n result: {\n mode: 'strict',\n typeSymbol: `${PACKAGE_NAME}#SessionMergeProjection`,\n schema: { parse: parseResult },\n },\n }],\n}\n","/** Small shared wire codecs; keep Host libraries out of the lazy browser bundle. */\nimport type {\n SessionDiscussionRange, SessionDiscussionSource, SessionHistoryMessage, SessionHistoryRequest, SessionHistoryResult, SessionHistoryTurn,\n} from './session-history.ts'\n\nfunction invalid(): never { throw new TypeError('Invalid Session History value') }\n\nfunction object(value: unknown, keys: readonly string[]): Record<string, unknown> {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) return invalid()\n if (Object.keys(value).some(key => !keys.includes(key))) return invalid()\n return value as Record<string, unknown>\n}\n\nfunction sequence(value: unknown): number {\n if (typeof value !== 'number' || !Number.isSafeInteger(value) || value < 0) return invalid()\n return value\n}\n\nfunction string(value: unknown): string {\n if (typeof value !== 'string') return invalid()\n return value\n}\n\nfunction array<Item>(value: unknown, parse: (item: unknown) => Item): Item[] {\n if (!Array.isArray(value)) return invalid()\n return value.map(parse)\n}\n\nfunction message(value: unknown): SessionHistoryMessage {\n const item = object(value, ['role', 'seq', 'text'])\n if (item.role !== 'user' && item.role !== 'assistant') return invalid()\n return { role: item.role, seq: sequence(item.seq), text: string(item.text) }\n}\n\nfunction turn(value: unknown): SessionHistoryTurn {\n const item = object(value, ['turn', 'startSeq', 'endSeq', 'startedAt', 'messages'])\n if (typeof item.startedAt !== 'number' || !Number.isFinite(item.startedAt)) return invalid()\n return {\n turn: sequence(item.turn), startSeq: sequence(item.startSeq),\n endSeq: item.endSeq === null ? null : sequence(item.endSeq),\n startedAt: item.startedAt, messages: array(item.messages, message),\n }\n}\n\nfunction source(value: unknown): SessionDiscussionSource {\n const item = object(value, ['startSeq', 'endSeq', 'turns'])\n const result = { startSeq: sequence(item.startSeq), endSeq: sequence(item.endSeq), turns: array(item.turns, turn) }\n if (result.turns.length === 0 || result.turns[0]?.startSeq !== result.startSeq\n || result.turns.at(-1)?.endSeq !== result.endSeq) return invalid()\n let previousEnd = -1\n for (const entry of result.turns) {\n if (entry.endSeq === null || entry.endSeq <= entry.startSeq || entry.startSeq <= previousEnd) return invalid()\n if (entry.messages.some(item => item.seq <= entry.startSeq || item.seq >= entry.endSeq!)) return invalid()\n previousEnd = entry.endSeq\n }\n return result\n}\n\nfunction range(value: unknown): SessionDiscussionRange {\n const item = object(value, ['startSeq', 'endSeq'])\n const result = { startSeq: sequence(item.startSeq), endSeq: sequence(item.endSeq) }\n if (result.endSeq <= result.startSeq) return invalid()\n return result\n}\n\nfunction parseRequest(value: unknown): SessionHistoryRequest {\n const item = object(value, ['sessionId', 'anchorSeq', 'beforeSeq', 'afterSeq', 'limit', 'source', 'range'])\n const sessionId = string(item.sessionId)\n if (sessionId === '' || [item.anchorSeq, item.beforeSeq, item.afterSeq, item.source, item.range].filter(value => value !== undefined).length > 1) return invalid()\n const limit = item.limit === undefined ? undefined : sequence(item.limit)\n if (limit !== undefined && (limit < 1 || limit > 20)) return invalid()\n return {\n sessionId,\n ...(item.anchorSeq === undefined ? {} : { anchorSeq: sequence(item.anchorSeq) }),\n ...(item.beforeSeq === undefined ? {} : { beforeSeq: sequence(item.beforeSeq) }),\n ...(item.afterSeq === undefined ? {} : { afterSeq: sequence(item.afterSeq) }),\n ...(limit === undefined ? {} : { limit }),\n ...(item.source === undefined ? {} : { source: source(item.source) }),\n ...(item.range === undefined ? {} : { range: range(item.range) }),\n }\n}\n\nfunction parseResult(value: unknown): SessionHistoryResult {\n const item = object(value, ['kind', 'sessionId', 'hasEarlier', 'hasLater', 'turns'])\n if (item.kind !== 'original' && item.kind !== 'excerpt' && item.kind !== 'unavailable') return invalid()\n if (typeof item.hasEarlier !== 'boolean' || typeof item.hasLater !== 'boolean') return invalid()\n const sessionId = string(item.sessionId)\n if (sessionId === '') return invalid()\n return { kind: item.kind, sessionId, hasEarlier: item.hasEarlier, hasLater: item.hasLater, turns: array(item.turns, turn) }\n}\n\nexport const sessionHistoryRequestSchema = { parse: parseRequest }\nexport const sessionHistoryResultSchema = { parse: parseResult }\n","/** Browser contribution for the package-owned, read-only history Remote. */\nimport type { RemoteResult, TypertRemoteContribution } from '@deepseek-ai/dsh-typert-protocol'\nimport type { SessionHistoryRequest, SessionHistoryResult } from '../session-history.ts'\nimport {\n sessionHistoryRequestSchema as requestSchema, sessionHistoryResultSchema as resultSchema,\n} from '../session-history-codec.ts'\n\ndeclare module '@deepseek-ai/dsh-typert-protocol' {\n interface TypertRemoteMap {\n 'sessionGraphHistory/read': (\n request: SessionHistoryRequest,\n signal?: AbortSignal,\n ) => Promise<RemoteResult<SessionHistoryResult>>\n }\n interface TypertRemoteNamespaceMap {\n sessionGraphHistory: { read: TypertRemoteMap['sessionGraphHistory/read'] }\n }\n}\n\nconst PACKAGE_NAME = '@benz-ai-x/dsh-research-graph'\n\nexport const SESSION_HISTORY_REMOTE: TypertRemoteContribution = {\n package: PACKAGE_NAME,\n descriptors: [{\n id: `${PACKAGE_NAME}#sessionGraphHistory/read`,\n service: 'sessionGraphHistory',\n namespace: 'sessionGraphHistory',\n method: 'read',\n invocation: { kind: 'direct' },\n parameters: [{\n name: 'request', wire: 'request', source: 'json',\n codec: { mode: 'strict', typeSymbol: `${PACKAGE_NAME}#SessionHistoryRequest`, schema: requestSchema },\n }],\n cancellation: { parameter: 'signal' },\n result: { mode: 'strict', typeSymbol: `${PACKAGE_NAME}#SessionHistoryResult`, schema: resultSchema },\n }],\n}\n","import type { DiscussionSearchHit, DiscussionSearchRequest, DiscussionSearchResult, DiscussionSearchScope } from './session-search.ts'\n\nfunction invalid(): never { throw new TypeError('Invalid Discussion Search request') }\n\nfunction object(value: unknown, keys: readonly string[]): Record<string, unknown> {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) return invalid()\n if (Object.keys(value).some(key => !keys.includes(key))) return invalid()\n return value as Record<string, unknown>\n}\n\nfunction string(value: unknown): string {\n if (typeof value !== 'string' || value.trim() === '' || value.includes('\\0')) return invalid()\n return value\n}\n\nfunction parseRequest(value: unknown): DiscussionSearchRequest {\n const item = object(value, ['query', 'scope', 'includeArchived', 'limit', 'cursor'])\n const query = string(item.query)\n if (query.length > 256 || typeof item.includeArchived !== 'boolean') return invalid()\n const rawScope = object(item.scope, ['kind', 'workspaceId', 'cwd'])\n let scope: DiscussionSearchScope\n if (rawScope.kind === 'all' && Object.keys(rawScope).length === 1) scope = { kind: 'all' }\n else if (rawScope.kind === 'workspace' && Object.keys(rawScope).length === 2 && rawScope.cwd === undefined) {\n scope = { kind: 'workspace', workspaceId: string(rawScope.workspaceId) }\n } else if (rawScope.kind === 'directory' && Object.keys(rawScope).length === 2 && rawScope.workspaceId === undefined) {\n scope = { kind: 'directory', cwd: string(rawScope.cwd) }\n } else return invalid()\n if (item.limit !== undefined && (typeof item.limit !== 'number' || !Number.isInteger(item.limit) || item.limit < 1 || item.limit > 20)) return invalid()\n if (item.cursor !== undefined && (typeof item.cursor !== 'string' || !/^[a-f0-9-]{36}:\\d{1,10}$/u.test(item.cursor))) return invalid()\n return {\n query: query.trim().replace(/\\s+/gu, ' '), scope, includeArchived: item.includeArchived,\n ...(item.limit === undefined ? {} : { limit: item.limit as number }),\n ...(item.cursor === undefined ? {} : { cursor: item.cursor as string }),\n }\n}\n\nexport const discussionSearchRequestSchema = { parse: parseRequest }\n\nfunction number(value: unknown): number {\n if (typeof value !== 'number' || !Number.isFinite(value)) throw new TypeError('Invalid Discussion Search result')\n return value\n}\n\nfunction sequence(value: unknown): number {\n const result = number(value)\n if (!Number.isSafeInteger(result) || result < 0) throw new TypeError('Invalid Discussion Search result')\n return result\n}\n\nfunction hit(value: unknown): DiscussionSearchHit {\n const item = object(value, ['sessionId', 'title', 'workspace', 'cwd', 'archived', 'eventSeq', 'turnStartSeq', 'time', 'snippet'])\n if (typeof item.archived !== 'boolean') throw new TypeError('Invalid Discussion Search result')\n const workspace = item.workspace === undefined ? undefined : object(item.workspace, ['id', 'title'])\n return {\n sessionId: string(item.sessionId), title: string(item.title), archived: item.archived,\n ...(workspace === undefined ? {} : { workspace: { id: string(workspace.id), title: string(workspace.title) } }),\n ...(item.cwd === undefined ? {} : { cwd: string(item.cwd) }),\n eventSeq: sequence(item.eventSeq), turnStartSeq: sequence(item.turnStartSeq),\n time: number(item.time), snippet: string(item.snippet),\n }\n}\n\nfunction parseResult(value: unknown): DiscussionSearchResult {\n const item = object(value, ['kind', 'hits', 'nextCursor'])\n if (item.kind === 'disabled' || item.kind === 'stale') {\n if (Object.keys(item).length !== 1) throw new TypeError('Invalid Discussion Search result')\n return { kind: item.kind }\n }\n if (item.kind !== 'results' || !Array.isArray(item.hits) || item.hits.length > 20) throw new TypeError('Invalid Discussion Search result')\n return {\n kind: 'results', hits: item.hits.map(hit),\n ...(item.nextCursor === undefined ? {} : { nextCursor: string(item.nextCursor) }),\n }\n}\n\nexport const discussionSearchResultSchema = { parse: parseResult }\n","import type { RemoteResult, TypertRemoteContribution } from '@deepseek-ai/dsh-typert-protocol'\nimport type { DiscussionSearchRequest, DiscussionSearchResult } from '../session-search.ts'\nimport { discussionSearchRequestSchema, discussionSearchResultSchema } from '../session-search-codec.ts'\n\ndeclare module '@deepseek-ai/dsh-typert-protocol' {\n interface TypertRemoteMap {\n 'sessionGraphSearch/search': (\n request: DiscussionSearchRequest,\n signal?: AbortSignal,\n ) => Promise<RemoteResult<DiscussionSearchResult>>\n }\n interface TypertRemoteNamespaceMap {\n sessionGraphSearch: { search: TypertRemoteMap['sessionGraphSearch/search'] }\n }\n}\n\nconst PACKAGE_NAME = '@benz-ai-x/dsh-research-graph'\n\nexport const DISCUSSION_SEARCH_REMOTE: TypertRemoteContribution = {\n package: PACKAGE_NAME,\n descriptors: [{\n id: `${PACKAGE_NAME}#sessionGraphSearch/search`,\n service: 'sessionGraphSearch', namespace: 'sessionGraphSearch', method: 'search',\n invocation: { kind: 'direct' },\n parameters: [{\n name: 'request', wire: 'request', source: 'json',\n codec: { mode: 'strict', typeSymbol: `${PACKAGE_NAME}#DiscussionSearchRequest`, schema: discussionSearchRequestSchema },\n }],\n cancellation: { parameter: 'signal' },\n result: { mode: 'strict', typeSymbol: `${PACKAGE_NAME}#DiscussionSearchResult`, schema: discussionSearchResultSchema },\n }],\n}\n","import type {\n ResearchTopic, ResearchTopicArrangement, ResearchTopicReference, ResearchTopicSnapshot, ResearchTopicSource, ResearchTopicWrite,\n} from './research-topic.ts'\n\nfunction invalid(): never { throw new TypeError('Invalid Research Topic data') }\n\nfunction object(value: unknown, keys?: readonly string[]): Record<string, unknown> {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) return invalid()\n if (keys !== undefined && Object.keys(value).some(key => !keys.includes(key))) return invalid()\n return value as Record<string, unknown>\n}\n\nfunction string(value: unknown): string {\n if (typeof value !== 'string' || value.trim() === '' || value.includes('\\0')) return invalid()\n return value\n}\n\nfunction topicId(value: unknown): string {\n const id = string(value)\n if (!/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/iu.test(id)) return invalid()\n return id\n}\n\nfunction title(value: unknown): string {\n const label = string(value).trim()\n if (label.length > 120) return invalid()\n return label\n}\n\nfunction array(value: unknown): unknown[] { return Array.isArray(value) ? value : invalid() }\nfunction finite(value: unknown): number { return typeof value === 'number' && Number.isFinite(value) ? value : invalid() }\n\nfunction arrangement(value: unknown): ResearchTopicArrangement {\n const item = object(value, ['positions', 'collapsed', 'offsets'])\n return {\n positions: Object.fromEntries(Object.entries(object(item.positions)).map(([key, value]) => {\n const point = object(value, ['x', 'y'])\n return [key, { x: finite(point.x), y: finite(point.y) }]\n })),\n collapsed: array(item.collapsed).map(string),\n offsets: Object.fromEntries(Object.entries(object(item.offsets)).map(([key, value]) => {\n const point = object(value, ['dx', 'dy'])\n return [key, { dx: finite(point.dx), dy: finite(point.dy) }]\n })),\n }\n}\n\nconst REFERENCE_KEYS = ['sessionId', 'title', 'cwd', 'workspace']\n\nfunction referenceFields(item: Record<string, unknown>): ResearchTopicReference {\n const workspace = item.workspace === undefined ? undefined : object(item.workspace, ['id', 'title'])\n return {\n sessionId: string(item.sessionId), title: string(item.title),\n ...(item.cwd === undefined ? {} : { cwd: string(item.cwd) }),\n ...(workspace === undefined ? {} : { workspace: { id: string(workspace.id), title: string(workspace.title) } }),\n }\n}\n\nexport const researchTopicSchema = { parse(value: unknown): ResearchTopic {\n const item = object(value, ['topicId', 'title', 'references', 'arrangement'])\n const references = array(item.references).map(value => referenceFields(object(value, REFERENCE_KEYS)))\n if (new Set(references.map(reference => reference.sessionId)).size !== references.length) return invalid()\n return { topicId: topicId(item.topicId), title: title(item.title), references, arrangement: arrangement(item.arrangement) }\n} }\n\nexport const researchTopicReadSchema = { parse(value: unknown): { readonly topicId: string } {\n return { topicId: topicId(object(value, ['topicId']).topicId) }\n} }\n\nexport const researchTopicWriteSchema = { parse(value: unknown): ResearchTopicWrite {\n const item = object(value)\n const id = topicId(item.topicId)\n if (item.kind === 'create' || item.kind === 'rename') {\n object(item, ['kind', 'topicId', 'title'])\n return { kind: item.kind, topicId: id, title: title(item.title) }\n }\n if (item.kind === 'add') {\n object(item, ['kind', 'topicId', 'sessionIds'])\n const sessionIds = array(item.sessionIds).map(string)\n if (sessionIds.length === 0) return invalid()\n return { kind: item.kind, topicId: id, sessionIds }\n }\n if (item.kind === 'remove') {\n object(item, ['kind', 'topicId', 'sessionId'])\n return { kind: item.kind, topicId: id, sessionId: string(item.sessionId) }\n }\n if (item.kind === 'arrange') {\n object(item, ['kind', 'topicId', 'arrangement'])\n return { kind: item.kind, topicId: id, arrangement: arrangement(item.arrangement) }\n }\n return invalid()\n} }\n\nexport const researchTopicListSchema = { parse(value: unknown): readonly ResearchTopic[] {\n return array(value).map(researchTopicSchema.parse)\n} }\n\nexport const researchTopicSnapshotSchema = { parse(value: unknown): ResearchTopicSnapshot {\n const item = object(value, ['topic', 'sources'])\n const sources = array(item.sources).map((value): ResearchTopicSource => {\n const source = object(value, [...REFERENCE_KEYS, 'status', 'archived', 'parentSessionId'])\n if ((source.status !== 'listed' && source.status !== 'unavailable') || typeof source.archived !== 'boolean') return invalid()\n return {\n ...referenceFields(source), status: source.status, archived: source.archived,\n ...(source.parentSessionId === undefined ? {} : { parentSessionId: string(source.parentSessionId) }),\n }\n })\n return { topic: researchTopicSchema.parse(item.topic), sources }\n} }\n","import type { RemoteResult, TypertRemoteContribution } from '@deepseek-ai/dsh-typert-protocol'\nimport type { ResearchTopic, ResearchTopicSnapshot, ResearchTopicWrite } from '../research-topic.ts'\nimport {\n researchTopicListSchema, researchTopicReadSchema, researchTopicSchema,\n researchTopicSnapshotSchema, researchTopicWriteSchema,\n} from '../research-topic-codec.ts'\n\ndeclare module '@deepseek-ai/dsh-typert-protocol' {\n interface TypertRemoteMap {\n 'sessionGraphTopics/list': (signal?: AbortSignal) => Promise<RemoteResult<readonly ResearchTopic[]>>\n 'sessionGraphTopics/read': (request: { readonly topicId: string }, signal?: AbortSignal) => Promise<RemoteResult<ResearchTopicSnapshot>>\n 'sessionGraphTopics/write': (request: ResearchTopicWrite, signal?: AbortSignal) => Promise<RemoteResult<ResearchTopic>>\n }\n interface TypertRemoteNamespaceMap {\n sessionGraphTopics: {\n list: TypertRemoteMap['sessionGraphTopics/list']\n read: TypertRemoteMap['sessionGraphTopics/read']\n write: TypertRemoteMap['sessionGraphTopics/write']\n }\n }\n}\n\nconst PACKAGE_NAME = '@benz-ai-x/dsh-research-graph'\n\nexport const RESEARCH_TOPICS_REMOTE: TypertRemoteContribution = {\n package: PACKAGE_NAME,\n descriptors: [\n { method: 'list', request: undefined, result: researchTopicListSchema },\n { method: 'read', request: researchTopicReadSchema, result: researchTopicSnapshotSchema },\n { method: 'write', request: researchTopicWriteSchema, result: researchTopicSchema },\n ].map(({ method, request, result }) => ({\n id: `${PACKAGE_NAME}#sessionGraphTopics/${method}`,\n service: 'sessionGraphTopics', namespace: 'sessionGraphTopics', method,\n invocation: { kind: 'direct' },\n parameters: request === undefined ? [] : [{\n name: 'request', wire: 'request', source: 'json',\n codec: { mode: 'strict', typeSymbol: `${PACKAGE_NAME}#ResearchTopics/${method}/Request`, schema: request },\n }],\n cancellation: { parameter: 'signal' },\n result: { mode: 'strict', typeSymbol: `${PACKAGE_NAME}#ResearchTopics/${method}/Result`, schema: result },\n })),\n}\n","interface WirePrimitives {\n readonly invalid: () => never\n readonly object: (value: unknown, keys: readonly string[]) => Record<string, unknown>\n readonly text: (value: unknown, max?: number) => string\n readonly identity: (value: unknown) => string\n readonly uuid: (value: unknown) => string\n readonly count: (value: unknown) => number\n readonly array: (value: unknown) => unknown[]\n}\n\n/** Shared wire validation without Host dependencies; each domain keeps its limits and errors. */\nexport function createWirePrimitives(message: string, textLimit: number): WirePrimitives {\n function invalid(): never { throw new TypeError(message) }\n function object(value: unknown, keys: readonly string[]): Record<string, unknown> {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) return invalid()\n if (Object.keys(value).some(key => !keys.includes(key))) return invalid()\n return value as Record<string, unknown>\n }\n function text(value: unknown, max = textLimit): string {\n if (typeof value !== 'string' || value.includes('\\0') || value.length > max) return invalid()\n return value\n }\n function identity(value: unknown): string {\n const id = text(value, 200)\n return id.trim() === '' ? invalid() : id\n }\n function uuid(value: unknown): string {\n const id = identity(value)\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/iu.test(id) ? id : invalid()\n }\n function count(value: unknown): number {\n return typeof value === 'number' && Number.isSafeInteger(value) && value >= 0 ? value : invalid()\n }\n function array(value: unknown): unknown[] { return Array.isArray(value) ? value : invalid() }\n return { invalid, object, text, identity, uuid, count, array }\n}\n","import type { KnowledgeCard, KnowledgeContent, KnowledgeMembership, KnowledgeSearch, KnowledgeSourceAddress, KnowledgeSave, KnowledgeSource } from './knowledge.ts'\nimport { sessionHistoryRequestSchema } from './session-history-codec.ts'\nimport type { ExtractionPreparationRequest, ExtractionRequest } from './knowledge-extraction.ts'\nimport { createWirePrimitives } from './wire-primitives.ts'\n\nconst { invalid, object, text, identity, uuid, count, array } = createWirePrimitives('Invalid Knowledge Card data', 24_000)\n\nexport const knowledgeHostIdentitySchema = { parse(value: unknown): { readonly hostId: string } {\n return { hostId: uuid(object(value, ['hostId']).hostId) }\n} }\n\nconst CONTENT_KEYS = ['title', 'question', 'conclusion', 'rationale', 'openQuestions', 'kind', 'status']\nfunction content(value: unknown): KnowledgeContent {\n const item = object(value, CONTENT_KEYS)\n const title = text(item.title, 120).trim()\n if (title === '' || !['conclusion', 'method', 'hypothesis', 'question'].includes(String(item.kind))\n || (item.status !== 'draft' && item.status !== 'confirmed')) return invalid()\n return {\n title, question: text(item.question), conclusion: text(item.conclusion), rationale: text(item.rationale),\n openQuestions: text(item.openQuestions), kind: item.kind as KnowledgeContent['kind'], status: item.status,\n }\n}\nfunction address(value: unknown): KnowledgeSourceAddress {\n const raw = object(value, ['kind', 'sessionId', 'startSeq', 'endSeq', 'cardId', 'revisionId', 'sourceIndex', 'preparationId'])\n if (raw.kind === 'extraction') {\n const item = object(value, ['kind', 'preparationId', 'startSeq', 'endSeq'])\n const startSeq = count(item.startSeq)\n const endSeq = count(item.endSeq)\n if (endSeq <= startSeq) return invalid()\n return { kind: 'extraction', preparationId: uuid(item.preparationId), startSeq, endSeq }\n }\n if (raw.kind === 'revision') {\n const item = object(value, ['kind', 'cardId', 'revisionId', 'sourceIndex'])\n return { kind: 'revision', cardId: uuid(item.cardId), revisionId: uuid(item.revisionId), sourceIndex: count(item.sourceIndex) }\n }\n const item = object(value, ['kind', 'sessionId', 'startSeq', 'endSeq'])\n const startSeq = count(item.startSeq)\n const endSeq = count(item.endSeq)\n if (item.kind !== 'discussion' || endSeq < startSeq) return invalid()\n return { kind: 'discussion', sessionId: identity(item.sessionId), startSeq, endSeq }\n}\nfunction source(value: unknown): KnowledgeSource {\n const item = object(value, ['sessionId', 'title', 'cwd', 'source'])\n const request = sessionHistoryRequestSchema.parse({ sessionId: item.sessionId, source: item.source })\n if (request.source === undefined) return invalid()\n return {\n sessionId: request.sessionId, title: text(item.title), source: request.source,\n ...(item.cwd === undefined ? {} : { cwd: text(item.cwd) }),\n }\n}\n\nexport const knowledgeSaveSchema = { parse(value: unknown): KnowledgeSave {\n const item = object(value, ['cardId', 'revisionId', 'topicId', 'content', 'sources'])\n if (array(item.sources).length > 32) return invalid()\n return {\n cardId: uuid(item.cardId), revisionId: uuid(item.revisionId), content: content(item.content),\n sources: array(item.sources).map(address), ...(item.topicId === undefined ? {} : { topicId: uuid(item.topicId) }),\n }\n} }\nexport const knowledgeSearchSchema = { parse(value: unknown): KnowledgeSearch {\n const item = object(value, ['query', 'topicId'])\n return { query: text(item.query, 200).trim(), ...(item.topicId === undefined ? {} : { topicId: uuid(item.topicId) }) }\n} }\nexport const knowledgeMembershipSchema = { parse(value: unknown): KnowledgeMembership {\n const item = object(value, ['cardId', 'topicId', 'attached'])\n if (typeof item.attached !== 'boolean') return invalid()\n return { cardId: uuid(item.cardId), topicId: uuid(item.topicId), attached: item.attached }\n} }\nexport const knowledgeReadSchema = { parse(value: unknown): { readonly cardId: string } {\n return { cardId: uuid(object(value, ['cardId']).cardId) }\n} }\nexport const knowledgeCardSchema = { parse(value: unknown): KnowledgeCard {\n const item = object(value, ['cardId', 'topicIds', 'revisions'])\n const revisions = array(item.revisions).map((value, index) => {\n const revision = object(value, ['revisionId', 'requestHash', 'number', 'savedAt', 'content', 'sources'])\n if (count(revision.number) !== index + 1) return invalid()\n const requestHash = text(revision.requestHash, 64)\n if (!/^[0-9a-f]{64}$/u.test(requestHash)) return invalid()\n return { revisionId: uuid(revision.revisionId), requestHash, number: index + 1, savedAt: count(revision.savedAt),\n content: content(revision.content), sources: array(revision.sources).map(source) }\n })\n if (revisions.length === 0 || new Set(revisions.map(revision => revision.revisionId)).size !== revisions.length) return invalid()\n return { cardId: uuid(item.cardId), topicIds: array(item.topicIds).map(uuid), revisions }\n} }\nexport const knowledgeListSchema = { parse(value: unknown): readonly KnowledgeCard[] { return array(value).map(knowledgeCardSchema.parse) } }\nexport const knowledgeNullableSchema = { parse(value: unknown): KnowledgeCard | null { return value === null ? null : knowledgeCardSchema.parse(value) } }\nexport const knowledgeContentSchema = { parse: content }\nexport const knowledgeSourceSchema = { parse: source }\nexport const knowledgeAddressSchema = { parse: address }\nexport const extractionPreparationRequestSchema = { parse(value: unknown): ExtractionPreparationRequest {\n const item = object(value, ['source', 'budgetChars'])\n const source = address(item.source)\n const budgetChars = count(item.budgetChars)\n if (source.kind !== 'discussion' || budgetChars < 500 || budgetChars > 64_000) return invalid()\n return { source, budgetChars }\n} }\nexport const extractionRequestSchema = { parse(value: unknown): ExtractionRequest {\n const item = object(value, ['preparationId', 'provider', 'model'])\n return { preparationId: uuid(item.preparationId), provider: identity(item.provider).trim(), model: identity(item.model).trim() }\n} }\n","import type { ExtractionPreparation, ExtractionResult } from './knowledge-extraction.ts'\nimport { extractionRequestSchema, knowledgeSaveSchema, knowledgeSourceSchema } from './knowledge-codec.ts'\n\nfunction object(value: unknown): Record<string, unknown> {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) throw new TypeError('Invalid extraction data')\n return value as Record<string, unknown>\n}\nfunction count(value: unknown): number {\n if (typeof value !== 'number' || !Number.isSafeInteger(value) || value < 0) throw new TypeError('Invalid extraction count')\n return value\n}\nfunction text(value: unknown): string {\n if (typeof value !== 'string') throw new TypeError('Invalid extraction text')\n return value\n}\nfunction array(value: unknown): unknown[] {\n if (!Array.isArray(value)) throw new TypeError('Invalid extraction list')\n return value\n}\nexport const extractionPreparationSchema = { parse(value: unknown): ExtractionPreparation {\n const item = object(value)\n const route = item.route === undefined ? undefined : object(item.route)\n const request = extractionRequestSchema.parse({ preparationId: item.preparationId, provider: route?.provider ?? '_', model: route?.model ?? '_' })\n return {\n preparationId: request.preparationId, selected: knowledgeSourceSchema.parse(item.selected), included: knowledgeSourceSchema.parse(item.included),\n omitted: array(item.omitted).map(value => { const range = object(value); return { startSeq: count(range.startSeq), endSeq: count(range.endSeq) } }),\n budgetChars: count(item.budgetChars), materialText: text(item.materialText),\n ...(route === undefined ? {} : { route: { provider: request.provider, model: request.model } }),\n }\n} }\nexport const extractionResultSchema = { parse(value: unknown): ExtractionResult {\n const item = object(value)\n return { provider: text(item.provider), model: text(item.model), drafts: array(item.drafts).map(value => {\n const draft = object(value)\n const save = knowledgeSaveSchema.parse({ cardId: draft.cardId, revisionId: draft.revisionId, content: draft.content, sources: draft.sources })\n if (typeof draft.needsVerification !== 'boolean') throw new TypeError('Invalid verification state')\n return { cardId: save.cardId, revisionId: save.revisionId, content: save.content, sources: save.sources,\n invalidCitations: count(draft.invalidCitations), needsVerification: draft.needsVerification }\n }) }\n} }\n","import { knowledgeReadSchema } from './knowledge-codec.ts'\nimport type { KnowledgeExportRequest, KnowledgeExportResult } from './knowledge-export.ts'\n\nfunction object(value: unknown, keys: readonly string[]): Record<string, unknown> {\n if (value === null || typeof value !== 'object' || Array.isArray(value) || Object.keys(value).some(key => !keys.includes(key))) throw new TypeError('Invalid knowledge export')\n return value as Record<string, unknown>\n}\nexport const knowledgeExportRequestSchema = { parse(value: unknown): KnowledgeExportRequest {\n const item = object(value, ['cardIds'])\n if (!Array.isArray(item.cardIds) || item.cardIds.length < 1 || item.cardIds.length > 50) throw new TypeError('Select 1–50 cards for export')\n const cardIds = item.cardIds.map(cardId => knowledgeReadSchema.parse({ cardId }).cardId)\n if (new Set(cardIds).size !== cardIds.length) throw new TypeError('Select each card once')\n return { cardIds }\n} }\nexport const knowledgeExportResultSchema = { parse(value: unknown): KnowledgeExportResult {\n const item = object(value, ['filename', 'markdown', 'cards'])\n if (typeof item.filename !== 'string' || !item.filename.endsWith('.md') || /[\\u0000-\\u001f/\\\\]/u.test(item.filename)\n || item.filename.length > 240 || typeof item.markdown !== 'string' || item.markdown.length > 8_000_000\n || !Array.isArray(item.cards) || item.cards.length < 1 || item.cards.length > 50) throw new TypeError('Invalid knowledge export preview')\n const cards = item.cards.map(value => {\n const card = object(value, ['cardId', 'revisionId', 'number', 'title'])\n if (typeof card.title !== 'string' || card.title.length > 120 || !Number.isSafeInteger(card.number) || (card.number as number) < 1) throw new TypeError('Invalid export revision')\n return { cardId: knowledgeReadSchema.parse({ cardId: card.cardId }).cardId,\n revisionId: knowledgeReadSchema.parse({ cardId: card.revisionId }).cardId, number: card.number as number, title: card.title }\n })\n return { filename: item.filename, markdown: item.markdown, cards }\n} }\n","import type { RemoteResult, TypertRemoteContribution } from '@deepseek-ai/dsh-typert-protocol'\nimport type { KnowledgeCard, KnowledgeMembership, KnowledgeSave, KnowledgeSearch } from '../knowledge.ts'\nimport { knowledgeCardSchema, knowledgeListSchema, knowledgeMembershipSchema, knowledgeNullableSchema,\n knowledgeReadSchema, knowledgeSaveSchema, knowledgeSearchSchema, knowledgeHostIdentitySchema } from '../knowledge-codec.ts'\nimport { extractionPreparationRequestSchema, extractionRequestSchema } from '../knowledge-codec.ts'\nimport { extractionPreparationSchema, extractionResultSchema } from '../knowledge-extraction-codec.ts'\nimport type { ExtractionPreparation, ExtractionPreparationRequest, ExtractionRequest, ExtractionResult } from '../knowledge-extraction.ts'\nimport type { KnowledgeExportRequest, KnowledgeExportResult } from '../knowledge-export.ts'\nimport { knowledgeExportRequestSchema, knowledgeExportResultSchema } from '../knowledge-export-codec.ts'\n\nexport interface KnowledgeApi {\n readonly prepareExport: (request: KnowledgeExportRequest, signal: AbortSignal) => Promise<KnowledgeExportResult>\n readonly prepareExtraction: (request: ExtractionPreparationRequest, signal: AbortSignal) => Promise<ExtractionPreparation>\n readonly extract: (request: ExtractionRequest, signal: AbortSignal) => Promise<ExtractionResult>\n readonly read: (request: { readonly cardId: string }, signal: AbortSignal) => Promise<KnowledgeCard | null>\n readonly save: (request: KnowledgeSave, signal: AbortSignal) => Promise<KnowledgeCard>\n readonly search: (request: KnowledgeSearch, signal: AbortSignal) => Promise<readonly KnowledgeCard[]>\n readonly membership: (request: KnowledgeMembership, signal: AbortSignal) => Promise<KnowledgeCard>\n}\n\ndeclare module '@deepseek-ai/dsh-typert-protocol' {\n interface TypertRemoteMap {\n 'sessionGraphKnowledge/prepareExport': (request: KnowledgeExportRequest, signal?: AbortSignal) => Promise<RemoteResult<KnowledgeExportResult>>\n 'sessionGraphKnowledge/hostIdentity': (signal?: AbortSignal) => Promise<RemoteResult<{ readonly hostId: string }>>\n 'sessionGraphKnowledge/prepareExtraction': (request: ExtractionPreparationRequest, signal?: AbortSignal) => Promise<RemoteResult<ExtractionPreparation>>\n 'sessionGraphKnowledge/extract': (request: ExtractionRequest, signal?: AbortSignal) => Promise<RemoteResult<ExtractionResult>>\n 'sessionGraphKnowledge/read': (request: { readonly cardId: string }, signal?: AbortSignal) => Promise<RemoteResult<KnowledgeCard | null>>\n 'sessionGraphKnowledge/save': (request: KnowledgeSave, signal?: AbortSignal) => Promise<RemoteResult<KnowledgeCard>>\n 'sessionGraphKnowledge/search': (request: KnowledgeSearch, signal?: AbortSignal) => Promise<RemoteResult<readonly KnowledgeCard[]>>\n 'sessionGraphKnowledge/membership': (request: KnowledgeMembership, signal?: AbortSignal) => Promise<RemoteResult<KnowledgeCard>>\n }\n interface TypertRemoteNamespaceMap {\n sessionGraphKnowledge: {\n prepareExport: TypertRemoteMap['sessionGraphKnowledge/prepareExport']\n hostIdentity: TypertRemoteMap['sessionGraphKnowledge/hostIdentity']\n prepareExtraction: TypertRemoteMap['sessionGraphKnowledge/prepareExtraction']\n extract: TypertRemoteMap['sessionGraphKnowledge/extract']\n read: TypertRemoteMap['sessionGraphKnowledge/read']\n save: TypertRemoteMap['sessionGraphKnowledge/save']\n search: TypertRemoteMap['sessionGraphKnowledge/search']\n membership: TypertRemoteMap['sessionGraphKnowledge/membership']\n }\n }\n}\n\nconst PACKAGE_NAME = '@benz-ai-x/dsh-research-graph'\nexport const KNOWLEDGE_REMOTE: TypertRemoteContribution = {\n package: PACKAGE_NAME,\n descriptors: [\n { method: 'prepareExport', request: knowledgeExportRequestSchema, result: knowledgeExportResultSchema },\n { method: 'hostIdentity', request: undefined, result: knowledgeHostIdentitySchema },\n { method: 'prepareExtraction', request: extractionPreparationRequestSchema, result: extractionPreparationSchema },\n { method: 'extract', request: extractionRequestSchema, result: extractionResultSchema },\n { method: 'read', request: knowledgeReadSchema, result: knowledgeNullableSchema },\n { method: 'save', request: knowledgeSaveSchema, result: knowledgeCardSchema },\n { method: 'search', request: knowledgeSearchSchema, result: knowledgeListSchema },\n { method: 'membership', request: knowledgeMembershipSchema, result: knowledgeCardSchema },\n ].map(({ method, request, result }) => ({\n id: `${PACKAGE_NAME}#sessionGraphKnowledge/${method}`,\n service: 'sessionGraphKnowledge', namespace: 'sessionGraphKnowledge', method, invocation: { kind: 'direct' },\n parameters: request === undefined ? [] : [{ name: 'request', wire: 'request', source: 'json',\n codec: { mode: 'strict', typeSymbol: `${PACKAGE_NAME}#Knowledge/${method}/Request`, schema: request } }],\n cancellation: { parameter: 'signal' },\n result: { mode: 'strict', typeSymbol: `${PACKAGE_NAME}#Knowledge/${method}/Result`, schema: result },\n })),\n}\n","import type { ResearchMaterial, ResearchMaterialSelection, ResearchReusePreparation, ResearchReuseRecord } from './research-reuse.ts'\nimport { knowledgeContentSchema, knowledgeSourceSchema } from './knowledge-codec.ts'\nimport { createWirePrimitives } from './wire-primitives.ts'\n\nconst { invalid, object, text, identity, uuid, count, array } = createWirePrimitives('Invalid research material data', 32_000)\n\nfunction selection(value: unknown): ResearchMaterialSelection {\n const item = object(value, ['kind', 'cardId', 'revisionId', 'sessionId', 'startSeq', 'endSeq'])\n if (item.kind === 'card') {\n object(value, ['kind', 'cardId', 'revisionId'])\n return { kind: 'card', cardId: uuid(item.cardId), revisionId: uuid(item.revisionId) }\n }\n object(value, ['kind', 'sessionId', 'startSeq', 'endSeq'])\n const startSeq = count(item.startSeq)\n const endSeq = count(item.endSeq)\n if (item.kind !== 'turn' || endSeq <= startSeq) return invalid()\n return { kind: 'turn', sessionId: identity(item.sessionId), startSeq, endSeq }\n}\nfunction material(value: unknown): ResearchMaterial {\n const item = object(value, ['kind', 'cardId', 'revisionId', 'revisionNumber', 'savedAt', 'content', 'sources', 'source'])\n if (item.kind === 'turn') {\n object(value, ['kind', 'source'])\n const source = knowledgeSourceSchema.parse(item.source)\n if (source.source.turns.length !== 1) return invalid()\n return { kind: 'turn', source }\n }\n object(value, ['kind', 'cardId', 'revisionId', 'revisionNumber', 'savedAt', 'content', 'sources'])\n if (item.kind !== 'card' || count(item.revisionNumber) < 1) return invalid()\n return { kind: 'card', cardId: uuid(item.cardId), revisionId: uuid(item.revisionId), revisionNumber: count(item.revisionNumber),\n savedAt: count(item.savedAt), content: knowledgeContentSchema.parse(item.content), sources: array(item.sources).map(value => {\n const source = object(value, ['sessionId', 'title', 'startSeq', 'endSeq', 'startedAt'])\n return { sessionId: identity(source.sessionId), title: text(source.title), startSeq: count(source.startSeq),\n endSeq: count(source.endSeq), startedAt: count(source.startedAt) }\n }) }\n}\nexport const researchReusePreparationSchema = { parse(value: unknown): ResearchReusePreparation {\n const item = object(value, ['operationId', 'materials', 'question', 'workspaceId'])\n const materials = array(item.materials).map(selection)\n const question = text(item.question, 4000).trim()\n if (materials.length < 1 || materials.length > 3 || question === '' || new Set(materials.map(item => JSON.stringify(item))).size !== materials.length) return invalid()\n return { operationId: uuid(item.operationId), materials, question, workspaceId: identity(item.workspaceId) }\n} }\nexport const researchReuseReadSchema = { parse(value: unknown): { readonly operationId: string } {\n return { operationId: uuid(object(value, ['operationId']).operationId) }\n} }\nexport const researchReuseSessionSchema = { parse(value: unknown): { readonly sessionId: string } {\n return { sessionId: identity(object(value, ['sessionId']).sessionId) }\n} }\nexport const researchReuseRecordSchema = { parse(value: unknown): ResearchReuseRecord {\n const item = object(value, ['operationId', 'requestHash', 'requestId', 'targetSessionId', 'targetCreated', 'stage', 'workspace',\n 'createdAt', 'question', 'materials', 'promptText', 'budgetChars', 'acceptedAt', 'error'])\n const workspace = object(item.workspace, ['id', 'title', 'cwd'])\n const requestHash = text(item.requestHash, 64)\n if (!/^[0-9a-f]{64}$/u.test(requestHash) || typeof item.targetCreated !== 'boolean'\n || (item.stage !== 'prepared' && item.stage !== 'created' && item.stage !== 'accepted')) return invalid()\n const materials = array(item.materials).map(material)\n const promptText = text(item.promptText)\n const budgetChars = count(item.budgetChars)\n if (materials.length < 1 || materials.length > 3 || promptText.length > budgetChars\n || (item.stage === 'accepted') !== (item.acceptedAt !== undefined) || (item.stage !== 'prepared' && !item.targetCreated)) return invalid()\n return { operationId: uuid(item.operationId), requestHash, requestId: identity(item.requestId), targetSessionId: identity(item.targetSessionId),\n targetCreated: item.targetCreated, stage: item.stage,\n workspace: { id: identity(workspace.id), title: text(workspace.title), cwd: text(workspace.cwd) },\n createdAt: count(item.createdAt), question: text(item.question, 4000), materials, promptText, budgetChars,\n ...(item.acceptedAt === undefined ? {} : { acceptedAt: count(item.acceptedAt) }), ...(item.error === undefined ? {} : { error: text(item.error) }) }\n} }\nexport const researchReuseNullableSchema = { parse(value: unknown): ResearchReuseRecord | null { return value === null ? null : researchReuseRecordSchema.parse(value) } }\nexport const researchReuseListSchema = { parse(value: unknown): readonly ResearchReuseRecord[] { return array(value).map(researchReuseRecordSchema.parse) } }\n","import type { RemoteResult, TypertRemoteContribution } from '@deepseek-ai/dsh-typert-protocol'\nimport type { ResearchReusePreparation, ResearchReuseRecord } from '../research-reuse.ts'\nimport { researchReusePreparationSchema, researchReuseReadSchema, researchReuseSessionSchema,\n researchReuseRecordSchema, researchReuseNullableSchema, researchReuseListSchema } from '../research-reuse-codec.ts'\n\nexport interface ResearchReuseApi {\n readonly prepare: (request: ResearchReusePreparation, signal: AbortSignal) => Promise<ResearchReuseRecord>\n readonly submit: (request: { readonly operationId: string }, signal: AbortSignal) => Promise<ResearchReuseRecord>\n readonly read: (request: { readonly operationId: string }, signal: AbortSignal) => Promise<ResearchReuseRecord | null>\n readonly forSession: (request: { readonly sessionId: string }, signal: AbortSignal) => Promise<readonly ResearchReuseRecord[]>\n}\ndeclare module '@deepseek-ai/dsh-typert-protocol' {\n interface TypertRemoteMap {\n 'sessionGraphReuse/prepare': (request: ResearchReusePreparation, signal?: AbortSignal) => Promise<RemoteResult<ResearchReuseRecord>>\n 'sessionGraphReuse/submit': (request: { readonly operationId: string }, signal?: AbortSignal) => Promise<RemoteResult<ResearchReuseRecord>>\n 'sessionGraphReuse/read': (request: { readonly operationId: string }, signal?: AbortSignal) => Promise<RemoteResult<ResearchReuseRecord | null>>\n 'sessionGraphReuse/forSession': (request: { readonly sessionId: string }, signal?: AbortSignal) => Promise<RemoteResult<readonly ResearchReuseRecord[]>>\n }\n interface TypertRemoteNamespaceMap {\n sessionGraphReuse: {\n prepare: TypertRemoteMap['sessionGraphReuse/prepare']\n submit: TypertRemoteMap['sessionGraphReuse/submit']\n read: TypertRemoteMap['sessionGraphReuse/read']\n forSession: TypertRemoteMap['sessionGraphReuse/forSession']\n }\n }\n}\nconst PACKAGE_NAME = '@benz-ai-x/dsh-research-graph'\nexport const RESEARCH_REUSE_REMOTE: TypertRemoteContribution = {\n package: PACKAGE_NAME,\n descriptors: [\n { method: 'prepare', request: researchReusePreparationSchema, result: researchReuseRecordSchema },\n { method: 'submit', request: researchReuseReadSchema, result: researchReuseRecordSchema },\n { method: 'read', request: researchReuseReadSchema, result: researchReuseNullableSchema },\n { method: 'forSession', request: researchReuseSessionSchema, result: researchReuseListSchema },\n ].map(({ method, request, result }) => ({\n id: `${PACKAGE_NAME}#sessionGraphReuse/${method}`, service: 'sessionGraphReuse', namespace: 'sessionGraphReuse', method,\n invocation: { kind: 'direct' }, parameters: [{ name: 'request', wire: 'request', source: 'json',\n codec: { mode: 'strict', typeSymbol: `${PACKAGE_NAME}#ResearchReuse/${method}/Request`, schema: request } }],\n cancellation: { parameter: 'signal' },\n result: { mode: 'strict', typeSymbol: `${PACKAGE_NAME}#ResearchReuse/${method}/Result`, schema: result },\n })),\n}\n","/**\n * Browser session-graph plugin contributing one entry to the conversation\n * view slot without defining a service.\n */\nimport type { Context } from '@deepseek-ai/cordis'\nimport type { SessionId } from '@deepseek-ai/dsh-session/types'\nimport type { WorkspaceId } from '@deepseek-ai/dsh-workspace/types'\nimport type { TypertRemoteContribution } from '@deepseek-ai/dsh-typert-protocol'\n// Type-only: pulls the Session Controller's Context merge (ctx.sessions).\nimport type {} from '@deepseek-ai/dsh-api-session-controller/client'\n// Type-only: pulls the Workspace Controller's Context merge (ctx.workspaces).\nimport type {} from '@deepseek-ai/dsh-api-workspace-controller/client'\n// Type-only: pulls the generated Remote gateway Context merge (ctx.remote).\nimport type {} from '@deepseek-ai/dsh-api-remotes/client'\n// Type-only: pulls the locale plugin's Context merge (ctx.locale).\nimport type {} from '@deepseek-ai/dsh-client-locale/client'\n// Type-only: the 'conversation.view' SlotMap row (declared by the slot's\n// owning package) must be in the program for the register calls to type.\nimport type {} from '@deepseek-ai/dsh-client-ui-conversation/client'\n// Type-only: pulls the slot service and global Session/Workspace standard props.\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-workspace/client'\nimport { createSessionMergeModule } from '../session-merge.ts'\nimport { GraphView, type GraphViewInjected } from './GraphView.tsx'\nimport { NS, en, zh } from './locales.ts'\nimport { SESSION_DIGEST_REMOTE } from './session-digest-remote.ts'\nimport { SESSION_MERGE_REMOTE } from './session-merge-remote.ts'\nimport { SESSION_HISTORY_REMOTE } from './session-history-remote.ts'\nimport { DISCUSSION_SEARCH_REMOTE } from './session-search-remote.ts'\nimport { RESEARCH_TOPICS_REMOTE } from './research-topics-remote.ts'\nimport { KNOWLEDGE_REMOTE } from './knowledge-remote.ts'\nimport { RESEARCH_REUSE_REMOTE } from './research-reuse-remote.ts'\n\nexport type { GraphViewInjected, GraphViewProps } from './GraphView.tsx'\n\n/** Required services: the conversation view slot, the sessions list, and the locale service. */\nexport const inject = ['slots', 'sessions', 'workspaces', 'locale', 'remote']\n\nconst SESSION_GRAPH_REMOTE: TypertRemoteContribution = {\n package: SESSION_DIGEST_REMOTE.package,\n descriptors: [\n ...SESSION_DIGEST_REMOTE.descriptors,\n ...SESSION_MERGE_REMOTE.descriptors,\n ...SESSION_HISTORY_REMOTE.descriptors,\n ...DISCUSSION_SEARCH_REMOTE.descriptors,\n ...RESEARCH_TOPICS_REMOTE.descriptors,\n ...KNOWLEDGE_REMOTE.descriptors,\n ...RESEARCH_REUSE_REMOTE.descriptors,\n ],\n}\n\n/** Register the Graph view after its dynamically mounted Remote is injectable. */\nasync function registerUi(ctx: Context): Promise<void> {\n const lifecycle = new AbortController()\n ctx.effect(() => () => { lifecycle.abort() }, 'ui-session-graph: identity request')\n const identity = await ctx.remote.sessionGraphKnowledge.hostIdentity(AbortSignal.any([lifecycle.signal, AbortSignal.timeout(30_000)]))\n lifecycle.signal.throwIfAborted()\n if (!identity.ok) throw new Error(identity.error.message)\n ctx.effect(() => ctx.locale.register(NS, { zh, en }), 'ui-session-graph: dictionaries')\n // Registration-time text (the view tab label) reads through the bound\n // translate as a thunk, so it follows the active locale without\n // re-registration.\n const t = ctx.locale.bind(NS)\n const merges = createSessionMergeModule({\n inspectSource: async (sessionId, signal) => {\n signal.throwIfAborted()\n const row = ctx.sessions.list.getSnapshot().byId[sessionId as SessionId]\n if (row === undefined) throw new Error(`Session ${JSON.stringify(sessionId)} is unavailable`)\n const workspaces = ctx.workspaces.list.getSnapshot()\n const workspace = workspaces.items.find(item => item.sessionIds.includes(row.id))\n ?? workspaces.items.find(item => item.path === row.cwd)\n return {\n sessionId,\n title: row.displayTitle,\n cwd: row.cwd ?? '',\n ...(workspace === undefined ? {} : { workspaceId: workspace.workspaceId }),\n canvas: row.origin !== 'subagent'\n && row.cwd !== undefined\n && !row.blank\n && !workspaces.archivedSessionIds.includes(row.id),\n }\n },\n createTarget: async (location, signal) => {\n signal.throwIfAborted()\n const target = await ctx.sessions.create(location.workspaceId === undefined\n ? { cwd: location.cwd }\n : { workspaceId: location.workspaceId as WorkspaceId })\n signal.throwIfAborted()\n return target\n },\n renameTarget: async (targetSessionId, title, signal) => {\n signal.throwIfAborted()\n const binding = ctx.sessions.binding(targetSessionId as SessionId)\n if (binding === undefined) {\n throw new Error(`Merge Session ${JSON.stringify(targetSessionId)} has no Client binding`)\n }\n const result = await binding.session.rename(title)\n if (!result.ok) throw new Error(`${result.error.code}: ${result.error.message}`)\n signal.throwIfAborted()\n },\n submitMerge: async (request, signal) => {\n const result = await ctx.remote.sessionGraphMerge.submit(request, signal)\n if (!result.ok) {\n const error = new Error(result.error.message) as Error & {\n code?: string\n stage?: unknown\n }\n error.code = result.error.code\n error.stage = (result.error.details as Readonly<Record<string, unknown>>)['stage']\n throw error\n }\n },\n openTarget: targetSessionId => {\n ctx.sessions.open(targetSessionId as SessionId)\n },\n createOperationId: () => crypto.randomUUID(),\n })\n ctx.slots.inject('conversation.view', () => ctx.slots.register({\n name: 'conversation.view',\n id: 'graph',\n order: 20,\n locale: NS,\n label: () => t('view.graph'),\n inject: (): GraphViewInjected => ({\n hostId: identity.value.hostId,\n reuse: {\n prepare: async (request, signal) => {\n const result = await ctx.remote.sessionGraphReuse.prepare(request, signal)\n if (!result.ok) throw new Error(result.error.message)\n return result.value\n },\n submit: async (request, signal) => {\n const result = await ctx.remote.sessionGraphReuse.submit(request, signal)\n if (!result.ok) throw new Error(result.error.message)\n return result.value\n },\n read: async (request, signal) => {\n const result = await ctx.remote.sessionGraphReuse.read(request, signal)\n if (!result.ok) throw new Error(result.error.message)\n return result.value\n },\n forSession: async (request, signal) => {\n const result = await ctx.remote.sessionGraphReuse.forSession(request, signal)\n if (!result.ok) throw new Error(result.error.message)\n return result.value\n },\n },\n knowledge: {\n prepareExport: async (request, signal) => {\n const result = await ctx.remote.sessionGraphKnowledge.prepareExport(request, signal)\n if (!result.ok) throw new Error(result.error.message)\n return result.value\n },\n prepareExtraction: async (request, signal) => {\n const result = await ctx.remote.sessionGraphKnowledge.prepareExtraction(request, signal)\n if (!result.ok) throw new Error(result.error.message)\n return result.value\n },\n extract: async (request, signal) => {\n const result = await ctx.remote.sessionGraphKnowledge.extract(request, signal)\n if (!result.ok) throw new Error(result.error.message)\n return result.value\n },\n read: async (request, signal) => {\n const result = await ctx.remote.sessionGraphKnowledge.read(request, signal)\n if (!result.ok) throw new Error(result.error.message)\n return result.value\n },\n save: async (request, signal) => {\n const result = await ctx.remote.sessionGraphKnowledge.save(request, signal)\n if (!result.ok) throw new Error(result.error.message)\n return result.value\n },\n search: async (request, signal) => {\n const result = await ctx.remote.sessionGraphKnowledge.search(request, signal)\n if (!result.ok) throw new Error(result.error.message)\n return result.value\n },\n membership: async (request, signal) => {\n const result = await ctx.remote.sessionGraphKnowledge.membership(request, signal)\n if (!result.ok) throw new Error(result.error.message)\n return result.value\n },\n },\n topics: {\n list: async signal => {\n const result = await ctx.remote.sessionGraphTopics.list(signal)\n if (!result.ok) throw new Error(result.error.message)\n return result.value\n },\n read: async (request, signal) => {\n const result = await ctx.remote.sessionGraphTopics.read(request, signal)\n if (!result.ok) throw new Error(result.error.message)\n return result.value\n },\n write: async (request, signal) => {\n const result = await ctx.remote.sessionGraphTopics.write(request, signal)\n if (!result.ok) throw new Error(result.error.message)\n return result.value\n },\n },\n searchDiscussion: async (request, signal) => {\n const result = await ctx.remote.sessionGraphSearch.search(request, signal)\n if (!result.ok) throw new Error(result.error.message)\n return result.value\n },\n readSessionHistory: async (request, signal) => {\n const result = await ctx.remote.sessionGraphHistory.read(request, signal)\n if (!result.ok) throw new Error(result.error.message)\n return result.value\n },\n // Canvas Sessions exclude Subagent Sessions by construction, so\n // navigation is a plain open.\n openSession: (id: SessionId) => {\n ctx.sessions.open(id)\n },\n branchSession: async (id: SessionId) => {\n await ctx.sessions.fork({ sessionId: id, increaseTitle: true })\n },\n generateSessionDigest: async (id, options, signal) => {\n const result = await ctx.remote.sessionGraphDigest.generate({\n sessionId: id,\n refresh: options.refresh,\n }, signal)\n if (!result.ok) {\n const error = new Error(result.error.message) as Error & { code?: string }\n error.code = result.error.code\n throw error\n }\n return result.value\n },\n mergeSessions: async (sourceIds, instruction, signal) => await merges.mergeSessions(\n sourceIds,\n instruction,\n signal,\n ) as SessionId,\n retrySessionMerge: async (targetSessionId, sourceIds, instruction, signal) =>\n await merges.retryMerge(targetSessionId, sourceIds, instruction, signal) as SessionId,\n }),\n }, GraphView))\n}\n\n/**\n * Mount the Digest, Merge, and History Remotes, then register the Graph UI\n * inside a child Context that explicitly depends on those namespaces.\n * @param ctx - client root context.\n * @returns disposer that removes the UI before unmounting its Remote.\n */\nexport async function apply(ctx: Context): Promise<() => Promise<void>> {\n const disposeRemote = await ctx.remote.$mount(SESSION_GRAPH_REMOTE)\n const ui = ctx.inject(\n [\n 'slots',\n 'sessions',\n 'workspaces',\n 'locale',\n 'remote.sessionGraphDigest',\n 'remote.sessionGraphMerge',\n 'remote.sessionGraphHistory',\n 'remote.sessionGraphSearch',\n 'remote.sessionGraphTopics',\n 'remote.sessionGraphKnowledge',\n 'remote.sessionGraphReuse',\n ],\n registerUi,\n )\n try {\n await ui\n } catch (error) {\n await ui.dispose()\n await disposeRemote()\n throw error\n }\n return async () => {\n await ui.dispose()\n await disposeRemote()\n }\n}\n"],"x_google_ignoreList":[2],"mappings":";;;;;;;;;;EAkBA,IAAa,oBAAb,cAAuC,MAAM;GAEhC;GAEA;GACA;GAJX,YACE,MACA,SACA,OACA,iBACA;IACA,MAAM,OAAO;IALJ,KAAA,OAAA;IAEA,KAAA,QAAA;IACA,KAAA,kBAAA;IAGT,KAAK,OAAO;GACd;EACF;EAEA,SAAS,eAAe,OAAgB,UAA0B;GAChE,OAAO,iBAAiB,SAAS,MAAM,YAAY,KAAK,MAAM,UAAU;EAC1E;EAEA,MAAM,wBAAwB;;EAG9B,SAAgB,4BAA4B,OAAwB;GAClE,OAAO,sBAAsB,KAAK,KAAK;EACzC;;EAuEA,SAAgB,yBACd,cACoB;GACpB,eAAe,SACb,WACA,aACA,QACgC;IAChC,OAAO,eAAe;IACtB,IAAI,UAAU,SAAS,KAAK,UAAU,SAAS,GAC7C,MAAM,IAAI,kBACR,wBACA,uDACA,YACF;IAEF,IAAI,IAAI,IAAI,SAAS,CAAC,CAAC,SAAS,UAAU,QACxC,MAAM,IAAI,kBACR,oBACA,0CACA,YACF;IAEF,MAAM,wBAAwB,YAAY,KAAK;IAC/C,IAAI,0BAA0B,IAC5B,MAAM,IAAI,kBACR,uBACA,+CACA,YACF;IAEF,IAAI,4BAA4B,qBAAqB,GACnD,MAAM,IAAI,kBACR,uBACA,qEACA,YACF;IAEF,MAAM,UAAU,MAAM,QAAQ,IAAI,UAAU,IAAI,OAAM,aACpD,MAAM,aAAa,cAAc,UAAU,MAAM,CAAC,CAAC;IACrD,OAAO,eAAe;IACtB,MAAM,UAAU,QAAQ,MAAK,WAAU,CAAC,OAAO,MAAM;IACrD,IAAI,YAAY,KAAA,GACd,MAAM,IAAI,kBACR,kBACA,WAAW,KAAK,UAAU,QAAQ,SAAS,EAAE,2BAC7C,YACF;IAEF,MAAM,SAAS,IAAI,IAAI,QAAQ,KAAI,WAAU,OAAO,GAAG,CAAC;IACxD,MAAM,eAAe,CAAC,GAAG,IAAI,IAAI,QAAQ,SAAQ,WAC/C,OAAO,gBAAgB,KAAA,IAAY,CAAC,IAAI,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC;IAChE,IAAI,OAAO,SAAS,KAAK,aAAa,SAAS,GAC7C,MAAM,IAAI,kBACR,0BACA,2EACA,YACF;IAEF,MAAM,QAAQ,QAAQ;;IAEtB,IAAI,UAAU,KAAA,GAAW,MAAM,IAAI,MAAM,0CAA0C;IACnF,OAAO;KACL;KACA;KACA,aAAa;KACb,UAAU;MACR,KAAK,MAAM;MACX,GAAI,aAAa,OAAO,KAAA,IAAY,CAAC,IAAI,EAAE,aAAa,aAAa,GAAG;KAC1E;IACF;GACF;GAEA,eAAe,SACb,iBACA,SACA,QACiB;IACjB,MAAM,QAAQ,UAAU,QAAQ,QAAQ,KAAI,WAAU,OAAO,KAAK,CAAC,CAAC,KAAK,KAAK;IAC9E,IAAI;KACF,MAAM,aAAa,aAAa,iBAAiB,OAAO,MAAM;IAChE,SAAS,OAAO;KACd,IAAI,OAAO,SAAS,MAAM;KAC1B,MAAM,IAAI,kBACR,sBACA,eAAe,OAAO,kCAAkC,GACxD,UACA,eACF;IACF;IACA,OAAO,eAAe;IACtB,IAAI;KACF,MAAM,aAAa,YAAY;MAC7B;MACA,WAAW,QAAQ;MACnB,aAAa,QAAQ;MACrB,aAAa,aAAa,kBAAkB;KAC9C,GAAG,MAAM;IACX,SAAS,OAAO;KACd,IAAI,OAAO,SAAS,MAAM;KAC1B,MAAM,IAAI,kBACR,0BACA,eAAe,OAAO,4CAA4C,GAClE,cACA,eACF;IACF;IACA,OAAO,eAAe;IACtB,IAAI;KACF,aAAa,WAAW,eAAe;IACzC,SAAS,OAAO;KACd,MAAM,IAAI,kBACR,sBACA,eAAe,OAAO,kCAAkC,GACxD,WACA,eACF;IACF;IACA,OAAO;GACT;GAEA,OAAO;IACL,MAAM,cAAc,WAAW,aAAa,QAAQ;KAClD,MAAM,UAAU,MAAM,SAAS,WAAW,aAAa,MAAM;KAC7D,IAAI;KACJ,IAAI;MACF,kBAAkB,MAAM,aAAa,aAAa,QAAQ,UAAU,MAAM;KAC5E,SAAS,OAAO;MACd,IAAI,OAAO,SAAS,MAAM;MAC1B,MAAM,IAAI,kBACR,wBACA,eAAe,OAAO,oCAAoC,GAC1D,UACF;KACF;KACA,OAAO,eAAe;KACtB,OAAO,MAAM,SAAS,iBAAiB,SAAS,MAAM;IACxD;IACA,MAAM,WAAW,iBAAiB,WAAW,aAAa,QAAQ;KAEhE,OAAO,MAAM,SAAS,iBAAiB,MADjB,SAAS,WAAW,aAAa,MAAM,GACb,MAAM;IACxD;GACF;EACF;;;;ECxPA,MAAa,6BAA6B;;EAG1C,MAAa,wBAAA;;EAGb,MAAa,yBAAA;;EAGb,MAAa,4BACX,mBAAmB,sBAAsB,KAAK;;EAGhD,MAAa,4BACX,GAAG,2BAA2B,IAAI,sBAAsB,WAAW;;;ECnBrE,SAAS,EAAE,GAAE;GAAC,IAAI,GAAE,GAAE,IAAE;GAAG,IAAG,YAAU,OAAO,KAAG,YAAU,OAAO,GAAE,KAAG;QAAO,IAAG,YAAU,OAAO,GAAE,IAAG,MAAM,QAAQ,CAAC,GAAE;IAAC,IAAI,IAAE,EAAE;IAAO,KAAI,IAAE,GAAE,IAAE,GAAE,KAAI,EAAE,OAAK,IAAE,EAAE,EAAE,EAAE,OAAK,MAAI,KAAG,MAAK,KAAG;GAAE,OAAM,KAAI,KAAK,GAAE,EAAE,OAAK,MAAI,KAAG,MAAK,KAAG;GAAG,OAAO;EAAC;EAAC,SAAgB,OAAM;GAAC,KAAI,IAAI,GAAE,GAAE,IAAE,GAAE,IAAE,IAAG,IAAE,UAAU,QAAO,IAAE,GAAE,KAAI,CAAC,IAAE,UAAU,QAAM,IAAE,EAAE,CAAC,OAAK,MAAI,KAAG,MAAK,KAAG;GAAG,OAAO;EAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ECG/W,SAAgB,kBAAkB,OAAyC;GACzE,IAAI,MAAM,QAAQ,OAAO;GACzB,MAAM,WAAW,CAAC,GAAG,MAAM,cAAc,iBAA8B,kDAAgD,CAAC,CAAC,CACtH,QAAO,YAAW,CAAC,QAAQ,aAAa,UAAU,CAAC;GACtD,MAAM,QAAQ,SAAS;GACvB,MAAM,OAAO,SAAS,SAAS,SAAS;GACxC,IAAI,MAAM,YAAY,SAAS,kBAAkB,OAAO;IAAE,MAAM,eAAe;IAAG,MAAM,MAAM;GAAE,OAC3F,IAAI,CAAC,MAAM,YAAY,SAAS,kBAAkB,MAAM;IAAE,MAAM,eAAe;IAAG,OAAO,MAAM;GAAE;EACxG;;;;ECDA,SAAgB,oBAAoB,EAAE,QAAQ,KAAK,QAAQ,MAAM,SAAS,SAAS,KAQlE;GACf,MAAM,CAAC,aAAa,mBAAA,GAAkBA,MAAAA,SAAAA,CAAS,GAAM;GACrD,MAAM,CAAC,UAAU,gBAAA,GAAeA,MAAAA,SAAAA,CAAgC;GAChE,MAAM,CAAC,UAAU,gBAAA,GAAeA,MAAAA,SAAAA,CAAS,EAAE;GAC3C,MAAM,CAAC,OAAO,aAAA,GAAYA,MAAAA,SAAAA,CAAS,EAAE;GACrC,MAAM,CAAC,MAAM,YAAA,GAAWA,MAAAA,SAAAA,CAAS,KAAK;GACtC,MAAM,CAAC,QAAQ,cAAA,GAAaA,MAAAA,SAAAA,CAAiB;GAC7C,MAAM,CAAC,UAAU,gBAAA,GAAeA,MAAAA,SAAAA,CAAS,KAAK;GAC9C,MAAM,CAAC,SAAS,eAAA,GAAcA,MAAAA,SAAAA,CAA6H,CAAC,CAAC;GAC7J,MAAM,UAAA,GAASC,MAAAA,OAAAA,CAAwB;GACvC,CAAA,GAAA,MAAA,UAAA,aAAsB;IAAE,OAAO,SAAS,MAAM;GAAE,GAAG,CAAC,CAAC;GACrD,MAAM,MAAM,OAAO,aAAqC;IACtD,OAAO,SAAS,MAAM;IACtB,MAAM,aAAa,IAAI,gBAAgB;IACvC,OAAO,UAAU;IACjB,QAAQ,IAAI;IACZ,UAAU,KAAA,CAAS;IACnB,YAAY,KAAK;IACjB,IAAI;KACF,IAAI,YAAY,aAAa,KAAA,GAAW;MACtC,MAAM,SAAS,MAAM,IAAI,QAAQ;OAAE,eAAe,SAAS;OAAe;OAAU;MAAM,GAAG,WAAW,MAAM;MAC9G,IAAI,CAAC,WAAW,OAAO,SAAS,YAAW,UAAS,CAAC,GAAG,OAAO;OAAE,IAAI,OAAO,WAAW;OAAG;OAAQ,aAAa;MAAS,CAAC,CAAC;KAC5H,OAAO;MACL,YAAY,KAAA,CAAS;MACrB,MAAM,QAAQ,MAAM,IAAI,kBAAkB;OAAE;OAAQ;MAAY,GAAG,WAAW,MAAM;MACpF,IAAI,WAAW,OAAO,SAAS;MAC/B,YAAY,KAAK;MACjB,YAAY,MAAM,OAAO,YAAY,EAAE;MACvC,SAAS,MAAM,OAAO,SAAS,EAAE;KACnC;IACF,SAAS,OAAO;KACd,IAAI,CAAC,WAAW,OAAO,SAAS,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;IAClG,UAAU;KAAE,IAAI,CAAC,WAAW,OAAO,SAAS,QAAQ,KAAK;IAAE;GAC7D;GACA,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAWC,6BAAO;IAAvB,UAAA;KACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,EAAE,kBAAkB,EAAM,CAAA;KAAC,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD,EAAA,UAAA;MAAI,OAAO;MAAU;MAAI,EAAE,yBAAyB;OAAE,OAAO,OAAO;OAAU,KAAK,OAAO;MAAO,CAAC;KAAK,EAAA,CAAA;KACvI,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD,EAAA,UAAA,CAAQ,EAAE,gBAAgB,GAAE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;MAAO,MAAK;MAAS,KAAK;MAAK,KAAK;MAAQ,MAAM;MAAK,UAAU;MAAM,OAAO;MACxG,WAAU,UAAS;OAAE,eAAe,MAAM,OAAO,aAAa;OAAG,YAAY,KAAA,CAAS;MAAE;KAAI,CAAA,CAAQ,EAAA,CAAA;KACtG,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;MAAQ,MAAK;MAAS,UAAU,QAAQ,CAAC,OAAO,cAAc,WAAW,KAAK,cAAc,OAAO,cAAc;MAC/G,eAAe;OAAE,IAAS,KAAK;MAAE;MAAI,UAAA,EAAE,iBAAiB;KAAU,CAAA;KACnE,aAAa,KAAA,IAAY,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;MAC/B,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,EAAE,kBAAkB,EAAM,CAAA;MAC/B,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD,EAAA,UAAA;OAAI,EAAE,yBAAyB;QAAE,OAAO,SAAS,SAAS,OAAO;QAAU,KAAK,SAAS,SAAS,OAAO;OAAO,CAAC;OAAE;OAAI,SAAS,aAAa;OAAO;OAAE,SAAS;MAAe,EAAA,CAAA;MAC9K,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;OAAK,WAAWA,6BAAO;OAAc,UAAA,SAAS;MAAkB,CAAA;MAChE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,EAAE,iBAAiB,EAAM,CAAA;MAC7B,SAAS,QAAQ,WAAW,IAAI,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,qBAAqB,EAAK,CAAA,IAAI,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,SAAS,QAAQ,KAAI,UAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UACrG,EAAE,yBAAyB;OAAE,OAAO,MAAM;OAAU,KAAK,MAAM;MAAO,CAAC,EAAM,GADiC,MAAM,QACvC,CAAC,EAAM,CAAA;MACvF,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,cAAc,EAAK,CAAA;MACzB,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD,EAAA,UAAA,CAAQ,EAAE,kBAAkB,GAAE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;OAAO,UAAU;OAAM,WAAW;OAAK,OAAO;OAAU,WAAU,UAAS;QAAE,YAAY,MAAM,OAAO,KAAK;OAAE;MAAI,CAAA,CAAQ,EAAA,CAAA;MACvJ,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD,EAAA,UAAA,CAAQ,EAAE,eAAe,GAAE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;OAAO,UAAU;OAAM,WAAW;OAAK,OAAO;OAAO,WAAU,UAAS;QAAE,SAAS,MAAM,OAAO,KAAK;OAAE;MAAI,CAAA,CAAQ,EAAA,CAAA;MAC9I,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OAAQ,MAAK;OAAS,UAAU,QAAQ,SAAS,KAAK,MAAM,MAAM,MAAM,KAAK,MAAM;OAAI,eAAe;QAAE,IAAS,IAAI;OAAE;OACpH,UAAA,EAAE,QAAQ,WAAW,IAAI,qBAAqB,gBAAgB;MAAU,CAAA;MAC3E,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,kBAAkB,EAAK,CAAA;MAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,kBAAkB,EAAK,CAAA;KAC3D,EAAA,CAAA;KACD,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD;MAAG,MAAK;MAAR,UAAA;OAAkB,EAAE,oBAAoB;OAAE;OAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,eAAe;SACtF,OAAO,SAAS,MAAM;SACtB,QAAQ,KAAK;SACb,YAAY,IAAI;QAClB;QAAI,UAAA,EAAE,gBAAgB;OAAU,CAAA;MAAI;KAAI,CAAA,IAAA;KACvC,WAAW,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,MAAK;MAAU,UAAA,EAAE,iBAAiB;KAAK,CAAA,IAAI;KACzD,WAAW,KAAA,IAAY,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD;MAAG,MAAK;MAAR,UAAA;OAAiB,EAAE,iBAAiB;OAAE;OAAE;MAAU;;KAChF,QAAQ,KAAI,UAAS,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD,EAAA,UAAA,CACpB,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD,EAAA,UAAA;MAAK,MAAM,OAAO;MAAS;MAAI,MAAM,OAAO;KAAU,EAAA,CAAA,GACrD,MAAM,OAAO,OAAO,KAAI,UAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,iBAAD;MAAoC,QAAQ,KAAA;MAAW,QAAQ,KAAA;MAAoB;MAC5G;MAAO,aAAa,MAAM;MAAkB;MAAa;MAAc;MAAS;MAAY;MACnG,aAAa;OAAE,YAAW,UAAS,MAAM,KAAI,SAAQ,KAAK,OAAO,MAAM,KAAK,OAAO;QAAE,GAAG;QACtF,QAAQ;SAAE,GAAG,KAAK;SAAQ,QAAQ,KAAK,OAAO,OAAO,QAAO,SAAQ,KAAK,WAAW,MAAM,MAAM;QAAE;OAAE,CAAC,CAAC;MAAE;KAAI,GAHxD,MAAM,MAGkD,CAAC,CAC1G,EAAA,GAN2B,MAAM,EAMjC,CAAC;IACP;;EACP;;;ECrEA,MAAM,gBAAA,GAAeC,MAAAA,cAAAA,CAA6C,KAAA,CAAS;EAC3E,SAAgB,mBAAkD;GAAE,QAAA,GAAOC,MAAAA,WAAAA,CAAW,YAAY;EAAE;EAEpG,SAAgB,mBAAmB,EAAE,KAAqD;GACxF,MAAM,QAAQ,iBAAiB;GAC/B,OAAO,UAAU,KAAA,IAAY,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA,CAClC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;IAAQ,MAAK;IAAS,WAAWC,6BAAO;IAAa,SAAS,MAAM;IAAO,UAAA,EAAE,mBAAmB,EAAE,OAAO,MAAM,MAAM,CAAC;GAAU,CAAA,GAChI,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;IAAQ,MAAK;IAAS,WAAWA,6BAAO;IAAa,SAAS,MAAM;IAAU,UAAA,EAAE,eAAe;GAAU,CAAA,CACzG,EAAA,CAAA;EACJ;;EAGA,SAAgB,sBAAsB,EAAE,KAAK,YAAY,UAAU,aAAa,UAAU,KAOzE;GACf,MAAM,CAAC,WAAW,iBAAA,GAAgBC,MAAAA,SAAAA,CAAmC,CAAC,CAAC;GACvE,MAAM,CAAC,MAAM,YAAA,GAAWA,MAAAA,SAAAA,CAAoB;GAC5C,MAAM,CAAC,UAAU,gBAAA,GAAeA,MAAAA,SAAAA,CAAS,EAAE;GAC3C,MAAM,CAAC,aAAa,mBAAA,GAAkBA,MAAAA,SAAAA,CAAS,EAAE;GACjD,MAAM,CAAC,SAAS,eAAA,GAAcA,MAAAA,SAAAA,CAA8B;GAC5D,MAAM,CAAC,WAAW,iBAAA,GAAgBA,MAAAA,SAAAA,CAAS,KAAK;GAChD,MAAM,CAAC,SAAS,eAAA,GAAcA,MAAAA,SAAAA,CAAyC;GACvE,MAAM,CAAC,QAAQ,cAAA,GAAaA,MAAAA,SAAAA,CAA0B;GACtD,MAAM,CAAC,MAAM,YAAA,GAAWA,MAAAA,SAAAA,CAAS,KAAK;GACtC,MAAM,CAAC,QAAQ,cAAA,GAAaA,MAAAA,SAAAA,CAAiB;GAC7C,MAAM,WAAA,GAAUC,MAAAA,OAAAA,CAAmE;GACnF,MAAM,UAAA,GAASA,MAAAA,OAAAA,CAAwB;GACvC,MAAM,WAAA,GAAUA,MAAAA,OAAAA,CAAoB;GACpC,CAAA,GAAA,MAAA,UAAA,aAAsB;IAAE,OAAO,SAAS,MAAM;GAAE,GAAG,CAAC,CAAC;GACrD,MAAM,QAAQ,SAA0B;IACtC,IAAI,SAAS,yBAAyB,aAAa,QAAQ,UAAU,SAAS;IAC9E,UAAU,KAAA,CAAS;IACnB,UAAU,KAAA,CAAS;IACnB,QAAQ,IAAI;IACZ,IAAI,SAAS,aAAa,aAAa,YAAY,KAAA,GACjD,SAAa,WAAU,QAAQ,SAAS,QAAQ,WAAW,KAAK,CAAC;GAErE;GACA,MAAM,cAAoB;IACxB,OAAO,SAAS,MAAM;IACtB,QAAQ,KAAK;IACb,QAAQ,KAAA,CAAS;IACjB,qBAAqB;KAAE,QAAQ,SAAS,MAAM;IAAE,CAAC;GACnD;GACA,MAAM,eAAqB;IACzB,OAAO,SAAS,MAAM;IACtB,QAAQ,KAAK;IACb,UAAU,KAAA,CAAS;IACnB,WAAW,KAAA,CAAS;GACtB;GACA,MAAM,UAAU,OAAO,cAAqE;IAC1F,OAAO,SAAS,MAAM;IACtB,MAAM,aAAa,IAAI,gBAAgB;IACvC,OAAO,UAAU;IACjB,QAAQ,IAAI;IACZ,UAAU,KAAA,CAAS;IACnB,IAAI;KAAE,MAAM,UAAU,WAAW,MAAM;IAAE,SAAS,OAAO;KACvD,IAAI,CAAC,WAAW,OAAO,SAAS,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;IAClG,UAAU;KAAE,IAAI,CAAC,WAAW,OAAO,SAAS,QAAQ,KAAK;IAAE;GAC7D;GACA,MAAM,gBAAsB;IAC1B,KAAK,SAAS;IACd,WAAW,KAAA,CAAS;IACpB,QAAa,OAAM,WAAU;KAC3B,MAAM,QAAQ,MAAM,IAAI,WAAW,EAAE,WAAW,SAAS,GAAG,MAAM;KAClE,IAAI,CAAC,OAAO,SAAS,WAAW,KAAK;IACvC,CAAC;GACH;GACA,MAAM,WAAW,OAA4B,aAAwB,aAA4B;IAC/F,IAAI,gBAAgB,WAAW,YAAW,UAAS,OAAO,KAAI,SAAQ,KAAK,gBAAgB,MAAM,cAAc,QAAQ,IAAI,CAAC;SACvH;KAAE,WAAW,KAAK;KAAG,aAAa,KAAK;IAAE;IAC9C,IAAI,MAAM,UAAU,YAAY,UAAU,MAAM,SAAS,EAAE,aAAa,CAAC;SACpE;KACH,UAAU,KAAA,CAAS;KACnB,IAAI,gBAAgB,WAAW,UAAU,YAAY;KACrD,IAAI,UAAU,YAAY,MAAM,eAA4B;IAC9D;GACF;GACA,MAAM,UAAU,OAAO,QAA6B,QAAqB,aAAwB,aAAqC;IACpI,MAAM,QAAQ,MAAM,IAAI,KAAK,EAAE,aAAa,OAAO,YAAY,GAAG,MAAM;IACxE,IAAI,OAAO,SAAS;IACpB,IAAI,UAAU,MAAM,MAAM,IAAI,MAAM,EAAE,2BAA2B,CAAC;IAClE,QAAQ,OAAO,aAAa,QAAQ;GACtC;GACA,MAAM,UAAU,WAAsC;IACpD,MAAM,cAAc,QAAQ;IAC5B,IAAI,gBAAgB,WAAW,aAAa,IAAI;IAChD,QAAa,OAAM,WAAU;KAC3B,IAAI;KACJ,IAAI;MAAE,QAAQ,MAAM,IAAI,OAAO,EAAE,aAAa,OAAO,YAAY,GAAG,MAAM;KAAE,QAAQ;MAClF,OAAO,eAAe;MACtB,MAAM,QAAQ,QAAQ,QAAQ,aAAa,gBAAgB,SAAS;MACpE;KACF;KACA,IAAI,CAAC,OAAO,SAAS,QAAQ,OAAO,aAAa,gBAAgB,SAAS;IAC5E,CAAC;GACH;GACA,MAAM,SAAS,QAAQ,aAAa,SAAS,kBAAkB;GAC/D,MAAM,OAAO,WAAsC,UAAwB;IACzE,IAAI,WAAW;KAAE,UAAU,iBAAiB;KAAG;IAAO;IACtD,IAAI,MAAM;IACV,IAAI,SAAS,eAAe;KAAE,UAAU,eAAe;KAAG;IAAO;IACjE,IAAI,UAAU,MAAK,SAAQ,KAAK,UAAU,KAAK,SAAS,MAAM,KAAK,UAAU,SAAS,CAAC,GAAG;KAAE,UAAU,iBAAiB;KAAG;IAAO;IACjI,IAAI,UAAU,UAAU,GAAG;KAAE,UAAU,aAAa;KAAG;IAAO;IAC9D,OAAO;IACP,cAAa,UAAS,CAAC,GAAG,OAAO;KAAE;KAAW;IAAM,CAAC,CAAC;IACtD,UAAU,aAAa;GACzB;GACA,MAAM,QAAQ,OAAe,cAA4B;IACvD,OAAO;IACP,cAAa,UAAS;KACpB,MAAM,OAAO,CAAC,GAAG,KAAK;KACtB,MAAM,QAAQ,QAAQ;KACtB,IAAI,KAAK,WAAW,KAAA,KAAa,KAAK,WAAW,KAAA,GAAW,OAAO;KACnE,MAAM,OAAO,KAAK;KAClB,KAAK,SAAS,KAAK;KACnB,KAAK,SAAS;KACd,OAAO;IACT,CAAC;GACH;GACA,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,aAAa,UAAd;IAAuB,OAAO;KAAE;KAAK,OAAO,UAAU;KAAQ,YAAY;MAAE,KAAK,SAAS;KAAE;KAAG;IAAQ;IAAvG,UAAA,CACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;KAAK,WAAWF,6BAAO;KAAe,eAAa,SAAS,KAAA,KAAa,KAAA;KACvE,MAAK,YAAW;MAAE,IAAI,YAAY,MAAM,QAAQ,QAAQ,SAAS,KAAA;KAAU;KAD7E,UAAA,CACiF,UAC9E,WAAW,KAAA,IAAY,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;MAAM,WAAWA,6BAAO;MAAa,MAAK;MAAU,UAAA,EAAE,MAAM;KAAQ,CAAA,CAChG;IACJ,CAAA,GAAA,SAAS,KAAA,IAAY,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;KAAS,WAAWA,6BAAO;KAAiB,MAAK;KAAS,cAAW;KAChG,cAAY,EAAE,SAAS,YAAY,gBAAgB,eAAe;KAAG,YAAW,UAAS;MACvF,IAAI,MAAM,QAAQ,UAAU;OAAE,MAAM,gBAAgB;OAAG,MAAM;MAAE;MAC/D,kBAAkB,KAAK;KACzB;KAJ2B,UAAA,CAK3B,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,6BAAO;MAAvB,UAAA,CAAqC,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,EAAE,SAAS,YAAY,gBAAgB,eAAe,EAAM,CAAA,GACpG,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OAAQ,MAAK;OAAS,WAAA;OAAU,SAAS;OAAQ,UAAA,EAAE,aAAa;MAAU,CAAA,CAAM;KAClF,CAAA,GAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,6BAAO;MAAvB,UAAA;OACG,SAAS,YAAY,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;QACpB,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,gBAAgB,EAAK,CAAA;QAC1B,UAAU,WAAW,IAAI,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;SAAG,MAAK;SAAU,UAAA,EAAE,aAAa;QAAK,CAAA,IAAI,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,UAAU,KAAK,MAAM,UAAU,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD,EAAA,UAAA;SACtG,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,KAAK,MAAc,CAAA;SAC5B,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;UAAQ,MAAK;UAAS,UAAU,UAAU,UAAU;UAAG,eAAe;WAAE,KAAK,OAAO,EAAE;UAAE;UAAI,UAAA,EAAE,UAAU;SAAU,CAAA;SAClH,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;UAAQ,MAAK;UAAS,UAAU,UAAU,UAAU,UAAU,SAAS;UAAG,eAAe;WAAE,KAAK,OAAO,CAAC;UAAE;UAAI,UAAA,EAAE,YAAY;SAAU,CAAA;SACtI,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;UAAQ,MAAK;UAAS,UAAU;UAAQ,eAAe;WAAE,OAAO;WAAG,cAAa,UAAS,MAAM,QAAQ,GAAG,MAAM,MAAM,KAAK,CAAC;UAAE;UAAI,UAAA,EAAE,cAAc;SAAU,CAAA;QAC1J,EAAA,GAL6G,KAAK,UAAU,KAAK,SAAS,CAK1I,CAAC,EAAM,CAAA;QACX,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD,EAAA,UAAA,CAAQ,EAAE,gBAAgB,GAAE,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;SAAU,OAAO;SAAU,UAAU;SAAQ,WAAW;SAAM,MAAM;SAC9F,WAAU,UAAS;UAAE,OAAO;UAAG,YAAY,MAAM,OAAO,KAAK;SAAE;QAAI,CAAA,CAAQ,EAAA,CAAA;QAC7E,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD,EAAA,UAAA,CAAQ,EAAE,iBAAiB,GAAE,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;SAAQ,OAAO;SAAa,UAAU;SAAQ,WAAU,UAAS;UAAE,OAAO;UAAG,eAAe,MAAM,OAAO,KAAK;SAAE;SAAhH,UAAA,CAC3B,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;UAAQ,OAAM;UAAI,UAAA,EAAE,uBAAuB;SAAU,CAAA,GAAE,WAAW,KAAI,SAAQ,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;UAA+B,OAAO,KAAK;UAAc,UAAA,KAAK,SAAS,KAAK;SAAa,GAA5E,KAAK,WAAuE,CAAC,CAClK;QAAQ,CAAA,CAAA,EAAA,CAAA;QAChB,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,MAAK;SAAS,UAAU,UAAU,UAAU,SAAS,KAAK,UAAU,SAAS,KAAK,SAAS,KAAK,MAAM,MAAM,CAAC,WAAW,MAAK,SAAQ,KAAK,gBAAgB,WAAW;SAC3K,eAAe;UACb,MAAM,OAAO;WAAE,WAAW,UAAU,KAAI,SAAQ,KAAK,SAAS;WAAG,UAAU,SAAS,KAAK;WAAG;UAAY;UACxG,MAAM,UAAU,KAAK,UAAU,IAAI;UACnC,IAAI,QAAQ,SAAS,YAAY,SAAS,QAAQ,UAAU;WAAE;WAAS,aAAa,OAAO,WAAW;UAAE;UACxG,MAAM,cAAc,QAAQ,QAAQ;UACpC,QAAa,OAAM,WAAU;WAC3B,MAAM,QAAQ,MAAM,IAAI,QAAQ;YAAE,GAAG;YAAM;WAAY,GAAG,MAAM;WAChE,IAAI,CAAC,OAAO,SAAS,WAAW,KAAK;UACvC,CAAC;SACH;SAAI,UAAA,EAAE,eAAe;QAAU,CAAA;QAChC,YAAY,KAAA,IAAY,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;SAC9B,iBAAA,GAAA,kBAAA,IAAA,CAAC,uBAAD;UAAuB,QAAQ;UAAY;SAAI,CAAA;SAC9C,YAAY,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;UAAK,MAAK;UAAV,UAAA;WAAmB,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,iBAAiB,EAAK,CAAA;WAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,QAAQ,gBAAmB,CAAA;WAC1F,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;YAAQ,MAAK;YAAS,UAAU;YAAM,eAAe;aACnD,SAAa,WAAU,QAAQ,SAAS,QAAQ,WAAW,KAAK,CAAC;YACnE;YAAI,UAAA,EAAE,eAAe;WAAU,CAAA;UAAM;SAAI,CAAA,IAAA;SAC1C,QAAQ,UAAU,aAAa,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;UAAQ,MAAK;UAAS,UAAU;UAAM,eAAe;WAAE,OAAO,OAAO;UAAE;UAC3G,UAAA,EAAE,CAAC,aAAa,QAAQ,UAAU,KAAA,IAAY,kBAAkB,aAAa;SAAU,CAAA;SACzF,QAAQ,gBAAgB,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;UAAQ,MAAK;UAAS,eAAe;WAAE,YAAY,QAAQ,eAA4B;UAAE;UAAI,UAAA,EAAE,YAAY;SAAU,CAAA,IAAI;QAClJ,EAAA,CAAA;OACF,EAAA,CAAA,IAAI,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA,CACH,SAAS,WAAW,IAAI,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,iBAAiB,EAAK,CAAA,IAAI,SAAS,KAAI,WAAU,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD,EAAA,UAAA,CAC9E,iBAAA,GAAA,kBAAA,IAAA,CAAC,uBAAD;QAA+B;QAAW;OAAI,CAAA,GAC7C,OAAO,UAAU,aAAa,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,UAAU;QAAM,eAAe;SAAE,OAAO,MAAM;QAAE;QAAI,UAAA,EAAE,aAAa;OAAU,CAAA,CAClI,EAAA,GAHqF,OAAO,WAG5F,CAAC,GACT,WAAW,KAAA,IAAY,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,UAAU;QAAM,SAAS;QAAU,UAAA,EAAE,oBAAoB;OAAU,CAAA,CACxH,EAAA,CAAA;OACD,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;QAAG,MAAK;QAAU,UAAA,EAAE,YAAY;OAAK,CAAA,IAAI;OAChD,WAAW,KAAA,IAAY,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD;QAAG,MAAK;QAAR,UAAA;SAAiB,EAAE,aAAa;SAAE;SAAE;QAAU;;MAC1E;KACE,CAAA,CAAA;IACY,CAAA,CAAA;;EACzB;EAEA,SAAS,sBAAsB,EAAE,QAAQ,KAAoF;GAC3H,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD,EAAA,UAAA;IACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,EAAE,OAAO,UAAU,aAAa,eAAe,OAAO,gBAAgB,kBAAkB,cAAc,EAAM,CAAA;IACjH,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD,EAAA,UAAA;KAAI,OAAO,UAAU;KAAM;KAAI,OAAO,UAAU;IAAO,EAAA,CAAA;IACvD,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,gBAAgB;KAAE,MAAM,OAAO,WAAW;KAAQ,QAAQ,OAAO;IAAY,CAAC,EAAK,CAAA;IACxF,OAAO,UAAU,aAAa,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;KAAE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,EAAE,gBAAgB,EAAM,CAAA;KAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,OAAO,UAAU,KAAK,UAAU,UAAU,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD,EAAA,UAAA;MAC3G,SAAS,SAAS,SAAS,GAAG,SAAS,QAAQ,MAAM,KAAK,EAAE,2BAA2B,EAAE,QAAQ,SAAS,eAAe,CAAC,MACvH,GAAG,SAAS,OAAO,MAAM,KAAK,EAAE,yBAAyB;OAAE,OAAO,SAAS,OAAO,OAAO;OAAU,KAAK,SAAS,OAAO,OAAO;MAAO,CAAC;MAAI;MAAI,OAAO;KACxJ,EAAA,GAHmH,KAGnH,CAAC,EAAM,CAAA;KAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,cAAc,EAAK,CAAA;IAAG,EAAA,CAAA,IAAI,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,eAAe,EAAK,CAAA;IACtE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;KAAK,WAAWA,6BAAO;KAAc,UAAA,OAAO;IAAgB,CAAA;GACrD,EAAA,CAAA;EACX;;;;EC9MA,SAAgB,gBAAgB,EAAE,OAAO,KAAK,KAI7B;GACf,MAAM,CAAC,UAAU,gBAAA,GAAeG,MAAAA,SAAAA,OAAe,MAAM,KAAI,SAAQ,KAAK,MAAM,CAAC;GAC7E,MAAM,CAAC,SAAS,eAAA,GAAcA,MAAAA,SAAAA,CAAgC;GAC9D,MAAM,CAAC,MAAM,YAAA,GAAWA,MAAAA,SAAAA,CAAS,KAAK;GACtC,MAAM,CAAC,OAAO,aAAA,GAAYA,MAAAA,SAAAA,CAAiB;GAC3C,MAAM,UAAA,GAASC,MAAAA,OAAAA,CAAwB;GACvC,MAAM,QAAA,GAAOA,MAAAA,OAAAA,iBAAO,IAAI,IAA2C,CAAC;GACpE,CAAA,GAAA,MAAA,UAAA,aAAsB;IACpB,OAAO,SAAS,MAAM;IACtB,KAAK,MAAM,CAAC,KAAK,UAAU,KAAK,SAAS;KAAE,aAAa,KAAK;KAAG,IAAI,gBAAgB,GAAG;IAAE;IACzF,KAAK,QAAQ,MAAM;GACrB,GAAG,CAAC,CAAC;GACL,MAAM,UAAU,YAA2B;IACzC,OAAO,SAAS,MAAM;IACtB,MAAM,aAAa,IAAI,gBAAgB;IACvC,OAAO,UAAU;IACjB,QAAQ,IAAI;IACZ,SAAS,KAAA,CAAS;IAClB,IAAI;KACF,MAAM,QAAQ,MAAM,IAAI,cAAc,EAAE,SAAS,SAAS,GAAG,WAAW,MAAM;KAC9E,IAAI,CAAC,WAAW,OAAO,SAAS,WAAW,KAAK;IAClD,SAAS,OAAO;KACd,IAAI,CAAC,WAAW,OAAO,SAAS,SAAS,iBAAiB,QAAQ,MAAM,UAAU,EAAE,cAAc,CAAC;IACrG,UAAU;KAAE,IAAI,CAAC,WAAW,OAAO,SAAS,QAAQ,KAAK;IAAE;GAC7D;GACA,MAAM,iBAAuB;IAC3B,IAAI,YAAY,KAAA,GAAW;IAC3B,SAAS,KAAA,CAAS;IAClB,IAAI;IACJ,IAAI;KACF,MAAM,MAAM,IAAI,gBAAgB,IAAI,KAAK,CAAC,QAAQ,QAAQ,GAAG,EAAE,MAAM,8BAA8B,CAAC,CAAC;KACrG,KAAK,QAAQ,IAAI,KAAK,iBAAiB;MAAE,IAAI,gBAAgB,GAAG;MAAG,KAAK,QAAQ,OAAO,GAAG;KAAE,GAAG,GAAK,CAAC;KACrG,OAAO,SAAS,cAAc,GAAG;KACjC,KAAK,OAAO;KACZ,KAAK,WAAW,QAAQ;KACxB,SAAS,KAAK,OAAO,IAAI;KACzB,KAAK,MAAM;IACb,SAAS,OAAO;KAAE,SAAS,iBAAiB,QAAQ,MAAM,UAAU,EAAE,cAAc,CAAC;IAAE,UAAU;KAAE,MAAM,OAAO;IAAE;GACpH;GACA,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAWC,6BAAO;IAAvB,UAAA;KACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,aAAa,EAAK,CAAA;KACxB,iBAAA,GAAA,kBAAA,KAAA,CAAC,YAAD;MAAU,UAAU;MAAM,WAAWA,6BAAO;MAA5C,UAAA,CAA2D,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,EAAE,eAAe,EAAU,CAAA,GAC5F,MAAM,KAAI,SAAQ,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD,EAAA,UAAA,CAAyB,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;OAAO,MAAK;OAAW,SAAS,SAAS,SAAS,KAAK,MAAM;OAAG,WAAU,UAAS;QAC7H,aAAY,YAAW,MAAM,OAAO,UAAU,MAAM,QAAO,SAAQ,KAAK,WAAW,KAAK,UAAU,QAAQ,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,KAAI,SAAQ,KAAK,MAAM,IAAI,QAAQ,QAAO,OAAM,OAAO,KAAK,MAAM,CAAC;QACpM,WAAW,KAAA,CAAS;QACpB,SAAS,KAAA,CAAS;OACpB;MAAI,CAAA,GAAE,KAAK,KAAa,EAAA,GAJO,KAAK,MAIZ,CAAC,CACjB;;KACV,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,6BAAO;MAAvB,UAAA;OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,UAAU,QAAQ,SAAS,WAAW,KAAK,SAAS,SAAS;QAAI,eAAe;SAAE,QAAa;QAAE;QAAI,UAAA,EAAE,gBAAgB;OAAU,CAAA;OACvJ,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,UAAU,QAAQ,YAAY,KAAA;QAAW,SAAS;QAAW,UAAA,EAAE,iBAAiB;OAAU,CAAA;OAC/G,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA,CAAE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,MAAK;QAAU,UAAA,EAAE,gBAAgB;OAAQ,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,eAAe;SAC7F,OAAO,SAAS,MAAM;SACtB,QAAQ,KAAK;QACf;QAAI,UAAA,EAAE,cAAc;OAAU,CAAA,CAAG,EAAA,CAAA,IAAI;MAClC;;KACJ,UAAU,KAAA,IAAY,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,MAAK;MAAV,UAAA,CAAkB,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,cAAc,EAAK,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,MAAS,CAAA,CAAM;;KAC5F,YAAY,KAAA,IAAY,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;MAC9B,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD,EAAA,UAAA;OAAI,QAAQ;OAAS;OAAI,EAAE,eAAe;MAAK,EAAA,CAAA;MAC/C,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,QAAQ,MAAM,KAAI,SAAQ,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD,EAAA,UAAA;OAAuB,KAAK;OAAM;OAAI,EAAE,2BAA2B,EAAE,QAAQ,KAAK,OAAO,CAAC;MAAM,EAAA,GAAvF,KAAK,MAAkF,CAAC,EAAM,CAAA;MACtI,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD,EAAA,UAAA,CAAQ,EAAE,iBAAiB,GAAE,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;OAAU,WAAWA,6BAAO;OAAe,UAAA;OAAS,OAAO,QAAQ;OAAU,MAAM;MAAK,CAAA,CAAQ,EAAA,CAAA;KAC7H,EAAA,CAAA;IACC;;EACP;;;;ECxEA,SAAgB,yBAAyB,QAAgB,UAA6B,aAAwE;GAC5J,OAAO,SAAS,QAAQ,KAAK,QAAQ,gBAAgB;IACnD,MAAM,EAAE,UAAU,WAAW,OAAO;IACpC,MAAM,WAAW,aAAa;IAC9B,MAAM,QAAQ,UAAU,OAAO,MAAM,QAAO,SAAQ,KAAK,YAAY,YAAY,KAAK,UAAW,MAAM;IACvG,IAAI,gBAAgB,KAAA,KAAa,UAAU,cAAc,OAAO,aAAa,KAAK,UAAU,KAAK,MAAM,KAAK,UAAU,OAAO,OAAO,KAAK,GACvI,OAAO;KAAE,MAAM;KAAc,eAAe,YAAY;KAAe;KAAU;IAAO;IAE1F,OAAO;KAAE,MAAM;KAAY;KAAQ,YAAY,SAAS;KAAY;IAAY;GAClF,CAAC;EACH;;EAGA,SAAgB,yBAAyB,aAAoC,SAA4C,UAAkB,SAAqD;GAC9L,MAAM,YAAY,YAA2E,QAAQ,SAAS,gBAAgB,QAAQ,kBAAkB,YAAY;GACpK,MAAM,YAAY,QAAQ,OAAO,QAAQ;GACzC,MAAM,QAAQ,YAAY,SAAS,OAAO;GAC1C,MAAM,WAAW,IAAI,IAAI,MAAM,QAAO,SAAQ,UAAU,MAAK,YAAW,KAAK,YAAY,QAAQ,YAAY,KAAK,UAAW,QAAQ,MAAM,CAAC,CAAC,CAAC,KAAI,SAAQ,KAAK,QAAQ,CAAC;GACxK,IAAI,SAAS,SAAS,IAAI,QAAQ;QAC7B,SAAS,OAAO,QAAQ;GAC7B,MAAM,SAAuC,CAAC;GAC9C,MAAM,SAAS,MAAM,UAAU;IAC7B,IAAI,CAAC,SAAS,IAAI,KAAK,QAAQ,GAAG;IAClC,MAAM,OAAO,OAAO,GAAG,EAAE;IACzB,IAAI,SAAS,KAAA,KAAa,MAAM,QAAQ,EAAE,EAAE,WAAW,KAAK,QAAQ,OAAO,OAAO,SAAS,KAAK;KAAE,GAAG;KAAM,QAAQ,KAAK;IAAQ;SAC3H,OAAO,KAAK;KAAE,MAAM;KAAc,eAAe,YAAY;KAAe,UAAU,KAAK;KAAU,QAAQ,KAAK;IAAQ,CAAC;GAClI,CAAC;GACD,OAAO,CAAC,GAAG,QAAQ,QAAO,YAAW,CAAC,SAAS,OAAO,CAAC,GAAG,GAAG,MAAM;EACrE;;;ECNA,MAAM,oBAAA,GAAmBC,MAAAA,cAAAA,CAAiD,KAAA,CAAS;EACnF,SAAgB,eAAkD;GAAE,QAAA,GAAOC,MAAAA,WAAAA,CAAW,gBAAgB;EAAE;;EASxG,SAAgB,kBAAkB,EAAE,KAAK,QAAQ,MAAM,GAAG,YAMzC;GACf,MAAM,CAAC,SAAS,eAAA,GAAcC,MAAAA,SAAAA,CAAqC,CAAC,CAAC;GACrE,MAAM,CAAC,WAAW,iBAAA,GAAgBA,MAAAA,SAAAA,CAAkC;GACpE,MAAM,iBAAA,GAAgBC,MAAAA,OAAAA,CAAoB;GAC1C,MAAM,CAAC,SAAS,eAAA,GAAcD,MAAAA,SAAAA,CAAS,CAAC;GACxC,MAAM,CAAC,SAAS,gBAAA,GAAeA,MAAAA,SAAAA,CAAiB;GAChD,MAAM,QAAQ,YAA8C;IAC1D,MAAM,SAAS;KAAE,IAAI,OAAO,WAAW;KAAG;KAAS,SAAS,SAAS,yBAAyB,cAAc,SAAS,gBAAgB,KAAA;IAAU;IAC/I,YAAW,YAAW,CAAC,GAAG,SAAS,MAAM,CAAC;GAC5C;GACA,MAAM,cAAoB;IACxB,MAAM,UAAU,QAAQ,GAAG,EAAE,CAAC,EAAE;IAChC,YAAW,YAAW,QAAQ,MAAM,GAAG,EAAE,CAAC;IAC1C,qBAAqB;KAAE,SAAS,MAAM;IAAE,CAAC;GAC3C;GACA,MAAM,oBAA0B;IAC9B,aAAa,KAAA,CAAS;IACtB,qBAAqB;KAAE,cAAc,SAAS,MAAM;IAAE,CAAC;GACzD;GACA,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,iBAAiB,UAAlB;IAA2B,OAAO;KAAE;KAAK;KAAS;KAAS;KAChE,SAAQ,WAAU;MAAE,KAAK,WAAW,KAAA,IAAY,CAAC,IAAI,EAAE,OAAO,CAAC;KAAE;KAAG,OAAM,WAAU;MAAE,KAAK,EAAE,OAAO,CAAC;KAAE;KACvG,UAAS,eAAc;MAAE,KAAK,EAAE,WAAW,CAAC;KAAE;KAAG,cAAa,UAAS;MACrE,IAAI,SAAS,yBAAyB,aAAa,cAAc,UAAU,SAAS;MACpF,aAAa,KAAK;KACpB;IAAE;IALG,UAAA;KAML,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MAAK,WAAWE,6BAAO;MAAe,eAAa,QAAQ,SAAS,KAAK,cAAc,KAAA,KAAa,KAAA;MAClG,MAAK,YAAW;OAAE,IAAI,YAAY,MAAM,QAAQ,QAAQ,QAAQ,SAAS,KAAK,cAAc,KAAA;MAAU;MAAI;KAAc,CAAA;KACzH,QAAQ,KAAK,EAAE,IAAI,SAAS,UAAU,UAAU;MAC/C,MAAM,UAAU,UAAU,QAAQ,SAAS,KAAK,cAAc,KAAA;MAC9D,MAAM,QAAQ,OAAO,eAAe,KAAA,IAAY,kBAAkB;MAClE,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;OAAkB,WAAWA,6BAAO;OAAiB,MAAK;OAAS,cAAY,CAAC;OAAS,cAAY,EAAE,KAAK;OACnH,eAAa,WAAW,KAAA;OAAW,MAAK,YAAW;QAAE,IAAI,YAAY,MAAM,QAAQ,QAAQ;OAAQ;OACnG,YAAW,UAAS;QAClB,IAAI,MAAM,QAAQ,UAAU;SAAE,MAAM,gBAAgB;SAAG,MAAM;QAAE;QAC/D,kBAAkB,KAAK;OACzB;OALO,UAAA,CAMP,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,WAAWA,6BAAO;QAAvB,UAAA,CAAqC,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,EAAE,KAAK,EAAM,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,MAAK;SAAS,WAAA;SAAU,SAAS;SAAQ,UAAA,EAAE,iBAAiB;QAAU,CAAA,CAAM;OAC3I,CAAA,GAAA,OAAO,eAAe,KAAA,IAAY,iBAAA,GAAA,kBAAA,IAAA,CAAC,iBAAD;QAAiB,QAAQ,OAAO;QAAQ,QAAQ,OAAO;QAAiB;QACpG;QAAa;QAAc;QAAS;QAAU;QAAO,eAAe;SAAE,YAAW,UAAS,QAAQ,CAAC;QAAE;OAAI,CAAA,IAC5G,iBAAA,GAAA,kBAAA,IAAA,CAAC,qBAAD;QAAqB,QAAQ,OAAO;QAAqB;QAAc;QAAa;QAAc;QAAS;QAC3G,eAAe;SAAE,YAAW,UAAS,QAAQ,CAAC;QAAE;OAAI,CAAA,CACjD;MAXc,GAAA,EAWd;KACT,CAAC;KACA,cAAc,KAAA,IAAY,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;MAAS,WAAWA,6BAAO;MAAiB,MAAK;MAAS,cAAW;MAAO,cAAY,EAAE,cAAc;MACxI,YAAW,UAAS;OAClB,IAAI,MAAM,QAAQ,UAAU;QAAE,MAAM,gBAAgB;QAAG,YAAY;OAAE;OACrE,kBAAkB,KAAK;MACzB;MAJgC,UAAA,CAKhC,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAK,WAAWA,6BAAO;OAAvB,UAAA,CAAqC,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,EAAE,cAAc,EAAM,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,WAAA;QAAU,SAAS;QAAc,UAAA,EAAE,cAAc;OAAU,CAAA,CAAM;MACxJ,CAAA,GAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,iBAAD;OAAiB,OAAO;OAAgB;OAAQ;MAAI,CAAA,CAC7C;;IACgB;;EAC7B;EAEA,MAAM,gBAAkC;GACtC,OAAO;GAAI,UAAU;GAAI,YAAY;GAAI,WAAW;GAAI,eAAe;GAAI,MAAM;GAAc,QAAQ;EACzG;EACA,MAAM,cAAc;GAAC;GAAS;GAAY;GAAc;GAAa;EAAe;EAEpF,SAAgB,gBAAgB,EAAE,QAAQ,QAAQ,SAAS,KAAK,QAAQ,MAAM,OAAO,SAAS,OAAO,aAAa,KAYjG;GACf,MAAM,CAAC,aAAA,GAAYF,MAAAA,SAAAA,OAAe,UAAU,OAAO,UAAU,OAAO,WAAW,CAAC;GAChF,MAAM,QAAQ,iBAAiB;GAC/B,MAAM,YAAY,aAAa;GAC/B,MAAM,CAAC,MAAM,YAAA,GAAWA,MAAAA,SAAAA,CAAwB;GAChD,MAAM,CAAC,SAAS,eAAA,GAAcA,MAAAA,SAAAA,CAAS,EAAE;GACzC,MAAM,CAAC,SAAS,eAAA,GAAcA,MAAAA,SAAAA,CAA2B,OAAO,WAAW,aAAa;GACxF,MAAM,CAAC,SAAS,eAAA,GAAcA,MAAAA,SAAAA,CAA4C,OAAO,YAAY,WAAW,KAAA,IAAY,CAAC,IAAI,CAAC,MAAM,EAAE;GAClI,MAAM,CAAC,kBAAkB,wBAAA,GAAuBA,MAAAA,SAAAA,CAAS,OAAO,oBAAoB,CAAC;GACrF,MAAM,CAAC,iBAAiB,uBAAA,GAAsBA,MAAAA,SAAAA,CAAiB;GAC/D,MAAM,CAAC,eAAe,qBAAA,GAAoBA,MAAAA,SAAAA,CAAS,WAAW,EAAE;GAChE,MAAM,CAAC,WAAW,iBAAA,GAAgBA,MAAAA,SAAAA,CAAmC,CAAC,CAAC;GACvE,MAAM,CAAC,YAAY,kBAAA,GAAiBA,MAAAA,SAAAA,CAAS,KAAK;GAClD,MAAM,CAAC,SAAS,eAAA,GAAcA,MAAAA,SAAAA,CAAS,WAAW,KAAA,CAAS;GAC3D,MAAM,CAAC,SAAS,eAAA,GAAcA,MAAAA,SAAAA,CAAS,WAAW,KAAA,CAAS;GAC3D,MAAM,CAAC,MAAM,YAAA,GAAWA,MAAAA,SAAAA,CAAS,KAAK;GACtC,MAAM,CAAC,QAAQ,cAAA,GAAaA,MAAAA,SAAAA,CAAS,KAAK;GAC1C,MAAM,CAAC,QAAQ,cAAA,GAAaA,MAAAA,SAAAA,CAAS,CAAC;GACtC,MAAM,CAAC,SAAS,eAAA,GAAcA,MAAAA,SAAAA,CAAiB;GAC/C,MAAM,WAAA,GAAUC,MAAAA,OAAAA,CAAkE;GAClF,MAAM,SAAA,GAAQA,MAAAA,OAAAA,CAAwB;GACtC,CAAA,GAAA,MAAA,UAAA,aAAsB;IAAE,MAAM,SAAS,MAAM;GAAE,GAAG,CAAC,CAAC;GACpD,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,MAAM,aAAa,IAAI,gBAAgB;IACvC,cAAc,KAAK;IACnB,OAAY,KAAK,WAAW,MAAM,CAAC,CAAC,MAAK,UAAS;KAChD,IAAI,CAAC,WAAW,OAAO,SAAS,aAAa,KAAK;IACpD,SAAS;KAAE,IAAI,CAAC,WAAW,OAAO,SAAS,cAAc,IAAI;IAAE,CAAC;IAChE,IAAI,WAAW,KAAA,GAAW;KACxB,WAAW,IAAI;KACf,UAAU,KAAK;KACf,IAAS,KAAK,EAAE,OAAO,GAAG,WAAW,MAAM,CAAC,CAAC,MAAK,UAAS;MACzD,IAAI,WAAW,OAAO,SAAS;MAC/B,IAAI,UAAU,MAAM,MAAM,IAAI,MAAM,kBAAkB;MACtD,QAAQ,KAAK;MACb,WAAW,MAAM,UAAU,GAAG,EAAE,CAAC,CAAE,UAAU;KAC/C,CAAC,CAAC,CAAC,YAAY;MAAE,IAAI,CAAC,WAAW,OAAO,SAAS,UAAU,IAAI;KAAE,CAAC,CAAC,CAChE,cAAc;MAAE,IAAI,CAAC,WAAW,OAAO,SAAS,WAAW,KAAK;KAAE,CAAC;IACxE;IACA,aAAa;KAAE,WAAW,MAAM;IAAE;GACpC,GAAG;IAAC;IAAK;IAAQ;IAAQ;GAAM,CAAC;GAChC,MAAM,WAAW,MAAM,UAAU,MAAK,SAAQ,KAAK,eAAe,OAAO,KAAK,MAAM,UAAU,GAAG,EAAE;GACnG,MAAM,SAAS,OAAO,cAA8E;IAClG,IAAI,MAAM,YAAY,KAAA,GAAW;IACjC,MAAM,aAAa,IAAI,gBAAgB;IACvC,MAAM,UAAU;IAChB,QAAQ,IAAI;IACZ,UAAU,KAAK;IACf,IAAI;KACF,MAAM,QAAQ,MAAM,UAAU,WAAW,MAAM;KAC/C,IAAI,WAAW,OAAO,SAAS;KAC/B,QAAQ,KAAK;KACb,WAAW,MAAM,UAAU,GAAG,EAAE,CAAC,CAAE,UAAU;KAC7C,WAAW,KAAK;KAChB,WAAW,KAAA,CAAS;KACpB,QAAQ,UAAU,KAAA;KAClB,QAAQ;IACV,QAAQ;KAAE,IAAI,CAAC,WAAW,OAAO,SAAS,UAAU,IAAI;IAAE,UAAU;KAClE,IAAI,CAAC,WAAW,OAAO,SAAS;MAAE,QAAQ,KAAK;MAAG,MAAM,UAAU,KAAA;KAAU;IAC9E;GACF;GACA,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAWC,6BAAO;IAAvB,UAAA;KACJ,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,MAAK;MAAU,UAAA,EAAE,eAAe;KAAK,CAAA,IAAI;KACtD,UAAU,aAAa,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,MAAK;MAAV,UAAA,CAAmB,EAAE,iBAAiB,GAC1D,CAAC,WAAW,SAAS,KAAA,KAAc,aAAa,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OAAQ,MAAK;OAAS,eAAe;QAAE,WAAU,UAAS,QAAQ,CAAC;OAAE;OAAI,UAAA,EAAE,aAAa;MAAU,CAAA,IAAI,IAAU;KAAI,CAAA,IAAA;KACvK,UAAU,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA,CAChB,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD,EAAA,UAAA,CAAQ,EAAE,iBAAiB,GAAE,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;MAAQ,OAAO;MAAe,UAAU;MAAM,WAAU,UAAS;OAAE,iBAAiB,MAAM,OAAO,KAAK;MAAE;MAAxG,UAAA,CAC3B,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OAAQ,OAAM;OAAI,UAAA,EAAE,mBAAmB;MAAU,CAAA,GAChD,UAAU,KAAI,UAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OAA4B,OAAO,MAAM;OAAU,UAAA,MAAM;MAAc,GAA1D,MAAM,OAAoD,CAAC,CAC1F;KAAQ,CAAA,CAAA,EAAA,CAAA,GACf,UAAU,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;MAAM,WAAWA,6BAAO;MAAe,WAAU,UAAS;OACnE,MAAM,eAAe;OACrB,MAAM,OAAO;QAAE,QAAQ;QAAU,SAAS;SAAE,GAAG;SAAS,OAAO,QAAQ,MAAM,KAAK;QAAE;QAAG;QACrF,GAAI,kBAAkB,KAAK,CAAC,IAAI,EAAE,SAAS,cAAc;OAAG;OAC9D,MAAM,UAAU,KAAK,UAAU,IAAI;OACnC,IAAI,QAAQ,SAAS,YAAY,SAAS,QAAQ,UAAU;QAAE;QAAS,YAAY,OAAO,WAAW;OAAE;OACvG,MAAM,UAAyB;QAAE,GAAG;QAAM,YAAY,QAAQ,QAAQ;OAAW;OACjF,QAAY,WAAU,IAAI,KAAK,SAAS,MAAM,CAAC;MACjD;MARW,UAAA;OASR,UAAU,KAAA,KAAa,QAAQ,WAAW,IAAI,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;QAAG,MAAK;QAAU,UAAA,EAAE,gBAAgB;OAAK,CAAA,IAAI;OAC3F,mBAAmB,IAAI,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;QAAG,MAAK;QAAS,UAAA,EAAE,mBAAmB,EAAE,OAAO,iBAAiB,CAAC;OAAK,CAAA,IAAI;OACjG,YAAY,KAAI,UAAS,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD,EAAA,UAAA,CAAoB,EAAE,mBAAmB,OAAO,GACvE,UAAU,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;QAAO,OAAO,QAAQ;QAAQ,WAAW;QAAK,UAAU;QAC3E,WAAU,UAAS;SAAE,YAAW,WAAU;UAAE,GAAG;WAAQ,QAAQ,MAAM,OAAO;SAAM,EAAE;QAAE;OAAI,CAAA,IACxF,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;QAAU,OAAO,QAAQ;QAAQ,WAAW;QAAQ,MAAM;QAAG,UAAU;QACvE,WAAU,UAAS;SAAE,YAAW,WAAU;UAAE,GAAG;WAAQ,QAAQ,MAAM,OAAO;SAAM,EAAE;QAAE;OAAI,CAAA,CAAS,EAAA,GAJnE,KAImE,CAAC;OAC1G,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD,EAAA,UAAA,CAAQ,EAAE,gBAAgB,GAAE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,OAAO,QAAQ;QAAM,UAAU;QACjE,WAAU,UAAS;SAAE,YAAW,WAAU;UAAE,GAAG;UAAO,MAAM,MAAM,OAAO;SAAkC,EAAE;QAAE;QAC7G,UAAA;SAAC;SAAc;SAAU;SAAc;QAAU,CAAC,CAAW,KAAI,SAAQ,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAmB,OAAO;SAAO,UAAA,EAAE,kBAAkB,MAAM;QAAU,GAAxD,IAAwD,CAAC;OAC3I,CAAA,CAAQ,EAAA,CAAA;OAChB,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD,EAAA,UAAA,CAAQ,EAAE,kBAAkB,GAAE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,OAAO,QAAQ;QAAQ,UAAU;QACrE,WAAU,UAAS;SAAE,YAAW,WAAU;UAAE,GAAG;UAAO,QAAQ,MAAM,OAAO;SAAoC,EAAE;QAAE;QACjH,UAAA,CAAC,SAAS,WAAW,CAAC,CAAW,KAAI,WAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAqB,OAAO;SAAS,UAAA,EAAE,oBAAoB,QAAQ;QAAU,GAAhE,MAAgE,CAAC;OACzH,CAAA,CAAQ,EAAA,CAAA;OAChB,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,sBAAsB,EAAK,CAAA;OAChC,aAAa,SAAS,OAAO,MAAM,KAAI,SAAQ,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD,EAAA,UAAA;QAC9C,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD,EAAA,UAAA,CAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;SAAO,MAAK;SAAW,UAAU;SAAM,SAAS,QAAQ,MAAK,YAAW,QAAQ,SAAS,gBAAgB,QAAQ,kBAAkB,YAAY,iBACjJ,KAAK,YAAY,QAAQ,YAAY,KAAK,UAAW,QAAQ,MAAM;SAAG,WAAU,UAAS;UAC1F,WAAW,yBAAyB,aAAa,SAAS,KAAK,UAAU,MAAM,OAAO,OAAO,CAAC;UAC9F,oBAAoB,CAAC;SACvB;QAAI,CAAA,GAAE,EAAE,oBAAoB,EAAE,MAAM,KAAK,KAAK,CAAC,CAAS,EAAA,CAAA;QAC1D,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,MAAK;SAAS,eAAe;UAAE,mBAAmB,KAAK,QAAQ;SAAE;SAAI,UAAA,EAAE,gBAAgB;QAAU,CAAA;QACxG,oBAAoB,KAAK,WAAW,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,gBAAD;SAAoC,WAAW,YAAY,SAAS;SAC9G,QAAQ;UAAE,UAAU,KAAK;UAAU,QAAQ,KAAK;UAAS,OAAO,CAAC,IAAI;SAAE;SAAS;SAAS;QAAI,GAD9B,KAAK,QACyB;OAC5F,EAAA,GATqD,KAAK,QAS1D,CAAC;OACL,QAAQ,WAAW,IAAI,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,qBAAqB,EAAK,CAAA,IAAI,QAAQ,KAAK,SAAS,UAAU,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD,EAAA,UAAA,CAC1F,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,QAAQ,SAAS,eAAe,GAAG,QAAQ,UAAU,KAAK,EAAE,yBAAyB;QAAE,OAAO,QAAQ;QAAU,KAAK,QAAQ;OAAO,CAAC,MACxI,QAAQ,SAAS,aAAa,GAAG,QAAQ,OAAO,KAAK,QAAQ,WAAW,KAAK,QAAQ,cAAc,MACjG,EAAE,yBAAyB;QAAE,OAAO,QAAQ;QAAU,KAAK,QAAQ;OAAO,CAAC,EAAQ,CAAA,GACzF,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,UAAU;QAAM,eAAe;SAAE,YAAW,UAAS,MAAM,QAAQ,GAAG,MAAM,MAAM,KAAK,CAAC;QAAE;QAAI,UAAA,EAAE,wBAAwB;OAAU,CAAA,CACrJ,EAAA,GALiG,KAKjG,CAAC;OACN,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,WAAWA,6BAAO;QAAvB,UAAA,CAAsC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,MAAK;SAAS,UAAU,QAAQ,QAAQ,MAAM,KAAK,MAAM;SAAK,UAAA,EAAE,gBAAgB;QAAU,CAAA,GACtI,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,MAAK;SAAS,UAAU;SAAM,eAAe;UAAE,IAAI,SAAS,KAAA,GAAW,MAAM;eAAQ;WAAE,WAAW,KAAK;WAAG,UAAU,KAAK;UAAE;SAAE;SAAI,UAAA,EAAE,kBAAkB;QAAU,CAAA,CAAM;;MAC3K;KAAI,CAAA,IAAA,aAAa,KAAA,IAAY,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;MACxC,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD,EAAA,UAAA,CAAQ,EAAE,mBAAmB,GAAE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OAAQ,OAAO;OAAS,WAAU,UAAS;QAAE,WAAW,MAAM,OAAO,KAAK;QAAG,WAAW,KAAA,CAAS;OAAE;OAC/H,UAAA,KAAM,UAAU,KAAI,SAAQ,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAA8B,OAAO,KAAK;QAAa,UAAA,EAAE,2BAA2B,EAAE,QAAQ,KAAK,OAAO,CAAC;OAAU,GAAxG,KAAK,UAAmG,CAAC;MAC7I,CAAA,CAAQ,EAAA,CAAA;MAChB,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,SAAS,QAAQ,MAAU,CAAA;MAChC,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD,EAAA,UAAA;OAAI,EAAE,kBAAkB,SAAS,QAAQ,MAAM;OAAE;OAAI,EAAE,oBAAoB,SAAS,QAAQ,QAAQ;OAAE;OAAI,EAAE,qBAAqB,EAAE,MAAM,IAAI,KAAK,SAAS,OAAO,CAAC,CAAC,eAAe,EAAE,CAAC;MAAK,EAAA,CAAA;MAC1L,YAAY,QAAO,UAAS,UAAU,OAAO,CAAC,CAAC,KAAI,UAAS,SAAS,QAAQ,WAAW,KAAK,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD,EAAA,UAAA,CACnG,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,EAAE,mBAAmB,OAAO,EAAM,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;OAAG,WAAWA,6BAAO;OAAc,UAAA,SAAS,QAAQ;MAAU,CAAA,CAAU,EAAA,GADC,KACD,CAAC;MACnH,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAK,WAAWA,6BAAO;OAAvB,UAAA;QAAsC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,MAAK;SAAS,UAAU;SAAM,eAAe;UACzF,WAAW,SAAS,OAAO;UAC3B,WAAW,yBAAyB,UAAU,UAAU,WAAW,CAAC;UACpE,UAAU,KAAK;UACf,WAAW,IAAI;SACjB;SAAI,UAAA,EAAE,gBAAgB;QAAU,CAAA;QAC7B,UAAU,KAAA,IAAY,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,MAAK;SAAS,eAAe;UACjE,MAAM,IAAI;WAAE,MAAM;WAAQ,QAAQ;WAAU,YAAY,SAAS;UAAW,GAC1E,GAAG,SAAS,QAAQ,MAAM,KAAK,EAAE,2BAA2B,EAAE,QAAQ,SAAS,OAAO,CAAC,GAAG;SAC9F;SAAI,UAAA,EAAE,eAAe;QAAU,CAAA;QAC9B,cAAc,KAAA,IAAY,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,MAAK;SAAS,eAAe;UACrE,UAAU,YAAY,CAAC;WAAE,QAAQ;WAAU,OAAO,SAAS,QAAQ;UAAM,CAAC,CAAC;SAC7E;SAAI,UAAA,EAAE,cAAc;QAAU,CAAA;QAC7B,kBAAkB,KAAK,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,MAAK;SAAS,UAAU;SAAM,eAAe;UAClF,QAAY,WAAU,IAAI,WAAW;WAAE,QAAQ;WAAU,SAAS;WAAe,UAAU,CAAC,KAAM,SAAS,SAAS,aAAa;UAAE,GAAG,MAAM,CAAC;SAC/I;SAAI,UAAA,EAAE,KAAM,SAAS,SAAS,aAAa,IAAI,qBAAqB,kBAAkB;QAAU,CAAA;OAAO;;MACzG,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,oBAAoB,EAAK,CAAA;MAC/B,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,EAAE,kBAAkB,EAAM,CAAA;MAC9B,SAAS,QAAQ,WAAW,IAAI,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,qBAAqB,EAAK,CAAA,IAAI,SAAS,QAAQ,KAAK,MAAM,UAAU,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;OAAqB,WAAWA,6BAAO;OAAvC,UAAA;QACzG,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,KAAK,MAAc,CAAA;QAAC,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;SAAK,WAAWA,6BAAO;SAAvB,UAAA;UAAyC,KAAK;UAAU;UAAI,KAAK;SAAS;;QACvG,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD,EAAA,UAAM,EAAE,yBAAyB;SAAE,OAAO,KAAK,OAAO;SAAU,KAAK,KAAK,OAAO;QAAO,CAAC,EAAO,CAAA;QAChG,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD,EAAA,UAAA,CAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD,EAAA,UAAU,EAAE,mBAAmB,EAAW,CAAA,GAAE,KAAK,OAAO,MAAM,KAAI,SAAQ,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD,EAAA,UAAA,CACjF,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD,EAAA,UAAA;SAAK,EAAE,gBAAgB,EAAE,MAAM,KAAK,KAAK,CAAC;SAAE;SAAI,IAAI,KAAK,KAAK,SAAS,CAAC,CAAC,eAAe;QAAM,EAAA,CAAA,GAC7F,KAAK,SAAS,KAAI,YAAW,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD;SAAqB,WAAWA,6BAAO;SAAvC,UAAA;UAAoD,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,EAAE,QAAQ,SAAS,SAAS,iBAAiB,mBAAmB,EAAU,CAAA;UAAE;UAAM,QAAQ;SAAQ;QAAvJ,GAAA,QAAQ,GAA+I,CAAC,CACvL,EAAA,GAHwF,KAAK,QAG7F,CAAC,CAAW,EAAA,CAAA;QACrB,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,MAAK;SAAS,eAAe;UAAE,WAAW,KAAK;SAAE;SAAI,UAAA,EAAE,sBAAsB;QAAU,CAAA;QAC9F,YAAY,QAAQ,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,gBAAD;SAAwD,WAAW,KAAK;SAAW,QAAQ,KAAK;SAAc;SAAS;QAAI,GAAtG,GAAG,SAAS,WAAW,GAAG,OAA4E;OAChJ;MATgH,GAAA,KAShH,CAAC;KACV,EAAA,CAAA,CACF,EAAA,CAAA;KACD,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,MAAK;MAAU,UAAA,EAAE,cAAc;KAAK,CAAA,IAAI;IAChD;;EACP;;;;EChQA,MAAa,YAAY;;;;EAczB,SAAgB,kBAA4B;GAC1C,OAAO;IAAE,OAAO;IAAG,MAAM;IAAG,MAAM;GAAE;EACtC;;;;;;EAOA,SAAgB,WAAW,OAAuB;GAChD,OAAO,KAAK,IAAA,GAAe,KAAK,IAAI,WAAW,KAAK,CAAC;EACvD;;;;;;;;;;EAWA,SAAgB,OACd,UACA,SACA,SACA,QACU;GACV,MAAM,QAAQ,WAAW,SAAS,QAAQ,MAAM;GAChD,MAAM,YAAY,UAAU,SAAS,QAAQ,SAAS;GACtD,MAAM,YAAY,UAAU,SAAS,QAAQ,SAAS;GACtD,OAAO;IACL;IACA,MAAM,UAAU,WAAW;IAC3B,MAAM,UAAU,WAAW;GAC7B;EACF;;;;;;;;EASA,SAAgB,MAAM,UAAoB,IAAY,IAAsB;GAC1E,OAAO;IAAE,OAAO,SAAS;IAAO,MAAM,SAAS,OAAO;IAAI,MAAM,SAAS,OAAO;GAAG;EACrF;;;;;;;;;EAgBA,SAAgB,eACd,UACA,UACA,MACU;GACV,OAAO;IACL,OAAO,SAAS;IAChB,MAAM,SAAS,QAAQ,KAAK,QAAQ,SAAS,SAAS;IACtD,MAAM,SAAS,QAAQ,KAAK,SAAS,SAAS,UAAU;GAC1D;EACF;;;;;;;;;;;EAYA,SAAgB,YACd,SACA,WACA,YACA,SACU;GACV,MAAM,YAAY,KAAK,IAAI,GAAG,YAAY,IAAI,OAAO;GACrD,MAAM,aAAa,KAAK,IAAI,GAAG,aAAa,IAAI,OAAO;GACvD,MAAM,QAAQ,WAAW,KAAK,IAC5B,YAAY,KAAK,IAAI,GAAG,QAAQ,KAAK,GACrC,aAAa,KAAK,IAAI,GAAG,QAAQ,MAAM,GACvC,CACF,CAAC;GACD,OAAO;IACL;IACA,OAAO,YAAY,QAAQ,QAAQ,SAAS,IAAI,QAAQ,IAAI;IAC5D,OAAO,aAAa,QAAQ,SAAS,SAAS,IAAI,QAAQ,IAAI;GAChE;EACF;;;;;;;;;EAiBA,SAAgB,kBACd,SACA,WACA,YACmB;GACnB,IAAI,QAAQ,SAAS,KAAK,QAAQ,UAAU,GAC1C,OAAO;IACL,OAAO;IACP,SAAS,YAAY,IAAI,QAAQ;IACjC,SAAS,aAAa,IAAI,QAAQ;GACpC;GAEF,MAAM,QAAQ,KAAK,IAAI,YAAY,QAAQ,OAAO,aAAa,QAAQ,QAAQ,CAAC;GAChF,OAAO;IACL;IACA,UAAU,YAAY,QAAQ,QAAQ,SAAS,IAAI,QAAQ,IAAI;IAC/D,UAAU,aAAa,QAAQ,SAAS,SAAS,IAAI,QAAQ,IAAI;GACnE;EACF;;;EC9IA,SAAgB,mBAAmB,QAAgB,OAAe,SAA0B;GAC1F,OAAO,KAAK,UAAU;IAAC;IAAQ;IAAO,WAAW;GAAI,CAAC;EACxD;EAEA,MAAMC,YAAU,UAAqD,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;EACxI,MAAMC,YAAU,OAAgB,MAAM,QAA0B,OAAO,UAAU,YAAY,MAAM,UAAU,OAAO,CAAC,MAAM,SAAS,IAAI;EACxI,MAAMC,YAAU,UAAoC,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK;EAEtG,SAAgB,oBAAoB,KAA0C;GAC5E,IAAI,QAAQ,KAAA,GAAW,OAAO,CAAC;GAC/B,IAAI;IACF,MAAM,QAAiB,KAAK,MAAM,WAAW,aAAa,QAAQ,8BAA8B,KAAK,KAAK,MAAM;IAChH,IAAI,CAACF,SAAO,KAAK,KAAK,MAAM,MAAM,GAAG,OAAO,CAAC;IAC7C,MAAM,WAAW,MAAM;IACvB,MAAM,aAAa,MAAM;IACzB,MAAM,QAAQA,SAAO,UAAU,IAAI,WAAW,QAAQ,KAAA;IACtD,MAAM,aAAaA,SAAO,KAAK,MAAM,MAAM,SAAS,SAC9C,MAAM,SAAS,eAAeC,SAAO,MAAM,WAAW,KAAO,MAAM,SAAS,eAAeA,SAAO,MAAM,GAAG;IACjH,MAAM,UAAUD,SAAO,MAAM,OAAO,IAAI,OAAO,YAAY,OAAO,QAAQ,MAAM,OAAO,CAAC,CACrF,QAAQ,CAAC,IAAI,SAASC,SAAO,EAAE,KAAK,OAAO,cAAc,GAAG,KAAM,OAAkB,CAAC,CAAC,IAA8B,KAAA;IACvH,MAAM,gBAAgBD,SAAO,MAAM,aAAa,IAAI,OAAO,YAAY,OAAO,QAAQ,MAAM,aAAa,CAAC,CACvG,QAAQ,CAAC,IAAI,SAASC,SAAO,EAAE,KAAKC,SAAO,GAAG,KAAK,OAAO,CAAC,CAAC,IAA8B,KAAA;IAC7F,MAAM,eAAeF,SAAO,MAAM,YAAY,IAAI,OAAO,YAAY,OAAO,QAAQ,MAAM,YAAY,CAAC,CACpG,QAAQ,CAAC,IAAI,WAAWC,SAAO,EAAE,KAAKD,SAAO,KAAK,KAAK,OAAO,cAAc,MAAM,QAAQ,KACtF,OAAO,cAAc,MAAM,MAAM,KAAM,MAAM,YAAuB,KAAM,MAAM,SAAqB,MAAM,QAAmB,CAAC,CACnI,KAAK,CAAC,IAAI,WAAW,CAAC,IAAI;KAAE,UAAW,MAAiC;KAAU,QAAS,MAAiC;IAAO,CAAC,CAAC,CAAC,IAAI,KAAA;IAC7I,OAAO;KACL,GAAIA,SAAO,QAAQ,KAAKE,SAAO,SAAS,KAAK,KAAK,SAAS,SAAA,MAAsB,SAAS,SAAA,KACrFA,SAAO,SAAS,IAAI,KAAKA,SAAO,SAAS,IAAI,IAAI,EAAY,SAAgC,IAAI,CAAC;KACvG,GAAI,MAAM,aAAa,QAAQD,SAAO,MAAM,QAAQ,IAAI,EAAE,UAAU,MAAM,SAAS,IAAI,CAAC;KACxF,GAAIA,SAAO,MAAM,OAAO,GAAG,IAAI,EAAE,OAAO,MAAM,MAAM,IAAI,CAAC;KACzD,GAAI,MAAM,QAAQ,YAAY,MAAM,QAAQ,YAAY,EAAE,KAAK,MAAM,IAAI,IAAI,CAAC;KAC9E,GAAI,YAAY,KAAA,IAAY,CAAC,IAAI,EAAE,QAAQ;KAC3C,GAAI,iBAAiB,KAAA,IAAY,CAAC,IAAI,EAAE,aAAa;KACrD,GAAI,kBAAkB,KAAA,IAAY,CAAC,IAAI,EAAE,cAAc;KACvD,GAAIA,SAAO,MAAM,OAAO,IAAI,EAAE,SAAS,MAAM,QAAQ,IAAI,CAAC;KAC1D,GAAI,MAAM,eAAe,gBAAgB,MAAM,eAAe,cAAc,EAAE,YAAY,MAAM,WAAW,IAAI,CAAC;KAChH,GAAID,SAAO,UAAU,KAAKC,SAAO,WAAW,OAAO,GAAG,KAAK,cAAc,OAAO,WAAW,oBAAoB,YAC3G,EAAE,YAAY;MAAE,OAAO,WAAW;MAAc;MAA2C,iBAAiB,WAAW;KAAgB,EAAE,IAAI,CAAC;KAClJ,GAAID,SAAO,MAAM,SAAS,KAAKC,SAAO,MAAM,UAAU,OAAO,GAAG,KAAK,OAAO,MAAM,UAAU,YAAY,YACpG,EAAE,WAAW;MAAE,OAAO,MAAM,UAAU;MAAO,SAAS,MAAM,UAAU;KAAQ,EAAE,IAAI,CAAC;IAC3F;GACF,QAAQ;IAAE,OAAO,CAAC;GAAE;EACtB;EAEA,SAAgB,oBAAoB,KAAyB,OAA8B;GACzF,IAAI,QAAQ,KAAA,GAAW;GACvB,IAAI;IAAE,WAAW,aAAa,QAAQ,8BAA8B,OAAO,KAAK,UAAU;KAAE,GAAG,oBAAoB,GAAG;KAAG,GAAG;KAAO,GAAG;IAAE,CAAC,CAAC;GAAE,QAAQ,CAEpJ;EACF;;;;EC1DA,SAAgB,eAAe,EAAE,WAAW,WAAW,cAAc,QAAQ,gBAAgB,YAAY,eAAe,MAAM,KAW7G;GACf,MAAM,YAAY,aAAa;GAC/B,MAAM,QAAQ,iBAAiB;GAC/B,MAAM,CAAC,QAAQ,cAAA,GAAaE,MAAAA,SAAAA,OAAiD;IAC3E,MAAM,UAAU,UAAU;IAC1B,OAAO,YAAY,KAAA,IAAY,KAAA,IAAY;KACzC,MAAM;KAAW;KAAW,OAAO,QAAQ;KAAO,YAAY;KAAO,UAAU;IACjF;GACF,CAAC;GACD,MAAM,WAAA,GAAUC,MAAAA,OAAAA,CAAoB,IAAI;GACxC,MAAM,iBAAA,GAAgBA,MAAAA,OAAAA,CAAO,cAAc,KAAA,KAAa,WAAW,KAAA,IAAY,oBAAoB,UAAU,CAAC,CAAC,gBAAgB,aAAa,KAAA,CAAS;GACrJ,MAAM,eAAA,GAAcA,MAAAA,OAAAA,CAAO,aAAa;GACxC,YAAY,UAAU;GACtB,MAAM,CAAC,SAAS,eAAA,GAAcD,MAAAA,SAAAA,OAAsC;IAClE,IAAI,WAAW,KAAA,GAAW,OAAO;KAAE;KAAW;IAAO;IACrD,IAAI,cAAc,KAAA,GAAW,OAAO;KAAE;KAAW;IAAU;IAC3D,MAAM,WAAW,oBAAoB,UAAU;IAC/C,MAAM,QAAQ,SAAS,eAAe;IACtC,MAAM,SAAS,SAAS,UAAU;IAClC,IAAI,UAAU,KAAA,KAAa,MAAM,aAAa,QAAQ,OAAO;KAAE;KAAW;IAAM;IAChF,IAAI,WAAW,KAAA,GAAW,OAAO;KAAE;KAAW,WAAW;IAAO;IAChE,OAAO;KAAE;KAAW,GAAI,mBAAmB,KAAA,IAAY,CAAC,IAAI,EAAE,QAAQ,eAAe;IAAG;GAC1F,CAAC;GACD,MAAM,CAAC,SAAS,eAAA,GAAcA,MAAAA,SAAAA,CAAS,IAAI;GAC3C,MAAM,CAAC,WAAW,iBAAA,GAAgBA,MAAAA,SAAAA,CAAkC;GACpE,MAAM,CAAC,QAAQ,cAAA,GAAaA,MAAAA,SAAAA,CAAS,KAAK;GAC1C,MAAM,CAAC,UAAU,gBAAA,GAAeA,MAAAA,SAAAA,CAAS,KAAK;GAC9C,MAAM,CAAC,iBAAiB,uBAAA,GAAsBA,MAAAA,SAAAA,CAAS,KAAK;GAC5D,MAAM,cAAA,GAAaC,MAAAA,OAAAA,CAAwB;GAC3C,MAAM,eAAA,GAAcA,MAAAA,OAAAA,iBAAO,IAAI,IAAgC,CAAC;GAChE,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,MAAM,aAAa,IAAI,gBAAgB;IACvC,WAAW,UAAU;IACrB,WAAW,IAAI;IACf,UAAU,KAAK;IACf,YAAY,KAAK;IACjB,KAAU,SAAS,WAAW,MAAM,CAAC,CAAC,MAAK,UAAS;KAClD,IAAI,WAAW,OAAO,SAAS;KAC/B,IAAI,MAAM,SAAS,YAAY;MAC7B,KAAK,MAAM,QAAQ,MAAM,OAAO,YAAY,QAAQ,IAAI,KAAK,UAAU,IAAI;MAC3E,MAAM,SAAS,MAAM,MAAM,EAAE,EAAE;MAC/B,MAAM,WAAW,oBAAoB,UAAU;MAC/C,MAAM,UAAU,EAAE,GAAG,SAAS,QAAQ;MACtC,MAAM,eAAe,EAAE,GAAG,SAAS,aAAa;MAChD,MAAM,SAAS,MAAM,MAAM,GAAG,EAAE,CAAC,EAAE;MACnC,IAAI,WAAW,KAAA,GAAW,OAAO,QAAQ;WACpC,QAAQ,aAAa;MAC1B,KAAK,QAAQ,WAAW,KAAA,KAAa,QAAQ,UAAU,KAAA,MAAc,WAAW,KAAA,KAAa,UAAU,MACrG,aAAa,aAAa;OAAE,UAAU;OAAQ;MAAO;WAChD,OAAO,aAAa;MAC3B,oBAAoB,YAAY;OAAE;OAAS;MAAa,CAAC;KAC3D,OAAO,IAAI,MAAM,SAAS,kBAAkB,QAAQ,cAAc,KAAA,KAAa,QAAQ,UAAU,KAAA,MAAc,eAAe,KAAA,GAAW;MACvI,MAAM,UAAU,EAAE,GAAG,oBAAoB,UAAU,CAAC,CAAC,QAAQ;MAC7D,MAAM,eAAe,EAAE,GAAG,oBAAoB,UAAU,CAAC,CAAC,aAAa;MACvE,MAAM,gBAAgB,EAAE,GAAG,oBAAoB,UAAU,CAAC,CAAC,cAAc;MACzE,OAAO,QAAQ;MACf,OAAO,aAAa;MACpB,OAAO,cAAc;MACrB,oBAAoB,YAAY;OAAE;OAAS;OAAc;MAAc,CAAC;MACxE,YAAY,UAAU;KACxB;KACA,UAAU,KAAK;KACf,WAAW,KAAK;IAClB,CAAC,CAAC,CAAC,YAAY;KACb,IAAI,WAAW,OAAO,SAAS;KAC/B,UAAU,IAAI;KACd,WAAW,KAAK;IAClB,CAAC;IACD,aAAa;KAAE,WAAW,MAAM;IAAE;GACpC,GAAG,CAAC,SAAS,IAAI,CAAC;GAClB,CAAA,GAAA,MAAA,gBAAA,OAAsB;IACpB,IAAI,WAAW,QAAQ,SAAS,YAAY;IAC5C,MAAM,QAAQ,QAAQ,SAAS,QAAqB,uBAAuB;IAC3E,IAAI,SAAS,MAAM;IACnB,IAAI,cAAc,YAAY,KAAA,GAAW;KACvC,MAAM,YAAY,cAAc;KAChC,cAAc,UAAU,KAAA;IAC1B;IACA,MAAM,iBAAuB;KAC3B,oBAAoB,YAAY,EAAE,eAAe;MAAE,GAAG,oBAAoB,UAAU,CAAC,CAAC;OAAgB,YAAY,MAAM;KAAU,EAAE,CAAC;IACvI;IACA,MAAM,iBAAiB,UAAU,UAAU,EAAE,SAAS,KAAK,CAAC;IAC5D,aAAa;KAAE,MAAM,oBAAoB,UAAU,QAAQ;IAAE;GAC/D,GAAG;IAAC;IAAY;IAAW;IAAQ;GAAO,CAAC;GAE3C,MAAM,UAAU,SAAmC;IACjD,IAAI,KAAK,WAAW,QAAQ,WAAW,QAAQ,SAAS,YAAY;IACpE,mBAAmB,KAAK;IACxB,IAAI,cAAc,KAAA,KAAa,KAAK,YAAY,UAAU,YAAY,KAAK,UAAU,UAAU,QAAQ;KACrG,aAAa,KAAA,CAAS;KACtB;IACF;IACA,MAAM,WAAW,KAAK,IAAI,WAAW,YAAY,KAAK,UAAU,KAAK,QAAQ;IAC7E,MAAM,SAAS,KAAK,IAAI,WAAW,UAAU,KAAK,QAAQ,KAAK,MAAM;IACrE,MAAM,QAAQ,CAAC,GAAG,YAAY,QAAQ,OAAO,CAAC,CAAC,CAC5C,QAAO,SAAQ,KAAK,YAAY,YAAY,KAAK,YAAY,MAAM,CAAC,CACpE,MAAM,GAAG,MAAM,EAAE,WAAW,EAAE,QAAQ;IACzC,IAAI,MAAM,MAAM,MAAM,UAAU;KAC9B,MAAM,WAAW,MAAM,QAAQ;KAC/B,OAAO,KAAK,WAAW,QAAS,aAAa,KAAA,KAAa,KAAK,SAAS,SAAS,OAAO;IAC1F,CAAC,GAAG;KACF,mBAAmB,IAAI;KACvB;IACF;IACA,aAAa;KAAE;KAAU;KAAQ;IAAM,CAAC;GAC1C;GAEA,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;IAAS,KAAK;IAAS,cAAY,EAAE,eAAe;IAAG,WAAWC,6BAAO;IAAzE,UAAA;KACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MAAK,WAAWA,6BAAO;MAAkB,UAAA;KAAe,CAAA;KACxD,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,WAAWA,6BAAO;MAAc,UAAA,EAAE,eAAe;KAAK,CAAA;KACxD,UAAU,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,MAAK;MAAV,UAAA,CACT,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,iBAAiB,EAAK,CAAA,GAC5B,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OAAQ,MAAK;OAAS,eAAe;QACnC,WAAW,SAAS,MAAM;QAC1B,WAAW,KAAK;QAChB,YAAY,IAAI;OAClB;OAAI,UAAA,EAAE,gBAAgB;MAAU,CAAA,CAC7B;KAAI,CAAA,IAAA;KACR,WAAW,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,MAAK;MAAU,UAAA,EAAE,kBAAkB;KAAK,CAAA,IAAI;KAC1D,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,MAAK;MAAS,UAAA,EAAE,eAAe;KAAK,CAAA,IAAI;KACpD,CAAC,WAAW,CAAC,UAAU,QAAQ,SAAS,gBAAgB,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,MAAK;MAAS,UAAA,EAAE,qBAAqB;KAAK,CAAA,IAAI;KACzG,QAAQ,SAAS,YAChB,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,MAAK;MAAV,UAAA,CAAmB,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,EAAE,iBAAiB,EAAU,CAAA,GAAE,UAAU,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,qBAAqB,EAAK,CAAA,CAAO;KACjH,CAAA,IAAA;KACH,CAAC,WAAW,CAAC,UAAU,QAAQ,SAAS,cAAc,OAAO,MAAM,WAAW,IAAI,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,eAAe,EAAK,CAAA,IAAI;KAChH,CAAC,YAAY,UAAU,YAAY,QAAQ,SAAS,iBAAiB,QAAQ,SAAS,aACrF,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;MAAQ,MAAK;MAAS,eAAe;OAAE,WAAW,EAAE,GAAG,QAAQ,CAAC;MAAE;MAAI,UAAA,EAAE,eAAe;KAAU,CAAA,IAC/F;KACJ,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,6BAAO;MAAvB,UAAA;OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,UAAU;QAAS,eAAe;SAAE,WAAW,EAAE,GAAG,QAAQ,CAAC;QAAE;QAAI,UAAA,EAAE,iBAAiB;OAAU,CAAA;OACtH,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,UAAU,WAAW,CAAC,QAAQ;QAAY,eAAe;SAC7E,MAAM,YAAY,QAAQ,MAAM,EAAE,EAAE;SACpC,IAAI,cAAc,KAAA,GAAW,WAAW;UAAE;UAAW;SAAU,CAAC;QAClE;QAAI,UAAA,EAAE,iBAAiB;OAAU,CAAA;OACjC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,UAAU,WAAW,CAAC,QAAQ;QAAU,eAAe;SAC3E,MAAM,WAAW,QAAQ,MAAM,GAAG,EAAE,CAAC,EAAE;SACvC,IAAI,aAAa,KAAA,GAAW,WAAW;UAAE;UAAW;SAAS,CAAC;QAChE;QAAI,UAAA,EAAE,eAAe;OAAU,CAAA;MAC5B;;KACJ,cAAc,KAAA,IAAY,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,WAAWA,6BAAO;MAAc,UAAA,EAAE,oBAAoB;KAAK,CAAA,IACvF,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,6BAAO;MAAvB,UAAA;OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,EAAE,oBAAoB;QAAE,OAAO,UAAU,MAAM,EAAE,EAAE;QAAM,MAAM,UAAU,MAAM,GAAG,EAAE,CAAC,EAAE;OAAK,CAAC,EAAU,CAAA;OAChH,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;QAAK,WAAWA,6BAAO;QAAkB,UAAA,EAAE,oBAAoB;SAAE,OAAO,UAAU;SAAU,KAAK,UAAU;QAAO,CAAC;OAAO,CAAA;OAC1H,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,UAAU;QAAS,eAAe;SAAE,WAAW;UAAE;UAAW,QAAQ;SAAU,CAAC;QAAE;QAAI,UAAA,EAAE,gBAAgB;OAAU,CAAA;OACtI,cAAc,KAAA,IAAY,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,UAAU,WAAW,QAAQ,SAAS;QAAY,eAAe;SACvH,UAAU,OAAO;UAAE,MAAM;UAAc;UAAW,UAAU,UAAU;UAAU,QAAQ,UAAU;SAAO,CAAC;QAC5G;QAAI,UAAA,EAAE,kBAAkB;OAAU,CAAA;OACjC,cAAc,KAAA,IAAY,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,UAAU,WAAW,QAAQ,SAAS;QAAY,eAAe;SACvH,UAAU,QAAQ;UAAE,MAAM;UAAc;UAAW,UAAU,UAAU;UAAU,QAAQ,UAAU;SAAO,CAAC;QAC7G;QAAI,UAAA,EAAE,eAAe;OAAU,CAAA;OAC9B,UAAU,KAAA,IAAY,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA,CAAE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,UAAU,WAAW,QAAQ,SAAS,cAAc,UAAU,MAAM,WAAW;QAAG,eAAe;SACrJ,MAAM,IAAI;UAAE,MAAM;UAAQ;UAAW,UAAU,UAAU;UAAU,QAAQ,UAAU;SAAO,GAC1F,GAAG,UAAU,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,MAAM,EAAE,CAAE,KAAK,CAAC,GAAG;QAC7E;QAAI,UAAA,EAAE,eAAe;OAAU,CAAA,GAAE,UAAU,MAAM,WAAW,IAAI,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,kBAAkB,EAAK,CAAA,IAAI,IAAO,EAAA,CAAA;OACxG,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,eAAe;SACnC,aAAa,KAAA,CAAS;SACtB,mBAAmB,KAAK;QAC1B;QAAI,UAAA,EAAE,eAAe;OAAU,CAAA;MAC5B;;KAEN,kBAAkB,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,MAAK;MAAU,UAAA,EAAE,yBAAyB;KAAK,CAAA,IAAI;KACxE,QAAQ,MAAM,KAAI,SACjB,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD,EAAA,UAAA;MACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,EAAE,gBAAgB,EAAE,MAAM,KAAK,KAAK,CAAC,EAAM,CAAA;MAChD,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;OAAO,MAAK;OAAW,UAAU,WAAW,KAAK,WAAW,QAAQ,OAAO,SAAS;OAClF,SAAS,cAAc,KAAA,KAAa,KAAK,YAAY,UAAU,YAAY,KAAK,YAAY,UAAU;OACtG,gBAAgB;QAAE,OAAO,IAAI;OAAE;MAAI,CAAA,GACpC,EAAE,sBAAsB,EAAE,MAAM,KAAK,KAAK,CAAC,CACvC,EAAA,CAAA;MACN,KAAK,WAAW,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,oBAAoB,EAAK,CAAA,IAAI;MAC1D,KAAK,SAAS,KAAI,YACjB,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAuB,WAAW,QAAQ,QAAQ,eAAeA,6BAAO,eAAe,KAAA;OAAvF,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,EAAE,QAAQ,SAAS,SAAS,iBAAiB,mBAAmB,EAAU,CAAA,GACnF,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;QAAG,WAAWA,6BAAO;QAAc,UAAA,QAAQ;OAAQ,CAAA,CAChD;MAHK,GAAA,QAAQ,GAGb,CACN;KACM,EAAA,GAfK,KAAK,QAeV,CACV;IACM;;EAEb;;ECzJA,MAAM,gBAAgB;;;;;;EAOtB,SAAgB,WAAW,OAA8C;GACvE,IAAI,MAAM,WAAW,GAAG,OAAO;IAAE,GAAG;IAAG,GAAG;IAAG,OAAO;IAAG,QAAQ;GAAE;GACjE,MAAM,IAAI,KAAK,IAAI,GAAG,MAAM,KAAI,SAAQ,KAAK,CAAC,CAAC;GAC/C,MAAM,IAAI,KAAK,IAAI,GAAG,MAAM,KAAI,SAAQ,KAAK,CAAC,CAAC;GAC/C,MAAM,QAAQ,KAAK,IAAI,GAAG,MAAM,KAAI,SAAQ,KAAK,IAAA,GAAU,CAAC;GAC5D,MAAM,SAAS,KAAK,IAAI,GAAG,MAAM,KAAI,SAAQ,KAAK,IAAA,EAAU,CAAC;GAC7D,OAAO;IAAE;IAAG;IAAG,OAAO,QAAQ;IAAG,QAAQ,SAAS;GAAE;EACtD;;;;;;;;;;EAWA,SAAgB,SAAS,MAAgC,IAAsC;GAC7F,MAAM,SAAS,KAAK,IAAA;GACpB,MAAM,SAAS,KAAK,IAAA;GACpB,MAAM,OAAO,GAAG,IAAA;GAChB,MAAM,OAAO,GAAG;GAChB,MAAM,OAAO,KAAK,IAAI,eAAe,KAAK,IAAI,OAAO,MAAM,IAAI,CAAC;GAChE,OAAO,KAAK,OAAO,GAAG,OAAO,KAAK,OAAO,GAAG,SAAS,KAAK,IAAI,KAAK,GAAG,OAAO,KAAK,IAAI,KAAK,GAAG;EAChG;;;;;;;;;;;;;;EAeA,SAAgB,mBAAmB,OAAmC;GACpE,MAAM,QAAuB,CAAC;GAG9B,MAAM,SAAS,MAAM,SAAS,KAAK,YAAY;IAC7C,IAAI,SAAS;IACb,MAAM,QAAuB,CAAC;IAC9B,MAAM,yBAAS,IAAI,IAAoB;IACvC,MAAM,QAAQ,CAAC;KAAE,KAAK,OAAO,QAAQ,MAAM;KAAG,OAAO;KAAG,MAAM;IAAM,CAAC;IACrE,IAAI,QAAQ,MAAM,IAAI;IACtB,OAAO,UAAU,KAAA,GAAW;KAC1B,MAAM,EAAE,KAAK,UAAU;KACvB,MAAM,OAAO,MAAM,MAAM,IAAI,GAAG;KAChC,IAAI,SAAS,KAAA,GAAW,MAAM,IAAI,MAAM,+BAA+B,IAAI,6BAA6B;KACxG,MAAM,WAAW,MAAM,SAAS,IAAI,GAAG,KAAK,CAAC;KAC7C,IAAI,CAAC,MAAM,MAAM;MACf,MAAM,KAAK;OAAE;OAAK;OAAO,MAAM;MAAK,CAAC;MACrC,KAAK,IAAI,QAAQ,SAAS,SAAS,GAAG,SAAS,GAAG,SAAS,GACzD,MAAM,KAAK;OAAE,KAAK,SAAS;OAAS,OAAO,QAAQ;OAAG,MAAM;MAAM,CAAC;KAEvE,OAAO;MACL,MAAM,IAAI,SAAS,WAAW,IAC1B,WAAA,OACC,OAAO,IAAI,SAAS,EAAG,IAAK,OAAO,IAAI,SAAS,SAAS,SAAS,EAAG,KAAM;MAChF,OAAO,IAAI,KAAK,CAAC;MACjB,MAAM,KAAK;OAAE;OAAM;OAAK;OAAG,GAAG,QAAA;MAAoB,CAAC;KACrD;KACA,QAAQ,MAAM,IAAI;IACpB;IAEA,MAAM,iBAAiB,KAAK,IAAI,GAAG,MAAM,KAAI,UAAS,MAAM,CAAC,CAAC,IAAA;IAC9D,MAAM,iBAAiB,QAAQ,UAAU,SAAS,KAAA,KAAA;IAClD,OAAO;KAAE;KAAO,aAAa,KAAK,IAAI,gBAAgB,aAAa;IAAE;GACvE,CAAC;GAGD,IAAI,UAAU;GACd,KAAK,MAAM,SAAS,QAAQ;IAC1B,KAAK,MAAM,SAAS,MAAM,OACxB,MAAM,KAAK;KAAE,GAAG;KAAO,GAAG,MAAM,IAAI;IAAQ,CAAC;IAE/C,WAAW,MAAM,cAAA;GACnB;GAEA,MAAM,QAAQ,IAAI,IAAI,MAAM,KAAI,SAAQ,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC;GACzD,MAAM,QAAuB,CAAC;GAC9B,KAAK,MAAM,QAAQ,MAAM,OAAO;IAC9B,MAAM,OAAO,MAAM,IAAI,KAAK,IAAI;IAChC,MAAM,KAAK,MAAM,IAAI,KAAK,EAAE;IAC5B,IAAI,SAAS,KAAA,KAAa,OAAO,KAAA,GAC/B,MAAM,IAAI,MAAM,+BAA+B,KAAK,GAAG,wBAAwB;IAEjF,MAAM,KAAK;KAAE;KAAM,MAAM,SAAS,MAAM,EAAE;IAAE,CAAC;GAC/C;GAEA,OAAO;IAAE;IAAO;IAAO,GAAG,WAAW,KAAK;GAAE;EAC9C;;;;;;;;;;EAWA,SAAgB,YACd,OACA,OACA,UACe;GACf,OAAO,MAAM,KAAK,EAAE,MAAM,WAAwB;IAChD,MAAM,OAAO,MAAM,IAAI,KAAK,IAAI;IAChC,MAAM,KAAK,MAAM,IAAI,KAAK,EAAE;IAC5B,IAAI,SAAS,KAAA,KAAa,OAAO,KAAA,KAAa,SAAS,MAAM,EAAE,GAC7D,OAAO;KAAE;KAAM;IAAK;IAEtB,OAAO;KAAE;KAAM,MAAM,SAAS,MAAM,EAAE;IAAE;GAC1C,CAAC;EACH;;;;;;;;;;EAWA,SAAgB,eACd,MACA,WACc;GACd,MAAM,QAAQ,IAAI,IAAI,KAAK,MAAM,KAAI,SAAQ,KAAK,GAAG,CAAC;GACtD,MAAM,YAAY,IAAI,IACpB,OAAO,QAAQ,SAAS,CAAC,CAAC,QAAQ,CAAC,SAAS,MAAM,IAAI,GAAG,CAAC,CAC5D;GACA,IAAI,UAAU,SAAS,GAAG,OAAO;GACjC,MAAM,QAAQ,KAAK,MAAM,KAAK,aAAa;IACzC,MAAM,QAAQ,UAAU,IAAI,SAAS,GAAG;IACxC,OAAO,UAAU,KAAA,IAAY,WAAW;KAAE,GAAG;KAAU,GAAG,MAAM;KAAG,GAAG,MAAM;IAAE;GAChF,CAAC;GACD,MAAM,QAAQ,IAAI,IAAI,MAAM,KAAI,SAAQ,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC;GAEzD,OAAO;IACL;IACA,OAHY,YAAY,KAAK,OAAO,aAAa,KAG7C;IACJ,GAAG,WAAW,KAAK;GACrB;EACF;;ECjMA,MAAa,iBAAoC;GAC/C;GACA;GACA;GACA;GACA;EACF;;;;;;;;;;;;EA4BA,SAAgB,cACd,MACA,UACA,4BAAiC,IAAI,IAAI,GACzB;GAChB,MAAM,SAAyB,CAAC;GAChC,MAAM,4BAAY,IAAI,IAA2B;GACjD,KAAK,MAAM,QAAQ,KAAK,OAAO;IAC7B,MAAM,UAAU,UAAU,IAAI,KAAK,KAAK,SAAS;IACjD,IAAI,YAAY,KAAA,GAAW,UAAU,IAAI,KAAK,KAAK,WAAW,CAAC,IAAI,CAAC;SAC/D,QAAQ,KAAK,IAAI;GACxB;GACA,IAAI,aAAa;GACjB,KAAK,MAAM,WAAW,UAAU;IAC9B,MAAM,UAAU,UAAU,IAAI,QAAQ,MAAM,KAAK,CAAC;IAClD,IAAI,QAAQ,WAAW,GAAG;IAC1B,MAAM,OAAO,KAAK,IAAI,GAAG,QAAQ,KAAI,SAAQ,KAAK,CAAC,CAAC;IACpD,MAAM,OAAO,KAAK,IAAI,GAAG,QAAQ,KAAI,SAAQ,KAAK,IAAA,GAAU,CAAC;IAC7D,MAAM,OAAO,KAAK,IAAI,GAAG,QAAQ,KAAI,SAAQ,KAAK,CAAC,CAAC;IACpD,MAAM,OAAO,KAAK,IAAI,GAAG,QAAQ,KAAI,SAAQ,KAAK,IAAA,EAAU,CAAC;IAC7D,OAAO,KAAK;KACV,WAAW,QAAQ;KACnB,OAAO,QAAQ;KACf,GAAG,OAAA;KACH,GAAG,OAAA,KAAA;KACH,OAAO,OAAO,OAAO;KACrB,QAAQ,OAAO,OAAO,KAAA;KACtB,WAAW,UAAU,IAAI,QAAQ,MAAM;KACvC;IACF,CAAC;IACD,cAAc,aAAa,KAAK,eAAe;GACjD;GACA,OAAO;EACT;;;;;;;EAQA,SAAgB,cACd,MACA,QACe;GACf,MAAM,QAAkC,CAAC,MAAM,GAAG,MAAM;GACxD,MAAM,IAAI,KAAK,IAAI,GAAG,MAAM,KAAI,QAAO,IAAI,CAAC,CAAC;GAC7C,MAAM,IAAI,KAAK,IAAI,GAAG,MAAM,KAAI,QAAO,IAAI,CAAC,CAAC;GAC7C,MAAM,QAAQ,KAAK,IAAI,GAAG,MAAM,KAAI,QAAO,IAAI,IAAI,IAAI,KAAK,CAAC;GAC7D,MAAM,SAAS,KAAK,IAAI,GAAG,MAAM,KAAI,QAAO,IAAI,IAAI,IAAI,MAAM,CAAC;GAC/D,OAAO;IAAE;IAAG;IAAG,OAAO,QAAQ;IAAG,QAAQ,SAAS;GAAE;EACtD;;;;;;;;;;;EAYA,SAAgB,aACd,MACA,SACc;GACd,MAAM,SAAS,IAAI,IACjB,OAAO,QAAQ,OAAO,CAAC,CAAC,QAAQ,GAAG,YAAY,OAAO,OAAO,KAAK,OAAO,OAAO,CAAC,CACnF;GACA,IAAI,OAAO,SAAS,GAAG,OAAO;GAC9B,IAAI,CAAC,KAAK,MAAM,MAAK,SAAQ,OAAO,IAAI,KAAK,KAAK,SAAS,CAAC,GAAG,OAAO;GACtE,MAAM,QAAQ,KAAK,MAAM,KAAK,SAAsB;IAClD,MAAM,SAAS,OAAO,IAAI,KAAK,KAAK,SAAS;IAC7C,IAAI,WAAW,KAAA,GAAW,OAAO;IACjC,OAAO;KAAE,GAAG;KAAM,GAAG,KAAK,IAAI,OAAO;KAAI,GAAG,KAAK,IAAI,OAAO;IAAG;GACjE,CAAC;GACD,MAAM,QAAQ,IAAI,IAAI,MAAM,KAAI,SAAQ,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC;GAGzD,OAAO;IACL;IACA,OAJY,YAAY,KAAK,OAAO,QAAQ,MAAM,OAClD,CAAC,OAAO,IAAI,KAAK,KAAK,SAAS,KAAK,CAAC,OAAO,IAAI,GAAG,KAAK,SAAS,CAG7D;IACJ,GAAG,WAAW,KAAK;GACrB;EACF;;;;;;;;;;;;EAaA,SAAgB,cACd,MACA,UACA,WACc;GACd,IAAI,UAAU,SAAS,GAAG,OAAO;GAGjC,MAAM,2BAAW,IAAI,IAAoB;GACzC,KAAK,MAAM,WAAW,UAAU;IAC9B,IAAI,CAAC,UAAU,IAAI,QAAQ,MAAM,GAAG;IACpC,QAAQ,UAAU,SAAS,UAAU,UAAU;KAAE,SAAS,IAAI,UAAU,KAAK;IAAE,CAAC;GAClF;GACA,MAAM,0BAAU,IAAI,IAAsC;GAC1D,KAAK,MAAM,QAAQ,KAAK,OAAO;IAC7B,IAAI,CAAC,UAAU,IAAI,KAAK,KAAK,SAAS,GAAG;IACzC,MAAM,SAAS,QAAQ,IAAI,KAAK,KAAK,SAAS;IAC9C,QAAQ,IAAI,KAAK,KAAK,WAAW;KAC/B,GAAG,KAAK,IAAI,QAAQ,KAAK,KAAK,GAAG,KAAK,CAAC;KACvC,GAAG,KAAK,IAAI,QAAQ,KAAK,KAAK,GAAG,KAAK,CAAC;IACzC,CAAC;GACH;GACA,MAAM,QAAQ,KAAK,MAAM,KAAK,SAAsB;IAClD,MAAM,MAAM,SAAS,IAAI,KAAK,GAAG;IACjC,MAAM,SAAS,QAAQ,IAAI,KAAK,KAAK,SAAS;IAC9C,IAAI,QAAQ,KAAA,KAAa,WAAW,KAAA,GAAW,OAAO;IACtD,OAAO;KACL,GAAG;KACH,GAAG,OAAO;KACV,GAAG,OAAO,IAAI,MAAA;IAChB;GACF,CAAC;GACD,IAAI,CAAC,KAAK,MAAM,MAAK,SAAQ,SAAS,IAAI,KAAK,GAAG,CAAC,GAAG,OAAO;GAC7D,MAAM,QAAQ,IAAI,IAAI,MAAM,KAAI,SAAQ,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC;GAQzD,OAAO;IAAE;IAAO,OADF,YANG,KAAK,MAAM,QAAQ,EAAE,WAAW;KAC/C,MAAM,OAAO,MAAM,IAAI,KAAK,IAAI;KAChC,OAAO,KAAK,SAAS,YAChB,SAAS,KAAA,KACT,CAAC,UAAU,IAAI,KAAK,KAAK,SAAS;IACzC,CAC0B,GAAU,aAAa,KAC7B;IAAG,GAAG,WAAW,KAAK;GAAE;EAC9C;;;;;;;;;;;;;;ECxDA,SAAgB,kBACd,WACA,MACA,YACwB;GACxB,MAAM,SAAS,KAAK,KAAK;GACzB,MAAM,eAAe,WAAW,MAAM,MAAK,cAAa,UAAU,WAAW,SAAS,SAAS,CAAC;GAChG,MAAM,QAAQ,QAAQ,QAAQ,KAAA,IAC1B,WAAW,MAAM,MAAK,cAAa,UAAU,SAAS,OAAO,GAAG,IAChE,KAAA;GACJ,MAAM,YAAY,gBAAgB;GAClC,MAAM,OAAO,WAAW,QAAQ,QAAQ;GACxC,IAAI,SAAS,KAAA,GAAW,OAAO,KAAA;GAC/B,MAAM,WAAW,IAAI,IAAI,WAAW,kBAAkB;GACtD,MAAM,YAAY,IAAI,IAAI,WAAW,UAAU;GAC/C,MAAM,0BAAU,IAAI,IAAe;GACnC,KAAK,MAAM,OAAO,OAAO,OAAO,KAAK,IAAI,GAAG;IAC1C,IAAI,SAAS,IAAI,IAAI,EAAE,GAAG;IAC1B,IAAI,cAAc,KAAA,IACd,UAAU,IAAI,IAAI,EAAE,KAAK,IAAI,QAAQ,UAAU,OAC/C,IAAI,QAAQ,MACd,QAAQ,IAAI,IAAI,EAAE;GAEtB;GACA,IAAI,cAAc,KAAA,GAChB,OAAO;IACL,MAAM;IACN,OAAO,KAAA;IACP;IACA,aAAa;KAAE,KAAK;KAAM,WAAW,KAAA;IAAU;IAC/C;GACF;GAEF,OAAO;IACL,MAAM;IACN,OAAO,UAAU;IACjB,aAAa,UAAU;IACvB;IACA,aAAa;KAAE,KAAK,aAAa,UAAU;KAAe,WAAW;IAAK;IAC1E;GACF;EACF;;;;;;;;;;EAiBA,SAAS,YACP,SACsC;GACtC,MAAM,0BAAU,IAAI,IAA6B;GACjD,KAAK,MAAM,cAAc,QAAQ,OAAO,GAAG;IACzC,IAAI,WAAW,WAAW,YAAY;IACtC,MAAM,uBAAO,IAAI,IAAe;IAChC,IAAI,UAAsC;IAK1C,OAAO,SAAS,WAAW,cAAc,QAAQ,aAAa,KAAA,KACzD,CAAC,KAAK,IAAI,QAAQ,EAAE,GAAG;KAC1B,KAAK,IAAI,QAAQ,EAAE;KACnB,MAAM,QAAQ,QAAQ,IAAI,QAAQ,QAAQ;KAC1C,IAAI,UAAU,KAAA,GACZ,QAAQ,IAAI,QAAQ,UAAU;MAAE,OAAO;MAAG,cAAc,WAAW,UAAU,IAAI;KAAE,CAAC;UAC/E;MACL,MAAM,SAAS;MACf,IAAI,WAAW,SAAS,MAAM,gBAAgB;KAChD;KACA,UAAU,QAAQ,IAAI,QAAQ,QAAQ;IACxC;GAEF;GACA,OAAO;EACT;;EAGA,SAAS,UAAU,GAAmB,GAA2B;GAE/D,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,KAAK;EAC1D;;;;;;;;;;;;;;;;EAiBA,SAAgB,mBACd,MACA,OACA,UACA,qBACgC;GAChC,MAAM,0BAAU,IAAI,IAA+B;GACnD,IAAI,UAAU,KAAA,GACZ,KAAK,MAAM,OAAO,OAAO,OAAO,KAAK,IAAI,GAAG;IAC1C,IAAI,CAAC,MAAM,QAAQ,IAAI,IAAI,EAAE,GAAG;IAChC,IAAI,IAAI,SAAS,IAAI,OAAO,UAAU;IACtC,QAAQ,IAAI,IAAI,IAAI,GAAG;GACzB;GAGF,OAAO,gBAAgB,SAAS,UAAU,mBAAmB;EAC/D;;EAGA,SAAgB,iBACd,UACA,MACA,UACA,qBACgC;GAChC,MAAM,UAAU,IAAI,IAAI,SAAS,QAAQ,KAAI,WAAU,CAAC,OAAO,WAAW,MAAM,CAAC,CAAC;GAClF,MAAM,0BAAU,IAAI,IAA+B;GACnD,KAAK,MAAM,aAAa,SAAS,MAAM,YAAY;IACjD,MAAM,SAAS,QAAQ,IAAI,UAAU,SAAS;IAC9C,MAAM,MAAM,QAAQ,WAAW,WAAW,KAAK,KAAK,UAAU,aAA0B,KAAA;IACxF,MAAM,SAAS,QAAQ;IACvB,QAAQ,IAAI,UAAU,WAAwB;KAC5C,IAAI,UAAU;KACd,cAAc,KAAK,aAAa,KAAK,KAAK,UAAU;KACpD,OAAO;KAAO,SAAS,KAAK,WAAW;KAAO,WAAW,KAAK,aAAa;KAC3E,GAAI,KAAK,cAAc,KAAA,IAAY,CAAC,IAAI,EAAE,WAAW,IAAI,UAAU;KACnE,GAAI,WAAW,KAAA,KAAa,QAAQ,IAAI,MAAM,CAAC,EAAE,WAAW,WAAW,CAAC,IAAI,EAAE,UAAU,OAAoB;KAC5G,GAAI,KAAK,qBAAqB,KAAA,IAAY,CAAC,IAAI,EAAE,kBAAkB,IAAI,iBAAiB;IAC1F,CAAC;GACH;GACA,OAAO,gBAAgB,SAAS,UAAU,qBAAqB,OAAO;EACxE;EAEA,SAAS,gBACP,SACA,UACA,qBACA,SACgC;GAEhC,MAAM,SAAS,YAAY,OAAO;GAClC,MAAM,wBAAQ,IAAI,IAA8B;GAChD,MAAM,2BAAW,IAAI,IAAsB;GAC3C,MAAM,QAAqB,CAAC;GAC5B,MAAM,WAA0B,CAAC;GACjC,MAAM,+BAAe,IAAI,IAA0B;GACnD,MAAM,iCAAiB,IAAI,IAAiC;GAC5D,KAAK,MAAM,OAAO,QAAQ,OAAO,GAAG;IAClC,IAAI,IAAI,WAAW,cAAc,IAAI,aAAa,KAAA,GAAW;IAC7D,MAAM,SAAS,QAAQ,IAAI,IAAI,QAAQ;IACvC,IAAI,WAAW,KAAA,KAAa,OAAO,WAAW,YAAY;IAC1D,aAAa,IAAI,IAAI,IAAI,OAAO,EAAE;IAClC,MAAM,WAAW,eAAe,IAAI,OAAO,EAAE;IAC7C,IAAI,aAAa,KAAA,GAAW,eAAe,IAAI,OAAO,IAAI,CAAC,GAAG,CAAC;SAC1D,SAAS,KAAK,GAAG;GACxB;GACA,KAAK,MAAM,YAAY,eAAe,OAAO,GAAG,SAAS,KAAK,SAAS;;GAGvE,MAAM,eAAe,KAAqB,eAA0B,YAA+B;IACjG,MAAM,QAAQ,OAAO,IAAI,IAAI,EAAE;IAC/B,MAAM,UAAU,oBAAoB,IAAI,IAAI,EAAE;IAC9C,MAAM,IAAI,IAAI,IAAI;KAChB,IAAI,IAAI;KACR,WAAW;KACX,OAAO,IAAI;KACX,OAAO,IAAI;KACX,eAAe,IAAI,UAAU,YACzB,UAAU,kBACR,IAAI,cAAc,OAAO,cAAc,KAAA;KAC7C,QAAQ,IAAI,OAAO;KACnB,WAAW,IAAI;KACf,eAAe,OAAO,SAAS;KAC/B,kBAAkB,OAAO,gBAAgB;KACzC,YAAY,aAAa,IAAI,IAAI,EAAE;KACnC,cAAc,IAAI,kBAAkB,mBAAmB,WAAW,CAAC;KACnE,GAAI,SAAS,IAAI,IAAI,EAAE,MAAM,KAAA,IAAY,CAAC,IAAI,EAAE,aAAa,QAAQ,IAAI,IAAI,EAAE,EAAG;IACpF,CAAC;IACD,QAAQ,KAAK,IAAI,EAAE;IACnB,MAAM,YAAsB,CAAC;IAC7B,MAAM,aAAa,eAAe,IAAI,IAAI,EAAE,KAAK,CAAC;IAClD,KAAK,MAAM,SAAS,YAAY;KAC9B,UAAU,KAAK,MAAM,EAAE;KACvB,MAAM,KAAK;MACT,IAAI,UAAU,IAAI,GAAG,IAAI,MAAM;MAC/B,MAAM;MACN,MAAM,IAAI;MACV,IAAI,MAAM;KACZ,CAAC;IACH;IACA,IAAI,UAAU,SAAS,GAAG,SAAS,IAAI,IAAI,IAAI,SAAS;GAC1D;GAEA,MAAM,QAAQ,CAAC,GAAG,QAAQ,OAAO,CAAC,CAAC,CAChC,QAAO,QAAO,IAAI,WAAW,cAAc,CAAC,aAAa,IAAI,IAAI,EAAE,CAAC,CAAC,CACrE,KAAK,SAAS;GACjB,KAAK,MAAM,QAAQ,OAAO;IACxB,MAAM,UAAuB,CAAC;IAC9B,MAAM,UAAU,CAAC,IAAI;IACrB,IAAI,MAAM,QAAQ,IAAI;IACtB,OAAO,QAAQ,KAAA,GAAW;KACxB,YAAY,KAAK,KAAK,IAAI,OAAO;KACjC,MAAM,cAAc,eAAe,IAAI,IAAI,EAAE,KAAK,CAAC;KACnD,KAAK,IAAI,QAAQ,YAAY,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,KAAK,YAAY,MAAO;KACjG,MAAM,QAAQ,IAAI;IACpB;IACA,SAAS,KAAK;KAAE,QAAQ,KAAK;KAAI,OAAO,KAAK;KAAc,WAAW;IAAQ,CAAC;GACjF;GAEA,KAAK,MAAM,UAAU,MAAM,OAAO,GAChC,KAAK,MAAM,UAAU,OAAO,cAAc;IACxC,IAAI,CAAC,MAAM,IAAI,OAAO,SAAS,GAAG;IAClC,MAAM,KAAK;KACT,IAAI,SAAS,OAAO,UAAU,IAAI,OAAO;KACzC,MAAM;KACN,MAAM,OAAO;KACb,IAAI,OAAO;IACb,CAAC;GACH;GAKF,OAAO;IACL,UAHsB,qBAAqB,UAAU,OAAO,KAGpC;IACxB;IACA;IACA;IACA,cAAc,MAAM;GACtB;EACF;;EAGA,SAAS,qBACP,UACA,OACA,OACwB;GACxB,MAAM,QAAQ,IAAI,IAAI,SAAS,KAAK,SAAS,aAAa,CAAC,QAAQ,QAAQ,QAAQ,CAAC,CAAC;GACrF,MAAM,OAAO,IAAI,IAAI,SAAS,KAAI,YAAW,CAAC,QAAQ,QAAQ,OAAO,CAAC,CAAC;GACvE,MAAM,2BAAW,IAAI,IAAyB;GAC9C,MAAM,WAAW,IAAI,IAAI,SAAS,KAAI,YAAW,CAAC,QAAQ,QAAQ,CAAC,CAAC,CAAC;GACrE,KAAK,MAAM,QAAQ,OAAO;IACxB,IAAI,KAAK,SAAS,SAAS;IAC3B,MAAM,OAAO,MAAM,IAAI,KAAK,IAAI,CAAC,EAAE;IACnC,MAAM,KAAK,MAAM,IAAI,KAAK,EAAE,CAAC,EAAE;IAC/B,IAAI,SAAS,KAAA,KAAa,OAAO,KAAA,KAAa,SAAS,IAAI;IAC3D,MAAM,UAAU,SAAS,IAAI,IAAI,qBAAK,IAAI,IAAY;IACtD,IAAI,QAAQ,IAAI,EAAE,GAAG;IACrB,QAAQ,IAAI,EAAE;IACd,SAAS,IAAI,MAAM,OAAO;IAC1B,SAAS,IAAI,KAAK,SAAS,IAAI,EAAE,KAAK,KAAK,CAAC;GAC9C;GACA,MAAM,QAAQ,SACX,QAAO,YAAW,SAAS,IAAI,QAAQ,MAAM,MAAM,CAAC,CAAC,CACrD,KAAI,YAAW,QAAQ,MAAM;GAChC,MAAM,UAAyB,CAAC;GAChC,OAAO,MAAM,SAAS,GAAG;IACvB,MAAM,OAAO,MAAM,MAAM;;IAEzB,IAAI,SAAS,KAAA,GAAW;IACxB,MAAM,UAAU,KAAK,IAAI,IAAI;;IAE7B,IAAI,YAAY,KAAA,GAAW;IAC3B,QAAQ,KAAK,OAAO;IACpB,KAAK,MAAM,UAAU,SAAS,IAAI,IAAI,KAAK,CAAC,GAAG;KAC7C,MAAM,aAAa,SAAS,IAAI,MAAM,KAAK,KAAK;KAChD,SAAS,IAAI,QAAQ,SAAS;KAC9B,IAAI,cAAc,GAAG;KACrB,MAAM,KAAK,MAAM;KACjB,MAAM,MAAM,MAAM,WAAW,MAAM,IAAI,IAAI,KAAK,MAAM,MAAM,IAAI,KAAK,KAAK,EAAE;IAC9E;GACF;GACA,OAAO,QAAQ,WAAW,SAAS,SAAS,UAAU;EACxD;;;;;;;;;;;EAYA,SAAgB,cAAc,OAA4B,KAAkC;GAC1F,MAAM,uBAAO,IAAI,IAAuB;GACxC,MAAM,6BAAa,IAAI,IAAsB;GAC7C,KAAK,MAAM,QAAQ,OAAO;IACxB,KAAK,IAAI,KAAK,IAAI,IAAI;IACtB,IAAI,KAAK,SAAS,eAAe,KAAK,eAAe,KAAA,GAAW;IAChE,MAAM,OAAO,WAAW,IAAI,KAAK,UAAU;IAC3C,IAAI,SAAS,KAAA,GAAW,WAAW,IAAI,KAAK,YAAY,CAAC,KAAK,EAAE,CAAC;SAC5D,KAAK,KAAK,KAAK,EAAE;GACxB;GACA,MAAM,uBAAO,IAAI,IAAY;GAC7B,IAAI,UAAU,KAAK,IAAI,GAAG;GAC1B,OAAO,YAAY,KAAA,KAAa,CAAC,KAAK,IAAI,QAAQ,EAAE,GAAG;IACrD,KAAK,IAAI,QAAQ,EAAE;IACnB,UAAU,QAAQ,SAAS,eAAe,QAAQ,eAAe,KAAA,IAAY,KAAA,IAAY,KAAK,IAAI,QAAQ,UAAU;GACtH;GACA,MAAM,QAAQ,CAAC,GAAG;GAClB,IAAI,OAAO,MAAM,IAAI;GACrB,OAAO,SAAS,KAAA,GAAW;IACzB,KAAK,MAAM,SAAS,WAAW,IAAI,IAAI,KAAK,CAAC,GAAG;KAC9C,IAAI,KAAK,IAAI,KAAK,GAAG;KACrB,KAAK,IAAI,KAAK;KACd,MAAM,KAAK,KAAK;IAClB;IACA,OAAO,MAAM,IAAI;GACnB;GACA,OAAO;EACT;;;;;;;;;;EAWA,SAAgB,YAAY,OAA4B,OAA2C;GACjG,MAAM,SAAS,MAAM,KAAK,CAAC,CAAC,YAAY;GACxC,IAAI,WAAW,IAAI,OAAO;GAC1B,MAAM,0BAAU,IAAI,IAAY;GAChC,KAAK,MAAM,QAAQ,OACjB,IAAI,KAAK,MAAM,YAAY,CAAC,CAAC,SAAS,MAAM,GAAG,QAAQ,IAAI,KAAK,EAAE;GAEpE,OAAO;EACT;;;;ECxbA,MAAM,aAAa;EAEnB,SAAS,WAAW,UAA0B;GAC5C,OAAO,GAAG,aAAa;EACzB;;;;;;;;;EAUA,SAAgB,WACd,UACA,SACyB;GACzB,IAAI;IACF,MAAM,OAAO,WAAW,WAAW,aAAA,CAAc,QAAQ,WAAW,QAAQ,CAAC;IAC7E,IAAI,QAAQ,MAAM,OAAO,KAAA;IACzB,MAAM,SAAkB,KAAK,MAAM,GAAG;IACtC,IAAI,OAAO,WAAW,YAAY,WAAW,MAAM,OAAO,KAAA;IAC1D,MAAM,EAAE,GAAG,WAAW,cAAc,WAAW,SAAS,eAAe;IAMvE,IAAI,MAAM,KAAK,OAAO,iBAAiB,YAAY,iBAAiB,MAClE;IAEF,MAAM,YAA0C,CAAC;IACjD,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,YAAY,GAAG;KACvD,IAAI,OAAO,UAAU,YAAY,UAAU,MAAM;KACjD,MAAM,EAAE,GAAG,MAAM;KACjB,IAAI,OAAO,MAAM,YAAY,CAAC,OAAO,SAAS,CAAC,KAC1C,OAAO,MAAM,YAAY,CAAC,OAAO,SAAS,CAAC,GAAG;KACnD,UAAU,OAAO;MAAE;MAAG;KAAE;IAC1B;IACA,MAAM,eAAe,MAAM,QAAQ,SAAS,IACxC,UAAU,QAAQ,UAA2B,OAAO,UAAU,QAAQ,IACtE,CAAC;IAGL,MAAM,UAAyC,CAAC;IAChD,IAAI,OAAO,eAAe,YAAY,eAAe,MACnD,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,UAAU,GAAG;KACrD,IAAI,OAAO,UAAU,YAAY,UAAU,MAAM;KACjD,MAAM,EAAE,IAAI,OAAO;KACnB,IAAI,OAAO,OAAO,YAAY,CAAC,OAAO,SAAS,EAAE,KAC5C,OAAO,OAAO,YAAY,CAAC,OAAO,SAAS,EAAE,GAAG;KACrD,QAAQ,OAAO;MAAE;MAAI;KAAG;IAC1B;IAEF,OAAO;KAAE;KAAW,WAAW;KAAc;IAAQ;GACvD,QAAQ;IAGN;GACF;EACF;;;;;;;EAQA,SAAgB,WACd,UACA,OACA,SACM;GACN,IAAI;IACF,MAAM,SAAuB;KAC3B,GAAG;KACH,WAAW,EAAE,GAAG,MAAM,UAAU;KAChC,WAAW,CAAC,GAAG,MAAM,SAAS;KAC9B,SAAS,EAAE,GAAG,MAAM,QAAQ;IAC9B;IAEA,CADgB,WAAW,WAAW,aAAA,CAC9B,QACN,WAAW,QAAQ,GACnB,KAAK,UAAU,MAAM,CACvB;GACF,QAAQ,CAER;EACF;;;;;;;;;EAUA,SAAgB,gBACd,UACA,SACyB;GACzB,MAAM,aAAa,WAAW,SAAS,KAAK,OAAO;GACnD,IAAI,eAAe,KAAA,KAAa,SAAS,cAAc,KAAA,GAAW,OAAO;GACzE,MAAM,SAAS,WAAW,SAAS,WAAW,OAAO;GACrD,IAAI,WAAW,KAAA,GAAW,WAAW,SAAS,KAAK,QAAQ,OAAO;GAClE,OAAO;EACT;;;;ECnHA,SAAgB,aAAa,EAC3B,QAAQ,SAAS,SAAS,SAAS,CAAC,KACM;GAC1C,MAAM,WAAW,OAAO,OAAO;GAC/B,MAAM,YAAY,OAAO,QAAQ;GACjC,MAAM,aAAa,QAAQ,SAAS,OAAO,SAAS;GACpD,MAAM,cAAc,QAAQ,UAAU,OAAO,UAAU;GACvD,MAAM,QAAQ,OAAO,IAAI,OAAO,QAAQ;GACxC,MAAM,IAAI,KAAK,IACb,KAAK,IAAI,OAAO,GAAG,QAAQ,GAC3B,KAAK,IAAI,UAAU,cAAc,QAAQ,MAAM,CACjD;GACA,IAAI,QAAQ,QAAQ,SAAS,YAC3B,OAAO;IACL,GAAG;IACH;IACA,MAAM;GACR;GAEF,MAAM,OAAO,OAAO,IAAI,QAAQ,QAAQ;GACxC,IAAI,QAAQ,WACV,OAAO;IACL,GAAG;IACH;IACA,MAAM;GACR;GAEF,MAAM,YAAY,OAAO,KAAK,OAAO,QAAQ,QAAQ,SAAS;GAC9D,MAAM,IAAI,KAAK,IACb,KAAK,IAAI,WAAW,SAAS,GAC7B,KAAK,IAAI,WAAW,aAAa,QAAQ,KAAK,CAChD;GACA,MAAM,SAAS,OAAO,IAAI,OAAO,SAAS;GAC1C,IAAI,SAAS,QAAQ,UAAU,aAC7B,OAAO;IAAE;IAAG,GAAG;IAAQ,MAAM;GAAS;GAExC,OAAO;IACL;IACA,GAAG,KAAK,IAAI,UAAU,OAAO,IAAI,QAAQ,SAAS,EAAE;IACpD,MAAM;GACR;EACF;;;;;;;;;;;;;EClDA,SAAgB,aACd,SACA,QACA,WACY;GACZ,IAAI,IAAI,QAAQ;GAChB,IAAI,IAAI,QAAQ;GAChB,IAAI,SAAwB;GAC5B,IAAI,SAAwB;GAC5B,IAAI,QAAQ;GACZ,IAAI,QAAQ;GACZ,KAAK,MAAM,SAAS,QAAQ;IAC1B,MAAM,KAAK,KAAK,IAAI,MAAM,IAAI,QAAQ,CAAC;IACvC,IAAI,MAAM,OAAO;KACf,QAAQ;KACR,IAAI,MAAM;KACV,SAAS,MAAM;IACjB;IACA,MAAM,KAAK,KAAK,IAAI,MAAM,IAAI,QAAQ,CAAC;IACvC,IAAI,MAAM,OAAO;KACf,QAAQ;KACR,IAAI,MAAM;KACV,SAAS,MAAM;IACjB;GACF;GACA,OAAO;IAAE;IAAG;IAAG;IAAQ;GAAO;EAChC;;;;;;;;;ECxBA,SAAgB,yBAAyB,EACvC,MACA,UACA,WACA,WACA,WAC8C;GAG9C,MAAM,QAAQ,aADI,cADC,eAAe,MAAM,SACR,GAAY,UAAU,SAC3B,GAAW,OAAO;GAC7C,MAAM,SAAS,cAAc,OAAO,UAAU,SAAS;GACvD,MAAM,kBAAkB,cAAc,MAAM,QAAQ;GACpD,OAAO;IACL;IACA;IACA,QAAQ,cAAc,OAAO,MAAM;IACnC,iBAAiB,cAAc,MAAM,eAAe;GACtD;EACF;;;;;;;;;;;;;;ECRA,MAAM,iBAAiB;;EAkBvB,SAAS,eAAe,OAA8B;GACpD,IAAI,EAAE,iBAAiB,QACrB,OAAO;IAAE,MAAM,KAAA;IAAW,OAAO,KAAA;IAAW,SAAS,OAAO,KAAK;IAAG,iBAAiB,KAAA;GAAU;GAEjG,MAAM,UAAU;GAKhB,OAAO;IACL,MAAM,OAAO,QAAQ,SAAS,WAAW,QAAQ,OAAO,KAAA;IACxD,OAAO,OAAO,QAAQ,UAAU,WAAW,QAAQ,QAAQ,KAAA;IAC3D,SAAS,MAAM;IACf,iBAAiB,OAAO,QAAQ,oBAAoB,WAChD,QAAQ,kBACR,KAAA;GACN;EACF;EAEA,SAAS,gBAAgB,SAAwC;GAC/D,IAAI,QAAQ,UAAU,cAAc,OAAO;GAC3C,IAAI,QAAQ,UAAU,YAAY,OAAO;GACzC,IAAI,QAAQ,UAAU,UAAU,OAAO;GACvC,IAAI,QAAQ,UAAU,cAAc,OAAO;GAC3C,IAAI,QAAQ,UAAU,WAAW,OAAO;GACxC,OAAO;EACT;;EAGA,MAAM,OAAO;;EAEb,MAAM,cAAc;;EAEpB,MAAM,eAAe;;EAErB,MAAM,YAAY;;EAElB,MAAM,UAAU;;EAEhB,MAAM,gBAAgB;;EAEtB,MAAM,YAAY;;EAElB,MAAM,YAAY;;EAElB,MAAM,oBAAoB;;EAE1B,MAAM,wBAAwB;;EAG9B,SAAS,aACP,QACA,KACA,UACmB;GACnB,IAAI,aAAa,KAAA,GAAW,OAAO;IAAE,GAAG;KAAS,MAAM;GAAS;GAChE,OAAO,OAAO,YAAY,OAAO,QAAQ,MAAM,CAAC,CAAC,QAAQ,CAAC,cAAc,aAAa,GAAG,CAAC;EAC3F;;EAGA,SAAS,UAAU,WAAmB,KAAa,GAAsB;GACvE,MAAM,MAAM;GACZ,MAAM,OAAO;GACb,MAAM,MAAM;GACZ,MAAM,OAAO,KAAK,IAAI,GAAG,MAAM,SAAS;GACxC,IAAI,OAAO,KAAK,OAAO,EAAE,UAAU;GACnC,IAAI,OAAO,MAAM,OAAO,EAAE,gBAAgB,EAAE,GAAG,KAAK,MAAM,OAAO,GAAG,EAAE,CAAC;GACvE,IAAI,OAAO,KAAK,OAAO,EAAE,cAAc,EAAE,GAAG,KAAK,MAAM,OAAO,IAAI,EAAE,CAAC;GACrE,IAAI,OAAO,KAAK,KAAK,OAAO,EAAE,aAAa,EAAE,GAAG,KAAK,MAAM,OAAO,GAAG,EAAE,CAAC;GACxE,IAAI,OAAO,MAAM,KAAK,OAAO,EAAE,eAAe,EAAE,GAAG,KAAK,MAAM,QAAQ,KAAK,IAAI,EAAE,CAAC;GAClF,OAAO,EAAE,cAAc,EAAE,GAAG,KAAK,MAAM,QAAQ,MAAM,IAAI,EAAE,CAAC;EAC9D;;EAGA,SAAS,mBAAmB,QAAmC,GAAsB;GACnF,IAAI,WAAW,WAAW,OAAO,EAAE,wBAAwB;GAC3D,IAAI,WAAW,iBAAiB,OAAO,EAAE,wBAAwB;GACjE,IAAI,WAAW,aAAa,OAAO,EAAE,0BAA0B;GAC/D,OAAO;EACT;;EAaA,SAAS,SAAS,EAChB,MAAM,KAAK,GAAG,UAAU,cAAc,UAAU,cAAc,cAC9D,UAAU,aAAa,cAatB;GACD,MAAM,EAAE,MAAM,KAAK,GAAG,MAAM;GAC5B,MAAM,UAAU,KAAK,SAAS,cAAc,KAAA,IAAY;GACxD,MAAM,SAAS,SAAS;GACxB,MAAM,QAAQ,YAAY,KAAA,KAAa,QAAQ,gBAAgB,IAC3D,GAAG,EAAE,kBAAkB,EAAE,OAAO,QAAQ,cAAc,CAAC,IAAI,QAAQ,mBAAmB,IAAI,KAAK,EAAE,gBAAgB,EAAE,OAAO,QAAQ,iBAAiB,CAAC,EAAE,KAAK,OAC3J;GACJ,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;IACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;KACE,MAAK;KACL,WAAW,KACTC,6BAAO,MACPA,6BAAO,aACP,KAAK,SAAS,cAAcA,6BAAO,gBAAgB,MACnD,WAAWA,6BAAO,eAAe,MACjC,eAAe,KAAA,IAAY,OAAOA,6BAAO,mBACzC,SAAS,kBAAkB,kBAAkBA,6BAAO,cAAc,MAClE,eAAeA,6BAAO,eAAe,MACrC,QACF;KACA,OAAO;MAAE,MAAM,GAAG,EAAE;MAAK,KAAK,GAAG,EAAE;KAAI;KACvC,gBAAc;KACd,kBAAgB,KAAK,QAAQ;KAC7B,uBAAqB,SAAS;KAC9B,uBAAqB;KACrB,gBAAc,SAAS,SAAS,SAAS,KAAA;KACzC,iBAAe,YAAY,eAAe,KAAA;KAC1C,eAAe,SAAS;KACxB,eAAe,SAAS;KACxB,aAAa,SAAS;KACtB,iBAAiB,SAAS;KAC1B,SAAS,SAAS;KAClB,eAAe,SAAS;KACxB,oBAAoB;MAAE,YAAY,GAAG;KAAE;KACvC,oBAAoB;MAAE,YAAY,IAAI;KAAE;KA1B1C,UAAA;MA4BE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OACE,WAAW,KAAKA,6BAAO,KAAK,SAAS,kBAAkB,YAAYA,6BAAO,WAAW,IAAI;OACzF,OAAO,EAAE,YAAY,OAAO,aAAa,GAAG;MAC7C,CAAA;MACD,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;OAAM,WAAWA,6BAAO;OAAxB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAWA,6BAAO;QACrB,UAAA,SAAS,QAAQ,EAAE,iBAAiB,IAAI,KAAK;OAC1C,CAAA,GACN,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;QAAM,WAAWA,6BAAO;QAAxB,UAAA;SACG,KAAK,SAAS,cAAc,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD,EAAA,UAAA;UAAO,EAAE,iBAAiB;UAAE;UAAI,EAAE,oBAAoB,KAAK,KAAK,UAAU,GAAG,EAAE,CAAC,CAAE,QAAQ,QAAQ;SAAQ,EAAA,CAAA,IAAI;SAC3I,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;UAAM,WAAW,KAAKA,6BAAO,MAAM,WAAW,KAAA,IAAY,OAAOA,6BAAO,gBAAgB;UACtF,OAAO,QAAQ,WAAW,SAAS,QAAQ;UAAM,UAAA,WAAW,KAAA,IAAY,UAAU,KAAK,WAAW,KAAK,CAAC,IACtG,OAAO,WAAW,SAAS,OAAO,OAAO,EAAE,mBAAmB;SAAQ,CAAA;SACzE,QAAQ,WAAW,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;UAAM,WAAWA,6BAAO;UAAQ,UAAA,EAAE,iBAAiB;SAAQ,CAAA,IAAI;SAClF,QAAQ,WAAW,gBAAgB,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;UAAM,WAAWA,6BAAO;UAAQ,UAAA,EAAE,mBAAmB;SAAQ,CAAA,IAAI;SACpG,UAAU,KAEP,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;UACE,WAAWA,6BAAO;UAClB,oBAAoB;WAAE,aAAa,GAAG;UAAE;UACxC,oBAAoB;WAAE,aAAa,IAAI;UAAE;UAExC,UAAA;SACG,CAAA,IAEN;QACA;OACF,CAAA,CAAA;;MACL,eAAe,KAAA,IACZ,OACA,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,WAAWA,6BAAO;OAAqB,eAAY;OAAQ,UAAA;MAAiB,CAAA;KAChF;;IACR,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;KACE,WAAW,KAAKA,6BAAO,UAAU,QAAQ;KACzC,OAAO;MAAE,MAAM,GAAG,IAAA,IAAe;MAAK,KAAK,GAAG,EAAE;KAAI;KACpD,qBAAmB,KAAK,SAAS,cAAc,KAAA,IAAY;KAC3D,gBAAc,GAAG,IAAI;KACrB,eAAY;IACb,CAAA;IACD,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;KACE,WAAW,KAAKA,6BAAO,UAAU,QAAQ;KACzC,OAAO;MAAE,MAAM,GAAG,IAAA,IAAe;MAAK,KAAK,GAAG,IAAA,GAAW;KAAI;KAC7D,qBAAmB,KAAK,SAAS,cAAc,KAAA,IAAY;KAC3D,gBAAc,GAAG,IAAI;KACrB,eAAY;IACb,CAAA;GACD,EAAA,CAAA;EAEN;EA0BA,SAAS,WAAW,OAA8D;GAChF,IAAI,OAAO,UAAU,SAAS,OAAO,MAAM;GAC3C,IAAI,OAAO,UAAU,gBAAgB,OAAO,UAAU,SAAS,OAAO,MAAM;EAE9E;EAEA,SAAS,kBAAkB,OAAuE;GAChG,IAAI,EAAE,iBAAiB,QAAQ,OAAO,CAAC;GACvC,MAAM,OAAO,OAAQ,MAAqC,SAAS,WAC9D,MAAmC,OACpC,KAAA;GACJ,MAAM,UAAU,SAAS,6BAA6B,SAAS,yBAC3D,MAAM,UACN,KAAA;GACJ,OAAO;IACL,GAAI,SAAS,KAAA,IAAY,CAAC,IAAI,EAAE,KAAK;IACrC,GAAI,YAAY,KAAA,IAAY,CAAC,IAAI,EAAE,QAAQ;GAC7C;EACF;EAEA,SAAS,iBAAiB,MAA0B,GAAsB;GACxE,IAAI,SAAS,2BAA2B,OAAO,EAAE,mBAAmB;GACpE,IAAI,SAAS,wBAAwB,OAAO,EAAE,oBAAoB;GAClE,OAAO,EAAE,cAAc;EACzB;;EAGA,SAAS,cAAc,EACrB,MAAM,OAAO,KAAK,GAAG,cAON;GACf,MAAM,iBAAA,GAAgBC,MAAAA,OAAAA,CAAgC,IAAI;GAC1D,MAAM,QAAQ,WAAW,KAAK;GAC9B,MAAM,aAAa,OAAO,UAAU,WAAW,KAAK,YAAY,MAAM;GACtE,MAAM,QAAS,UAAU,KAAA,KAAa,KAAK,YAAY,MAAM,mBAAoB;GACjF,MAAM,cAAc,UAAU,KAAA,IAC1B,OAEA,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IACE,WAAWD,6BAAO;IAClB,eAAY;IACZ,gBAAgB,UAAU;KACxB,IAAI,MAAM,WAAW,KAChB,MAAM,cAAc,gBAAgB,MAAM,cAAc,cAAc;KAC3E,MAAM,gBAAgB;KACtB,MAAM,eAAe;KACrB,cAAc,UAAU;MACtB,WAAW,MAAM;MACjB,QAAQ,MAAM;MACd,gBAAgB,MAAM,cAAc;MACpC,OAAO;KACT;KACA,IAAI,OAAO,MAAM,cAAc,sBAAsB,YACnD,MAAM,cAAc,kBAAkB,MAAM,SAAS;IAEzD;IACA,gBAAgB,UAAU;KACxB,MAAM,OAAO,cAAc;KAC3B,IAAI,SAAS,QAAQ,KAAK,cAAc,MAAM,WAAW;KACzD,MAAM,gBAAgB;KACtB,MAAM,QAAQ,KAAK,SAAS,MAAM;KAClC,IAAI,CAAC,KAAK,SAAS,KAAK,IAAI,KAAK,IAAI,gBAAgB;KACrD,KAAK,QAAQ;KACb,MAAM,eAAe;KACrB,MAAM,cAAc,QAAQ,WAAW;KACvC,MAAM,cAAc,YAAY,KAAK,iBAAiB;IACxD;IACA,cAAc,UAAU;KACtB,MAAM,OAAO,cAAc;KAC3B,IAAI,SAAS,QAAQ,KAAK,cAAc,MAAM,WAAW;KACzD,MAAM,gBAAgB;KACtB,cAAc,UAAU;KACxB,OAAO,MAAM,cAAc,QAAQ;KACnC,IAAI,OAAO,MAAM,cAAc,0BAA0B,eACnD,OAAO,MAAM,cAAc,sBAAsB,cAChD,MAAM,cAAc,kBAAkB,MAAM,SAAS,IAC1D,MAAM,cAAc,sBAAsB,MAAM,SAAS;IAE7D;IACA,kBAAkB,UAAU;KAC1B,IAAI,cAAc,SAAS,cAAc,MAAM,WAAW;KAC1D,MAAM,gBAAgB;KACtB,cAAc,UAAU;KACxB,OAAO,MAAM,cAAc,QAAQ;IACrC;IACA,uBAAuB,UAAU;KAC/B,IAAI,cAAc,SAAS,cAAc,MAAM,WAAW;KAC1D,cAAc,UAAU;KACxB,OAAO,MAAM,cAAc,QAAQ;IACrC;IAnDF,UAAA;KAqDE,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,WAAWA,6BAAO;MAAiB,UAAA,MAAM,OAAO;KAAY,CAAA;KAC9D,MAAM,OAAO,YAAY,WAAW,IACjC,OAEA,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,6BAAO;MAAvB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;OAAK,WAAWA,6BAAO;OAAmB,UAAA,EAAE,iBAAiB;MAAO,CAAA,GACpE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,MAAM,OAAO,YAAY,KAAK,MAAM,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAsC,KAAS,GAAtC,GAAG,OAAO,KAAK,EAAE,GAAG,MAAkB,CAAC,EAAM,CAAA,CACtG;;KAER,MAAM,OAAO,UAAU,WAAW,IAC/B,OAEA,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,6BAAO;MAAvB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;OAAK,WAAWA,6BAAO;OAAmB,UAAA,EAAE,kBAAkB;MAAO,CAAA,GACrE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,MAAM,OAAO,UAAU,KAAK,MAAM,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAsC,KAAS,GAAtC,GAAG,OAAO,KAAK,EAAE,GAAG,MAAkB,CAAC,EAAM,CAAA,CACpG;;KAET,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,6BAAO;MAAvB,UAAA;OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,EAAE,gBAAgB,EAAE,OAAO,MAAM,OAAO,gBAAgB,CAAC,EAAQ,CAAA;OACxE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAM,IAAO,CAAA;OACb,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,UAAU,MAAM,OAAO,aAAa,KAAK,CAAC,EAAQ,CAAA;MACtD;;IACF;;GAGT,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;IACE,WAAWA,6BAAO;IAClB,cAAY,EAAE,cAAc;IAC5B,eAAY;IAHd,UAAA;KAKE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,6BAAO;MAAvB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;OAAI,WAAWA,6BAAO;OAAc,UAAA,EAAE,cAAc;MAAM,CAAA,GAC1D,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAK,WAAWA,6BAAO;OAAvB,UAAA,CACG,OAAO,OAAO,0BAA0B,OACrC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAWA,6BAAO;QAAiB,UAAA,EAAE,iBAAiB;OAAQ,CAAA,IACpE,MACH,QAAQ,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAWA,6BAAO;QAAc,UAAA,EAAE,cAAc;OAAQ,CAAA,IAAI,IACxE;MACF,CAAA,CAAA;;KACJ,UAAU,KAAA,KAAa,CAAC,KAAK,QAE1B,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,6BAAO;MAAvB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,cAAc,EAAK,CAAA,GACzB,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OAAQ,MAAK;OAAS,WAAWA,6BAAO;OAAc,eAAe;QAAE,WAAW,KAAK;OAAE;OACtF,UAAA,EAAE,iBAAiB;MACd,CAAA,CACL;KAEL,CAAA,IAAA;KACH,KAAK,SAAS,OAAO,UAAU,UAC5B,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,WAAWA,6BAAO;MAAc,UAAA,EAAE,cAAc;KAAK,CAAA,IACxD;KACH,aAEG,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;MAAQ,MAAK;MAAS,WAAWA,6BAAO;MAAc,eAAe;OAAE,WAAW,KAAK;MAAE;MACtF,UAAA,EAAE,iBAAiB;KACd,CAAA,IAER;KACH,OAAO,UAAU,eAEd,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,6BAAO;MAAkB,MAAK;MAAS,aAAU;MAAjE,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,WAAWA,6BAAO;OAAe,eAAY;MAAQ,CAAA,GAC3D,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,UAAU,KAAA,IAAY,EAAE,mBAAmB,IAAI,EAAE,mBAAmB,EAAQ,CAAA,CAChF;KAEL,CAAA,IAAA;KACH;KACA,OAAO,UAAU,UAEd,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;MAAQ,MAAK;MAAS,WAAWA,6BAAO;MAAc,eAAe;OAAE,WAAW,IAAI;MAAE;MACrF,UAAA,QAAQ,EAAE,gBAAgB,IAAI,EAAE,mBAAmB;KAC9C,CAAA,IAER;KACH,OAAO,UAAU,UAEd,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MACE,WAAWA,6BAAO;MAClB,MAAK;MACL,mBAAiB,MAAM;MACvB,OAAO,MAAM;MAJf,UAAA,CAME,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,iBAAiB,MAAM,MAAM,CAAC,EAAQ,CAAA,GAC7C,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OAAQ,MAAK;OAAS,WAAWA,6BAAO;OAAc,eAAe;QAAE,WAAW,UAAU,KAAA,CAAS;OAAE;OACpG,UAAA,EAAE,cAAc;MACX,CAAA,CACL;KAEL,CAAA,IAAA;IACG;;EAEb;EAEA,SAAS,qBAAqB,EAC5B,MAAM,cAAc,mBAAmB,KAAK,GAAG,QAAQ,UAAU,kBAAkB,eAAe,SAAS,cAAc,YAAY,iBAe/G;GACtB,MAAM,CAAC,KAAK,WAAA,GAAUE,MAAAA,SAAAA,OAAqC,oBAAoB,UAAU,CAAC,CAAC,OAAO,QAAQ;GAC1G,CAAA,GAAA,MAAA,UAAA,OAAgB;IAAE,oBAAoB,YAAY,EAAE,IAAI,CAAC;GAAE,GAAG,CAAC,YAAY,GAAG,CAAC;GAC/E,MAAM,SAAA,GAAQC,MAAAA,MAAAA,CAAM;GACpB,MAAM,aAAA,GAAYF,MAAAA,OAAAA,CAA0B,IAAI;GAChD,MAAM,cAAA,GAAaA,MAAAA,OAAAA,CAA0B,IAAI;GACjD,MAAM,CAAC,gBAAgB,sBAAA,GAAqBC,MAAAA,SAAAA,CAA2B,IAAI;GAC3E,MAAM,CAAC,iBAAiB,uBAAA,GAAsBA,MAAAA,SAAAA,CAAsC,CAAC,CAAC;GACtF,MAAM,wBAAA,GAAuBD,MAAAA,OAAAA,iBAAO,IAAI,IAGrC,CAAC;GACJ,MAAM,uBAAA,GAAsBA,MAAAA,OAAAA,CAAO,CAAC;GACpC,MAAM,sBAAA,GAAqBA,MAAAA,OAAAA,CAA8B,KAAA,CAAS;GAElE,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,MAAM,WAAW,mBAAmB;IACpC,MAAM,UAAU,MAAM;IACtB,mBAAmB,UAAU;IAC7B,IAAI,aAAa,KAAA,KAAa,aAAa,SAAS;IACpD,MAAM,SAAS,qBAAqB,QAAQ,IAAI,QAAQ;IACxD,IAAI,WAAW,KAAA,GAAW;IAC1B,OAAO,WAAW,MAAM;IACxB,qBAAqB,QAAQ,OAAO,QAAQ;IAC5C,oBAAmB,YAAW;KAC5B,MAAM,QAAQ,QAAQ;KACtB,IAAI,OAAO,UAAU,gBAAgB,MAAM,cAAc,OAAO,WAAW,OAAO;KAClF,MAAM,OAAO,EAAE,GAAG,QAAQ;KAC1B,IAAI,MAAM,aAAa,KAAA,GAAW,OAAO,KAAK;UACzC,KAAK,YAAY;MAAE,OAAO;MAAS,OAAO,MAAM;KAAS;KAC9D,OAAO;IACT,CAAC;GACH,GAAG,CAAC,MAAM,EAAE,CAAC;GAEb,CAAA,GAAA,MAAA,UAAA,aAAsB;IACpB,KAAK,MAAM,UAAU,qBAAqB,QAAQ,OAAO,GAAG,OAAO,WAAW,MAAM;IACpF,qBAAqB,QAAQ,MAAM;GACrC,GAAG,CAAC,CAAC;GAEL,MAAM,kBAAA,GAAiBG,MAAAA,YAAAA,EAAa,YAA2B;IAC7D,IAAI,SAAS,KAAA,KAAa,KAAK,OAAO;IACtC,MAAM,YAAY,KAAK;IAEvB,qBADsC,QAAQ,IAAI,SAC3C,CAAC,EAAE,WAAW,MAAM;IAC3B,MAAM,YAAY,oBAAoB,UAAU;IAChD,oBAAoB,UAAU;IAC9B,MAAM,aAAa,IAAI,gBAAgB;IACvC,qBAAqB,QAAQ,IAAI,WAAW;KAAE;KAAW;IAAW,CAAC;IACrE,IAAI;IACJ,oBAAmB,YAAW;KAC5B,WAAW,WAAW,QAAQ,UAAU;KACxC,OAAO;MACL,GAAG;OACF,YAAY;OACX,OAAO;OACP;OACA,GAAI,aAAa,KAAA,IAAY,CAAC,IAAI,EAAE,SAAS;MAC/C;KACF;IACF,CAAC;IACD,iBAAsB,WAAW,EAAE,QAAQ,GAAG,WAAW,MAAM,CAAC,CAC7D,MAAK,WAAU;KACd,IAAI,qBAAqB,QAAQ,IAAI,SAAS,CAAC,EAAE,cAAc,WAAW;KAC1E,oBAAmB,aAAY;MAC7B,GAAG;OACF,YAAY,OAAO,SAAS,UACzB;OAAE,OAAO;OAAS,iBAAiB,KAAK;MAAU,IAClD;OACA,OAAO;OACP,OAAO;QAAE,QAAQ,OAAO;QAAQ,iBAAiB,KAAK;OAAU;MAClE;KACJ,EAAE;IACJ,CAAC,CAAC,CACD,OAAM,UAAS;KACd,IAAI,WAAW,OAAO,WACjB,qBAAqB,QAAQ,IAAI,SAAS,CAAC,EAAE,cAAc,WAAW;KAC3E,MAAM,UAAU,kBAAkB,KAAK;KACvC,oBAAmB,aAAY;MAC7B,GAAG;OACF,YAAY;OACX,OAAO;OACP,GAAG;OACH,GAAI,aAAa,KAAA,IAAY,CAAC,IAAI,EAAE,SAAS;MAC/C;KACF,EAAE;IACJ,CAAC,CAAC,CACD,cAAc;KACb,IAAI,qBAAqB,QAAQ,IAAI,SAAS,CAAC,EAAE,cAAc,WAC7D,qBAAqB,QAAQ,OAAO,SAAS;IAEjD,CAAC;GACL,GAAG,CAAC,MAAM,gBAAgB,CAAC;GAE3B,IAAI,SAAS,KAAA,GAAW,OAAO;GAC/B,MAAM,SAAS,mBAAmB,KAAK,eAAe,CAAC;GACvD,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IACE,WAAWJ,6BAAO;IAClB,MAAK;IACL,cAAY,EAAE,aAAa;IAC3B,uBAAoB;IACpB,eAAY;IACZ,uBAAoB;IANtB,UAAA;KAQE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,6BAAO;MAAvB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;OAAK,WAAWA,6BAAO;OAAe,UAAA,EAAE,aAAa;MAAO,CAAA,GAC5D,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OACE,MAAK;OACL,WAAWA,6BAAO;OAClB,cAAY,EAAE,aAAa;OAC3B,SAAS;OACV,UAAA;MAEO,CAAA,CACL;;KACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MAAK,WAAWA,6BAAO;MAAa,UAAA,KAAK,QAAQ,EAAE,iBAAiB,IAAI,KAAK;KAAW,CAAA;KACxF,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,6BAAO;MAAvB,UAAA;OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,UAAU,KAAK,WAAW,KAAK,CAAC,EAAQ,CAAA;OAC9C,WAAW,KACR,OACA,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAWA,6BAAO;QAAa,uBAAqB,KAAK;QAAgB,UAAA;OAAa,CAAA;OAC/F,KAAK,gBAAgB,IAClB,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,EAAE,mBAAmB,EAAE,OAAO,KAAK,cAAc,CAAC,EAAQ,CAAA,IACjE;MACD;;KACJ,iBAAiB,KAAA,IACd,OACA,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MAAK,WAAWA,6BAAO;MAAgB,UAAA,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;KAAO,CAAA;KAC9F,KAAK,aAAa,WAAW,IAC1B,OAEA,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;MAAS,WAAWA,6BAAO;MAAgB,mBAAgB;MAA3D,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;OAAK,IAAG;OAA8B,WAAWA,6BAAO;OACrD,UAAA,EAAE,oBAAoB;MACpB,CAAA,GACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UACG,KAAK,aAAa,KAAK,QAAQ,UAC9B,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD,EAAA,UAAA;OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAWA,6BAAO;QAAmB,UAAA,QAAQ;OAAQ,CAAA;OAC3D,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAWA,6BAAO;QACrB,UAAA,kBAAkB,IAAI,OAAO,SAAS,KAClC,EAAE,0BAA0B,EAAE,IAAI,OAAO,UAAU,CAAC;OACrD,CAAA;OACN,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAWA,6BAAO;QACrB,UAAA,OAAO,uBAAuB,OAC3B,EAAE,6BAA6B,IAC/B,EAAE,8BAA8B,EAAE,KAAK,OAAO,mBAAmB,CAAC;OAClE,CAAA;MACJ,EAAA,GAXK,OAAO,SAWZ,CACL,EACC,CAAA,CACG;;KAEb,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MACE,MAAK;MACL,cAAY,EAAE,aAAa;MAC3B,WAAWA,6BAAO;MAClB,YAAW,UAAS;OAClB,IAAI;OACJ,IAAI,MAAM,QAAQ,QAAQ,OAAO;YAC5B,IAAI,MAAM,QAAQ,OAAO,OAAO;YAChC,IAAI,MAAM,QAAQ,eAAe,MAAM,QAAQ,cAClD,OAAO,QAAQ,WAAW,YAAY;YACjC;OACP,MAAM,eAAe;OACrB,MAAM,gBAAgB;OACtB,OAAO,IAAI;OAEX,CADgB,SAAS,WAAW,YAAY,WAAA,CACxC,SAAS,MAAM;MACzB;MAhBF,UAAA,CAkBE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OACE,KAAK;OACL,IAAI,GAAG,MAAM;OACb,MAAK;OACL,MAAK;OACL,iBAAe,QAAQ;OACvB,iBAAe,GAAG,MAAM;OACxB,UAAU,QAAQ,WAAW,IAAI;OACjC,eAAe;QAAE,OAAO,QAAQ;OAAE;OAEjC,UAAA,EAAE,cAAc;MACX,CAAA,GACR,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OACE,KAAK;OACL,IAAI,GAAG,MAAM;OACb,MAAK;OACL,MAAK;OACL,iBAAe,QAAQ;OACvB,iBAAe,GAAG,MAAM;OACxB,UAAU,QAAQ,YAAY,IAAI;OAClC,eAAe;QAAE,OAAO,SAAS;OAAE;OAElC,UAAA,EAAE,aAAa;MACV,CAAA,CACL;;KACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MAAK,IAAI,GAAG,MAAM;MAAW,MAAK;MAAW,mBAAiB,GAAG,MAAM,GAAG;MACvE,UAAA,QAAQ,YACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,gBAAD;OAA8B,WAAW,KAAK;OAAgB;OAA2B;OAAe,MAAM;OAAkB;MAAI,GAA/G,KAAK,EAA0G,IACpI,iBAAA,GAAA,kBAAA,IAAA,CAAC,eAAD;OACM;OACN,OAAO,gBAAgB,KAAK;OACvB;OACF;OACH,YAAY;MACb,CAAA;KACA,CAAA;KACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,6BAAO;MAAvB,UAAA;OACG,iBAAiB,KAAA,IAAY,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,WAAWA,6BAAO;QAC3E,eAAe;SAAE,aAAa,KAAK,EAAE;QAAE;QAAI,UAAA,EAAE,WAAW;OAAU,CAAA;OACpE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QACE,MAAK;QACL,WAAWA,6BAAO;QAClB,eAAe;SAAE,OAAO,KAAK,EAAE;QAAE;QAEhC,UAAA,EAAE,YAAY;OACT,CAAA;OACR,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QACE,MAAK;QACL,WAAWA,6BAAO;QAClB,eAAe;SACb,SAAc,KAAK,EAAE,CAAC,CACnB,WAAW;UACV,mBAAkB,aAAY,aAAa,KAAK,KAAK,OAAO,QAAQ;SACtE,CAAC,CAAC,CACD,YAAY;UAAE,kBAAkB,KAAK,EAAE;SAAE,CAAC;QAC/C;QAEC,UAAA,EAAE,cAAc;OACX,CAAA;MACL;;KACJ,mBAAmB,KAAK,KACrB,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MAAK,WAAWA,6BAAO;MAAY,MAAK;MAAS,UAAA,EAAE,mBAAmB;KAAO,CAAA,IAC7E;IACD;;EAET;;EAGA,MAAM,YAAY;EAClB,MAAM,YAAY;;EAElB,MAAM,cAAc;;;;;;;;;;EAWpB,SAAS,QAAQ,EACf,OAAO,QAAQ,QAAQ,UAAU,UAAU,YAAY,KASxC;GAGf,MAAM,aAAa,kBAAkB,QAAQ,KAAW,GAAU;GAClE,MAAM,UAAU,MAAsB,cAAc,WAAW,UAAU,IAAI,WAAW;GACxF,MAAM,UAAU,MAAsB,cAAc,WAAW,UAAU,IAAI,WAAW;GAExF,MAAM,OAAO;IACX,GAAG,CAAC,SAAS,OAAO,SAAS;IAC7B,GAAG,CAAC,SAAS,OAAO,SAAS;IAC7B,OAAO,SAAS,QAAQ,SAAS;IACjC,QAAQ,SAAS,SAAS,SAAS;GACrC;GACA,MAAM,qBAAqB,UAAmD;IAC5E,MAAM,OAAO,MAAM,cAAc,sBAAsB;IACvD,MAAM,OAAO,MAAM,UAAU,KAAK;IAClC,MAAM,OAAO,MAAM,UAAU,KAAK;IAClC,YACG,OAAO,cAAc,WAAW,WAAW,WAAW,QACtD,OAAO,cAAc,WAAW,WAAW,WAAW,KACzD;GACF;GACA,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IACE,WAAWA,6BAAO;IAClB,OAAO;IACP,QAAQ;IACR,MAAK;IACL,cAAY,EAAE,gBAAgB;IAC9B,eAAY;IACZ,gBAAgB,UAAU;KACxB,IAAI,OAAO,MAAM,cAAc,sBAAsB,YACnD,MAAM,cAAc,kBAAkB,MAAM,SAAS;KAEvD,kBAAkB,KAAK;IACzB;IACA,gBAAgB,UAAU;KACxB,IAAI,MAAM,YAAY,GAAG;KACzB,kBAAkB,KAAK;IACzB;IAhBF,UAAA;KAkBG,OAAO,KAAI,UACV,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;MAEE,GAAG,OAAO,MAAM,CAAC;MACjB,GAAG,OAAO,MAAM,CAAC;MACjB,OAAO,MAAM,QAAQ,WAAW;MAChC,QAAQ,MAAM,SAAS,WAAW;MAClC,WAAWA,6BAAO;KACnB,GANM,KAAK,MAAM,WAMjB,CACF;KACA,MAAM,MAAM,KAAK,EAAE,KAAK,GAAG,QAC1B,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;MAEE,GAAG,OAAO,CAAC;MACX,GAAG,OAAO,CAAC;MACX,OAAO;MACP,QAAQ;MACR,WAAWA,6BAAO;KACnB,GANM,KAAK,KAMX,CACF;KACA,KAAK,QAAQ,WAAW,QAAQ,OAC5B,KAAK,SAAS,WAAW,QAAQ,MAElC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;MACE,GAAG,OAAO,KAAK,CAAC;MAChB,GAAG,OAAO,KAAK,CAAC;MAChB,OAAO,KAAK,QAAQ,WAAW;MAC/B,QAAQ,KAAK,SAAS,WAAW;MACjC,WAAWA,6BAAO;MAClB,eAAY;KACb,CAAA,IAED;IACD;;EAET;;EAGA,MAAM,aAAa;EACnB,MAAM,aAAa;;;;;;;;;;EAWnB,SAAgB,YAAY,EAC1B,MAAM,UAAU,aAAa,KAAK,GAAG,QAAQ,UAAU,kBAAkB,eACzE,SAAS,cAAc,OAAO,cAAc,cAqB7B;GACf,MAAM,CAAC,aAAA,GAAYE,MAAAA,SAAAA,OAAe,oBAAoB,UAAU,CAAC;GACjE,MAAM,cAAA,GAAaD,MAAAA,OAAAA,CAA8B,IAAI;GACrD,MAAM,CAAC,UAAU,gBAAA,GAAeC,MAAAA,SAAAA,OAAe,SAAS,YAAY,gBAAgB,CAAC;GACrF,MAAM,CAAC,UAAU,gBAAA,GAAeA,MAAAA,SAAAA,CAAS;IAAE,OAAO;IAAG,QAAQ;GAAE,CAAC;GAChE,MAAM,eAAA,GAAcD,MAAAA,OAAAA,CAAO,QAAQ;GACnC,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,MAAM,UAAU,WAAW;IAC3B,IAAI,YAAY,MAAM;IACtB,MAAM,gBAAsB;KAC1B,MAAM,OAAO,QAAQ,sBAAsB;KAC3C,MAAM,OAAO;MAAE,OAAO,KAAK;MAAO,QAAQ,KAAK;KAAO;KACtD,MAAM,WAAW,YAAY;KAC7B,IAAI,KAAK,UAAU,SAAS,SAAS,KAAK,WAAW,SAAS,QAAQ;KACtE,YAAY,UAAU;KACtB,YAAY,IAAI;KAChB,IAAI,SAAS,QAAQ,KAAK,SAAS,SAAS,GAC1C,aAAY,YAAW,eAAe,SAAS,UAAU,IAAI,CAAC;IAElE;IACA,QAAQ;IACR,IAAI,OAAO,mBAAmB,aAAa;KACzC,MAAM,WAAW,IAAI,eAAe,OAAO;KAC3C,SAAS,QAAQ,OAAO;KACxB,aAAa;MAAE,SAAS,WAAW;KAAE;IACvC;IACA,OAAO,iBAAiB,UAAU,OAAO;IACzC,aAAa;KAAE,OAAO,oBAAoB,UAAU,OAAO;IAAE;GAC/D,GAAG,CAAC,CAAC;GACL,MAAM,WAAA,GAAUA,MAAAA,OAAAA,CAAmE,IAAI;GACvF,MAAM,CAAC,WAAW,iBAAA,GAAgBC,MAAAA,SAAAA,CAAuC,CAAC,CAAC;GAC3E,MAAM,CAAC,WAAW,iBAAA,GAAgBA,MAAAA,SAAAA,CAA4B,CAAC,CAAC;GAChE,MAAM,CAAC,SAAS,eAAA,GAAcA,MAAAA,SAAAA,CAAwC,CAAC,CAAC;GACxE,MAAM,CAAC,wBAAwB,8BAAA,GAA6BA,MAAAA,SAAAA,CAAwB,IAAI;GACxF,MAAM,gBAAA,GAAeD,MAAAA,OAAAA,CAAO,SAAS;GACrC,aAAa,UAAU;GACvB,MAAM,gBAAA,GAAeA,MAAAA,OAAAA,CAAO,SAAS;GACrC,aAAa,UAAU;GACvB,MAAM,cAAA,GAAaA,MAAAA,OAAAA,CAAO,OAAO;GACjC,WAAW,UAAU;GACrB,MAAM,eAAA,GAAcA,MAAAA,OAAAA,CAUV,IAAI;GACd,MAAM,kBAAA,GAAiBA,MAAAA,OAAAA,CASb,IAAI;GACd,MAAM,oBAAA,GAAmBA,MAAAA,OAAAA,CAAO,KAAK;GACrC,MAAM,CAAC,UAAU,gBAAA,GAAeC,MAAAA,SAAAA,CAAwB,SAAS,YAAY,IAAI;GACjF,MAAM,sBAAA,GAAqBD,MAAAA,OAAAA,CAAO,SAAS,QAAQ;GACnD,MAAM,CAAC,sBAAsB,4BAAA,GAA2BC,MAAAA,SAAAA,CAAS,KAAK;GACtE,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,IAAI,aAAa,MAAM;IACvB,MAAM,OAAO,KAAK,MAAM,MAAK,UAAS,MAAM,QAAQ,QAAQ,CAAC,EAAE;IAC/D,MAAM,YAAY,mBAAmB,YAAY;IACjD,mBAAmB,UAAU,KAAA;IAC7B,IAAI,SAAS,KAAA,KAAa,EAAE,aAAa,KAAK,SAAS,eAAe,KAAK,aAAa,WAAW,iBAAiB,KAAK,mBAAmB,KAAA,IAAY;IACxJ,YAAY,IAAI;IAChB,wBAAwB,IAAI;GAC9B,GAAG,CAAC,UAAU,IAAI,CAAC;GACnB,MAAM,CAAC,WAAW,iBAAA,GAAgBA,MAAAA,SAAAA,CAAS,KAAK;GAChD,MAAM,CAAC,cAAc,oBAAA,GAAmBA,MAAAA,SAAAA,CAA+B,CAAC,CAAC;GACzE,MAAM,CAAC,kBAAkB,wBAAA,GAAuBA,MAAAA,SAAAA,CAAS,EAAE;GAC3D,MAAM,CAAC,UAAU,gBAAA,GAAeA,MAAAA,SAAAA,CAAwB,EAAE,OAAO,OAAO,CAAC;GACzE,MAAM,mBAAA,GAAkBD,MAAAA,OAAAA,CAA+B,IAAI;GAC3D,CAAA,GAAA,MAAA,UAAA,aAAsB;IAAE,gBAAgB,SAAS,MAAM;GAAE,GAAG,CAAC,CAAC;GAC9D,MAAM,CAAC,YAAY,kBAAA,GAAiBC,MAAAA,SAAAA,CAAwB,IAAI;GAEhE,MAAM,CAAC,QAAQ,cAAA,GAAaA,MAAAA,SAAAA,CAAwD,IAAI;GAGxF,MAAM,CAAC,eAAe,qBAAA,GAAoBA,MAAAA,SAAAA,CAAwB,IAAI;GAEtE,MAAM,CAAC,YAAY,kBAAA,GAAiBA,MAAAA,SAAAA,CAAwB,IAAI;GAChE,MAAM,gBAAA,GAAeD,MAAAA,OAAAA,CAAsB,IAAI;GAC/C,CAAA,GAAA,MAAA,UAAA,aAAsB;IACpB,IAAI,aAAa,YAAY,MAAM,OAAO,aAAa,aAAa,OAAO;GAC7E,GAAG,CAAC,CAAC;;GAGL,MAAM,oBAA0B;IAC9B,IAAI,aAAa,YAAY,MAAM,OAAO,aAAa,aAAa,OAAO;IAC3E,aAAa,UAAU;IACvB,cAAc,IAAI;GACpB;;GAGA,MAAM,aAAa,QAAsB;IACvC,aAAa,GAAG;IAChB,IAAI,aAAa,KAAK;KACpB,YAAY;KACZ;IACF;IACA,IAAI,aAAa,YAAY,MAAM,OAAO,aAAa,aAAa,OAAO;IAC3E,aAAa,UAAU,OAAO,iBAAiB;KAAE,cAAc,GAAG;IAAE,GAAG,aAAa;GACtF;;GAGA,MAAM,kBAAwB;IAC5B,aAAa,IAAI;IACjB,YAAY;GACd;GACA,MAAM,CAAC,WAAW,iBAAA,GAAgBC,MAAAA,SAAAA,CAAwB,IAAI;GAC9D,MAAM,CAAC,WAAW,iBAAA,GAAgBA,MAAAA,SAAAA,CAAwB,IAAI;GAC9D,MAAM,CAAC,OAAO,aAAA,GAAYA,MAAAA,SAAAA,CAAS,SAAS,SAAS,EAAE;GACvD,CAAA,GAAA,MAAA,UAAA,OAAgB;IAAE,oBAAoB,YAAY;KAAE;KAAU;KAAU;IAAM,CAAC;GAAE,GAAG;IAAC;IAAY;IAAU;IAAU;GAAK,CAAC;GAI3H,MAAM,CAAC,WAAW,iBAAA,GAAgBA,MAAAA,SAAAA,CAAS,KAAK;GAChD,MAAM,kBAAA,GAAiBD,MAAAA,OAAAA,CAAsB,IAAI;GACjD,CAAA,GAAA,MAAA,UAAA,aAAsB;IACpB,IAAI,eAAe,YAAY,MAAM,OAAO,aAAa,eAAe,OAAO;GACjF,GAAG,CAAC,CAAC;;GAGL,MAAM,cAAoB;IACxB,aAAa,IAAI;IACjB,IAAI,eAAe,YAAY,MAAM,OAAO,aAAa,eAAe,OAAO;IAC/E,eAAe,UAAU,OAAO,iBAAiB;KAAE,aAAa,KAAK;IAAE,GAAG,GAAG;GAC/E;GAIA,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,MAAM,SAAS,OAAO,eAAe,gBAAgB,WAAW;IAChE,aAAa,QAAQ,aAAa,CAAC,CAAC;IACpC,aAAa,QAAQ,aAAa,CAAC,CAAC;IACpC,WAAW,QAAQ,WAAW,CAAC,CAAC;IAChC,0BAA0B,YAAY,GAAG;GAC3C,GAAG,CAAC,YAAY,KAAK,YAAY,SAAS,CAAC;GAE3C,MAAM,gBAAA,GAAeI,MAAAA,QAAAA,OAAc,IAAI,IAAI,SAAS,GAAG,CAAC,SAAS,CAAC;GAGlE,MAAM,aAAA,GAAYJ,MAAAA,OAAAA,CAAO,KAAK;GAC9B,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,UAAU,UAAU,SAAS,aAAa,KAAA;GAC5C,GAAG,CAAC,YAAY,GAAG,CAAC;GAIpB,MAAM,aAAa,cAAsD;IACvE,MAAM,SAAS,SAAS,eAAe,QAAQ,gBAAgB;IAC/D,MAAM,OAAO,WAAW,OACpB,MAAM,MAAM,MAAK,UAAS,MAAM,QAAQ,OAAO,QAAQ,MAAM,IAC7D,MAAM,MAAM,MAAK,UAAS,MAAM,KAAK,SAAS,eAAe,MAAM,KAAK,MAAM,KAAK,MAAM,MAAM;IACnG,IAAI,SAAS,KAAA,GAAW;IACxB,IAAI;IACJ,KAAK,MAAM,SAAS,MAAM,OAAO;KAC/B,IAAI,MAAM,QAAQ,KAAK,KAAK;KAC5B,MAAM,KAAK,MAAM,IAAI,KAAK;KAC1B,MAAM,KAAK,MAAM,IAAI,KAAK;KAK1B,IAAI,EAJY,cAAc,SAAS,KAAK,KACxC,cAAc,UAAU,KAAK,IAC3B,cAAc,OAAO,KAAK,KACxB,KAAK,IACC;KACd,MAAM,WAAW,KAAK,MAAM,IAAI,EAAE;KAClC,IAAI,SAAS,KAAA,KAAa,WAAW,KAAK,UAAU,OAAO;MAAE,KAAK,MAAM;MAAK;KAAS;IACxF;IACA,IAAI,SAAS,KAAA,GAAW;IACxB,SAAS,cAA2B,kBAAkB,KAAK,IAAI,GAAG,CAAC,EAAE,MAAM;GAC7E;GACA,MAAM,EAAE,OAAO,QAAQ,QAAQ,qBAAA,GAAoBI,MAAAA,QAAAA,OAC3C,yBAAyB;IAC7B;IACA;IACA;IACA,WAAW;IACX;GACF,CAAC,GACD;IAAC;IAAM;IAAW;IAAU;IAAc;GAAO,CACnD;GACA,MAAM,cAAA,GAAaA,MAAAA,QAAAA,OAAc,IAAI,IAAI,MAAM,MAAM,KAAI,SAAQ,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;GAC5F,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,IAAI,2BAA2B,YAAY,OAAO,UAAU,SAAS;IAGrE,IAAI;IACJ,MAAM,cAAc,OAAO,4BAA4B;KACrD,eAAe,OAAO,4BAA4B;MAChD,MAAM,OAAO,WAAW,SAAS,sBAAsB;MACvD,IAAI,SAAS,KAAA,GAAW;MACxB,UAAU,UAAU;MACpB,YAAY,YAAY,QAAQ,KAAK,OAAO,KAAK,QAAQ,WAAW,CAAC;KACvE,CAAC;IACH,CAAC;IACD,aAAa;KACX,OAAO,qBAAqB,WAAW;KACvC,IAAI,iBAAiB,KAAA,GAAW,OAAO,qBAAqB,YAAY;IAC1E;GAGF,GAAG;IAAC,YAAY;IAAK;IAAQ;GAAsB,CAAC;GAGpD,MAAM,kBAAA,GAAiBA,MAAAA,QAAAA,OAAc;IACnC,MAAM,sBAAM,IAAI,IAAoB;IACpC,SAAS,SAAS,SAAS,UAAU;KACnC,IAAI,IAAI,QAAQ,QAAQ,eAAe,QAAQ,eAAe,WAAW,uBAAuB;IAClG,CAAC;IACD,OAAO;GACT,GAAG,CAAC,QAAQ,CAAC;GAEb,MAAM,gBAAA,GAAeA,MAAAA,QAAAA,OAAc;IACjC,MAAM,UAAU,IAAI,IAAI,MAAM,MAAM,KAAI,UAAS,CAAC,MAAM,KAAK,MAAM,KAAK,KAAK,CAAC,CAAC;IAC/E,MAAM,sBAAM,IAAI,IAAoB;IACpC,KAAK,MAAM,EAAE,UAAU,MAAM,OAAO;KAClC,IAAI,KAAK,SAAS,UAAU;KAC5B,MAAM,QAAQ,QAAQ,IAAI,KAAK,IAAI;KACnC,IAAI,UAAU,KAAA,GAAW,IAAI,IAAI,KAAK,IAAI,KAAK;IACjD;IACA,OAAO;GACT,GAAG,CAAC,KAAK,CAAC;GAGV,MAAM,iBAAA,GAAgBA,MAAAA,QAAAA,OACd,YAAY,MAAM,MAAM,KAAI,UAAS,MAAM,IAAI,GAAG,KAAK,GAC7D,CAAC,OAAO,KAAK,CACf;GAKA,MAAM,YAAA,GAAWA,MAAAA,QAAAA,OAGL;IACV,IAAI,kBAAkB,MAAM,OAAO;KAAE,MAAM;KAAe,MAAM;IAAS;IACzE,IAAI,cAAc,MAAM;KACtB,MAAM,QAAQ,MAAM,MAAM,MAAK,UAAS,MAAM,KAAK,OAAO,SAAS;KACnE,OAAO,UAAU,KAAA,IACb,OACA;MAAE,sBAAM,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,MAAM,KAAK,EAAE,CAAC;MAAG,MAAM;KAAU;IACzE;IACA,MAAM,WAAW,aAAa;IAC9B,IAAI,aAAa,MAAM,OAAO;IAC9B,MAAM,MAAM,cAAc,MAAM,MAAM,KAAI,UAAS,MAAM,IAAI,GAAG,QAAQ;IACxE,OAAO,IAAI,SAAS,IAAI,OAAO;KAAE,MAAM;KAAK,MAAM;IAAU;GAC9D,GAAG;IAAC;IAAe;IAAW;IAAW;IAAU;GAAK,CAAC;GACzD,MAAM,WAAW,UAAU,SAAS,WAAWL,6BAAO,YAAYA,6BAAO;GACzE,MAAM,sBAAA,GAAqBK,MAAAA,QAAAA,OAAc,IAAI,IAAI,MAAM,MACpD,QAAO,UAAS,UAAU,KAAK,IAAI,MAAM,GAAG,CAAC,CAAC,CAC9C,KAAI,UAAS,MAAM,KAAK,SAAS,CAAC,GAAG,CAAC,OAAO,QAAQ,CAAC;GACzD,MAAM,UAAU,QAAyB,aAAa,QAAQ,CAAC,SAAS,KAAK,IAAI,GAAG;GACpF,MAAM,cAAc,MAAc,OAChC,aAAa,QAAQ,EAAE,SAAS,KAAK,IAAI,IAAI,KAAK,SAAS,KAAK,IAAI,EAAE;GACxE,MAAM,eAAe,cACnB,aAAa,QAAQ,CAAC,mBAAmB,IAAI,SAAsB;;GAGrE,MAAM,WACJ,eACA,eACA,gBACS;IACT,MAAM,aAAa,IAAI,IAAI,MAAM,MAAM,KAAI,SAAQ,KAAK,GAAG,CAAC;IAC5D,MAAM,gBAAgB,IAAI,IAAY,SAAS,KAAI,YAAW,QAAQ,MAAM,CAAC;IAC7E,MAAM,QAAqB;KACzB,WAAW,OAAO,YAChB,OAAO,QAAQ,aAAa,CAAC,CAAC,QAAQ,CAAC,SAAS,WAAW,IAAI,GAAG,CAAC,CACrE;KACA,WAAW,cAAc,QAAO,WAAU,cAAc,IAAI,MAAM,CAAC;KACnE,SAAS,OAAO,YACd,OAAO,QAAQ,WAAW,CAAC,CAAC,QAAQ,CAAC,SAAS,cAAc,IAAI,GAAG,CAAC,CACtE;IACF;IACA,IAAI,UAAU,KAAA,GAAW,WAAW,YAAY,KAAK,KAAK;SACrD,MAAM,UAAU,KAAK;GAC5B;GAEA,MAAM,aAAa,SAAiB,YAA8C;IAChF,MAAM,OAAO,WAAW,SAAS,sBAAsB;IACvD,IAAI,SAAS,KAAA,GAAW,OAAO;KAAE,GAAG;KAAS,GAAG;IAAQ;IACxD,OAAO;KACL,IAAI,UAAU,KAAK,OAAO,SAAS,QAAQ,SAAS;KACpD,IAAI,UAAU,KAAK,MAAM,SAAS,QAAQ,SAAS;IACrD;GACF;GAEA,MAAM,gBAAgB,IAAY,WAAmB,SAAiB,aAA0C;IAC9G,gBAAgB,UAAU;KACxB,YAAY;KAGZ,iBAAiB,UAAU;KAC3B,IAAI,WAAW;KAGf,IAAI,aAAa,IAAI,SAAS,GAAG;KACjC,MAAM,QAAQ,UAAU,MAAM,SAAS,MAAM,OAAO;KACpD,YAAY,UAAU;MACpB,WAAW,MAAM;MACjB,KAAK;MACL,SAAS;MACT,OAAO,MAAM,IAAI;MACjB,OAAO,MAAM,IAAI;MACjB,QAAQ,MAAM;MACd,QAAQ,MAAM;MACd,OAAO;MACP,UAAU,aAAa,QAAQ;KACjC;KACA,IAAI,OAAO,MAAM,cAAc,sBAAsB,YACnD,MAAM,cAAc,kBAAkB,MAAM,SAAS;IAEzD;IACA,gBAAgB,UAAU;KACxB,MAAM,OAAO,YAAY;KACzB,IAAI,SAAS,QAAQ,KAAK,cAAc,MAAM,WAAW;KACzD,IAAI,CAAC,KAAK,SACL,KAAK,MAAM,MAAM,UAAU,KAAK,QAAQ,MAAM,UAAU,KAAK,MAAM,IAAI,gBAC1E;KAEF,KAAK,QAAQ;KACb,MAAM,QAAQ,UAAU,MAAM,SAAS,MAAM,OAAO;KAEpD,MAAM,UAAU,aACd;MAAE,GAAG,MAAM,IAAI,KAAK;MAAO,GAAG,MAAM,IAAI,KAAK;KAAM,GACnD,MAAM,MAAM,QAAO,UAAS,MAAM,QAAQ,KAAK,GAAG,GAClD,UAAU,SAAS,KACrB;KACA,UAAU;MAAE,GAAG,QAAQ;MAAQ,GAAG,QAAQ;KAAO,CAAC;KAGlD,MAAM,SAAS,WAAW,QAAQ,KAAK;KACvC,cAAa,aAAY;MACvB,GAAG;OACF,KAAK,MAAM;OACV,GAAG,QAAQ,KAAK,QAAQ,MAAM;OAC9B,GAAG,QAAQ,KAAK,QAAQ,MAAM;MAChC;KACF,EAAE;IACJ;IACA,cAAc,UAAU;KACtB,MAAM,OAAO,YAAY;KACzB,IAAI,SAAS,QAAQ,KAAK,cAAc,MAAM,WAAW;KACzD,YAAY,UAAU;KACtB,UAAU,IAAI;KACd,IAAI,CAAC,KAAK,OAAO;KACjB,iBAAiB,UAAU;KAC3B,QAAQ,aAAa,SAAS,aAAa,SAAS,WAAW,OAAO;IACxE;IACA,kBAAkB,UAAU;KAC1B,MAAM,OAAO,YAAY;KACzB,IAAI,SAAS,QAAQ,KAAK,cAAc,MAAM,WAAW;KACzD,YAAY,UAAU;KACtB,iBAAiB,UAAU;KAC3B,UAAU,IAAI;KACd,cAAa,YAAW,aAAa,SAAS,KAAK,KAAK,KAAK,QAAQ,CAAC;IACxE;IACA,eAAe;KACb,IAAI,iBAAiB,SAAS;MAC5B,iBAAiB,UAAU;MAC3B;KACF;KACA,YAAY;KACZ,IAAI,WAAW;MACb,IAAI,SAAS,UAAU,gBACjB,SAAS,UAAU,WAAW,SAAS,QAAQ,oBAAoB,KAAA,GAAY;MACrF,MAAM,OAAO,WAAW,IAAI,EAAE,CAAC,EAAE;MACjC,IAAI,SAAS,KAAA,KAAa,KAAK,SAAS,aAAa;MACrD,iBAAgB,YAAW,QAAQ,SAAS,KAAK,EAAE,IAC/C,QAAQ,QAAO,aAAY,aAAa,KAAK,EAAE,IAC/C,QAAQ,SAAS,IAAI,CAAC,GAAG,SAAS,KAAK,EAAE,IAAI,OAAO;MACxD,YAAY,EAAE,OAAO,OAAO,CAAC;MAC7B;KACF;KACA,YAAY,EAAE;IAChB;IACA,qBAAqB;KACnB,IAAI,WAAW;KACf,MAAM,OAAO,WAAW,IAAI,EAAE,CAAC,EAAE;KACjC,IAAI,MAAM,SAAS,aAAa,OAAO,WAAW,KAAK,KAAK,MAAM;UAC7D,IAAI,SAAS,KAAA,GAAW,OAAO,KAAK,EAAE;IAC7C;GACF;GAIA,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,MAAM,UAAU,WAAW;IAC3B,IAAI,YAAY,MAAM;IACtB,MAAM,WAAW,UAA4B;KAC3C,IAAI,MAAM,kBAAkB,WACvB,MAAM,OAAO,QAAQ,uBAAuB,MAAM,MAAM;KAC7D,MAAM,eAAe;KACrB,MAAM,OAAO,QAAQ,sBAAsB;KAC3C,aAAY,YAAW,OACrB,SACA,MAAM,UAAU,KAAK,MACrB,MAAM,UAAU,KAAK,KACrB,MAAM,SAAS,IAAI,eAAe,IAAI,YACxC,CAAC;IACH;IACA,QAAQ,iBAAiB,SAAS,SAAS,EAAE,SAAS,MAAM,CAAC;IAC7D,aAAa;KAAE,QAAQ,oBAAoB,SAAS,OAAO;IAAE;GAC/D,GAAG,CAAC,CAAC;GAEL,MAAM,iBAAA,GAAgBD,MAAAA,YAAAA,EAAa,UAAoD;IAKrF,IAAK,MAAM,OAAuB,QAAQ,mGAAmG,MAAM,MAAM;IACzJ,YAAY;IACZ,YAAY,IAAI;IAChB,QAAQ,UAAU;KAAE,WAAW,MAAM;KAAW,OAAO,MAAM;KAAS,OAAO,MAAM;IAAQ;IAC3F,MAAM,cAAc,MAAM;IAC1B,IAAI,OAAO,MAAM,cAAc,sBAAsB,YACnD,MAAM,cAAc,kBAAkB,MAAM,SAAS;GAEzD,GAAG,CAAC,CAAC;GAEL,MAAM,iBAAA,GAAgBA,MAAAA,YAAAA,EAAa,UAAoD;IACrF,MAAM,OAAO,QAAQ;IACrB,IAAI,SAAS,QAAQ,KAAK,cAAc,MAAM,WAAW;IAGzD,MAAM,KAAK,MAAM,UAAU,KAAK;IAChC,MAAM,KAAK,MAAM,UAAU,KAAK;IAChC,KAAK,QAAQ,MAAM;IACnB,KAAK,QAAQ,MAAM;IACnB,aAAY,YAAW,MAAM,SAAS,IAAI,EAAE,CAAC;GAC/C,GAAG,CAAC,CAAC;GAEL,MAAM,WAAA,GAAUA,MAAAA,YAAAA,EAAa,UAAoD;IAC/E,IAAI,QAAQ,SAAS,cAAc,MAAM,WAAW,QAAQ,UAAU;GACxE,GAAG,CAAC,CAAC;GAEL,MAAM,kBAAkB,WAAyB;IAC/C,MAAM,OAAO,WAAW,SAAS,sBAAsB;IACvD,IAAI,SAAS,KAAA,GAAW;IACxB,aAAY,YAAW,OAAO,SAAS,KAAK,QAAQ,GAAG,KAAK,SAAS,GAAG,MAAM,CAAC;GACjF;;GAGA,MAAM,aAAa,WAAgC;IACjD,MAAM,OAAO,WAAW,SAAS,sBAAsB;IACvD,IAAI,SAAS,KAAA,GAAW;IACxB,MAAM;IACN,YAAY,YAAY,QAAQ,KAAK,OAAO,KAAK,QAAQ,WAAW,CAAC;GACvE;GAEA,MAAM,YAAkB;IAAE,UAAU,MAAM;GAAE;;GAG5C,MAAM,iBAAuB;IAC3B,aAAa,CAAC,CAAC;IACf,WAAW,CAAC,CAAC;IACb,QAAQ,CAAC,GAAG,aAAa,SAAS,CAAC,CAAC;GACtC;;GAGA,MAAM,cAAoB;IACxB,aAAa,CAAC,CAAC;IACf,aAAa,CAAC,CAAC;IACf,WAAW,CAAC,CAAC;IACb,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAClB,UAAU,eAAe;GAC3B;;GAGA,MAAM,YAAY,UAAkB,aAA2B;IAC7D,MAAM,OAAO,WAAW,SAAS,sBAAsB;IACvD,IAAI,SAAS,KAAA,GAAW;IACxB,aAAY,aAAY;KACtB,GAAG;KACH,MAAM,KAAK,QAAQ,IAAI,WAAW,QAAQ;KAC1C,MAAM,KAAK,SAAS,IAAI,WAAW,QAAQ;IAC7C,EAAE;GACJ;;GAGA,MAAM,cAAc,QAAsB;IACxC,MAAM,QAAQ,MAAM,MAAM,MAAK,UAAS,MAAM,QAAQ,GAAG;IACzD,IAAI,UAAU,KAAA,GAAW;IACzB,MAAM;IACN,SAAS,MAAM,IAAA,KAAgB,MAAM,IAAA,EAAc;GACrD;;GAGA,MAAM,eAAe,aAAa,OAC9B,MAAM,MAAM,MAAK,UAAS,MAAM,KAAK,OAAO,QAAQ,CAAC,EAAE,OACvD,KAAA;GAKJ,MAAM,eAAe;IACnB,MAAM,SAAS,OAAO,OAAO,IAAI,SAAS;IAC1C,KAAK,SAAS,OAAO,OAAO,IAAI,SAAS;IACzC,OAAO,SAAS,QAAQ,OAAO,IAAI,OAAO,SAAS,SAAS;IAC5D,QAAQ,SAAS,QAAQ,OAAO,IAAI,OAAO,UAAU,SAAS;GAChE;GACA,MAAM,cAAc,SAAS,SAAS,KAAK,SAAS,UAAU,KACzD,aAAa,OAAO,MACpB,aAAa,MAAM,MACnB,aAAa,QAAQ,SAAS,QAAQ,KACtC,aAAa,SAAS,SAAS,SAAS;GAE7C,MAAM,iBAAiB,WAAyB;IAC9C,MAAM,OAAO,aAAa,IAAI,MAAM,IAChC,UAAU,QAAO,UAAS,UAAU,MAAM,IAC1C,CAAC,GAAG,WAAW,MAAM;IACzB,aAAa,IAAI;IACjB,QAAQ,aAAa,SAAS,MAAM,WAAW,OAAO;GACxD;GAEA,MAAM,mBAAyB;IAC7B,IAAI,SAAS,UAAU,cAAc;IACrC,gBAAgB,SAAS,MAAM;IAC/B,gBAAgB,UAAU;IAC1B,aAAa,KAAK;IAClB,gBAAgB,CAAC,CAAC;IAClB,YAAY,EAAE,OAAO,OAAO,CAAC;GAC/B;GAEA,MAAM,oBAA0B;IAC9B,IAAI,aAAa,SAAS,KAAK,aAAa,SAAS,KAChD,iBAAiB,KAAK,MAAM,MAAM,4BAA4B,gBAAgB,KAC9E,SAAS,UAAU,cAAc;IACtC,MAAM,aAAa,IAAI,gBAAgB;IACvC,gBAAgB,SAAS,MAAM;IAC/B,gBAAgB,UAAU;IAC1B,MAAM,eAAe,SAAS,UAAU,UACpC,SAAS,QAAQ,kBACjB,KAAA;IACJ,YAAY,EAAE,OAAO,aAAa,CAAC;IAInC,CAHgB,iBAAiB,KAAA,IAC7B,QAAQ,cAAc,kBAAkB,WAAW,MAAM,IACzD,aAAa,cAAc,cAAc,kBAAkB,WAAW,MAAM,EAAA,CAE7E,WAAW;KACV,IAAI,gBAAgB,YAAY,cAAc,WAAW,OAAO,SAAS;KACzE,gBAAgB,UAAU;KAC1B,aAAa,KAAK;KAClB,gBAAgB,CAAC,CAAC;KAClB,YAAY,EAAE,OAAO,OAAO,CAAC;IAC/B,CAAC,CAAC,CACD,OAAM,UAAS;KACd,IAAI,gBAAgB,YAAY,cAAc,WAAW,OAAO,SAAS;KACzE,gBAAgB,UAAU;KAC1B,YAAY;MAAE,OAAO;MAAS,SAAS,eAAe,KAAK;KAAE,CAAC;IAChE,CAAC;GACL;;GAGA,MAAM,mBAAmB,eAKnB;IACJ,gBAAgB,UAAU;KAExB,IAAK,MAAM,OAAuB,QAAQ,QAAQ,MAAM,MAAM;KAC9D,iBAAiB,SAAS;KAC1B,eAAe,UAAU;MACvB,WAAW,MAAM;MACjB;MACA,OAAO,MAAM;MACb,OAAO,MAAM;MACb,QAAQ,MAAM;MACd,QAAQ,MAAM;MACd,OAAO;MACP,UAAU,WAAW,QAAQ;KAC/B;KACA,IAAI,OAAO,MAAM,cAAc,sBAAsB,YACnD,MAAM,cAAc,kBAAkB,MAAM,SAAS;IAEzD;IACA,gBAAgB,UAAU;KACxB,MAAM,OAAO,eAAe;KAC5B,IAAI,SAAS,QAAQ,KAAK,cAAc,MAAM,WAAW;KACzD,IAAI,CAAC,KAAK,SACL,KAAK,MAAM,MAAM,UAAU,KAAK,QAAQ,MAAM,UAAU,KAAK,MAAM,IAAI,gBAC1E;KAEF,KAAK,QAAQ;KAGb,MAAM,MAAM,MAAM,UAAU,KAAK,SAAS,SAAS;KACnD,MAAM,MAAM,MAAM,UAAU,KAAK,SAAS,SAAS;KACnD,KAAK,QAAQ,MAAM;KACnB,KAAK,QAAQ,MAAM;KACnB,YAAY,YAAY;MACtB,MAAM,OAAO,QAAQ,KAAK,cAAc;OAAE,IAAI;OAAG,IAAI;MAAE;MACvD,OAAO;OACL,GAAG;QACF,KAAK,YAAY;QAAE,IAAI,KAAK,KAAK;QAAI,IAAI,KAAK,KAAK;OAAG;MACzD;KACF,CAAC;IACH;IACA,cAAc,UAAU;KACtB,MAAM,OAAO,eAAe;KAC5B,IAAI,SAAS,QAAQ,KAAK,cAAc,MAAM,WAAW;KACzD,eAAe,UAAU;KACzB,IAAI,CAAC,KAAK,OAAO;KACjB,QAAQ,aAAa,SAAS,aAAa,SAAS,WAAW,OAAO;IACxE;IACA,kBAAkB,UAAU;KAC1B,MAAM,OAAO,eAAe;KAC5B,IAAI,SAAS,QAAQ,KAAK,cAAc,MAAM,WAAW;KACzD,eAAe,UAAU;KACzB,YAAW,YAAW,aAAa,SAAS,KAAK,WAAW,KAAK,QAAQ,CAAC;IAC5E;GACF;;GAGA,MAAM,uBAA6B;IACjC,MAAM;IACN,eAAe,IAAI,SAAS,KAAK;GACnC;GAEA,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IACE,KAAK;IACL,WAAWJ,6BAAO;IAClB,MAAK;IACL,cAAY,EAAE,oBAAoB;IAClC,UAAU;IACV,OAAO;KACL,iBAAiB;KACjB,gBAAgB,GAAG,OAAO,SAAS,MAAM,KAAK,OAAO,SAAS,MAAM;KACpE,oBAAoB,GAAG,SAAS,KAAK,KAAK,SAAS,KAAK;IAC1D;IACe;IACA;IACf,aAAa;IACb,iBAAiB;IACjB,YAAY,UAAU;KAEpB,IAAK,MAAM,OAAuB,QAAQ,yBAAyB,MAAM,MAAM;KAC/E,IAAI,MAAM,QAAQ,UAAU;MAC1B,YAAY;MACZ,YAAY,IAAI;MAChB;KACF;KACA,MAAM,YAAY,MAAM,QAAQ,cAAc,SAC1C,MAAM,QAAQ,eAAe,UAC3B,MAAM,QAAQ,YAAY,OACxB,MAAM,QAAQ,cAAc,SAC1B,KAAA;KACV,IAAI,cAAc,KAAA,GAAW;MAC3B,MAAM,eAAe;MACrB,UAAU,SAAS;MACnB;KACF;KAEA,IAAI,MAAM,QAAQ,OAAO,MAAM,QAAQ,KAAK;MAC1C,MAAM,eAAe;MACrB,eAAe,YAAY;MAC3B;KACF;KACA,IAAI,MAAM,QAAQ,OAAO,MAAM,QAAQ,KAAK;MAC1C,MAAM,eAAe;MACrB,eAAe,IAAI,YAAY;MAC/B;KACF;KACA,IAAI,MAAM,QAAQ,KAAK;MACrB,MAAM,eAAe;MACrB,eAAe;MACf;KACF;KACA,IAAI,MAAM,QAAQ,KAAK;MACrB,MAAM,eAAe;MACrB,IAAI;KACN;IACF;IArDF,UAAA;KAuDE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MACE,WAAW,KACTA,6BAAO,SACP,SAAS,QAAQ,YAAYA,6BAAO,UAAU,MAC9C,YAAYA,6BAAO,WAAW,IAChC;MACA,OAAO;OACL,OAAO,GAAG,MAAM,MAAM;OACtB,QAAQ,GAAG,MAAM,OAAO;OACxB,WAAW,aAAa,SAAS,KAAK,MAAM,SAAS,KAAK,YAAY,SAAS,MAAM;MACvF;MAVF,UAAA;OAYG,OAAO,KAAI,UACV,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;QAEE,WAAW,KACTA,6BAAO,OACP,YAAY,MAAM,SAAS,IAAI,WAAW,MAC1C,kBAAkB,MAAM,YAAYA,6BAAO,cAAc,IAC3D;QACA,mBAAiB,MAAM;QACvB,OAAO;SACL,MAAM,GAAG,MAAM,EAAE;SACjB,KAAK,GAAG,MAAM,EAAE;SAChB,OAAO,GAAG,MAAM,MAAM;SACtB,QAAQ,GAAG,MAAM,OAAO;QAC1B;QAEA,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;SACE,WAAWA,6BAAO;SAClB,sBAAoB,MAAM;SAC1B,GAAI,gBAAgB,MAAM,SAAS;SAHrC,UAAA;UAKE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;WACE,MAAK;WACL,WAAWA,6BAAO;WAClB,iBAAe,CAAC,MAAM;WACtB,cAAY,EAAE,MAAM,YAAY,mBAAmB,kBAAkB;WACrE,eAAe;YAAE,cAAc,MAAM,SAAS;WAAE;WAE/C,UAAA,MAAM,YAAY,MAAM;UACnB,CAAA;UACR,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;WACE,WAAWA,6BAAO;WAClB,OAAO,EAAE,YAAY,OAAO,eAAe,MAAM,YAAY,GAAG;UACjE,CAAA;UACD,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;WAAM,WAAWA,6BAAO;WAAa,UAAA,MAAM;UAAY,CAAA;SACpD;;OACF,GAlCE,MAAM,SAkCR,CACN;OACD,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QACE,WAAWA,6BAAO;QAClB,OAAO,MAAM;QACb,QAAQ,MAAM;QACd,SAAS,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,MAAM,GAAG,MAAM;QACvD,OAAO;SAAE,MAAM,GAAG,MAAM,EAAE;SAAK,KAAK,GAAG,MAAM,EAAE;QAAI;QACnD,eAAY;QANd,UAAA,CAQG,MAAM,MAAM,KAAK,EAAE,MAAM,WAAW;SACnC,MAAM,KAAK,WAAW,IAAI,KAAK,EAAE;SACjC,IAAI,OAAO,KAAA,GAAW,OAAO;SAC7B,MAAM,KAAK,GAAG,IAAA;SACd,MAAM,QAAQ,KAAK,SAAS;SAC5B,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD;UAEE,WAAW,KACTA,6BAAO,WACP,WAAW,KAAK,MAAM,KAAK,EAAE,IAAI,WAAW,MAC5C,cAAc,KAAK,KAAKA,6BAAO,UAAU,IAC3C;UANF,UAAA;WAQE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;YACE,WAAWA,6BAAO;YAClB,GAAG;YACH,gBAAc,KAAK;YACnB,oBAAoB;aAAE,aAAa,KAAK,EAAE;YAAE;YAC5C,oBAAoB;aAAE,aAAa,IAAI;YAAE;WAC1C,CAAA;WACD,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;YACE,WAAW,KAAK,SAAS,WAAWA,6BAAO,aAAa,QAAQA,6BAAO,YAAYA,6BAAO;YAC1F,kBAAgB,KAAK;YACrB,GAAG;WACJ,CAAA;WACD,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;YACE,WAAW,QAAQA,6BAAO,iBAAiBA,6BAAO;YAClD,GAAG,KAAK,KAAK,EAAE,GAAG,GAAG,IAAI,EAAE,KAAK,GAAG,GAAG,GAAG,EAAE,KAAK,KAAK,EAAE,GAAG,GAAG,IAAI,EAAE;WACpE,CAAA;UACA;SAvBI,GAAA,KAAK,EAuBT;QAEP,CAAC,GACA,eAAe,cAAc;SAC5B,MAAM,UAAU,MAAM,MAAM,MAAK,UAAS,MAAM,QAAQ,UAAU;SAClE,IAAI,YAAY,KAAA,GAAW,OAAO;SAClC,MAAM,KAAK,QAAQ,IAAA;SACnB,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;UACE,WAAWA,6BAAO;UAClB,kBAAe;UACf,iBAAgB;UAChB,IAAI;UAAI,IAAI,QAAQ,IAAA;UACpB,IAAI;UAAI,IAAI,QAAQ,IAAA,KAAa;SAClC,CAAA;QAEL,EAAA,CAAG,IAAI,IACJ;;OACJ,QAAQ,KAAK,OAEV,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;QACE,WAAWA,6BAAO;QAClB,OAAO,EAAE,MAAM,GAAG,OAAO,EAAE,IAAI;QAC/B,eAAY;OACb,CAAA,IAED;OACH,QAAQ,KAAK,OAEV,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;QACE,WAAWA,6BAAO;QAClB,OAAO,EAAE,KAAK,GAAG,OAAO,EAAE,IAAI;QAC9B,eAAY;OACb,CAAA,IAED;OACH,MAAM,MAAM,KAAI,aACf,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAEE,MAAM;QACD;QACF;QACH,UAAU,aAAa,SAAS,KAAK,IAAI,SAAS,KAAK,WAAW,SAAS,GAAG,SAAS,CAAC;QACxF,UAAU,aAAa,SAAS,KAAK;QACrC,YAAY,SAAS,KAAK,SAAS,eAAe,aAAa,SAAS,SAAS,KAAK,EAAE,IACpF,aAAa,QAAQ,SAAS,KAAK,EAAE,IAAI,IACzC,KAAA;QACJ,cAAc;QACd,cAAc,eAAe,SAAS;QACtC,UAAU,OAAO,SAAS,GAAG,IAAI,WAAW;QAC5C,cAAc,QAAQ;SACpB,IAAI,QAAQ,MAAM,UAAU;cACvB,UAAU,GAAG;QACpB;QACA,cAAc,eAAe,IAAI,SAAS,KAAK,SAAS,MAClD,SAAS,KAAK,cAAc,SAAS,KAAK,KAAK,6BAA6B;OACnF,GAlBM,SAAS,GAkBf,CACF;MACE;;KACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,6BAAO;MAAvB,UAAA;OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;QACE,WAAWA,6BAAO;QAClB,OAAO;QACP,aAAa,EAAE,oBAAoB;QACnC,cAAY,EAAE,oBAAoB;QAClC,oBAAkB,kBAAkB,OAAO,KAAA,IAAY;QACvD,WAAW,UAAU;SAAE,SAAS,MAAM,OAAO,KAAK;QAAE;QACpD,YAAY,UAAU;SACpB,IAAI,MAAM,QAAQ,WAAW,kBAAkB,MAAM;UACnD,MAAM,QAAQ,MAAM,MAAM,MAAK,UAAS,cAAc,IAAI,MAAM,GAAG,CAAC;UACpE,IAAI,UAAU,KAAA,GAAW,WAAW,MAAM,GAAG;SAC/C;SACA,IAAI,MAAM,QAAQ,UAAU;UAC1B,SAAS,EAAE;UACX,MAAM,cAAc,KAAK;SAC3B;QACF;OACD,CAAA;OACA,UAAU,KAEP,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,cAAY,EAAE,cAAc;QAAG,eAAe;SAAE,SAAS,EAAE;QAAE;QAAG,UAAA;OAE9E,CAAA,IAER;OACH,kBAAkB,OAEf,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QACE,IAAG;QACH,WAAWA,6BAAO;QAClB,MAAK;QACL,aAAU;QACV,eAAY;QAEX,UAAA,cAAc,SAAS,IACpB,EAAE,aAAa,IACf,EAAE,kBAAkB,EAAE,OAAO,cAAc,KAAK,CAAC;OACjD,CAAA,IAEN;MACD;;KACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,6BAAO;MAAU,MAAK;MAAQ,cAAY,EAAE,eAAe;MAA3E,UAAA;OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,cAAY,EAAE,iBAAiB;QAAG,eAAe;SAAE,eAAe,IAAI,YAAY;QAAE;QAAG,UAAA;OAAS,CAAA;OACtH,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,cAAY,EAAE,mBAAmB;QAAG,SAAS;QAChE,UAAA,GAAG,KAAK,MAAM,SAAS,QAAQ,GAAG,EAAE;OAC/B,CAAA;OACR,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,cAAY,EAAE,gBAAgB;QAAG,eAAe;SAAE,eAAe,YAAY;QAAE;QAAG,UAAA;OAAS,CAAA;OACjH,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAWA,6BAAO;QAAgB,eAAY;OAAQ,CAAA;OAC5D,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,cAAY,EAAE,aAAa;QAAG,SAAS;QAAM,UAAA,EAAE,aAAa;OAAU,CAAA;OAC5F,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,cAAY,EAAE,kBAAkB;QAAG,SAAS;QAAW,UAAA,EAAE,kBAAkB;OAAU,CAAA;OAC3G,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,cAAY,EAAE,eAAe;QAAG,SAAS;QAAQ,UAAA,EAAE,eAAe;OAAU,CAAA;OAClG,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAWA,6BAAO;QAAgB,eAAY;OAAQ,CAAA;OAC5D,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QACE,MAAK;QACL,cAAY,EAAE,gBAAgB;QAC9B,eAAe;SACb,MAAM,SAAS,MAAM,MAAM,MAAK,UAAS,MAAM,KAAK,SAAS,eAAe,MAAM,KAAK,MAAM;SAC7F,IAAI,WAAW,KAAA,GAAW,WAAW,OAAO,GAAG;QACjD;QAEC,UAAA,EAAE,gBAAgB;OACb,CAAA;OACR,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAWA,6BAAO;QAAgB,eAAY;OAAQ,CAAA;OAC3D,UAAU,KAAA,IAAY,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QACrB,MAAK;QACL,WAAWA,6BAAO;QAClB,cAAY,EAAE,eAAe;QAC7B,gBAAc;QACd,UAAU,SAAS,UAAU;QAC7B,eAAe;SACb,IAAI,WAAW;UACb,WAAW;UACX;SACF;SACA,YAAY;SACZ,YAAY,IAAI;SAChB,gBAAgB,CAAC,CAAC;SAClB,oBAAoB,EAAE,0BAA0B,CAAC;SACjD,YAAY,EAAE,OAAO,OAAO,CAAC;SAC7B,aAAa,IAAI;QACnB;QAEC,UAAA,EAAE,eAAe;OACZ,CAAA,IAAI;MACT;;KACJ,YAEG,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MACE,WAAW,KAAKA,6BAAO,OAAOA,6BAAO,UAAU;MAC/C,MAAK;MACL,cAAY,EAAE,aAAa;MAC3B,uBAAoB;MAJtB,UAAA;OAME,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,WAAWA,6BAAO;QAAvB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;SAAK,WAAWA,6BAAO;SAAe,UAAA,EAAE,aAAa;QAAO,CAAA,GAC5D,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SACE,MAAK;SACL,WAAWA,6BAAO;SAClB,cAAY,EAAE,aAAa;SAC3B,UAAU,SAAS,UAAU;SAC7B,SAAS;SACV,UAAA;QAEO,CAAA,CACL;;OACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;QAAG,WAAWA,6BAAO;QAAa,UAAA,EAAE,aAAa;OAAK,CAAA;OACrD,SAAS,UAAU,eAEhB,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,WAAWA,6BAAO;QAAe,MAAK;QAAS,aAAU;QAA9D,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;SAAM,WAAWA,6BAAO;SAAe,eAAY;QAAQ,CAAA,GAC3D,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,EAAE,kBAAkB,EAAQ,CAAA,CAChC;OAGL,CAAA,IAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;QAAK,WAAWA,6BAAO;QAAY,MAAK;QAAS,aAAU;QACxD,UAAA,EAAE,uBAAuB,EAAE,OAAO,aAAa,OAAO,CAAC;OACrD,CAAA;OAER,SAAS,UAAU,UAEhB,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QACE,WAAWA,6BAAO;QAClB,MAAK;QACL,mBAAiB,SAAS,QAAQ;QAClC,oBAAkB,SAAS,QAAQ;QACnC,OAAO,SAAS,QAAQ;QAL1B,UAAA,CAOE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,EAAE,gBAAgB,SAAS,OAAO,CAAC,EAAQ,CAAA,GACjD,SAAS,QAAQ,oBAAoB,KAAA,IAClC,OACA,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,EAAE,kBAAkB,EAAQ,CAAA,CACpC;OAEL,CAAA,IAAA;OACJ,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;QAAI,WAAWA,6BAAO;QACnB,UAAA,aAAa,KAAK,UAAU,UAAU;SACrC,MAAM,SAAS,MAAM,MAAM,MAAK,UAAS,MAAM,KAAK,OAAO,QAAQ,CAAC,EAAE;SACtE,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD,EAAA,UAAA;UACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;WAAM,WAAWA,6BAAO;WAAmB,UAAA,QAAQ;UAAQ,CAAA;UAC3D,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,QAAQ,SAAS,SAAe,CAAA;UACvC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;WACE,MAAK;WACL,UAAU,SAAS,UAAU,gBACvB,SAAS,UAAU,WAClB,SAAS,QAAQ,oBAAoB,KAAA;WAC5C,cAAY,EAAE,gBAAgB,EAAE,MAAM,QAAQ,SAAS,SAAS,CAAC;WACjE,eAAe;YACb,iBAAgB,YAAW,QAAQ,QAAO,OAAM,OAAO,QAAQ,CAAC;YAChE,IAAI,SAAS,UAAU,SAAS,YAAY,EAAE,OAAO,OAAO,CAAC;WAC/D;WACD,UAAA;UAEO,CAAA;SACN,EAAA,GAhBK,QAgBL;QAER,CAAC;OACC,CAAA;OACJ,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD;QAAO,WAAWA,6BAAO;QAAzB,UAAA;SACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,EAAE,mBAAmB,EAAQ,CAAA;SACpC,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;UACE,OAAO;UACP,cAAY,EAAE,mBAAmB;UACjC,MAAM;UACN,UAAU,SAAS,UAAU,gBACvB,SAAS,UAAU,WAClB,SAAS,QAAQ,oBAAoB,KAAA;UAC5C,WAAW,UAAU;WACnB,oBAAoB,MAAM,OAAO,KAAK;WACtC,IAAI,SAAS,UAAU,SAAS,YAAY,EAAE,OAAO,OAAO,CAAC;UAC/D;SACD,CAAA;SACA,4BAA4B,gBAAgB,IAEzC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;UAAM,WAAWA,6BAAO;UAAuB,MAAK;UACjD,UAAA,EAAE,4BAA4B;SAC3B,CAAA,IAEN;QACC;;OACN,SAAS,UAAU,WAAW,SAAS,QAAQ,oBAAoB,KAAA,IAEhE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QACE,MAAK;QACL,WAAWA,6BAAO;QAClB,eAAe;SAAE,OAAO,SAAS,QAAQ,eAAgB;QAAE;QAE1D,UAAA,EAAE,kBAAkB;OACf,CAAA,IAER;OACJ,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,WAAWA,6BAAO;QAAvB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SACE,MAAK;SACL,WAAWA,6BAAO;SAClB,UAAU,SAAS,UAAU;SAC7B,SAAS;SAER,UAAA,EAAE,cAAc;QACX,CAAA,GACR,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SACE,MAAK;SACL,WAAWA,6BAAO;SAClB,UAAU,aAAa,SAAS,KAAK,iBAAiB,KAAK,MAAM,MAC5D,4BAA4B,gBAAgB,KAC5C,SAAS,UAAU;SACxB,SAAS;SAER,UAAA,SAAS,UAAU,UAAU,EAAE,aAAa,IAAI,EAAE,cAAc;QAC3D,CAAA,CACL;;MACF;KAEL,CAAA,IAAA;KACH,UAAU,KAAA,IAAY,iBAAA,GAAA,kBAAA,IAAA,CAAC,sBAAD;MACT;MACZ,qBAAqB;OAAE,YAAY,IAAI;OAAG,wBAAwB,IAAI;MAAE;MAC1D;MACd,MAAM,aAAa,cAAc,SAAS,cAAc,KAAA,IAAY;MACpE,cAAc,aAAa,OAAO,KAAA,IAAY,aAAa,IAAI,QAAQ;MACvE,mBAAmB,IAAI,IAAI,MAAM,MAAM,KAAI,UAAS,CAAC,MAAM,KAAK,MAAM,KAAK,KAAK,CAAC,CAAC;MAC7E;MACF;MACK;MACE;MACQ;MACH;MACf,eAAe;OAAE,YAAY,IAAI;MAAE;KACpC,CAAA,IAAI,MAAM,gBAAgB,oBAAoB;MAAE,YAAY,IAAI;KAAE,SAAS;MAAE,YAAY,IAAI;MAAG,wBAAwB,IAAI;KAAE,CAAC;KAC/H,uBAAuB,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,6BAAO;MAAa,uBAAoB;MAAG,MAAK;MAAhE,UAAA,CAA0E,EAAE,sBAAsB,GACxH,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OAAQ,MAAK;OAAS,eAAe;QAAE,wBAAwB,KAAK;OAAE;OAAI,UAAA,EAAE,aAAa;MAAU,CAAA,CAAM;KAAI,CAAA,IAAA;KAC9G,cAEG,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;MACS;MACC;MACA;MACE;MACA;MACV,YAAY;MACT;KACJ,CAAA,IAED;YACI;MAGN,IAAI,eAAe,MAAM,OAAO;MAChC,MAAM,QAAQ,MAAM,MAAM,MAAK,SAAQ,KAAK,QAAQ,UAAU;MAC9D,IAAI,UAAU,KAAA,GAAW,OAAO;MAChC,MAAM,YAAY,aAAa;OAC7B,QAAQ;QACN,GAAG,SAAS,OAAO,MAAM,IAAI,SAAS;QACtC,GAAG,SAAS,OAAO,MAAM,IAAI,SAAS;QACtC,OAAA,MAAgB,SAAS;QACzB,QAAA,KAAiB,SAAS;OAC5B;OACA,SAAS;QAAE,OAAO;QAAW,QAAQ;OAAU;OAC/C,SAAS;OACT,QAAQ;QACN,KAAK;QACL,OAAO,iBAAiB,KAAA,IAAY,KAAK;OAC3C;MACF,CAAC;MACD,MAAM,UAAU,MAAM,KAAK,SAAS,cAAc,KAAA,IAAY,MAAM;MACpE,MAAM,SAAS,mBAAmB,SAAS,eAAe,CAAC;MAC3D,MAAM,WAAW,aAAa,IAAI,MAAM,GAAG;MAC3C,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OACE,WAAWA,6BAAO;OAClB,OAAO;QAAE,MAAM,GAAG,UAAU,EAAE;QAAK,KAAK,GAAG,UAAU,EAAE;OAAI;OAC3D,eAAY;OACZ,kBAAgB,UAAU;OAC1B,eAAY;OALd,UAAA;QAOE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;SAAK,WAAWA,6BAAO;SACpB,UAAA,SAAS,QAAQ,EAAE,iBAAiB,IAAI,MAAM,KAAK;QACjD,CAAA;QACJ,WAAW,KAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;SAAK,WAAWA,6BAAO;SAAgB,UAAA;QAAY,CAAA,IAAI;QACxE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;SAAK,WAAWA,6BAAO;SAAvB,UAAA,CACG,UAAU,MAAM,KAAK,WAAW,KAAK,CAAC,GACtC,YAAY,KAAA,KAAa,QAAQ,gBAAgB,IAC9C,MAAM,EAAE,mBAAmB,EAAE,OAAO,QAAQ,cAAc,CAAC,MAC3D,EACD;;QACJ,aAAa,KAAA,IACV,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;SAAK,WAAWA,6BAAO;SAAc,UAAA,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;QAAO,CAAA,IACrF;OACD;;KAET,EAAA,CAAG;IACA;;EAET;;;;EC37DA,SAAgB,gBAAgB,EAAE,GAAG,cAGpB;GACf,MAAM,YAAY,aAAa;GAC/B,MAAM,CAAC,aAAA,GAAYM,MAAAA,SAAAA,OAAe,oBAAoB,UAAU,CAAC,CAAC,SAAS;GAC3E,MAAM,CAAC,OAAO,aAAA,GAAYA,MAAAA,SAAAA,CAAS,UAAU,SAAS,EAAE;GACxD,MAAM,CAAC,SAAS,eAAA,GAAcA,MAAAA,SAAAA,CAAS,UAAU,YAAY,QAAQ,UAAU,YAAY,KAAA,CAAS;GACpG,CAAA,GAAA,MAAA,UAAA,OAAgB;IAAE,oBAAoB,YAAY,EAAE,WAAW;KAAE;KAAO;IAAQ,EAAE,CAAC;GAAE,GAAG;IAAC;IAAY;IAAO;GAAO,CAAC;GACpH,MAAM,CAAC,OAAO,aAAA,GAAYA,MAAAA,SAAAA,CAAmC;GAC7D,MAAM,CAAC,MAAM,YAAA,GAAWA,MAAAA,SAAAA,CAAS,KAAK;GACtC,MAAM,CAAC,QAAQ,cAAA,GAAaA,MAAAA,SAAAA,CAAS,KAAK;GAC1C,MAAM,CAAC,UAAU,gBAAA,GAAeA,MAAAA,SAAAA,CAAS,KAAK;GAC9C,MAAM,UAAA,GAASC,MAAAA,OAAAA,CAAwB;GACvC,CAAA,GAAA,MAAA,UAAA,aAAsB;IAAE,OAAO,SAAS,MAAM;GAAE,GAAG,CAAC,CAAC;GACrD,MAAM,mBAAyB;IAC7B,OAAO,SAAS,MAAM;IACtB,SAAS,KAAA,CAAS;IAClB,QAAQ,KAAK;IACb,UAAU,KAAK;IACf,YAAY,KAAK;GACnB;GACA,MAAM,MAAM,YAA2B;IACrC,WAAW;IACX,MAAM,aAAa,IAAI,gBAAgB;IACvC,OAAO,UAAU;IACjB,QAAQ,IAAI;IACZ,IAAI;KACF,MAAM,SAAS,MAAM,UAAU,IAAI,OAAO;MAAE;MAC1C,GAAI,WAAW,UAAU,YAAY,KAAA,IAAY,EAAE,SAAS,UAAU,QAAQ,IAAI,CAAC;KAAG,GAAG,WAAW,MAAM;KAC5G,IAAI,CAAC,WAAW,OAAO,SAAS,SAAS,MAAM;IACjD,QAAQ;KAAE,IAAI,CAAC,WAAW,OAAO,SAAS,UAAU,IAAI;IAAE,UAAU;KAClE,IAAI,CAAC,WAAW,OAAO,SAAS,QAAQ,KAAK;IAC/C;GACF;GACA,CAAA,GAAA,MAAA,UAAA,OAAgB;IAAE,IAAI,aAAa,KAAA,GAAW,IAAS;GAAE,GAAG,CAAC,CAAC;GAC9D,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAWC,6BAAO;IAAvB,UAAA;KACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;MAAM,WAAWA,6BAAO;MAAY,WAAU,UAAS;OAAE,MAAM,eAAe;OAAG,IAAS;MAAE;MAA5F,UAAA;OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD,EAAA,UAAA,CAAQ,EAAE,iBAAiB,GAAE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;QAAO,WAAA;QAAU,WAAW;QAAK,OAAO;QACnE,WAAU,UAAS;SAAE,WAAW;SAAG,SAAS,MAAM,OAAO,KAAK;QAAE;OAAI,CAAA,CAAQ,EAAA,CAAA;OAC9E,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD,EAAA,UAAA,CAAQ,EAAE,cAAc,GAAE,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;QAAQ,OAAO,UAAU,UAAU;QAAO,WAAU,UAAS;SAAE,WAAW;SAAG,WAAW,MAAM,OAAO,UAAU,OAAO;QAAE;QAAxH,UAAA,CACxB,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,OAAM;SAAO,UAAA,EAAE,eAAe;QAAU,CAAA,GAC/C,UAAU,YAAY,KAAA,IAAY,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,OAAM;SAAS,UAAA,EAAE,wBAAwB;QAAU,CAAA,CAC/F;OAAQ,CAAA,CAAA,EAAA,CAAA;OAChB,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,UAAU;QAAO,UAAA,EAAE,kBAAkB;OAAU,CAAA;OACrE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,eAAe;SAAE,UAAU,OAAO;QAAE;QAAI,UAAA,EAAE,eAAe;OAAU,CAAA;OACxF,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,eAAe;SAAE,WAAW;SAAG,YAAY,IAAI;QAAE;QAAI,UAAA,EAAE,eAAe;OAAU,CAAA,IAAI;MAC9G;;KACL,QAAQ,WAAW,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,MAAK;MAAU,UAAA,EAAE,OAAO,mBAAmB,iBAAiB;KAAK,CAAA,IAAI;KAC3F,SAAS,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD;MAAG,MAAK;MAAR,UAAA;OAAiB,EAAE,iBAAiB;OAAE;OAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,eAAe;SAAE,IAAS;QAAE;QAAI,UAAA,EAAE,cAAc;OAAU,CAAA;MAAI;KAAI,CAAA,IAAA;KACxI,OAAO,WAAW,IAAI,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,MAAK;MAAU,UAAA,EAAE,iBAAiB;KAAK,CAAA,IAAI;KACrE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MAAK,WAAWA,6BAAO;MAAmB,UAAA,OAAO,KAAI,SAAQ;OAC3D,MAAM,WAAW,KAAK,UAAU,GAAG,EAAE;OACrC,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;QAAQ,WAAWA,6BAAO;QAA6B,MAAK;QAAS,eAAe;SAAE,UAAU,KAAK,KAAK,MAAM;QAAE;QAAlH,UAAA;SACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,SAAS,QAAQ,MAAc,CAAA;SAAC,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD,EAAA,UAAA;UAAO,EAAE,iBAAiB;UAAE;UAAI,EAAE,oBAAoB,SAAS,QAAQ,QAAQ;UAAE;UAAI,EAAE,2BAA2B,EAAE,QAAQ,SAAS,OAAO,CAAC;SAAQ,EAAA,CAAA;SAC9L,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,SAAS,QAAQ,WAAW,MAAM,GAAG,GAAG,EAAQ,CAAA;QACjD;OAHyC,GAAA,KAAK,MAG9C;MACV,CAAC;KAAO,CAAA;IACL;;EACP;;;;ECrDA,SAAgB,iBAAiB,EAAE,cAAc,YAAY,QAAQ,MAAM,MAAM,SAAS,cAAc,YAAY,KAUnG;GACf,MAAM,YAAY,aAAa;GAC/B,MAAM,CAAC,aAAA,GAAYC,MAAAA,SAAAA,OAAe,oBAAoB,UAAU,CAAC;GACjE,MAAM,CAAC,YAAY,kBAAA,GAAiBA,MAAAA,SAAAA,CAAqC,SAAS,cAAc,YAAY;GAC5G,MAAM,CAAC,OAAO,aAAA,GAAYA,MAAAA,SAAAA,CAAS,SAAS,YAAY,SAAS,EAAE;GACnE,MAAM,CAAC,OAAO,aAAA,GAAYA,MAAAA,SAAAA,CAAS,SAAS,YAAY,SAAS,YAAY;GAC7E,MAAM,CAAC,iBAAiB,uBAAA,GAAsBA,MAAAA,SAAAA,CAAS,SAAS,YAAY,mBAAmB,KAAK;GACpG,CAAA,GAAA,MAAA,UAAA,OAAgB;IAAE,oBAAoB,YAAY;KAAE;KAAY,YAAY;MAAE;MAAO;MAAO;KAAgB;IAAE,CAAC;GAAE,GAC/G;IAAC;IAAY;IAAY;IAAO;IAAO;GAAe,CAAC;GACzD,MAAM,CAAC,QAAQ,cAAA,GAAaA,MAAAA,SAAAA,CAAiC;GAC7D,MAAM,CAAC,UAAU,gBAAA,GAAeA,MAAAA,SAAAA,CAA8B;GAC9D,MAAM,CAAC,MAAM,YAAA,GAAWA,MAAAA,SAAAA,CAAS,KAAK;GACtC,MAAM,CAAC,QAAQ,cAAA,GAAaA,MAAAA,SAAAA,CAAS,KAAK;GAC1C,MAAM,CAAC,UAAU,gBAAA,GAAeA,MAAAA,SAAAA,CAAS,KAAK;GAC9C,MAAM,UAAA,GAASC,MAAAA,OAAAA,CAAwB;GACvC,MAAM,eAAA,GAAcA,MAAAA,OAAAA,CAAe;GACnC,CAAA,GAAA,MAAA,UAAA,aAAsB;IAAE,OAAO,SAAS,MAAM;GAAE,GAAG,CAAC,CAAC;GAErD,MAAM,mBAAyB;IAC7B,OAAO,SAAS,MAAM;IACtB,QAAQ,KAAK;IACb,UAAU,KAAK;IACf,YAAY,KAAK;IACjB,UAAU,KAAA,CAAS;IACnB,YAAY,KAAA,CAAS;IACrB,YAAY,UAAU,KAAA;GACxB;GAEA,MAAM,iBAAiB,MAAM,SAAS,UAAU,MAAM,SAAS,cAC3D,WAAW,MAAK,cAAa,UAAU,gBAAgB,MAAM,WAAW,IACxE,aAAa,SAAS,eAAe,aAAa,QAAQ,MAAM;GACpE,CAAA,GAAA,MAAA,gBAAA,OAAsB;IACpB,IAAI,gBAAgB;IACpB,WAAW;IACX,SAAS,aAAa,SAAS,eAAe,CAAC,WAAW,MAAK,cAAa,UAAU,gBAAgB,aAAa,WAAW,IAC1H,EAAE,MAAM,MAAM,IAAI,YAAY;GACpC,GAAG;IAAC;IAAgB;IAAc;GAAU,CAAC;GAE7C,MAAM,MAAM,OAAO,WAAmC;IACpD,IAAI,MAAM,KAAK,MAAM,IAAI;IACzB,OAAO,SAAS,MAAM;IACtB,MAAM,aAAa,IAAI,gBAAgB;IACvC,OAAO,UAAU;IACjB,QAAQ,IAAI;IACZ,UAAU,KAAK;IACf,YAAY,KAAK;IACjB,YAAY,UAAU;IACtB,IAAI,WAAW,KAAA,GAAW;KACxB,UAAU,KAAA,CAAS;KACnB,YAAY,KAAA,CAAS;IACvB;IACA,IAAI;KACF,MAAM,QAAQ,MAAM,OAAO;MAAE;MAAO;MAAO;MAAiB,GAAI,WAAW,KAAA,IAAY,CAAC,IAAI,EAAE,OAAO;KAAG,GAAG,WAAW,MAAM;KAC5H,IAAI,WAAW,OAAO,SAAS;KAC/B,IAAI,MAAM,SAAS,WAAW,YAAY,KAAA,CAAS;KACnD,WAAU,aAAY,WAAW,KAAA,KAAa,UAAU,SAAS,aAAa,MAAM,SAAS,YACzF;MAAE,GAAG;MAAO,MAAM,CAAC,GAAG,SAAS,MAAM,GAAG,MAAM,IAAI;KAAE,IAAI,KAAK;IACnE,QAAQ;KACN,IAAI,WAAW,OAAO,SAAS;KAC/B,UAAU,IAAI;IAChB,UAAU;KACR,IAAI,CAAC,WAAW,OAAO,SAAS,QAAQ,KAAK;IAC/C;GACF;GAEA,CAAA,GAAA,MAAA,UAAA,OAAgB;IAAE,IAAI,kBAAkB,eAAe,gBAAgB,SAAS,YAAY,MAAM,KAAK,GAAG,IAAS;GAAE,GAAG,CAAC,CAAC;GAE1H,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;IAAS,WAAWC,6BAAO;IAAe,MAAK;IAAS,cAAW;IAAO,cAAY,EAAE,cAAc;IACpG,YAAW,UAAS;KAClB,IAAI,MAAM,QAAQ,UAAU;MAAE,MAAM,gBAAgB;MAAG,QAAQ;KAAE;KACjE,kBAAkB,KAAK;IACzB;IAJF,UAAA;KAKE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,6BAAO;MAAvB,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD,EAAA,UAAA,CAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,EAAE,cAAc,EAAM,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,oBAAoB,EAAK,CAAA,CAAM,EAAA,CAAA,GACtE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OAAQ,MAAK;OAAS,SAAS;OAAU,UAAA,EAAE,cAAc;MAAU,CAAA,CAChE;;KACJ,cAAc,KAAA,IAAY,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD;MAAO,WAAWA,6BAAO;MAAzB,UAAA,CAAsC,EAAE,sBAAsB,GAC9F,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;OAAQ,OAAO;OAAY,WAAU,UAAS;QAAE,WAAW;QAAG,cAAc,MAAM,OAAO,KAA0B;OAAE;OAArH,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,OAAM;QAAc,UAAA,EAAE,uBAAuB;OAAU,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,OAAM;QAAa,UAAA,EAAE,iBAAiB;OAAU,CAAA,CAClH;MAAQ,CAAA,CAAA;;KACjB,eAAe,cAAc,iBAAA,GAAA,kBAAA,IAAA,CAAC,iBAAD;MAA6B;MAAe;KAAI,CAAA,IAAI,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;MAClF,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;OAAM,WAAWA,6BAAO;OAAY,WAAU,UAAS;QAAE,MAAM,eAAe;QAAG,IAAS;OAAE;OAA5F,UAAA;QACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD;SAAO,WAAWA,6BAAO;SAAzB,UAAA,CAAuC,EAAE,cAAc,GACrD,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;UAAO,WAAA;UAAU,OAAO;UAAO,WAAW;UAAK,aAAa,EAAE,oBAAoB;UAChF,WAAU,UAAS;WAAE,WAAW;WAAG,SAAS,MAAM,OAAO,KAAK;UAAE;SAAI,CAAA,CACjE;;QACP,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD,EAAA,UAAA,CAAQ,EAAE,cAAc,GACtB,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;SAAQ,OAAO,MAAM,SAAS,cAAc,aAAa,MAAM,gBAAgB,MAAM;SACnF,WAAU,UAAS;UACjB,MAAM,QAAQ,MAAM,OAAO;UAC3B,WAAW;UACX,SAAS,UAAU,QAAQ,EAAE,MAAM,MAAM,IACrC,UAAU,cAAc,eAAe;WAAE,MAAM;WAAa,aAAa,MAAM,MAAM,EAAE;UAAE,CAAC;SAChG;SANF,UAAA;UAOG,aAAa,SAAS,cAAc,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;WAAQ,OAAM;WAAa,UAAA,EAAE,kBAAkB;UAAU,CAAA,IAAI;UACjG,WAAW,KAAI,cAAa,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;WAAoC,OAAO,aAAa,UAAU;WAAgB,UAAA,UAAU;UAAc,GAA7F,UAAU,WAAmF,CAAC;UACxI,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;WAAQ,OAAM;WAAO,UAAA,EAAE,YAAY;UAAU,CAAA;SACvC;QACH,CAAA,CAAA,EAAA,CAAA;QACP,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD;SAAO,WAAWA,6BAAO;SAAzB,UAAA,CAAwC,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;UAAO,MAAK;UAAW,SAAS;UACtE,WAAU,UAAS;WAAE,WAAW;WAAG,mBAAmB,MAAM,OAAO,OAAO;UAAE;SAAI,CAAA,GAAE,EAAE,wBAAwB,CAAS;;QACvH,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,MAAK;SAAS,UAAU,QAAQ,MAAM,KAAK,MAAM;SAAK,UAAA,EAAE,eAAe;QAAU,CAAA;QACxF,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,MAAK;SAAS,eAAe;UAAE,WAAW;UAAG,YAAY,IAAI;SAAE;SAAI,UAAA,EAAE,eAAe;QAAU,CAAA,IAAI;OAC9G;;MACN,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;OAAK,WAAWA,6BAAO;OAAc,MAAK;OACvC,UAAA,OAAO,EAAE,gBAAgB,IAAI,QAAQ,SAAS,YAC3C,OAAO,KAAK,WAAW,IAAI,EAAE,cAAc,IAAI,EAAE,gBAAgB,EAAE,OAAO,OAAO,KAAK,OAAO,CAAC,IAC9F,QAAQ,SAAS,aAAa,EAAE,iBAAiB,IAAI,QAAQ,SAAS,UAAU,EAAE,cAAc,IAChG,WAAW,EAAE,iBAAiB,IAAI,SAAS,KAAK,EAAE,cAAc;MACjE,CAAA;MACJ,QAAQ,SAAS,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;OAAK,WAAWA,6BAAO;OACjD,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,eAAe;SAAE,IAAS;QAAE;QAAI,UAAA,EAAE,gBAAgB;OAAU,CAAA;MAC/E,CAAA,IAAI;MACR,QAAQ,SAAS,aAAa,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAK,WAAWA,6BAAO;OAAvB,UAAA;QAC7B,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,cAAc,EAAK,CAAA;QACzB,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;SAAG,MAAM,EAAE,iBAAiB;SAAG,QAAO;SAAS,KAAI;SAAc,UAAA,EAAE,kBAAkB;QAAK,CAAA;QAC1F,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,MAAK;SAAS,eAAe;UAAE,IAAS;SAAE;SAAI,UAAA,EAAE,gBAAgB;QAAU,CAAA;OAC/E;MAAI,CAAA,IAAA;MACR,SAAS,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAK,WAAWA,6BAAO;OAAc,MAAK;OAA1C,UAAA,CAAkD,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,cAAc,EAAK,CAAA,GACnF,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,eAAe;SAAE,IAAS,YAAY,OAAO;QAAE;QAAI,UAAA,EAAE,cAAc;OAAU,CAAA,CAChG;MAAI,CAAA,IAAA;MACT,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAK,WAAWA,6BAAO;OAAvB,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,WAAWA,6BAAO;QAAe,cAAY,EAAE,gBAAgB;QAApE,UAAA,CACG,QAAQ,SAAS,YAAY,OAAO,KAAK,KAAI,QAC5C,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;SAAQ,MAAK;SAA6B,WAAWA,6BAAO;SAC1D,cAAY,EAAE,eAAe,EAAE,OAAO,IAAI,MAAM,CAAC;SAAG,gBAAc,UAAU,cAAc,IAAI;SAC9F,eAAe;UAAE,YAAY,GAAG;SAAE;SAFpC,UAAA;UAGE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,IAAI,MAAc,CAAA;UAC3B,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;WAAM,WAAWA,6BAAO;WAAxB,UAAA,CAAqC,IAAI,WAAW,SAAS,IAAI,OAAO,EAAE,oBAAoB,GAC3F,IAAI,WAAW,MAAM,EAAE,iBAAiB,MAAM,EAAS;;UAC1D,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;WAAM,WAAWA,6BAAO;WAAY,UAAU,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,YAAY;WAAI,UAAA,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,eAAe;UAAQ,CAAA;UAC3H,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,IAAI,QAAc,CAAA;SACnB;QARmB,GAAA,IAAI,SAQvB,CACT,IAAI,MACJ,QAAQ,SAAS,aAAa,OAAO,eAAe,KAAA,IAAY,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,MAAK;SAAS,UAAU;SAC/F,eAAe;UAAE,IAAS,OAAO,UAAU;SAAE;SAAI,UAAA,EAAE,aAAa;QAAU,CAAA,IAAI,IAC7E;OACL,CAAA,GAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;QAAO,WAAWA,6BAAO;QAAiB,cAAY,EAAE,iBAAiB;QACtE,UAAA,aAAa,KAAA,IAAY,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;SAAG,WAAWA,6BAAO;SAAa,UAAA,EAAE,eAAe;QAAK,CAAA,IAAI,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;SACpF,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;UAAK,WAAWA,6BAAO;UAAvB,UAAA;WAA2C,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,SAAS,MAAU,CAAA;WAChE,iBAAiB,KAAA,IAAY,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;YAAQ,MAAK;YAAS,eAAe;aAAE,aAAa,SAAS,SAAsB;YAAE;YAAI,UAAA,EAAE,WAAW;WAAU,CAAA;WACrJ,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;YAAQ,MAAK;YAAS,eAAe;aAAE,KAAK,SAAS,SAAsB;YAAE;YAAI,UAAA,EAAE,YAAY;WAAU,CAAA;UACtG;;SACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;UAAG,WAAWA,6BAAO;UAAa,UAAA,EAAE,iBAAiB;SAAK,CAAA;SAC1D,iBAAA,GAAA,kBAAA,IAAA,CAAC,gBAAD;UAAmE,WAAW,SAAS;UACrF,WAAW,SAAS;UAAc,cAAc,SAAS;UAAgB;UAAS;SAAI,GADnE,GAAG,SAAS,UAAU,GAAG,SAAS,UACiC;QACxF,EAAA,CAAA;OACG,CAAA,CACJ;;KACH,EAAA,CAAA;IACK;;EAEb;;;;EC3KA,SAAgB,mBAAmB,OAAqB,OAAiC,MAAwB,UAA6C;GAC5J,MAAM,QAAQ,IAAI,IAAI,MAAM,KAAK;GACjC,MAAM,WAAW,CAAC,GAAG,MAAM,QAAQ;GACnC,MAAM,WAAW,IAAI,IAAI,MAAM,QAAQ;GACvC,MAAM,QAAQ,CAAC,GAAG,MAAM,KAAK;GAC7B,MAAM,UAAU,IAAI,IAAI,MAAM,KAAI,SAAQ,KAAK,EAAE,CAAC;GAClD,KAAK,MAAM,QAAQ,OAAO;IACxB,MAAM,WAAW,KAAK,UAAU,GAAG,EAAE;IACrC,MAAM,KAAK,QAAQ,KAAK;IACxB,KAAK,MAAM,UAAU,SAAS,SAAS;KACrC,IAAI,CAAC,MAAM,IAAI,OAAO,SAAS,GAAG;MAChC,MAAM,YAAY,OAAO;MACzB,MAAM,MAAM,KAAK,KAAK;MACtB,MAAM,IAAI,WAAW;OACnB,IAAI;OAAW,WAAW;OAAW,OAAO,OAAO;OAAO,OAAO;OAAO,eAAe,KAAA;OAAW,QAAQ;OAC1G,WAAW,OAAO,OAAO,MAAM,GAAG,EAAE,CAAC,CAAE;OAAW,eAAe;OAAG,kBAAkB;OAAG,YAAY,KAAA;OAAW,cAAc,CAAC;OAC/H,gBAAgB,OAAO;OACvB,aAAa;QAAE;QAAW,OAAO,OAAO;QAAO,QAAQ,QAAQ,KAAA,KAAa,IAAI,WAAW,aAAa,gBAAgB;QAAU,UAAU,SAAS,IAAI,SAAS;QAChK,GAAI,OAAO,QAAQ,KAAA,IAAY,CAAC,IAAI,EAAE,KAAK,OAAO,IAAI;OAAG;MAC7D,CAAC;MACD,SAAS,IAAI,WAAW,CAAC,CAAC;MAC1B,SAAS,KAAK;OAAE,QAAQ;OAAW,OAAO,OAAO;OAAO,WAAW,CAAC,SAAS;MAAE,CAAC;KAClF;KACA,MAAM,SAAS,UAAU,OAAO,UAAU,GAAG;KAC7C,IAAI,CAAC,QAAQ,IAAI,MAAM,GAAG;MACxB,MAAM,KAAK;OAAE,IAAI;OAAQ,MAAM;OAAU,MAAM,OAAO;OAAW,IAAI;MAAG,CAAC;MACzE,QAAQ,IAAI,MAAM;KACpB;IACF;IACA,MAAM,IAAI,IAAI;KACZ,MAAM;KAAa;KAAM;KAAI,WAAW;KAAI,OAAO,SAAS,QAAQ;KAAO,WAAW,SAAS;IACjG,CAAC;IACD,SAAS,IAAI,IAAI,CAAC,CAAC;IACnB,SAAS,KAAK;KAAE,QAAQ;KAAI,OAAO,SAAS,QAAQ;KAAO,WAAW,CAAC,EAAE;IAAE,CAAC;GAC9E;GACA,OAAO;IAAE,GAAG;IAAO;IAAO;IAAU;IAAU;GAAM;EACtD;;;;ECXA,SAAgB,WAAW,EAAE,OAAO,SAAS,aAAa,WAAW,QAAQ,MAAM,KAQlE;GACf,MAAM,YAAY,aAAa;GAC/B,MAAM,aAAa,mBAAmB,QAAQ,QAAQ,QAAQ,QAAQ,YAAY,MAAM,OAAO;GAC/F,MAAM,CAAC,OAAO,aAAA,GAAYC,MAAAA,SAAAA,CAAmC,CAAC,CAAC;GAC/D,MAAM,CAAC,UAAU,gBAAA,GAAeA,MAAAA,SAAAA,CAAgC;GAChE,MAAM,CAAC,OAAO,aAAA,GAAYA,MAAAA,SAAAA,CAAqD,SAAS;GACxF,MAAM,CAAC,UAAU,gBAAA,GAAeA,MAAAA,SAAAA,CAAS,CAAC;GAC1C,MAAM,UAAA,GAASC,MAAAA,OAAAA,CAAwB;GACvC,MAAM,aAAa,KAAK,UAAU,MAAM,WAAW,KAAI,cAAa,UAAU,SAAS,CAAC;GACxF,MAAM,OAAO,QAAQ,QAAQ,OAAO;GACpC,MAAM,cAAc,UAAU,IAAI;GAClC,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,MAAM,aAAa,IAAI,gBAAgB;IACvC,OAAO,UAAU;IACjB,SAAS,SAAS;IAClB,YAAY,KAAA,CAAS;IACrB,QAAa,IAAI,CAAC,KAAK,EAAE,SAAS,MAAM,QAAQ,GAAG,WAAW,MAAM,GAClE,YAAY;KAAE,OAAO;KAAI,SAAS,MAAM;IAAQ,GAAG,WAAW,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,WAAW;KACjG,IAAI,WAAW,OAAO,SAAS;KAC/B,YAAY,KAAK;KACjB,SAAS,KAAK;KACd,SAAS,OAAO;IAClB,SAAS;KAAE,IAAI,CAAC,WAAW,OAAO,SAAS,SAAS,OAAO;IAAE,CAAC;IAC9D,aAAa;KAAE,WAAW,MAAM;IAAE;GACpC,GAAG;IAAC,MAAM;IAAS;IAAY;IAAM;IAAa;IAAU,UAAU;GAAO,CAAC;GAC9E,MAAM,SAAA,GAAQC,MAAAA,QAAAA,OAAc;IAC1B,IAAI,aAAa,KAAA,GAAW,OAAO,KAAA;IACnC,MAAM,WAAW,IAAI,IAAY,QAAQ,WAAW,kBAAkB;IACtE,MAAM,kBAAkB,IAAI,IAAI,QAAQ,WAAW,MAAM,KAAI,cAAa,CAAC,OAAO,UAAU,WAAW,GAAG,UAAU,KAAK,CAAC,CAAC;IAQ3H,OAAO,mBAAmB,iBAAiB;KAAE,SAP7B,SAAS,QAAQ,KAAI,YAAW;MAC9C,GAAG;MACH,UAAU,QAAQ,WAAW,UAAU,UAAU,SAAS,IAAI,OAAO,SAAS,IAAI,OAAO;MACzF,GAAI,OAAO,cAAc,KAAA,IAAY,CAAC,IAAI,EAAE,WAAW;OACrD,GAAG,OAAO;OAAW,OAAO,gBAAgB,IAAI,OAAO,UAAU,EAAE,KAAK,OAAO,UAAU;MAC3F,EAAE;KACJ,EAC6C;KAAS;IAAM,GAAG,QAAQ,UAAU,QAAQ,UAAU,QAAQ,mBAAmB,GAAG,OAAO,QAAQ,UAAU,QAAQ;GACpK,GAAG;IAAC;IAAU;IAAO,QAAQ;IAAU,QAAQ;IAAY,QAAQ;IAAU,QAAQ;IAAqB;GAAK,CAAC;GAChH,MAAM,QAAA,GAAOA,MAAAA,QAAAA,OAAc,UAAU,KAAA,IAAY,KAAA,IAAY,mBAAmB,KAAK,GAAG,CAAC,KAAK,CAAC;GAC/F,MAAM,QAAQ,OAAwB;IACpC,MAAM,OAAO,OAAO,MAAM,IAAI,EAAE;IAChC,MAAM,SAAS,MAAM,SAAS,cAAc,KAAA,IAAY,MAAM;IAC9D,IAAI,QAAQ,WAAW,YAAY,CAAC,OAAO,UAAU,QAAQ,QAAQ,YAAY,EAAE;GACrF;GACA,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAWC,6BAAO;IAAvB,UAAA;KACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,6BAAO;MAAvB,UAAA;OAAsC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,UAAU,UAAU;QAC9E,eAAe;SAAE,aAAY,UAAS,QAAQ,CAAC;QAAE;QAAI,UAAA,EAAE,eAAe;OAAU,CAAA;OAChF,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,eAAe;SAAE,UAAU,OAAO;QAAE;QAAI,UAAA,EAAE,eAAe;OAAU,CAAA;OACzF,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,UAAU,UAAU,WAAW,MAAM,WAAW;QAAG,eAAe;SACtF,UAAU,YAAY,MAAM,KAAI,UAAS;UAAE,QAAQ,KAAK;UAAQ,OAAO,KAAK,UAAU,GAAG,EAAE,CAAC,CAAE,QAAQ;SAAM,EAAE,CAAC;QACjH;QAAI,UAAA,EAAE,cAAc;OAAU,CAAA;OAC7B,MAAM,SAAS,IAAI,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,EAAE,0BAA0B,EAAQ,CAAA,IAAI;MAAU;;KAC9E,UAAU,YAAY,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,6BAAO;MAAe,MAAK;MAA3C,UAAA;OAAqD,EAAE,eAAe;OAAE;OAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,eAAe;SACnI,OAAO,SAAS,MAAM;SACtB,SAAS,UAAU;QACrB;QAAI,UAAA,EAAE,cAAc;OAAU,CAAA;MAAM;KAAI,CAAA,IAAA;KACvC,UAAU,WAAW,UAAU,aAAa,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,6BAAO;MAAe,MAAM,UAAU,UAAU,UAAU;MAA1E,UAAA,CAC1C,EAAE,UAAU,UAAU,oBAAoB,gBAAgB,GAC3D,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OAAQ,MAAK;OAAS,eAAe;QAAE,aAAY,UAAS,QAAQ,CAAC;OAAE;OAAI,UAAA,EAAE,aAAa;MAAU,CAAA,CACjG;KAAI,CAAA,IAAA;KACR,UAAU,WAAW,UAAU,KAAA,KAAa,SAAS,KAAA,IAAY,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA,CACtE,MAAM,MAAM,SAAS,IAAI,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,oBAAoB,EAAK,CAAA,IAAI,MAC7D,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;MAA6D;MAAkB;MAAM,UAAU,MAAM;MACnG,aAAa;OAAE,KAAK,SAAS,MAAM;OAAW,WAAW,KAAA;MAAU;MAAG,KAAK,KAAK,IAAI;MAAM;MAC1F,QAAQ;MAAM,UAAU,QAAQ,QAAQ;MAAe,kBAAkB,QAAQ,QAAQ;MACzF,eAAe,QAAQ,QAAQ;MAAoB,SAAS,QAAQ,QAAQ;MAAe,cAAc,QAAQ,QAAQ;MACzH,OAAO;OAAE;OAAa;OAAW,UAAU,UAAU;OAAM,kBAAkB,MAAM,SAAS,kBAAkB,SAAS,KAAA,IAAY,OAC/H,KAAK,SAAS,cAAc,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD;QAAO,WAAW,GAAGA,6BAAO,MAAM,GAAGA,6BAAO;QAAoB,uBAAoB;QAAG,cAAY,EAAE,iBAAiB;QAAtH,UAAA;SAC5B,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;UAAK,WAAWA,6BAAO;UAAvB,UAAA,CAAoC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,EAAE,iBAAiB,EAAU,CAAA,GACxE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;WAAQ,MAAK;WAAS,SAAS;WAAS,cAAY,EAAE,aAAa;WAAG,UAAA;UAAS,CAAA,CAAM;;SACvF,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,KAAK,MAAU,CAAA;SAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;UAAG,WAAWA,6BAAO;UAAc,UAAA,KAAK,KAAK,UAAU,GAAG,EAAE,CAAC,CAAE,QAAQ;SAAc,CAAA;SAC1G,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD,EAAA,UAAA;UAAI,EAAE,2BAA2B,EAAE,QAAQ,KAAK,KAAK,UAAU,GAAG,EAAE,CAAC,CAAE,OAAO,CAAC;UAAE;UAAI,EAAE,oBAAoB,KAAK,KAAK,UAAU,GAAG,EAAE,CAAC,CAAE,QAAQ,QAAQ;SAAK,EAAA,CAAA;SAC5J,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;UAAQ,MAAK;UAAS,eAAe;WAAE,UAAU,KAAK,KAAK,KAAK,MAAM;UAAE;UAAI,UAAA,EAAE,gBAAgB;SAAU,CAAA;SACxG,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;UAAQ,MAAK;UAAS,eAAe;WAAE,UAAU,YAAY,CAAC;YAAE,QAAQ,KAAK,KAAK;YAAQ,OAAO,KAAK;WAAM,CAAC,CAAC;UAAE;UAAI,UAAA,EAAE,cAAc;SAAU,CAAA;QACzI;OAAI,CAAA,IAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,kBAAD;QAA4C;QAAkB;QAAM,MAAM,QAAQ,QAAQ;QAA0B;QAC7H,QAAQ,MAAM,WAAW,MAAK,cAAa,UAAU,cAAc,KAAK,EAAE,UAAU;SAAE,OAAO,KAAK,EAAE;QAAE,IAAI,KAAA;QACpG;QAAe;QAAwB;QAAkB;OAAI,GAFnC,KAAK,EAE8B;MAAE;KAAI,GAd7D,GAAG,WAAW,GAAG,YAc4C,CAAG,EAAA,CAAA;IACjF;;EACP;EAEA,SAAS,iBAAiB,EAAE,MAAM,MAAM,MAAM,QAAQ,MAAM,SAAS,eAAe,YAAY,KAU/E;GACf,MAAM,CAAC,SAAS,eAAA,GAAcH,MAAAA,SAAAA,OAAe,oBAAoB,UAAU,CAAC,CAAC,aAAa,KAAK,MAAM,oBAAoB,UAAU,CAAC,CAAC,QAAQ,SAAS;GACtJ,CAAA,GAAA,MAAA,UAAA,OAAgB;IAAE,oBAAoB,YAAY,EAAE,KAAK,UAAU,YAAY,SAAS,CAAC;GAAE,GAAG,CAAC,YAAY,OAAO,CAAC;GACnH,MAAM,SAAS,KAAK;GACpB,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD;IAAO,WAAW,GAAGG,6BAAO,MAAM,GAAGA,6BAAO;IAAoB,uBAAoB;IAAG,uBAAoB;IAAG,eAAY;IAAqB,cAAY,EAAE,cAAc;IAA3K,UAAA;KACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,6BAAO;MAAvB,UAAA,CAAoC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,WAAWA,6BAAO;OAAe,UAAA,EAAE,cAAc;MAAQ,CAAA,GACjG,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OAAQ,MAAK;OAAS,WAAWA,6BAAO;OAAY,cAAY,EAAE,aAAa;OAAG,SAAS;OAAS,UAAA;MAAS,CAAA,CAAM;;KACrH,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;MAAI,WAAWA,6BAAO;MAAa,UAAA,KAAK;KAAU,CAAA;KAClD,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,6BAAO;MAAvB,UAAA,CAAkC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,QAAQ,WAAW,SAAS,QAAQ,OAAO,EAAE,mBAAmB,EAAQ,CAAA,GAC9G,QAAQ,WAAW,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,EAAE,iBAAiB,EAAQ,CAAA,IAAI,IAAU;;KACtE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MAAK,WAAWA,6BAAO;MAAgB,UAAA,KAAK;KAAQ,CAAA;KACnD,QAAQ,WAAW,gBAAgB,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MAAK,MAAK;MAAU,UAAA,EAAE,mBAAmB;KAAO,CAAA,IAAI;KACvF,QAAQ,WAAW,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MAAK,MAAK;MAAU,UAAA,EAAE,uBAAuB;KAAO,CAAA,IAAI;KAC5E,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,6BAAO;MAAvB,UAAA;OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,WAAWA,6BAAO;QAAoB,eAAe;SAAE,KAAK,KAAK,EAAE;QAAE;QAAG,UAAU,QAAQ,WAAW,YAAY,OAAO;QAAW,UAAA,EAAE,YAAY;OAAU,CAAA;OACjL,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,WAAWA,6BAAO;QAAsB,eAAe;SAAE,YAAW,UAAS,CAAC,KAAK;QAAE;QAAI,UAAA,EAAE,UAAU,wBAAwB,oBAAoB;OAAU,CAAA;OAChL,WAAW,KAAA,IAAY,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,WAAWA,6BAAO;QAAsB,UAAU;QAAM,SAAS;QAAS,UAAA,EAAE,cAAc;OAAU,CAAA;MACtJ;;KACJ,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,gBAAD;MAA4B;MAA2B;MAAe,WAAW,KAAK;MAAI,GAAK,KAAK,mBAAmB,KAAA,IAAY,CAAC,IAAI,EAAE,gBAAgB,KAAK,eAAe;MAAU;MAAS;KAAI,CAAA,IAAI;IAC/M;;EACT;;;;ECxIA,SAAgB,eAAe,EAAE,KAAK,SAAS,KAAK,UAAU,GAAG,KAMhD;GACf,MAAM,YAAY,aAAa;GAC/B,MAAM,CAAC,OAAO,aAAA,GAAYC,MAAAA,SAAAA,CAAmC,CAAC,CAAC;GAC/D,MAAM,CAAC,OAAO,aAAA,GAAYA,MAAAA,SAAAA,CAAwC,SAAS;GAC3E,MAAM,CAAC,UAAU,gBAAA,GAAeA,MAAAA,SAAAA,CAAS,CAAC;GAC1C,MAAM,CAAC,eAAA,GAAcA,MAAAA,SAAAA,OAAe,oBAAoB,SAAS,UAAU,CAAC,CAAC,OAAO;GACpF,MAAM,CAAC,YAAY,kBAAA,GAAiBA,MAAAA,SAAAA,CAAS,cAAc,EAAE;GAC7D,MAAM,CAAC,aAAa,mBAAA,GAAkBA,MAAAA,SAAAA,CAAS,KAAK;GACpD,MAAM,CAAC,OAAO,aAAA,GAAYA,MAAAA,SAAAA,CAAS,EAAE;GACrC,MAAM,CAAC,SAAS,eAAA,GAAcA,MAAAA,SAAAA,CAAiC,CAAC,CAAC;GACjE,MAAM,CAAC,cAAc,oBAAA,GAAmBA,MAAAA,SAAAA,CAAsC,CAAC,CAAC;GAChF,MAAM,CAAC,MAAM,YAAA,GAAWA,MAAAA,SAAAA,CAAS,KAAK;GACtC,MAAM,CAAC,QAAQ,cAAA,GAAaA,MAAAA,SAAAA,CAAS,KAAK;GAC1C,MAAM,iBAAA,GAAgBC,MAAAA,OAAAA,CAAuF;GAC7G,MAAM,mBAAA,GAAkBA,MAAAA,OAAAA,CAAwB;GAChD,CAAA,GAAA,MAAA,UAAA,aAAsB;IAAE,gBAAgB,SAAS,MAAM;GAAE,GAAG,CAAC,CAAC;GAC9D,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,MAAM,aAAa,IAAI,gBAAgB;IACvC,SAAS,SAAS;IAClB,IAAS,KAAK,WAAW,MAAM,CAAC,CAAC,MAAK,UAAS;KAC7C,IAAI,WAAW,OAAO,SAAS;KAC/B,SAAS,KAAK;KACd,eAAc,YAAW;MACvB,IAAI,MAAM,MAAK,UAAS,MAAM,YAAY,OAAO,GAAG,OAAO;MAC3D,IAAI,YAAY,MAAM,eAAe,KAAA,GAAW;OAC9C,eAAe,IAAI;OACnB,OAAO;MACT;MACA,OAAO,MAAM,EAAE,EAAE,WAAW;KAC9B,CAAC;KACD,SAAS,OAAO;IAClB,SAAS;KAAE,IAAI,CAAC,WAAW,OAAO,SAAS,SAAS,OAAO;IAAE,CAAC;IAC9D,aAAa;KAAE,WAAW,MAAM;IAAE;GACpC,GAAG;IAAC;IAAK;IAAU;GAAO,CAAC;GAC3B,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,IAAI,UAAU,SAAS,oBAAoB,SAAS,YAAY,EAAE,SAAS,WAAW,CAAC;GACzF,GAAG;IAAC,SAAS;IAAY;IAAO;GAAU,CAAC;GAE3C,MAAM,QAAQ,OAAO,YAAoE;IACvF,MAAM,aAAa,IAAI,gBAAgB;IACvC,gBAAgB,UAAU;IAC1B,QAAQ,IAAI;IACZ,UAAU,KAAK;IACf,IAAI;KACF,IAAI,QAAQ,MAAM,IAAI,MAAM,SAAS,WAAW,MAAM;KACtD,IAAI,WAAW,OAAO,SAAS,OAAO,KAAA;KACtC,IAAI,QAAQ,SAAS,YAAY,cAAc,SAAS,UAAU,MAAM,UAAU,QAAQ,OAAO;MAC/F,QAAQ,MAAM,IAAI,MAAM;OAAE,MAAM;OAAU,SAAS,MAAM;OAAS,OAAO,QAAQ;MAAM,GAAG,WAAW,MAAM;MAC3G,IAAI,WAAW,OAAO,SAAS,OAAO,KAAA;KACxC;KACA,UAAS,YAAW,QAAQ,MAAK,SAAQ,KAAK,YAAY,MAAM,OAAO,IACnE,QAAQ,KAAI,SAAQ,KAAK,YAAY,MAAM,UAAU,QAAQ,IAAI,IAAI,CAAC,GAAG,SAAS,KAAK,CAAC;KAC5F,OAAO;IACT,QAAQ;KACN,IAAI,CAAC,WAAW,OAAO,SAAS,UAAU,IAAI;KAC9C;IACF,UAAU;KACR,IAAI,CAAC,WAAW,OAAO,SAAS,QAAQ,KAAK;IAC/C;GACF;GACA,MAAM,WAAW,MAAM,MAAK,UAAS,MAAM,YAAY,UAAU;GACjE,MAAM,iBAAiB,YAAY,KAAA,IAAY,KAAA,IAAY,mBAAmB,QAAQ,QAAQ,QAAQ,QAAQ,YAAY,UAAU;GACpI,MAAM,mBAAmB,aAAa,gBAAgB,mBAAmB,KAAA,IAAY,KAAA,IAAY,WAAW,cAAc;GAC1H,MAAM,cAAc,WAAW;GAC/B,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,IAAI,YAAY,KAAA,GAAW;IAC3B,cAAc,UAAU,OAAO;IAC/B,aAAa;KAAE,cAAc,KAAA,CAAS;IAAE;GAC1C,GAAG;IAAC,YAAY,KAAA;IAAW;IAAa,UAAU;GAAO,CAAC;GAC1D,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;IAAS,WAAWC,6BAAO;IAAQ,cAAY,EAAE,aAAa;IAA9D,UAAA;KACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,WAAWA,6BAAO;MAAmB,UAAA,EAAE,mBAAmB;KAAK,CAAA;KACjE,cAAc,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,MAAK;MAAU,UAAA,EAAE,2BAA2B;KAAK,CAAA,IAAI;KACtE,UAAU,YAAY,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,MAAK;MAAU,UAAA,EAAE,eAAe;KAAK,CAAA,IAAI,UAAU,UAAU,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,MAAK;MAAV,UAAA;OACpF,EAAE,iBAAiB;OAAE;OAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,eAAe;SAAE,aAAY,UAAS,QAAQ,CAAC;QAAE;QAAI,UAAA,EAAE,aAAa;OAAU,CAAA;MACxH;KAAI,CAAA,IAAA,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;MACP,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;OAAM,WAAWA,6BAAO;OAAe,WAAU,UAAS;QACxD,MAAM,eAAe;QACrB,MAAM,WAAW,cAAc;QAC/B,MAAM,OAAO,MAAM,KAAK;QACxB,cAAc,UAAU;SACtB,SAAS,UAAU,WAAW,OAAO,WAAW;SAAG,OAAO;SAE1D,QAAQ,aAAa,KAAA,MAAc,SAAS,UAAU,SAAS,UAAU;QAC3E;QACA,MAAW;SAAE,MAAM;SAAU,SAAS,cAAc,QAAQ;SAAS,OAAO;QAAK,CAAC,CAAC,CAAC,MAAK,UAAS;SAChG,IAAI,UAAU,KAAA,GAAW;SACzB,cAAc,UAAU,KAAA;SACxB,SAAS,EAAE;SACX,cAAc,MAAM,OAAO;QAC7B,CAAC;OACH;OAfA,UAAA,CAgBE,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD,EAAA,UAAA,CAAQ,EAAE,eAAe,GAAE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;QAAO,OAAO;QAAO,WAAW;QAAK,UAAU;QACxE,WAAU,UAAS;SAAE,SAAS,MAAM,OAAO,KAAK;QAAE;OAAI,CAAA,CAAQ,EAAA,CAAA,GAChE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,UAAU,QAAQ,MAAM,KAAK,MAAM;QAAK,UAAA,EAAE,cAAc;OAAU,CAAA,CACpF;;MACL,MAAM,WAAW,IAAI,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,aAAa,EAAK,CAAA,IAAI,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD;OAAO,WAAWA,6BAAO;OAAzB,UAAA,CAA0C,EAAE,cAAc,GAC1G,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;QAAQ,OAAO;QAAY,UAAU;QAAM,WAAU,UAAS;SAAE,cAAc,MAAM,OAAO,KAAK;SAAG,UAAU,KAAK;SAAG,eAAe,KAAK;QAAE;QAA3I,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,OAAM;SAAI,UAAA,EAAE,cAAc;QAAU,CAAA,GAC3C,MAAM,KAAI,UAAS,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;SAA4B,OAAO,MAAM;SAAzC,UAAA;UAAmD,MAAM;UAAM;UAAG,MAAM,WAAW;UAAO;SAAS;QAAtF,GAAA,MAAM,OAAgF,CAAC,CAClH;OACH,CAAA,CAAA;;MACN,aAAa,KAAA,IAAY,OAAO,QAAQ,KAAA,IAAY,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;OAAK,WAAWA,6BAAO;OAC1E,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,UAAU;QAAM,eAAe;SACnD,MAAW;UAAE,MAAM;UAAO,SAAS,SAAS;UAAS,YAAY,CAAC,IAAI,SAAS;SAAE,CAAC,CAAC,CAAC,MAAK,UAAS;UAChG,IAAI,UAAU,KAAA,GAAW,IAAI,KAAK;SACpC,CAAC;QACH;QAAI,UAAA,EAAE,mBAAmB;OAAU,CAAA;MAChC,CAAA,IAAI,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;OAAM,WAAWA,6BAAO;OAAe,WAAU,UAAS;QACjE,MAAM,eAAe;QACrB,MAAW;SAAE,MAAM;SAAU,SAAS,SAAS;SAAS,OAAO,QAAQ,SAAS,YAAY,SAAS;QAAM,CAAC;OAC9G;OAHS,UAAA,CAIP,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD,EAAA,UAAA,CAAQ,EAAE,YAAY,GAAE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;QAAO,OAAO,QAAQ,SAAS,YAAY,SAAS;QAAO,WAAW;QAAK,UAAU;QAC3G,WAAU,UAAS;SAAE,YAAW,aAAY;UAAE,GAAG;WAAU,SAAS,UAAU,MAAM,OAAO;SAAM,EAAE;QAAE;OAAI,CAAA,CAAQ,EAAA,CAAA,GACnH,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,UAAU,SAAS,QAAQ,SAAS,YAAY,SAAS,MAAA,CAAO,KAAK,MAAM;QAAK,UAAA,EAAE,cAAc;OAAU,CAAA,CAC5H;;KACN,EAAA,CAAA;KACD,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,MAAK;MAAU,UAAA,EAAE,cAAc;KAAK,CAAA,IAAI;KAClD,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,MAAK;MAAS,UAAA,EAAE,iBAAiB;KAAK,CAAA,IAAI;KACtD,YAAY,KAAA,KAAa,aAAa,KAAA,IAAY,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,6BAAO;MAAvB,UAAA,CACxD,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OAAQ,MAAK;OAAS,UAAU,UAAU,WAAW,QAAQ,qBAAqB,KAAA;OAAW,eAAe;QAC1G,MAAM,cAAc;QACpB,IAAI,gBAAgB,KAAA,GAAW;QAC/B,MAAW;SAAE,MAAM;SAAW,SAAS,SAAS;SAAS;QAAY,CAAC,CAAC,CAAC,MAAK,UAAS;SACpF,IAAI,UAAU,KAAA,GAAW;SACzB,IAAI,mBAAmB,KAAA,KAAa,KAAK,UAAU,WAAW,cAAc,CAAC,MAAM,KAAK,UAAU,WAAW,GAC3G,IAAI;UAAE,aAAa,WAAW,4BAA4B,gBAAgB;SAAE,QAAQ,CAA2C;SAEjI,iBAAgB,YAAW;UACzB,IAAI,QAAQ,SAAS,aAAa,KAAA,KAAa,QAAQ,SAAS,aAAa,aAAa,OAAO;UACjG,MAAM,OAAO,EAAE,GAAG,QAAQ;UAC1B,OAAO,KAAK,SAAS;UACrB,OAAO;SACT,CAAC;QACH,CAAC;OACH;OAAI,UAAA,EAAE,uBAAuB;MAAU,CAAA,GACvC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,MAAK;OAAU,UAAA,EAAE,qBAAqB,KAAA,IAAY,0BAA0B,eAAe;MAAQ,CAAA,CACtG;;KACJ,UAAU,WAAW,aAAa,KAAA,KAAa,YAAY,KAAA,IAAY,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;MAAmC,OAAO;MAC9G;MAAS,aAAa,oBAAoB,SAAS;MAC5D,YAAW,UAAS;OAClB,IAAI,mBAAmB,KAAA,GAAW,WAAW,gBAAgB,KAAK;OAClE,iBAAgB,aAAY;QAAE,GAAG;SAAU,SAAS,UAAU;OAAM,EAAE;MACxE;MACA,SAAQ,cAAa;OAAE,MAAW;QAAE,MAAM;QAAU,SAAS,SAAS;QAAS;OAAU,CAAC;MAAE;MAAS;MAAS;KAAI,GANpB,SAAS,OAMW;IAC7G;;EACX;;;;;;;;;;;;;;;ECtFA,SAAgB,UAAU,OAAqC;GAC7D,MAAM,aAAa,MAAM,eAAc,UAAS,KAAK;GACrD,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;IAAK,WAAWC,6BAAO;IAAmB,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,uBAAD;KAA6C,KAAK,MAAM;KACvG,YAAY,WAAW;KAAO,UAAU,MAAM;KAAW,aAAa,MAAM;KAAa,GAAG,MAAM;KAClG,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,mBAAD;MAAmB,KAAK,MAAM;MAC9B,QAAQ,MAAM;MAAQ,MAAM,MAAM;MAAoB,GAAG,MAAM;MAC/D,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,eAAD,EAAe,GAAI,MAAQ,CAAA;KACV,CAAA;IAAwB,GALkC,MAAM,SAKxC;GAAM,CAAA;EACnD;EAEA,SAAS,cAAc,EACrB,WAAW,aAAa,8BAA8B,eACtD,QAAQ,aAAa,eAAe,uBAAuB,oBAAoB,kBAAkB,eAAe,mBAAmB,QAAQ,WAAW,OAAO,KAC9H;GAC/B,MAAM,mBAAmB,aAAa;GACtC,MAAM,WAAW,aAAY,UAAS,KAAK;GAC3C,MAAM,sBAAsB,8BAA6B,UAAS,KAAK;GACvE,MAAM,aAAa,eAAc,UAAS,KAAK;GAC/C,MAAM,CAAC,YAAY,kBAAA,GAAiBC,MAAAA,SAAAA,CAAS,KAAK;GAClD,MAAM,CAAC,WAAW,iBAAA,GAAgBA,MAAAA,SAAAA,CAAS,KAAK;GAChD,MAAM,CAAC,QAAQ,cAAA,GAAaA,MAAAA,SAAAA,CAAoB;GAChD,MAAM,CAAC,eAAe,qBAAA,GAAoBA,MAAAA,SAAAA,CAAS,CAAC;GACpD,MAAM,cAAA,GAAaC,MAAAA,OAAAA,CAAoB;GACvC,MAAM,cAAc,OAAwB;IAC1C,IAAI,SAAS,yBAAyB,aAAa,WAAW,UAAU,SAAS;IACjF,UAAU,EAAE;GACd;GACA,MAAM,oBAA0B;IAC9B,UAAU,KAAA,CAAS;IACnB,qBAAqB;KAAE,WAAW,SAAS,MAAM;IAAE,CAAC;GACtD;GACA,MAAM,gBAAA,GAAeA,MAAAA,OAAAA,CAA0B,IAAI;GAEnD,MAAM,SAAA,GAAQC,MAAAA,QAAAA,OACN,kBAAkB,WAAW,UAAU,UAAU,GACvD;IAAC;IAAW;IAAU;GAAU,CAClC;GACA,MAAM,SAAA,GAAQA,MAAAA,QAAAA,OACN,mBAAmB,UAAU,OAAO,WAAW,mBAAmB,GACxE;IAAC;IAAU;IAAO;IAAW;GAAmB,CAClD;GACA,MAAM,QAAA,GAAOA,MAAAA,QAAAA,OAAc,mBAAmB,KAAK,GAAG,CAAC,KAAK,CAAC;GAE7D,MAAM,MAAM,KAAK,IAAI;GACrB,MAAM,aAAa,mBAAmB,QAAQ,OAAO,YAAY,OAAO,UAAU,WAAW;GAC7F,MAAM,YAAY,YAAY,mBAAmB,QAAQ,YAAY,kBAAkB,WAAW,YAAY,IAAI;GAElH,OAGE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAWH,6BAAO;IAAM,sCAAmC;IAAhE,UAAA;KACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,6BAAO;MAAW,eAAa,cAAc,WAAW,KAAA,KAAa,KAAA;MACnF,MAAK,YAAW;OAAE,IAAI,YAAY,MAAM,QAAQ,QAAQ,cAAc,WAAW,KAAA;MAAU;MAD7F,UAAA,CAEE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAK,WAAWA,6BAAO;OAAvB,UAAA;QACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,WAAWA,6BAAO;SAAa,MAAK;SAAS,KAAK;SAAc,eAAe;UAAE,cAAc,IAAI;SAAE;SAAI,UAAA,EAAE,aAAa;QAAU,CAAA;QAC1I,iBAAA,GAAA,kBAAA,IAAA,CAAC,oBAAD,EAAuB,EAAI,CAAA;QAC3B,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,WAAWA,6BAAO;SAAa,MAAK;SAAS,gBAAc;SACjE,eAAe;UAAE,cAAa,UAAS,CAAC,KAAK;SAAE;SAAI,UAAA,EAAE,YAAY,eAAe,aAAa;QAAU,CAAA;QACzG,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;SAAM,WAAWA,6BAAO;SACrB,UAAA,YAAY,EAAE,aAAa,IAAI,UAAU,KAAA,IAAY,OAAO,MAAM,SAAS,cACxE,EAAE,wBAAwB;UAAE,MAAM,MAAM;UAAO,OAAO,MAAM;SAAa,CAAC,IAC1E,EAAE,wBAAwB,EAAE,OAAO,MAAM,aAAa,CAAC;QACvD,CAAA;QACN,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;SAAM,WAAWA,6BAAO;SAAQ,eAAY;SAA5C,UAAA;UACG,YAAY,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA,CAAE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAM,WAAWA,6BAAO,qBAAuB,CAAA,GAAE,EAAE,mBAAmB,CAAI,EAAA,CAAA;UAChG,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAM,WAAWA,6BAAO,iBAAmB,CAAA;UAC1C,EAAE,eAAe;UAClB,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAM,WAAWA,6BAAO,gBAAkB,CAAA;UACzC,EAAE,cAAc;SACb;;QACN,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;SAAM,WAAWA,6BAAO;SAAW,OAAO;SACvC,UAAA;QACG,CAAA;OACH;MACJ,CAAA,GAAA,YAAY,iBAAA,GAAA,kBAAA,IAAA,CAAC,gBAAD;OAAiC,KAAK;OAAQ,SAAS;OAAe,SAAS;QAAE;QAAU;QAAY;QAAqB,UAAU;QACjJ;QAAY,SAAS;SAAE;SAAQ;SAAQ;SAAW;SAAO;SAAa;SAAe;SAAuB;SAAoB;SAAkB;SAAe;QAAkB;OACrL;OAAM;MAAI,GAFwB,UAExB,IAAI,UAAU,KAAA,IAAY,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;OAAK,WAAWA,6BAAO;OAAQ,UAAA,EAAE,eAAe;MAAO,CAAA,IACvF,MAAM,MAAM,SAAS,IAAI,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;OAAK,WAAWA,6BAAO;OAAQ,UAAA,EAAE,YAAY;MAAO,CAAA,IAAI,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;OACtD;OAAkB;OAC/C,UAAU,MAAM;OAChB,aAAa;QAAE,KAAK;QAAY,WAAW,KAAA;OAAU;OAChD;OACF;OACH,QAAQ;OACR,UAAU;OACV,kBAAkB;OAClB,eAAe;OACf,SAAS;OACT,cAAc;OACd,cAAc;MACf,GAZM,UAYN,CACE;;KACJ,aAAa,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MAAK,WAAWA,6BAAO;MAAa,eAAa,WAAW,KAAA,KAAa,KAAA;MACrF,MAAK,YAAW;OAAE,IAAI,YAAY,MAAM,QAAQ,QAAQ,WAAW,KAAA;MAAU;MAAG,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,kBAAD;OAChF,YAAY;OAAW,cAAc,UAAU,KAAA,IAAY,EAAE,MAAM,MAAM,IAAI,MAAM,SAAS,cAAc;QAAE,MAAM;QAAa,aAAa,MAAM;OAAY,IAAI;QAAE,MAAM;QAAa,KAAK,MAAM;OAAK;OACvM,YAAY,WAAW;OAAO,QAAQ;OAAkB,MAAM;OAAoB,MAAM;OAAgB;OACxG,cAAc;OACd,eAAe;QAAE,cAAc,KAAK;QAAG,qBAAqB;SAAE,aAAa,SAAS,MAAM;QAAE,CAAC;OAAE;MAAI,GAJI,SAIJ;KAAM,CAAA,IAAI;KAC9G,WAAW,KAAA,IAAY,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;MAAS,WAAWA,6BAAO;MAAe,MAAK;MAAS,cAAW;MAAO,cAAY,EAAE,WAAW;MAChI,YAAW,UAAS;OAClB,IAAI,MAAM,QAAQ,UAAU;QAAE,MAAM,gBAAgB;QAAG,YAAY;OAAE;OACrE,kBAAkB,KAAK;MACzB;MAJ6B,UAAA,CAK7B,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAK,WAAWA,6BAAO;OAAvB,UAAA,CAAqC,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD,EAAA,UAAA,CAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,EAAE,WAAW,EAAM,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;QAAG,WAAWA,6BAAO;QAAgB,UAAA;OAAU,CAAA,CAAM,EAAA,CAAA,GACtH,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,WAAA;QAAU,SAAS;QAAc,UAAA,EAAE,aAAa;OAAU,CAAA,CAAM;MACxF,CAAA,GAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,gBAAD;OAAgB,KAAK;OAAQ,KAAK;QAAE,WAAW;QAAQ,YAAY;SAAE,kBAAiB,UAAS,QAAQ,CAAC;SAAG,YAAY;QAAE;OAAE;OAAM;MAAI,CAAA,CAC9H;;IACN;;EAET;;;EC3LA,MAAa,cAAc;GACzB,gBAAgB;GAAe,gBAAgB;GAAQ,iBAAiB;GACxE,kBAAkB;GAAe,mBAAmB;GAAe,mBAAmB;GACtF,eAAe;GACf,iBAAiB;GACjB,gBAAgB;GAAkB,kBAAkB;GACpD,iBAAiB;GAAQ,mBAAmB;GAAU,kBAAkB;GACxE,oBAAoB;GAAQ,oBAAoB;GAAU,mBAAmB;GAC7E,uBAAuB;GAAY,oBAAoB;GAAS,iBAAiB;GACjF,oBAAoB;GAAU,kBAAkB;GAAU,kBAAkB;GAC5E,sBAAsB;GAAc,kBAAkB;GACtD,mBAAmB;GACnB,oBAAoB;GAAgB,kBAAkB;GACtD,gBAAgB;GAChB,oBAAoB;GACpB,oBAAoB;GACpB,mBAAmB;GAAQ,mBAAmB;GAC9C,mBAAmB;GAAQ,oBAAoB;GAAW,iBAAiB;GAC3E,yBAAyB;GAAQ,4BAA4B;GAAQ,8BAA8B;GACnG,6BAA6B;GAAW,iCAAiC;GACzE,kBAAkB;GAAQ,6BAA6B;GAAM,yBAAyB;GACtF,6BAA6B;GAAM,2BAA2B;GAC9D,oBAAoB;GAAM,0BAA0B;GAAM,8BAA8B;GACxF,kBAAkB;GAAQ,kBAAkB;GAAQ,oBAAoB;GACxE,qBAAqB;GAAQ,2BAA2B;GAAgB,qBAAqB;GAC7F,oBAAoB;GAAM,4BAA4B;GAAQ,wBAAwB;GACtF,qBAAqB;GAAW,uBAAuB;GACvD,yBAAyB;GAAoB,0BAA0B;GACvE,mBAAmB;GAAQ,qBAAqB;GAAU,oBAAoB;GAC9E,oBAAoB;GAAU,sBAAsB;GACpD,oBAAoB;GAAU,wBAAwB;GAAQ,yBAAyB;GACvF,iBAAiB;GAAgB,0BAA0B;GAAU,mBAAmB;GACxF,mBAAmB;GAAmB,yBAAyB;GAC/D,wBAAwB;EAC1B;EAEA,MAAa,cAA4C;GACvD,gBAAgB;GAAmB,gBAAgB;GAAgB,iBAAiB;GACpF,kBAAkB;GAAoB,mBAAmB;GAAqB,mBAAmB;GACjG,eAAe;GACf,iBAAiB;GACjB,gBAAgB;GAAoD,kBAAkB;GACtF,iBAAiB;GAAqB,mBAAmB;GAA6B,kBAAkB;GACxG,oBAAoB;GAAkB,oBAAoB;GAAkB,mBAAmB;GAC/F,uBAAuB;GAAkC,oBAAoB;GAAkB,iBAAiB;GAChH,oBAAoB;GAAwB,kBAAkB;GAA8B,kBAAkB;GAC9G,sBAAsB;GAAiC,kBAAkB;GACzE,mBAAmB;GACnB,oBAAoB;GAAoB,kBAAkB;GAC1D,gBAAgB;GAChB,oBAAoB;GACpB,oBAAoB;GACpB,mBAAmB;GAAc,mBAAmB;GACpD,mBAAmB;GAAmB,oBAAoB;GAA0B,iBAAiB;GACrG,yBAAyB;GAAc,4BAA4B;GAAiB,8BAA8B;GAClH,6BAA6B;GAA0B,iCAAiC;GACxF,kBAAkB;GAAa,6BAA6B;GAAc,yBAAyB;GACnG,6BAA6B;GAAc,2BAA2B;GACtE,oBAAoB;GAAU,0BAA0B;GAAS,8BAA8B;GAC/F,kBAAkB;GAAa,kBAAkB;GAAiB,oBAAoB;GACtF,qBAAqB;GAAY,2BAA2B;GAAqB,qBAAqB;GACtG,oBAAoB;GAAU,4BAA4B;GAAmB,wBAAwB;GACrG,qBAAqB;GAAwB,uBAAuB;GACpE,yBAAyB;GAAwB,0BAA0B;GAC3E,mBAAmB;GAAkB,qBAAqB;GAAgB,oBAAoB;GAC9F,oBAAoB;GAA8B,sBAAsB;GACxE,oBAAoB;GAA0B,wBAAwB;GAAkB,yBAAyB;GACjH,iBAAiB;GAA8B,0BAA0B;GAA2B,mBAAmB;GACvH,mBAAmB;GAA8D,yBAAyB;GAC1G,wBAAwB;EAC1B;;;ECtEA,MAAa,UAAU;GACrB,mBAAmB;GACnB,iBAAiB;GAAY,iBAAiB;GAAa,oBAAoB;GAC/E,eAAe;GAAS,mBAAmB;GAAe,eAAe;GACzE,eAAe;GAAoB,eAAe;GAAS,mBAAmB;GAC9E,YAAY;GAAM,cAAc;GAAM,gBAAgB;GACtD,kBAAkB;GAAO,mBAAmB;GAAS,yBAAyB;GAC9E,iBAAiB;GAAU,iBAAiB;GAAW,eAAe;GACtE,kBAAkB;GAClB,gBAAgB;GAA6B,gBAAgB;GAC7D,cAAc;GAAW,eAAe;GACxC,iBAAiB;GACjB,mBAAmB;GACnB,iBAAiB;GAAU,6BAA6B;GACxD,cAAc;GAAkB,gBAAgB;GAChD,eAAe;GAAQ,cAAc;GAAU,iBAAiB;GAChE,kBAAkB;GAAQ,iBAAiB;GAAU,sBAAsB;EAC7E;EAEA,MAAa,UAAoC;GAC/C,mBAAmB;GACnB,iBAAiB;GAAkC,iBAAiB;GAAkC,oBAAoB;GAC1H,eAAe;GAA0B,mBAAmB;GAAuB,eAAe;GAClG,eAAe;GAAwC,eAAe;GAAsB,mBAAmB;GAC/G,YAAY;GAAW,cAAc;GAAa,gBAAgB;GAClE,kBAAkB;GAAgB,mBAAmB;GAAoB,yBAAyB;GAClG,iBAAiB;GAAmB,iBAAiB;GAAgC,eAAe;GACpG,kBAAkB;GAClB,gBAAgB;GAAwC,gBAAgB;GACxE,cAAc;GAAyB,eAAe;GACtD,iBAAiB;GACjB,mBAAmB;GACnB,iBAAiB;GAAuB,6BAA6B;GACrE,cAAc;GAAqC,gBAAgB;GACnE,eAAe;GAAiB,cAAc;GAAuB,iBAAiB;GACtF,kBAAkB;GAAkB,iBAAiB;GAA2B,sBAAsB;EACxG;;;;;EC/BA,MAAa,KAAK;;EAwKlB,MAAa,KAAsC;GACjD,wBAAwB;GACxB,6BAA6B;GAC7B,GAAG;GACH,GAAG;GACH,iBAAiB;GACjB,yBAAyB;GACzB,yBAAyB;GACzB,iBAAiB;GACjB,aAAa;GACb,qBAAqB;GACrB,eAAe;GACf,qBAAqB;GACrB,qBAAqB;GACrB,sBAAsB;GACtB,gBAAgB;GAChB,sBAAsB;GACtB,uBAAuB;GACvB,gBAAgB;GAChB,eAAe;GACf,cAAc;GACd,qBAAqB;GACrB,iBAAiB;GACjB,gBAAgB;GAChB,kBAAkB;GAClB,yBAAyB;GACzB,mBAAmB;GACnB,eAAe;GACf,iBAAiB;GACjB,gBAAgB;GAChB,eAAe;GACf,gBAAgB;GAChB,cAAc;GACd,gBAAgB;GAChB,gBAAgB;GAChB,mBAAmB;GACnB,mBAAmB;GACnB,gBAAgB;GAChB,mBAAmB;GACnB,oBAAoB;GACpB,kBAAkB;GAClB,gBAAgB;GAChB,iBAAiB;GACjB,mBAAmB;GACnB,eAAe;GACf,gBAAgB;GAChB,eAAe;GACf,gBAAgB;GAChB,sBAAsB;GACtB,gBAAgB;GAChB,gBAAgB;GAChB,sBAAsB;GACtB,gBAAgB;GAChB,oBAAoB;GACpB,cAAc;GACd,0BAA0B;GAC1B,iBAAiB;GACjB,kBAAkB;GAClB,gBAAgB;GAChB,gBAAgB;GAChB,gBAAgB;GAChB,gBAAgB;GAChB,kBAAkB;GAClB,eAAe;GACf,sBAAsB;GACtB,mBAAmB;GACnB,mBAAmB;GACnB,iBAAiB;GACjB,mBAAmB;GACnB,mBAAmB;GACnB,kBAAkB;GAClB,oBAAoB;GACpB,mBAAmB;GACnB,uBAAuB;GACvB,iBAAiB;GACjB,uBAAuB;GACvB,iBAAiB;GACjB,iBAAiB;GACjB,iBAAiB;GACjB,sBAAsB;GACtB,2BAA2B;GAC3B,sBAAsB;GACtB,oBAAoB;GACpB,oBAAoB;GACpB,kBAAkB;GAClB,iBAAiB;GACjB,sBAAsB;GACtB,mBAAmB;GACnB,mBAAmB;GACnB,iBAAiB;GACjB,eAAe;GACf,iBAAiB;GACjB,gBAAgB;GAChB,gBAAgB;GAChB,qBAAqB;GACrB,cAAc;GACd,wBAAwB;GACxB,wBAAwB;GACxB,mBAAmB;GACnB,gBAAgB;GAChB,kBAAkB;GAClB,qBAAqB;GACrB,YAAY;GACZ,gBAAgB;GAChB,cAAc;GACd,aAAa;GACb,eAAe;GACf,cAAc;GACd,kBAAkB;GAClB,oBAAoB;GACpB,kBAAkB;GAClB,mBAAmB;GACnB,qBAAqB;GACrB,iBAAiB;GACjB,eAAe;GACf,oBAAoB;GACpB,iBAAiB;GACjB,kBAAkB;GAClB,iBAAiB;GACjB,kBAAkB;GAClB,sBAAsB;GACtB,gBAAgB;GAChB,kBAAkB;GAClB,eAAe;GACf,qBAAqB;GACrB,iBAAiB;GACjB,gBAAgB;GAChB,eAAe;GACf,eAAe;GACf,eAAe;GACf,uBAAuB;GACvB,qBAAqB;GACrB,8BAA8B;GAC9B,4BAA4B;GAC5B,gBAAgB;GAChB,gBAAgB;GAChB,gBAAgB;GAChB,oBAAoB;GACpB,eAAe;GACf,oBAAoB;GACpB,oBAAoB;GACpB,yBAAyB;GACzB,uBAAuB;GACvB,qBAAqB;GACrB,yBAAyB;GACzB,sBAAsB;GACtB,sBAAsB;GACtB,eAAe;GACf,eAAe;GACf,cAAc;GACd,gBAAgB;GAChB,qBAAqB;GACrB,mBAAmB;GACnB,sBAAsB;GACtB,0BAA0B;GAC1B,8BAA8B;GAC9B,+BAA+B;GAC/B,gBAAgB;GAChB,gBAAgB;GAChB,mBAAmB;GACnB,qBAAqB;GACrB,qBAAqB;GACrB,kBAAkB;GAClB,qBAAqB;GACrB,gBAAgB;GAChB,gBAAgB;GAChB,mBAAmB;GACnB,gBAAgB;GAChB,gBAAgB;GAChB,qBAAqB;GACrB,sBAAsB;GACtB,mBAAmB;GACnB,oBAAoB;GACpB,gBAAgB;GAChB,0BAA0B;GAC1B,0BAA0B;GAC1B,4BAA4B;GAC5B,sBAAsB;GACtB,iBAAiB;GACjB,cAAc;EAChB;;EAGA,MAAa,KAAsC;GACjD,wBAAwB;GACxB,6BAA6B;GAC7B,GAAG;GACH,GAAG;GACH,iBAAiB;GACjB,yBAAyB;GACzB,yBAAyB;GACzB,iBAAiB;GACjB,aAAa;GACb,qBAAqB;GACrB,eAAe;GACf,qBAAqB;GACrB,qBAAqB;GACrB,sBAAsB;GACtB,gBAAgB;GAChB,sBAAsB;GACtB,uBAAuB;GACvB,gBAAgB;GAChB,eAAe;GACf,cAAc;GACd,qBAAqB;GACrB,iBAAiB;GACjB,gBAAgB;GAChB,kBAAkB;GAClB,yBAAyB;GACzB,mBAAmB;GACnB,eAAe;GACf,iBAAiB;GACjB,gBAAgB;GAChB,eAAe;GACf,gBAAgB;GAChB,cAAc;GACd,gBAAgB;GAChB,gBAAgB;GAChB,mBAAmB;GACnB,mBAAmB;GACnB,gBAAgB;GAChB,mBAAmB;GACnB,oBAAoB;GACpB,kBAAkB;GAClB,gBAAgB;GAChB,iBAAiB;GACjB,mBAAmB;GACnB,eAAe;GACf,gBAAgB;GAChB,eAAe;GACf,gBAAgB;GAChB,sBAAsB;GACtB,gBAAgB;GAChB,gBAAgB;GAChB,sBAAsB;GACtB,gBAAgB;GAChB,oBAAoB;GACpB,cAAc;GACd,0BAA0B;GAC1B,iBAAiB;GACjB,kBAAkB;GAClB,gBAAgB;GAChB,gBAAgB;GAChB,gBAAgB;GAChB,gBAAgB;GAChB,kBAAkB;GAClB,eAAe;GACf,sBAAsB;GACtB,mBAAmB;GACnB,mBAAmB;GACnB,iBAAiB;GACjB,mBAAmB;GACnB,mBAAmB;GACnB,kBAAkB;GAClB,oBAAoB;GACpB,mBAAmB;GACnB,uBAAuB;GACvB,iBAAiB;GACjB,uBAAuB;GACvB,iBAAiB;GACjB,iBAAiB;GACjB,iBAAiB;GACjB,sBAAsB;GACtB,2BAA2B;GAC3B,sBAAsB;GACtB,oBAAoB;GACpB,oBAAoB;GACpB,kBAAkB;GAClB,iBAAiB;GACjB,sBAAsB;GACtB,mBAAmB;GACnB,mBAAmB;GACnB,iBAAiB;GACjB,eAAe;GACf,iBAAiB;GACjB,gBAAgB;GAChB,gBAAgB;GAChB,qBAAqB;GACrB,cAAc;GACd,wBAAwB;GACxB,wBAAwB;GACxB,mBAAmB;GACnB,gBAAgB;GAChB,kBAAkB;GAClB,qBAAqB;GACrB,YAAY;GACZ,gBAAgB;GAChB,cAAc;GACd,aAAa;GACb,eAAe;GACf,cAAc;GACd,kBAAkB;GAClB,oBAAoB;GACpB,kBAAkB;GAClB,mBAAmB;GACnB,qBAAqB;GACrB,iBAAiB;GACjB,eAAe;GACf,oBAAoB;GACpB,iBAAiB;GACjB,kBAAkB;GAClB,iBAAiB;GACjB,kBAAkB;GAClB,sBAAsB;GACtB,gBAAgB;GAChB,kBAAkB;GAClB,eAAe;GACf,qBAAqB;GACrB,iBAAiB;GACjB,gBAAgB;GAChB,eAAe;GACf,eAAe;GACf,eAAe;GACf,uBAAuB;GACvB,qBAAqB;GACrB,8BAA8B;GAC9B,4BAA4B;GAC5B,gBAAgB;GAChB,gBAAgB;GAChB,gBAAgB;GAChB,oBAAoB;GACpB,eAAe;GACf,oBAAoB;GACpB,oBAAoB;GACpB,yBAAyB;GACzB,uBAAuB;GACvB,qBAAqB;GACrB,yBAAyB;GACzB,sBAAsB;GACtB,sBAAsB;GACtB,eAAe;GACf,eAAe;GACf,cAAc;GACd,gBAAgB;GAChB,qBAAqB;GACrB,mBAAmB;GACnB,sBAAsB;GACtB,0BAA0B;GAC1B,8BAA8B;GAC9B,+BAA+B;GAC/B,gBAAgB;GAChB,gBAAgB;GAChB,mBAAmB;GACnB,qBAAqB;GACrB,qBAAqB;GACrB,kBAAkB;GAClB,qBAAqB;GACrB,gBAAgB;GAChB,gBAAgB;GAChB,mBAAmB;GACnB,gBAAgB;GAChB,gBAAgB;GAChB,qBAAqB;GACrB,sBAAsB;GACtB,mBAAmB;GACnB,oBAAoB;GACpB,gBAAgB;GAChB,0BAA0B;GAC1B,0BAA0B;GAC1B,4BAA4B;GAC5B,sBAAsB;GACtB,iBAAiB;GACjB,cAAc;EAChB;;;ECngBA,MAAMI,iBAAe;EAErB,SAASC,WAAS,OAAgB,OAAkD;GAClF,IAAI,UAAU,QAAQ,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GACpE,MAAM,IAAI,UAAU,GAAG,MAAM,mBAAmB;GAElD,OAAO;EACT;EAEA,SAASC,WAAS,OAAgB,OAAe,aAAa,OAAe;GAC3E,IAAI,OAAO,UAAU,YAAa,CAAC,cAAc,MAAM,WAAW,GAChE,MAAM,IAAI,UAAU,GAAG,MAAM,WAAW,aAAa,aAAa,sBAAsB;GAE1F,OAAO;EACT;EAEA,SAAS,SAAS,OAAgB,OAAuB;GACvD,IAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,GACrD,MAAM,IAAI,UAAU,GAAG,MAAM,yBAAyB;GAExD,OAAO;EACT;EAEA,SAAS,aAAa,OAAgB,OAAkC;GACtE,IAAI,CAAC,MAAM,QAAQ,KAAK,GAAG,MAAM,IAAI,UAAU,GAAG,MAAM,kBAAkB;GAC1E,OAAO,MAAM,KAAK,MAAM,UAAUA,WAAS,MAAM,GAAG,MAAM,GAAG,OAAO,KAAK,EAAE,IAAI,IAAI,CAAC;EACtF;EAEA,SAASC,eAAa,OAAsC;GAC1D,MAAM,SAASF,WAAS,OAAO,wBAAwB;GACvD,IAAI,OAAO,OAAO,YAAY,WAC5B,MAAM,IAAI,UAAU,kDAAkD;GAExE,OAAO;IACL,WAAWC,WAAS,OAAO,WAAW,kCAAkC;IACxE,SAAS,OAAO;GAClB;EACF;EAEA,SAAS,YAAY,OAA+B;GAClD,MAAM,SAASD,WAAS,OAAO,gBAAgB;GAC/C,IAAI,OAAO,OAAO,0BAA0B,WAC1C,MAAM,IAAI,UAAU,wDAAwD;GAE9E,OAAO;IACL,WAAWC,WAAS,OAAO,WAAW,0BAA0B;IAChE,gBAAgBA,WAAS,OAAO,gBAAgB,iCAAiC,IAAI;IACrF,iBAAiB,SAAS,OAAO,iBAAiB,gCAAgC;IAClF,aAAa,SAAS,OAAO,aAAa,4BAA4B;IACtE,uBAAuB,OAAO;IAC9B,UAAUA,WAAS,OAAO,UAAU,yBAAyB;IAC7D,aAAa,aAAa,OAAO,aAAa,4BAA4B;IAC1E,WAAW,aAAa,OAAO,WAAW,0BAA0B;GACtE;EACF;EAEA,SAASE,cAAY,OAAqC;GACxD,MAAM,SAASH,WAAS,OAAO,uBAAuB;GACtD,IAAI,OAAO,SAAS,SAAS,OAAO,EAAE,MAAM,QAAQ;GACpD,IAAI,OAAO,SAAS,WAAW,OAAO,OAAO,WAAW,WACtD,MAAM,IAAI,UAAU,0DAA0D;GAEhF,OAAO;IAAE,MAAM;IAAS,QAAQ,OAAO;IAAQ,QAAQ,YAAY,OAAO,MAAM;GAAE;EACpF;;EAMA,MAAa,wBAAkD;GAC7D,SAASD;GACT,aAAa,CAAC;IACZ,IAAI,GAAGA,eAAa;IACpB,SAAS;IACT,WAAW;IACX,QAAQ;IACR,YAAY,EAAE,MAAM,SAAS;IAC7B,YAAY,CAAC;KACX,MAAM;KACN,MAAM;KACN,QAAQ;KACR,OAAO;MACL,MAAM;MACN,YAAY,GAAGA,eAAa;MAC5B,QAAQ,EAnBQ,OAAOG,eAmBf;KACV;IACF,CAAC;IACD,cAAc,EAAE,WAAW,SAAS;IACpC,QAAQ;KACN,MAAM;KACN,YAAY,GAAGH,eAAa;KAC5B,QAAQ,EAzBS,OAAOI,cAyBhB;IACV;GACF,CAAC;EACH;;;ECjGA,MAAMC,iBAAe;EAErB,SAAS,SAAS,OAAgB,OAAkD;GAClF,IAAI,UAAU,QAAQ,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GACpE,MAAM,IAAI,UAAU,GAAG,MAAM,mBAAmB;GAElD,OAAO;EACT;EAEA,SAAS,SAAS,OAAgB,OAAuB;GACvD,IAAI,OAAO,UAAU,YAAY,MAAM,KAAK,MAAM,IAChD,MAAM,IAAI,UAAU,GAAG,MAAM,4BAA4B;GAE3D,OAAO;EACT;EAEA,SAAS,YAAY,OAAgB,OAAkC;GACrE,IAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,SAAS,KAAK,MAAM,SAAS,GAC9D,MAAM,IAAI,UAAU,GAAG,MAAM,8CAA8C;GAE7E,MAAM,YAAY,MAAM,KAAK,MAAM,UAAU,SAAS,MAAM,GAAG,MAAM,GAAG,OAAO,KAAK,EAAE,EAAE,CAAC;GACzF,IAAI,IAAI,IAAI,SAAS,CAAC,CAAC,SAAS,UAAU,QACxC,MAAM,IAAI,UAAU,GAAG,MAAM,0CAA0C;GAEzE,OAAO;EACT;EAEA,SAASC,eAAa,OAAwC;GAC5D,MAAM,UAAU,SAAS,OAAO,uBAAuB;GACvD,OAAO;IACL,iBAAiB,SAAS,QAAQ,iBAAiB,+BAA+B;IAClF,WAAW,YAAY,QAAQ,WAAW,yBAAyB;IACnE,aAAa,SAAS,QAAQ,aAAa,2BAA2B;IACtE,aAAa,SAAS,QAAQ,aAAa,2BAA2B;GACxE;EACF;EAEA,SAAS,WAAW,OAAgB,OAAuB;GACzD,IAAI,CAAC,OAAO,cAAc,KAAK,KAAM,QAAmB,GACtD,MAAM,IAAI,UAAU,GAAG,MAAM,qCAAqC;GAEpE,OAAO;EACT;EAEA,SAASC,cAAY,OAAwC;GAC3D,MAAM,SAAS,SAAS,OAAO,sBAAsB;GACrD,IAAI,CAAC,MAAM,QAAQ,OAAO,OAAO,KAAK,OAAO,QAAQ,SAAS,KAAK,OAAO,QAAQ,SAAS,GACzF,MAAM,IAAI,UAAU,kEAAkE;GAExF,MAAM,UAAU,OAAO,QAAQ,KAAK,OAAO,UAAU;IACnD,MAAM,SAAS,SAAS,OAAO,gCAAgC,OAAO,KAAK,EAAE,EAAE;IAC/E,MAAM,WAAW,OAAO;IACxB,IAAI,EAAE,aAAa,QAAS,OAAO,cAAc,QAAQ,KAAM,YAAuB,IACpF,MAAM,IAAI,UAAU,yEAAyE;IAE/F,OAAO;KACL,WAAW,SAAS,OAAO,WAAW,gCAAgC;KACtE,oBAAoB;IACtB;GACF,CAAC;GACD,IAAI,IAAI,IAAI,QAAQ,KAAI,WAAU,OAAO,SAAS,CAAC,CAAC,CAAC,SAAS,QAAQ,QACpE,MAAM,IAAI,UAAU,+CAA+C;GAErE,OAAO;IACL,aAAa,SAAS,OAAO,aAAa,kCAAkC;IAC5E,iBAAiB,WAAW,OAAO,iBAAiB,+BAA+B;IACnF;GACF;EACF;;EAGA,MAAa,uBAAiD;GAC5D,SAASF;GACT,aAAa,CAAC;IACZ,IAAI,GAAGA,eAAa;IACpB,SAAS;IACT,WAAW;IACX,QAAQ;IACR,YAAY,EAAE,MAAM,SAAS;IAC7B,YAAY,CAAC;KACX,MAAM;KACN,MAAM;KACN,QAAQ;KACR,OAAO;MACL,MAAM;MACN,YAAY,GAAGA,eAAa;MAC5B,QAAQ,EAAE,OAAOC,eAAa;KAChC;IACF,CAAC;IACD,cAAc,EAAE,WAAW,SAAS;IACpC,QAAQ;KACN,MAAM;KACN,YAAY,GAAGD,eAAa;KAC5B,QAAQ,EAAE,OAAOE,cAAY;IAC/B;GACF,CAAC;EACH;;;EC7GA,SAASC,YAAiB;GAAE,MAAM,IAAI,UAAU,+BAA+B;EAAE;EAEjF,SAASC,SAAO,OAAgB,MAAkD;GAChF,IAAI,UAAU,QAAQ,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG,OAAOD,UAAQ;GACxF,IAAI,OAAO,KAAK,KAAK,CAAC,CAAC,MAAK,QAAO,CAAC,KAAK,SAAS,GAAG,CAAC,GAAG,OAAOA,UAAQ;GACxE,OAAO;EACT;EAEA,SAASE,WAAS,OAAwB;GACxC,IAAI,OAAO,UAAU,YAAY,CAAC,OAAO,cAAc,KAAK,KAAK,QAAQ,GAAG,OAAOF,UAAQ;GAC3F,OAAO;EACT;EAEA,SAASG,SAAO,OAAwB;GACtC,IAAI,OAAO,UAAU,UAAU,OAAOH,UAAQ;GAC9C,OAAO;EACT;EAEA,SAASI,QAAY,OAAgB,OAAwC;GAC3E,IAAI,CAAC,MAAM,QAAQ,KAAK,GAAG,OAAOJ,UAAQ;GAC1C,OAAO,MAAM,IAAI,KAAK;EACxB;EAEA,SAAS,QAAQ,OAAuC;GACtD,MAAM,OAAOC,SAAO,OAAO;IAAC;IAAQ;IAAO;GAAM,CAAC;GAClD,IAAI,KAAK,SAAS,UAAU,KAAK,SAAS,aAAa,OAAOD,UAAQ;GACtE,OAAO;IAAE,MAAM,KAAK;IAAM,KAAKE,WAAS,KAAK,GAAG;IAAG,MAAMC,SAAO,KAAK,IAAI;GAAE;EAC7E;EAEA,SAAS,KAAK,OAAoC;GAChD,MAAM,OAAOF,SAAO,OAAO;IAAC;IAAQ;IAAY;IAAU;IAAa;GAAU,CAAC;GAClF,IAAI,OAAO,KAAK,cAAc,YAAY,CAAC,OAAO,SAAS,KAAK,SAAS,GAAG,OAAOD,UAAQ;GAC3F,OAAO;IACL,MAAME,WAAS,KAAK,IAAI;IAAG,UAAUA,WAAS,KAAK,QAAQ;IAC3D,QAAQ,KAAK,WAAW,OAAO,OAAOA,WAAS,KAAK,MAAM;IAC1D,WAAW,KAAK;IAAW,UAAUE,QAAM,KAAK,UAAU,OAAO;GACnE;EACF;EAEA,SAASC,SAAO,OAAyC;GACvD,MAAM,OAAOJ,SAAO,OAAO;IAAC;IAAY;IAAU;GAAO,CAAC;GAC1D,MAAM,SAAS;IAAE,UAAUC,WAAS,KAAK,QAAQ;IAAG,QAAQA,WAAS,KAAK,MAAM;IAAG,OAAOE,QAAM,KAAK,OAAO,IAAI;GAAE;GAClH,IAAI,OAAO,MAAM,WAAW,KAAK,OAAO,MAAM,EAAE,EAAE,aAAa,OAAO,YACjE,OAAO,MAAM,GAAG,EAAE,CAAC,EAAE,WAAW,OAAO,QAAQ,OAAOJ,UAAQ;GACnE,IAAI,cAAc;GAClB,KAAK,MAAM,SAAS,OAAO,OAAO;IAChC,IAAI,MAAM,WAAW,QAAQ,MAAM,UAAU,MAAM,YAAY,MAAM,YAAY,aAAa,OAAOA,UAAQ;IAC7G,IAAI,MAAM,SAAS,MAAK,SAAQ,KAAK,OAAO,MAAM,YAAY,KAAK,OAAO,MAAM,MAAO,GAAG,OAAOA,UAAQ;IACzG,cAAc,MAAM;GACtB;GACA,OAAO;EACT;EAEA,SAAS,MAAM,OAAwC;GACrD,MAAM,OAAOC,SAAO,OAAO,CAAC,YAAY,QAAQ,CAAC;GACjD,MAAM,SAAS;IAAE,UAAUC,WAAS,KAAK,QAAQ;IAAG,QAAQA,WAAS,KAAK,MAAM;GAAE;GAClF,IAAI,OAAO,UAAU,OAAO,UAAU,OAAOF,UAAQ;GACrD,OAAO;EACT;EAEA,SAASM,eAAa,OAAuC;GAC3D,MAAM,OAAOL,SAAO,OAAO;IAAC;IAAa;IAAa;IAAa;IAAY;IAAS;IAAU;GAAO,CAAC;GAC1G,MAAM,YAAYE,SAAO,KAAK,SAAS;GACvC,IAAI,cAAc,MAAM;IAAC,KAAK;IAAW,KAAK;IAAW,KAAK;IAAU,KAAK;IAAQ,KAAK;GAAK,CAAC,CAAC,QAAO,UAAS,UAAU,KAAA,CAAS,CAAC,CAAC,SAAS,GAAG,OAAOH,UAAQ;GACjK,MAAM,QAAQ,KAAK,UAAU,KAAA,IAAY,KAAA,IAAYE,WAAS,KAAK,KAAK;GACxE,IAAI,UAAU,KAAA,MAAc,QAAQ,KAAK,QAAQ,KAAK,OAAOF,UAAQ;GACrE,OAAO;IACL;IACA,GAAI,KAAK,cAAc,KAAA,IAAY,CAAC,IAAI,EAAE,WAAWE,WAAS,KAAK,SAAS,EAAE;IAC9E,GAAI,KAAK,cAAc,KAAA,IAAY,CAAC,IAAI,EAAE,WAAWA,WAAS,KAAK,SAAS,EAAE;IAC9E,GAAI,KAAK,aAAa,KAAA,IAAY,CAAC,IAAI,EAAE,UAAUA,WAAS,KAAK,QAAQ,EAAE;IAC3E,GAAI,UAAU,KAAA,IAAY,CAAC,IAAI,EAAE,MAAM;IACvC,GAAI,KAAK,WAAW,KAAA,IAAY,CAAC,IAAI,EAAE,QAAQG,SAAO,KAAK,MAAM,EAAE;IACnE,GAAI,KAAK,UAAU,KAAA,IAAY,CAAC,IAAI,EAAE,OAAO,MAAM,KAAK,KAAK,EAAE;GACjE;EACF;EAEA,SAASE,cAAY,OAAsC;GACzD,MAAM,OAAON,SAAO,OAAO;IAAC;IAAQ;IAAa;IAAc;IAAY;GAAO,CAAC;GACnF,IAAI,KAAK,SAAS,cAAc,KAAK,SAAS,aAAa,KAAK,SAAS,eAAe,OAAOD,UAAQ;GACvG,IAAI,OAAO,KAAK,eAAe,aAAa,OAAO,KAAK,aAAa,WAAW,OAAOA,UAAQ;GAC/F,MAAM,YAAYG,SAAO,KAAK,SAAS;GACvC,IAAI,cAAc,IAAI,OAAOH,UAAQ;GACrC,OAAO;IAAE,MAAM,KAAK;IAAM;IAAW,YAAY,KAAK;IAAY,UAAU,KAAK;IAAU,OAAOI,QAAM,KAAK,OAAO,IAAI;GAAE;EAC5H;EAEA,MAAa,8BAA8B,EAAE,OAAOE,eAAa;EACjE,MAAa,6BAA6B,EAAE,OAAOC,cAAY;;;ECzE/D,MAAMC,iBAAe;EAErB,MAAa,yBAAmD;GAC9D,SAASA;GACT,aAAa,CAAC;IACZ,IAAI,GAAGA,eAAa;IACpB,SAAS;IACT,WAAW;IACX,QAAQ;IACR,YAAY,EAAE,MAAM,SAAS;IAC7B,YAAY,CAAC;KACX,MAAM;KAAW,MAAM;KAAW,QAAQ;KAC1C,OAAO;MAAE,MAAM;MAAU,YAAY,GAAGA,eAAa;MAAyB,QAAQC;KAAc;IACtG,CAAC;IACD,cAAc,EAAE,WAAW,SAAS;IACpC,QAAQ;KAAE,MAAM;KAAU,YAAY,GAAGD,eAAa;KAAwB,QAAQE;IAAa;GACrG,CAAC;EACH;;;EClCA,SAASC,YAAiB;GAAE,MAAM,IAAI,UAAU,mCAAmC;EAAE;EAErF,SAASC,SAAO,OAAgB,MAAkD;GAChF,IAAI,UAAU,QAAQ,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG,OAAOD,UAAQ;GACxF,IAAI,OAAO,KAAK,KAAK,CAAC,CAAC,MAAK,QAAO,CAAC,KAAK,SAAS,GAAG,CAAC,GAAG,OAAOA,UAAQ;GACxE,OAAO;EACT;EAEA,SAASE,SAAO,OAAwB;GACtC,IAAI,OAAO,UAAU,YAAY,MAAM,KAAK,MAAM,MAAM,MAAM,SAAS,IAAI,GAAG,OAAOF,UAAQ;GAC7F,OAAO;EACT;EAEA,SAAS,aAAa,OAAyC;GAC7D,MAAM,OAAOC,SAAO,OAAO;IAAC;IAAS;IAAS;IAAmB;IAAS;GAAQ,CAAC;GACnF,MAAM,QAAQC,SAAO,KAAK,KAAK;GAC/B,IAAI,MAAM,SAAS,OAAO,OAAO,KAAK,oBAAoB,WAAW,OAAOF,UAAQ;GACpF,MAAM,WAAWC,SAAO,KAAK,OAAO;IAAC;IAAQ;IAAe;GAAK,CAAC;GAClE,IAAI;GACJ,IAAI,SAAS,SAAS,SAAS,OAAO,KAAK,QAAQ,CAAC,CAAC,WAAW,GAAG,QAAQ,EAAE,MAAM,MAAM;QACpF,IAAI,SAAS,SAAS,eAAe,OAAO,KAAK,QAAQ,CAAC,CAAC,WAAW,KAAK,SAAS,QAAQ,KAAA,GAC/F,QAAQ;IAAE,MAAM;IAAa,aAAaC,SAAO,SAAS,WAAW;GAAE;QAClE,IAAI,SAAS,SAAS,eAAe,OAAO,KAAK,QAAQ,CAAC,CAAC,WAAW,KAAK,SAAS,gBAAgB,KAAA,GACzG,QAAQ;IAAE,MAAM;IAAa,KAAKA,SAAO,SAAS,GAAG;GAAE;QAClD,OAAOF,UAAQ;GACtB,IAAI,KAAK,UAAU,KAAA,MAAc,OAAO,KAAK,UAAU,YAAY,CAAC,OAAO,UAAU,KAAK,KAAK,KAAK,KAAK,QAAQ,KAAK,KAAK,QAAQ,KAAK,OAAOA,UAAQ;GACvJ,IAAI,KAAK,WAAW,KAAA,MAAc,OAAO,KAAK,WAAW,YAAY,CAAC,4BAA4B,KAAK,KAAK,MAAM,IAAI,OAAOA,UAAQ;GACrI,OAAO;IACL,OAAO,MAAM,KAAK,CAAC,CAAC,QAAQ,SAAS,GAAG;IAAG;IAAO,iBAAiB,KAAK;IACxE,GAAI,KAAK,UAAU,KAAA,IAAY,CAAC,IAAI,EAAE,OAAO,KAAK,MAAgB;IAClE,GAAI,KAAK,WAAW,KAAA,IAAY,CAAC,IAAI,EAAE,QAAQ,KAAK,OAAiB;GACvE;EACF;EAEA,MAAa,gCAAgC,EAAE,OAAO,aAAa;EAEnE,SAAS,OAAO,OAAwB;GACtC,IAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,GAAG,MAAM,IAAI,UAAU,kCAAkC;GAChH,OAAO;EACT;EAEA,SAAS,SAAS,OAAwB;GACxC,MAAM,SAAS,OAAO,KAAK;GAC3B,IAAI,CAAC,OAAO,cAAc,MAAM,KAAK,SAAS,GAAG,MAAM,IAAI,UAAU,kCAAkC;GACvG,OAAO;EACT;EAEA,SAAS,IAAI,OAAqC;GAChD,MAAM,OAAOC,SAAO,OAAO;IAAC;IAAa;IAAS;IAAa;IAAO;IAAY;IAAY;IAAgB;IAAQ;GAAS,CAAC;GAChI,IAAI,OAAO,KAAK,aAAa,WAAW,MAAM,IAAI,UAAU,kCAAkC;GAC9F,MAAM,YAAY,KAAK,cAAc,KAAA,IAAY,KAAA,IAAYA,SAAO,KAAK,WAAW,CAAC,MAAM,OAAO,CAAC;GACnG,OAAO;IACL,WAAWC,SAAO,KAAK,SAAS;IAAG,OAAOA,SAAO,KAAK,KAAK;IAAG,UAAU,KAAK;IAC7E,GAAI,cAAc,KAAA,IAAY,CAAC,IAAI,EAAE,WAAW;KAAE,IAAIA,SAAO,UAAU,EAAE;KAAG,OAAOA,SAAO,UAAU,KAAK;IAAE,EAAE;IAC7G,GAAI,KAAK,QAAQ,KAAA,IAAY,CAAC,IAAI,EAAE,KAAKA,SAAO,KAAK,GAAG,EAAE;IAC1D,UAAU,SAAS,KAAK,QAAQ;IAAG,cAAc,SAAS,KAAK,YAAY;IAC3E,MAAM,OAAO,KAAK,IAAI;IAAG,SAASA,SAAO,KAAK,OAAO;GACvD;EACF;EAEA,SAAS,YAAY,OAAwC;GAC3D,MAAM,OAAOD,SAAO,OAAO;IAAC;IAAQ;IAAQ;GAAY,CAAC;GACzD,IAAI,KAAK,SAAS,cAAc,KAAK,SAAS,SAAS;IACrD,IAAI,OAAO,KAAK,IAAI,CAAC,CAAC,WAAW,GAAG,MAAM,IAAI,UAAU,kCAAkC;IAC1F,OAAO,EAAE,MAAM,KAAK,KAAK;GAC3B;GACA,IAAI,KAAK,SAAS,aAAa,CAAC,MAAM,QAAQ,KAAK,IAAI,KAAK,KAAK,KAAK,SAAS,IAAI,MAAM,IAAI,UAAU,kCAAkC;GACzI,OAAO;IACL,MAAM;IAAW,MAAM,KAAK,KAAK,IAAI,GAAG;IACxC,GAAI,KAAK,eAAe,KAAA,IAAY,CAAC,IAAI,EAAE,YAAYC,SAAO,KAAK,UAAU,EAAE;GACjF;EACF;EAEA,MAAa,+BAA+B,EAAE,OAAO,YAAY;;;EC3DjE,MAAMC,iBAAe;EAErB,MAAa,2BAAqD;GAChE,SAASA;GACT,aAAa,CAAC;IACZ,IAAI,GAAGA,eAAa;IACpB,SAAS;IAAsB,WAAW;IAAsB,QAAQ;IACxE,YAAY,EAAE,MAAM,SAAS;IAC7B,YAAY,CAAC;KACX,MAAM;KAAW,MAAM;KAAW,QAAQ;KAC1C,OAAO;MAAE,MAAM;MAAU,YAAY,GAAGA,eAAa;MAA2B,QAAQ;KAA8B;IACxH,CAAC;IACD,cAAc,EAAE,WAAW,SAAS;IACpC,QAAQ;KAAE,MAAM;KAAU,YAAY,GAAGA,eAAa;KAA0B,QAAQ;IAA6B;GACvH,CAAC;EACH;;;EC3BA,SAASC,YAAiB;GAAE,MAAM,IAAI,UAAU,6BAA6B;EAAE;EAE/E,SAASC,SAAO,OAAgB,MAAmD;GACjF,IAAI,UAAU,QAAQ,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG,OAAOD,UAAQ;GACxF,IAAI,SAAS,KAAA,KAAa,OAAO,KAAK,KAAK,CAAC,CAAC,MAAK,QAAO,CAAC,KAAK,SAAS,GAAG,CAAC,GAAG,OAAOA,UAAQ;GAC9F,OAAO;EACT;EAEA,SAAS,OAAO,OAAwB;GACtC,IAAI,OAAO,UAAU,YAAY,MAAM,KAAK,MAAM,MAAM,MAAM,SAAS,IAAI,GAAG,OAAOA,UAAQ;GAC7F,OAAO;EACT;EAEA,SAAS,QAAQ,OAAwB;GACvC,MAAM,KAAK,OAAO,KAAK;GACvB,IAAI,CAAC,8EAA8E,KAAK,EAAE,GAAG,OAAOA,UAAQ;GAC5G,OAAO;EACT;EAEA,SAAS,MAAM,OAAwB;GACrC,MAAM,QAAQ,OAAO,KAAK,CAAC,CAAC,KAAK;GACjC,IAAI,MAAM,SAAS,KAAK,OAAOA,UAAQ;GACvC,OAAO;EACT;EAEA,SAASE,QAAM,OAA2B;GAAE,OAAO,MAAM,QAAQ,KAAK,IAAI,QAAQF,UAAQ;EAAE;EAC5F,SAAS,OAAO,OAAwB;GAAE,OAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,IAAI,QAAQA,UAAQ;EAAE;EAEzH,SAAS,YAAY,OAA0C;GAC7D,MAAM,OAAOC,SAAO,OAAO;IAAC;IAAa;IAAa;GAAS,CAAC;GAChE,OAAO;IACL,WAAW,OAAO,YAAY,OAAO,QAAQA,SAAO,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,WAAW;KACzF,MAAM,QAAQA,SAAO,OAAO,CAAC,KAAK,GAAG,CAAC;KACtC,OAAO,CAAC,KAAK;MAAE,GAAG,OAAO,MAAM,CAAC;MAAG,GAAG,OAAO,MAAM,CAAC;KAAE,CAAC;IACzD,CAAC,CAAC;IACF,WAAWC,QAAM,KAAK,SAAS,CAAC,CAAC,IAAI,MAAM;IAC3C,SAAS,OAAO,YAAY,OAAO,QAAQD,SAAO,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,WAAW;KACrF,MAAM,QAAQA,SAAO,OAAO,CAAC,MAAM,IAAI,CAAC;KACxC,OAAO,CAAC,KAAK;MAAE,IAAI,OAAO,MAAM,EAAE;MAAG,IAAI,OAAO,MAAM,EAAE;KAAE,CAAC;IAC7D,CAAC,CAAC;GACJ;EACF;EAEA,MAAM,iBAAiB;GAAC;GAAa;GAAS;GAAO;EAAW;EAEhE,SAAS,gBAAgB,MAAuD;GAC9E,MAAM,YAAY,KAAK,cAAc,KAAA,IAAY,KAAA,IAAYA,SAAO,KAAK,WAAW,CAAC,MAAM,OAAO,CAAC;GACnG,OAAO;IACL,WAAW,OAAO,KAAK,SAAS;IAAG,OAAO,OAAO,KAAK,KAAK;IAC3D,GAAI,KAAK,QAAQ,KAAA,IAAY,CAAC,IAAI,EAAE,KAAK,OAAO,KAAK,GAAG,EAAE;IAC1D,GAAI,cAAc,KAAA,IAAY,CAAC,IAAI,EAAE,WAAW;KAAE,IAAI,OAAO,UAAU,EAAE;KAAG,OAAO,OAAO,UAAU,KAAK;IAAE,EAAE;GAC/G;EACF;EAEA,MAAa,sBAAsB,EAAE,MAAM,OAA+B;GACxE,MAAM,OAAOA,SAAO,OAAO;IAAC;IAAW;IAAS;IAAc;GAAa,CAAC;GAC5E,MAAM,aAAaC,QAAM,KAAK,UAAU,CAAC,CAAC,KAAI,UAAS,gBAAgBD,SAAO,OAAO,cAAc,CAAC,CAAC;GACrG,IAAI,IAAI,IAAI,WAAW,KAAI,cAAa,UAAU,SAAS,CAAC,CAAC,CAAC,SAAS,WAAW,QAAQ,OAAOD,UAAQ;GACzG,OAAO;IAAE,SAAS,QAAQ,KAAK,OAAO;IAAG,OAAO,MAAM,KAAK,KAAK;IAAG;IAAY,aAAa,YAAY,KAAK,WAAW;GAAE;EAC5H,EAAE;EAEF,MAAa,0BAA0B,EAAE,MAAM,OAA8C;GAC3F,OAAO,EAAE,SAAS,QAAQC,SAAO,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,EAAE;EAChE,EAAE;EAEF,MAAa,2BAA2B,EAAE,MAAM,OAAoC;GAClF,MAAM,OAAOA,SAAO,KAAK;GACzB,MAAM,KAAK,QAAQ,KAAK,OAAO;GAC/B,IAAI,KAAK,SAAS,YAAY,KAAK,SAAS,UAAU;IACpD,SAAO,MAAM;KAAC;KAAQ;KAAW;IAAO,CAAC;IACzC,OAAO;KAAE,MAAM,KAAK;KAAM,SAAS;KAAI,OAAO,MAAM,KAAK,KAAK;IAAE;GAClE;GACA,IAAI,KAAK,SAAS,OAAO;IACvB,SAAO,MAAM;KAAC;KAAQ;KAAW;IAAY,CAAC;IAC9C,MAAM,aAAaC,QAAM,KAAK,UAAU,CAAC,CAAC,IAAI,MAAM;IACpD,IAAI,WAAW,WAAW,GAAG,OAAOF,UAAQ;IAC5C,OAAO;KAAE,MAAM,KAAK;KAAM,SAAS;KAAI;IAAW;GACpD;GACA,IAAI,KAAK,SAAS,UAAU;IAC1B,SAAO,MAAM;KAAC;KAAQ;KAAW;IAAW,CAAC;IAC7C,OAAO;KAAE,MAAM,KAAK;KAAM,SAAS;KAAI,WAAW,OAAO,KAAK,SAAS;IAAE;GAC3E;GACA,IAAI,KAAK,SAAS,WAAW;IAC3B,SAAO,MAAM;KAAC;KAAQ;KAAW;IAAa,CAAC;IAC/C,OAAO;KAAE,MAAM,KAAK;KAAM,SAAS;KAAI,aAAa,YAAY,KAAK,WAAW;IAAE;GACpF;GACA,OAAOA,UAAQ;EACjB,EAAE;EAEF,MAAa,0BAA0B,EAAE,MAAM,OAA0C;GACvF,OAAOE,QAAM,KAAK,CAAC,CAAC,IAAI,oBAAoB,KAAK;EACnD,EAAE;EAEF,MAAa,8BAA8B,EAAE,MAAM,OAAuC;GACxF,MAAM,OAAOD,SAAO,OAAO,CAAC,SAAS,SAAS,CAAC;GAC/C,MAAM,UAAUC,QAAM,KAAK,OAAO,CAAC,CAAC,KAAK,UAA+B;IACtE,MAAM,SAASD,SAAO,OAAO;KAAC,GAAG;KAAgB;KAAU;KAAY;IAAiB,CAAC;IACzF,IAAK,OAAO,WAAW,YAAY,OAAO,WAAW,iBAAkB,OAAO,OAAO,aAAa,WAAW,OAAOD,UAAQ;IAC5H,OAAO;KACL,GAAG,gBAAgB,MAAM;KAAG,QAAQ,OAAO;KAAQ,UAAU,OAAO;KACpE,GAAI,OAAO,oBAAoB,KAAA,IAAY,CAAC,IAAI,EAAE,iBAAiB,OAAO,OAAO,eAAe,EAAE;IACpG;GACF,CAAC;GACD,OAAO;IAAE,OAAO,oBAAoB,MAAM,KAAK,KAAK;IAAG;GAAQ;EACjE,EAAE;;;ECtFF,MAAMG,iBAAe;EAErB,MAAa,yBAAmD;GAC9D,SAASA;GACT,aAAa;IACX;KAAE,QAAQ;KAAQ,SAAS,KAAA;KAAW,QAAQ;IAAwB;IACtE;KAAE,QAAQ;KAAQ,SAAS;KAAyB,QAAQ;IAA4B;IACxF;KAAE,QAAQ;KAAS,SAAS;KAA0B,QAAQ;IAAoB;GACpF,CAAC,CAAC,KAAK,EAAE,QAAQ,SAAS,cAAc;IACtC,IAAI,GAAGA,eAAa,sBAAsB;IAC1C,SAAS;IAAsB,WAAW;IAAsB;IAChE,YAAY,EAAE,MAAM,SAAS;IAC7B,YAAY,YAAY,KAAA,IAAY,CAAC,IAAI,CAAC;KACxC,MAAM;KAAW,MAAM;KAAW,QAAQ;KAC1C,OAAO;MAAE,MAAM;MAAU,YAAY,GAAGA,eAAa,kBAAkB,OAAO;MAAW,QAAQ;KAAQ;IAC3G,CAAC;IACD,cAAc,EAAE,WAAW,SAAS;IACpC,QAAQ;KAAE,MAAM;KAAU,YAAY,GAAGA,eAAa,kBAAkB,OAAO;KAAU,QAAQ;IAAO;GAC1G,EAAE;EACJ;;;;EC9BA,SAAgB,qBAAqB,SAAiB,WAAmC;GACvF,SAAS,UAAiB;IAAE,MAAM,IAAI,UAAU,OAAO;GAAE;GACzD,SAAS,OAAO,OAAgB,MAAkD;IAChF,IAAI,UAAU,QAAQ,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG,OAAO,QAAQ;IACxF,IAAI,OAAO,KAAK,KAAK,CAAC,CAAC,MAAK,QAAO,CAAC,KAAK,SAAS,GAAG,CAAC,GAAG,OAAO,QAAQ;IACxE,OAAO;GACT;GACA,SAAS,KAAK,OAAgB,MAAM,WAAmB;IACrD,IAAI,OAAO,UAAU,YAAY,MAAM,SAAS,IAAI,KAAK,MAAM,SAAS,KAAK,OAAO,QAAQ;IAC5F,OAAO;GACT;GACA,SAAS,SAAS,OAAwB;IACxC,MAAM,KAAK,KAAK,OAAO,GAAG;IAC1B,OAAO,GAAG,KAAK,MAAM,KAAK,QAAQ,IAAI;GACxC;GACA,SAAS,KAAK,OAAwB;IACpC,MAAM,KAAK,SAAS,KAAK;IACzB,OAAO,8EAA8E,KAAK,EAAE,IAAI,KAAK,QAAQ;GAC/G;GACA,SAAS,MAAM,OAAwB;IACrC,OAAO,OAAO,UAAU,YAAY,OAAO,cAAc,KAAK,KAAK,SAAS,IAAI,QAAQ,QAAQ;GAClG;GACA,SAAS,MAAM,OAA2B;IAAE,OAAO,MAAM,QAAQ,KAAK,IAAI,QAAQ,QAAQ;GAAE;GAC5F,OAAO;IAAE;IAAS;IAAQ;IAAM;IAAU;IAAM;IAAO;GAAM;EAC/D;;;EC9BA,MAAM,EAAE,SAAA,WAAS,QAAA,UAAQ,MAAA,QAAM,UAAA,YAAU,MAAA,QAAM,OAAA,SAAO,OAAA,YAAU,qBAAqB,+BAA+B,IAAM;EAE1H,MAAa,8BAA8B,EAAE,MAAM,OAA6C;GAC9F,OAAO,EAAE,QAAQC,OAAKC,SAAO,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE;EAC1D,EAAE;EAEF,MAAM,eAAe;GAAC;GAAS;GAAY;GAAc;GAAa;GAAiB;GAAQ;EAAQ;EACvG,SAAS,QAAQ,OAAkC;GACjD,MAAM,OAAOA,SAAO,OAAO,YAAY;GACvC,MAAM,QAAQC,OAAK,KAAK,OAAO,GAAG,CAAC,CAAC,KAAK;GACzC,IAAI,UAAU,MAAM,CAAC;IAAC;IAAc;IAAU;IAAc;GAAU,CAAC,CAAC,SAAS,OAAO,KAAK,IAAI,CAAC,KAC5F,KAAK,WAAW,WAAW,KAAK,WAAW,aAAc,OAAOC,UAAQ;GAC9E,OAAO;IACL;IAAO,UAAUD,OAAK,KAAK,QAAQ;IAAG,YAAYA,OAAK,KAAK,UAAU;IAAG,WAAWA,OAAK,KAAK,SAAS;IACvG,eAAeA,OAAK,KAAK,aAAa;IAAG,MAAM,KAAK;IAAkC,QAAQ,KAAK;GACrG;EACF;EACA,SAAS,QAAQ,OAAwC;GACvD,MAAM,MAAMD,SAAO,OAAO;IAAC;IAAQ;IAAa;IAAY;IAAU;IAAU;IAAc;IAAe;GAAe,CAAC;GAC7H,IAAI,IAAI,SAAS,cAAc;IAC7B,MAAM,OAAOA,SAAO,OAAO;KAAC;KAAQ;KAAiB;KAAY;IAAQ,CAAC;IAC1E,MAAM,WAAWG,QAAM,KAAK,QAAQ;IACpC,MAAM,SAASA,QAAM,KAAK,MAAM;IAChC,IAAI,UAAU,UAAU,OAAOD,UAAQ;IACvC,OAAO;KAAE,MAAM;KAAc,eAAeH,OAAK,KAAK,aAAa;KAAG;KAAU;IAAO;GACzF;GACA,IAAI,IAAI,SAAS,YAAY;IAC3B,MAAM,OAAOC,SAAO,OAAO;KAAC;KAAQ;KAAU;KAAc;IAAa,CAAC;IAC1E,OAAO;KAAE,MAAM;KAAY,QAAQD,OAAK,KAAK,MAAM;KAAG,YAAYA,OAAK,KAAK,UAAU;KAAG,aAAaI,QAAM,KAAK,WAAW;IAAE;GAChI;GACA,MAAM,OAAOH,SAAO,OAAO;IAAC;IAAQ;IAAa;IAAY;GAAQ,CAAC;GACtE,MAAM,WAAWG,QAAM,KAAK,QAAQ;GACpC,MAAM,SAASA,QAAM,KAAK,MAAM;GAChC,IAAI,KAAK,SAAS,gBAAgB,SAAS,UAAU,OAAOD,UAAQ;GACpE,OAAO;IAAE,MAAM;IAAc,WAAWE,WAAS,KAAK,SAAS;IAAG;IAAU;GAAO;EACrF;EACA,SAAS,OAAO,OAAiC;GAC/C,MAAM,OAAOJ,SAAO,OAAO;IAAC;IAAa;IAAS;IAAO;GAAQ,CAAC;GAClE,MAAM,UAAU,4BAA4B,MAAM;IAAE,WAAW,KAAK;IAAW,QAAQ,KAAK;GAAO,CAAC;GACpG,IAAI,QAAQ,WAAW,KAAA,GAAW,OAAOE,UAAQ;GACjD,OAAO;IACL,WAAW,QAAQ;IAAW,OAAOD,OAAK,KAAK,KAAK;IAAG,QAAQ,QAAQ;IACvE,GAAI,KAAK,QAAQ,KAAA,IAAY,CAAC,IAAI,EAAE,KAAKA,OAAK,KAAK,GAAG,EAAE;GAC1D;EACF;EAEA,MAAa,sBAAsB,EAAE,MAAM,OAA+B;GACxE,MAAM,OAAOD,SAAO,OAAO;IAAC;IAAU;IAAc;IAAW;IAAW;GAAS,CAAC;GACpF,IAAIK,QAAM,KAAK,OAAO,CAAC,CAAC,SAAS,IAAI,OAAOH,UAAQ;GACpD,OAAO;IACL,QAAQH,OAAK,KAAK,MAAM;IAAG,YAAYA,OAAK,KAAK,UAAU;IAAG,SAAS,QAAQ,KAAK,OAAO;IAC3F,SAASM,QAAM,KAAK,OAAO,CAAC,CAAC,IAAI,OAAO;IAAG,GAAI,KAAK,YAAY,KAAA,IAAY,CAAC,IAAI,EAAE,SAASN,OAAK,KAAK,OAAO,EAAE;GACjH;EACF,EAAE;EACF,MAAa,wBAAwB,EAAE,MAAM,OAAiC;GAC5E,MAAM,OAAOC,SAAO,OAAO,CAAC,SAAS,SAAS,CAAC;GAC/C,OAAO;IAAE,OAAOC,OAAK,KAAK,OAAO,GAAG,CAAC,CAAC,KAAK;IAAG,GAAI,KAAK,YAAY,KAAA,IAAY,CAAC,IAAI,EAAE,SAASF,OAAK,KAAK,OAAO,EAAE;GAAG;EACvH,EAAE;EACF,MAAa,4BAA4B,EAAE,MAAM,OAAqC;GACpF,MAAM,OAAOC,SAAO,OAAO;IAAC;IAAU;IAAW;GAAU,CAAC;GAC5D,IAAI,OAAO,KAAK,aAAa,WAAW,OAAOE,UAAQ;GACvD,OAAO;IAAE,QAAQH,OAAK,KAAK,MAAM;IAAG,SAASA,OAAK,KAAK,OAAO;IAAG,UAAU,KAAK;GAAS;EAC3F,EAAE;EACF,MAAa,sBAAsB,EAAE,MAAM,OAA6C;GACtF,OAAO,EAAE,QAAQA,OAAKC,SAAO,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE;EAC1D,EAAE;EACF,MAAa,sBAAsB,EAAE,MAAM,OAA+B;GACxE,MAAM,OAAOA,SAAO,OAAO;IAAC;IAAU;IAAY;GAAW,CAAC;GAC9D,MAAM,YAAYK,QAAM,KAAK,SAAS,CAAC,CAAC,KAAK,OAAO,UAAU;IAC5D,MAAM,WAAWL,SAAO,OAAO;KAAC;KAAc;KAAe;KAAU;KAAW;KAAW;IAAS,CAAC;IACvG,IAAIG,QAAM,SAAS,MAAM,MAAM,QAAQ,GAAG,OAAOD,UAAQ;IACzD,MAAM,cAAcD,OAAK,SAAS,aAAa,EAAE;IACjD,IAAI,CAAC,kBAAkB,KAAK,WAAW,GAAG,OAAOC,UAAQ;IACzD,OAAO;KAAE,YAAYH,OAAK,SAAS,UAAU;KAAG;KAAa,QAAQ,QAAQ;KAAG,SAASI,QAAM,SAAS,OAAO;KAC7G,SAAS,QAAQ,SAAS,OAAO;KAAG,SAASE,QAAM,SAAS,OAAO,CAAC,CAAC,IAAI,MAAM;IAAE;GACrF,CAAC;GACD,IAAI,UAAU,WAAW,KAAK,IAAI,IAAI,UAAU,KAAI,aAAY,SAAS,UAAU,CAAC,CAAC,CAAC,SAAS,UAAU,QAAQ,OAAOH,UAAQ;GAChI,OAAO;IAAE,QAAQH,OAAK,KAAK,MAAM;IAAG,UAAUM,QAAM,KAAK,QAAQ,CAAC,CAAC,IAAIN,MAAI;IAAG;GAAU;EAC1F,EAAE;EACF,MAAa,sBAAsB,EAAE,MAAM,OAA0C;GAAE,OAAOM,QAAM,KAAK,CAAC,CAAC,IAAI,oBAAoB,KAAK;EAAE,EAAE;EAC5I,MAAa,0BAA0B,EAAE,MAAM,OAAsC;GAAE,OAAO,UAAU,OAAO,OAAO,oBAAoB,MAAM,KAAK;EAAE,EAAE;EACzJ,MAAa,yBAAyB,EAAE,OAAO,QAAQ;EACvD,MAAa,wBAAwB,EAAE,OAAO,OAAO;EAErD,MAAa,qCAAqC,EAAE,MAAM,OAA8C;GACtG,MAAM,OAAOL,SAAO,OAAO,CAAC,UAAU,aAAa,CAAC;GACpD,MAAM,SAAS,QAAQ,KAAK,MAAM;GAClC,MAAM,cAAcG,QAAM,KAAK,WAAW;GAC1C,IAAI,OAAO,SAAS,gBAAgB,cAAc,OAAO,cAAc,MAAQ,OAAOD,UAAQ;GAC9F,OAAO;IAAE;IAAQ;GAAY;EAC/B,EAAE;EACF,MAAa,0BAA0B,EAAE,MAAM,OAAmC;GAChF,MAAM,OAAOF,SAAO,OAAO;IAAC;IAAiB;IAAY;GAAO,CAAC;GACjE,OAAO;IAAE,eAAeD,OAAK,KAAK,aAAa;IAAG,UAAUK,WAAS,KAAK,QAAQ,CAAC,CAAC,KAAK;IAAG,OAAOA,WAAS,KAAK,KAAK,CAAC,CAAC,KAAK;GAAE;EACjI,EAAE;;;EChGF,SAASE,SAAO,OAAyC;GACvD,IAAI,UAAU,QAAQ,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG,MAAM,IAAI,UAAU,yBAAyB;GACtH,OAAO;EACT;EACA,SAASC,QAAM,OAAwB;GACrC,IAAI,OAAO,UAAU,YAAY,CAAC,OAAO,cAAc,KAAK,KAAK,QAAQ,GAAG,MAAM,IAAI,UAAU,0BAA0B;GAC1H,OAAO;EACT;EACA,SAASC,OAAK,OAAwB;GACpC,IAAI,OAAO,UAAU,UAAU,MAAM,IAAI,UAAU,yBAAyB;GAC5E,OAAO;EACT;EACA,SAASC,QAAM,OAA2B;GACxC,IAAI,CAAC,MAAM,QAAQ,KAAK,GAAG,MAAM,IAAI,UAAU,yBAAyB;GACxE,OAAO;EACT;EACA,MAAa,8BAA8B,EAAE,MAAM,OAAuC;GACxF,MAAM,OAAOH,SAAO,KAAK;GACzB,MAAM,QAAQ,KAAK,UAAU,KAAA,IAAY,KAAA,IAAYA,SAAO,KAAK,KAAK;GACtE,MAAM,UAAU,wBAAwB,MAAM;IAAE,eAAe,KAAK;IAAe,UAAU,OAAO,YAAY;IAAK,OAAO,OAAO,SAAS;GAAI,CAAC;GACjJ,OAAO;IACL,eAAe,QAAQ;IAAe,UAAU,sBAAsB,MAAM,KAAK,QAAQ;IAAG,UAAU,sBAAsB,MAAM,KAAK,QAAQ;IAC/I,SAASG,QAAM,KAAK,OAAO,CAAC,CAAC,KAAI,UAAS;KAAE,MAAM,QAAQH,SAAO,KAAK;KAAG,OAAO;MAAE,UAAUC,QAAM,MAAM,QAAQ;MAAG,QAAQA,QAAM,MAAM,MAAM;KAAE;IAAE,CAAC;IAClJ,aAAaA,QAAM,KAAK,WAAW;IAAG,cAAcC,OAAK,KAAK,YAAY;IAC1E,GAAI,UAAU,KAAA,IAAY,CAAC,IAAI,EAAE,OAAO;KAAE,UAAU,QAAQ;KAAU,OAAO,QAAQ;IAAM,EAAE;GAC/F;EACF,EAAE;EACF,MAAa,yBAAyB,EAAE,MAAM,OAAkC;GAC9E,MAAM,OAAOF,SAAO,KAAK;GACzB,OAAO;IAAE,UAAUE,OAAK,KAAK,QAAQ;IAAG,OAAOA,OAAK,KAAK,KAAK;IAAG,QAAQC,QAAM,KAAK,MAAM,CAAC,CAAC,KAAI,UAAS;KACvG,MAAM,QAAQH,SAAO,KAAK;KAC1B,MAAM,OAAO,oBAAoB,MAAM;MAAE,QAAQ,MAAM;MAAQ,YAAY,MAAM;MAAY,SAAS,MAAM;MAAS,SAAS,MAAM;KAAQ,CAAC;KAC7I,IAAI,OAAO,MAAM,sBAAsB,WAAW,MAAM,IAAI,UAAU,4BAA4B;KAClG,OAAO;MAAE,QAAQ,KAAK;MAAQ,YAAY,KAAK;MAAY,SAAS,KAAK;MAAS,SAAS,KAAK;MAC9F,kBAAkBC,QAAM,MAAM,gBAAgB;MAAG,mBAAmB,MAAM;KAAkB;IAChG,CAAC;GAAE;EACL,EAAE;;;ECpCF,SAASG,SAAO,OAAgB,MAAkD;GAChF,IAAI,UAAU,QAAQ,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,KAAK,OAAO,KAAK,KAAK,CAAC,CAAC,MAAK,QAAO,CAAC,KAAK,SAAS,GAAG,CAAC,GAAG,MAAM,IAAI,UAAU,0BAA0B;GAC9K,OAAO;EACT;EACA,MAAa,+BAA+B,EAAE,MAAM,OAAwC;GAC1F,MAAM,OAAOA,SAAO,OAAO,CAAC,SAAS,CAAC;GACtC,IAAI,CAAC,MAAM,QAAQ,KAAK,OAAO,KAAK,KAAK,QAAQ,SAAS,KAAK,KAAK,QAAQ,SAAS,IAAI,MAAM,IAAI,UAAU,8BAA8B;GAC3I,MAAM,UAAU,KAAK,QAAQ,KAAI,WAAU,oBAAoB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM;GACvF,IAAI,IAAI,IAAI,OAAO,CAAC,CAAC,SAAS,QAAQ,QAAQ,MAAM,IAAI,UAAU,uBAAuB;GACzF,OAAO,EAAE,QAAQ;EACnB,EAAE;EACF,MAAa,8BAA8B,EAAE,MAAM,OAAuC;GACxF,MAAM,OAAOA,SAAO,OAAO;IAAC;IAAY;IAAY;GAAO,CAAC;GAC5D,IAAI,OAAO,KAAK,aAAa,YAAY,CAAC,KAAK,SAAS,SAAS,KAAK,KAAK,sBAAsB,KAAK,KAAK,QAAQ,KAC9G,KAAK,SAAS,SAAS,OAAO,OAAO,KAAK,aAAa,YAAY,KAAK,SAAS,SAAS,OAC1F,CAAC,MAAM,QAAQ,KAAK,KAAK,KAAK,KAAK,MAAM,SAAS,KAAK,KAAK,MAAM,SAAS,IAAI,MAAM,IAAI,UAAU,kCAAkC;GAC1I,MAAM,QAAQ,KAAK,MAAM,KAAI,UAAS;IACpC,MAAM,OAAOA,SAAO,OAAO;KAAC;KAAU;KAAc;KAAU;IAAO,CAAC;IACtE,IAAI,OAAO,KAAK,UAAU,YAAY,KAAK,MAAM,SAAS,OAAO,CAAC,OAAO,cAAc,KAAK,MAAM,KAAM,KAAK,SAAoB,GAAG,MAAM,IAAI,UAAU,yBAAyB;IACjL,OAAO;KAAE,QAAQ,oBAAoB,MAAM,EAAE,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC;KAClE,YAAY,oBAAoB,MAAM,EAAE,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC;KAAQ,QAAQ,KAAK;KAAkB,OAAO,KAAK;IAAM;GAChI,CAAC;GACD,OAAO;IAAE,UAAU,KAAK;IAAU,UAAU,KAAK;IAAU;GAAM;EACnE,EAAE;;;ECmBF,MAAMC,iBAAe;EACrB,MAAa,mBAA6C;GACxD,SAASA;GACT,aAAa;IACX;KAAE,QAAQ;KAAiB,SAAS;KAA8B,QAAQ;IAA4B;IACtG;KAAE,QAAQ;KAAgB,SAAS,KAAA;KAAW,QAAQ;IAA4B;IAClF;KAAE,QAAQ;KAAqB,SAAS;KAAoC,QAAQ;IAA4B;IAChH;KAAE,QAAQ;KAAW,SAAS;KAAyB,QAAQ;IAAuB;IACtF;KAAE,QAAQ;KAAQ,SAAS;KAAqB,QAAQ;IAAwB;IAChF;KAAE,QAAQ;KAAQ,SAAS;KAAqB,QAAQ;IAAoB;IAC5E;KAAE,QAAQ;KAAU,SAAS;KAAuB,QAAQ;IAAoB;IAChF;KAAE,QAAQ;KAAc,SAAS;KAA2B,QAAQ;IAAoB;GAC1F,CAAC,CAAC,KAAK,EAAE,QAAQ,SAAS,cAAc;IACtC,IAAI,GAAGA,eAAa,yBAAyB;IAC7C,SAAS;IAAyB,WAAW;IAAyB;IAAQ,YAAY,EAAE,MAAM,SAAS;IAC3G,YAAY,YAAY,KAAA,IAAY,CAAC,IAAI,CAAC;KAAE,MAAM;KAAW,MAAM;KAAW,QAAQ;KACpF,OAAO;MAAE,MAAM;MAAU,YAAY,GAAGA,eAAa,aAAa,OAAO;MAAW,QAAQ;KAAQ;IAAE,CAAC;IACzG,cAAc,EAAE,WAAW,SAAS;IACpC,QAAQ;KAAE,MAAM;KAAU,YAAY,GAAGA,eAAa,aAAa,OAAO;KAAU,QAAQ;IAAO;GACrG,EAAE;EACJ;;;EC7DA,MAAM,EAAE,SAAS,QAAQ,MAAM,UAAU,MAAM,OAAO,UAAU,qBAAqB,kCAAkC,IAAM;EAE7H,SAAS,UAAU,OAA2C;GAC5D,MAAM,OAAO,OAAO,OAAO;IAAC;IAAQ;IAAU;IAAc;IAAa;IAAY;GAAQ,CAAC;GAC9F,IAAI,KAAK,SAAS,QAAQ;IACxB,OAAO,OAAO;KAAC;KAAQ;KAAU;IAAY,CAAC;IAC9C,OAAO;KAAE,MAAM;KAAQ,QAAQ,KAAK,KAAK,MAAM;KAAG,YAAY,KAAK,KAAK,UAAU;IAAE;GACtF;GACA,OAAO,OAAO;IAAC;IAAQ;IAAa;IAAY;GAAQ,CAAC;GACzD,MAAM,WAAW,MAAM,KAAK,QAAQ;GACpC,MAAM,SAAS,MAAM,KAAK,MAAM;GAChC,IAAI,KAAK,SAAS,UAAU,UAAU,UAAU,OAAO,QAAQ;GAC/D,OAAO;IAAE,MAAM;IAAQ,WAAW,SAAS,KAAK,SAAS;IAAG;IAAU;GAAO;EAC/E;EACA,SAAS,SAAS,OAAkC;GAClD,MAAM,OAAO,OAAO,OAAO;IAAC;IAAQ;IAAU;IAAc;IAAkB;IAAW;IAAW;IAAW;GAAQ,CAAC;GACxH,IAAI,KAAK,SAAS,QAAQ;IACxB,OAAO,OAAO,CAAC,QAAQ,QAAQ,CAAC;IAChC,MAAM,SAAS,sBAAsB,MAAM,KAAK,MAAM;IACtD,IAAI,OAAO,OAAO,MAAM,WAAW,GAAG,OAAO,QAAQ;IACrD,OAAO;KAAE,MAAM;KAAQ;IAAO;GAChC;GACA,OAAO,OAAO;IAAC;IAAQ;IAAU;IAAc;IAAkB;IAAW;IAAW;GAAS,CAAC;GACjG,IAAI,KAAK,SAAS,UAAU,MAAM,KAAK,cAAc,IAAI,GAAG,OAAO,QAAQ;GAC3E,OAAO;IAAE,MAAM;IAAQ,QAAQ,KAAK,KAAK,MAAM;IAAG,YAAY,KAAK,KAAK,UAAU;IAAG,gBAAgB,MAAM,KAAK,cAAc;IAC5H,SAAS,MAAM,KAAK,OAAO;IAAG,SAAS,uBAAuB,MAAM,KAAK,OAAO;IAAG,SAAS,MAAM,KAAK,OAAO,CAAC,CAAC,KAAI,UAAS;KAC3H,MAAM,SAAS,OAAO,OAAO;MAAC;MAAa;MAAS;MAAY;MAAU;KAAW,CAAC;KACtF,OAAO;MAAE,WAAW,SAAS,OAAO,SAAS;MAAG,OAAO,KAAK,OAAO,KAAK;MAAG,UAAU,MAAM,OAAO,QAAQ;MACxG,QAAQ,MAAM,OAAO,MAAM;MAAG,WAAW,MAAM,OAAO,SAAS;KAAE;IACrE,CAAC;GAAE;EACP;EACA,MAAa,iCAAiC,EAAE,MAAM,OAA0C;GAC9F,MAAM,OAAO,OAAO,OAAO;IAAC;IAAe;IAAa;IAAY;GAAa,CAAC;GAClF,MAAM,YAAY,MAAM,KAAK,SAAS,CAAC,CAAC,IAAI,SAAS;GACrD,MAAM,WAAW,KAAK,KAAK,UAAU,GAAI,CAAC,CAAC,KAAK;GAChD,IAAI,UAAU,SAAS,KAAK,UAAU,SAAS,KAAK,aAAa,MAAM,IAAI,IAAI,UAAU,KAAI,SAAQ,KAAK,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,UAAU,QAAQ,OAAO,QAAQ;GACtK,OAAO;IAAE,aAAa,KAAK,KAAK,WAAW;IAAG;IAAW;IAAU,aAAa,SAAS,KAAK,WAAW;GAAE;EAC7G,EAAE;EACF,MAAa,0BAA0B,EAAE,MAAM,OAAkD;GAC/F,OAAO,EAAE,aAAa,KAAK,OAAO,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,EAAE;EACzE,EAAE;EACF,MAAa,6BAA6B,EAAE,MAAM,OAAgD;GAChG,OAAO,EAAE,WAAW,SAAS,OAAO,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,EAAE;EACvE,EAAE;EACF,MAAa,4BAA4B,EAAE,MAAM,OAAqC;GACpF,MAAM,OAAO,OAAO,OAAO;IAAC;IAAe;IAAe;IAAa;IAAmB;IAAiB;IAAS;IAClH;IAAa;IAAY;IAAa;IAAc;IAAe;IAAc;GAAO,CAAC;GAC3F,MAAM,YAAY,OAAO,KAAK,WAAW;IAAC;IAAM;IAAS;GAAK,CAAC;GAC/D,MAAM,cAAc,KAAK,KAAK,aAAa,EAAE;GAC7C,IAAI,CAAC,kBAAkB,KAAK,WAAW,KAAK,OAAO,KAAK,kBAAkB,aACpE,KAAK,UAAU,cAAc,KAAK,UAAU,aAAa,KAAK,UAAU,YAAa,OAAO,QAAQ;GAC1G,MAAM,YAAY,MAAM,KAAK,SAAS,CAAC,CAAC,IAAI,QAAQ;GACpD,MAAM,aAAa,KAAK,KAAK,UAAU;GACvC,MAAM,cAAc,MAAM,KAAK,WAAW;GAC1C,IAAI,UAAU,SAAS,KAAK,UAAU,SAAS,KAAK,WAAW,SAAS,eAClE,KAAK,UAAU,gBAAiB,KAAK,eAAe,KAAA,MAAe,KAAK,UAAU,cAAc,CAAC,KAAK,eAAgB,OAAO,QAAQ;GAC3I,OAAO;IAAE,aAAa,KAAK,KAAK,WAAW;IAAG;IAAa,WAAW,SAAS,KAAK,SAAS;IAAG,iBAAiB,SAAS,KAAK,eAAe;IAC5I,eAAe,KAAK;IAAe,OAAO,KAAK;IAC/C,WAAW;KAAE,IAAI,SAAS,UAAU,EAAE;KAAG,OAAO,KAAK,UAAU,KAAK;KAAG,KAAK,KAAK,UAAU,GAAG;IAAE;IAChG,WAAW,MAAM,KAAK,SAAS;IAAG,UAAU,KAAK,KAAK,UAAU,GAAI;IAAG;IAAW;IAAY;IAC9F,GAAI,KAAK,eAAe,KAAA,IAAY,CAAC,IAAI,EAAE,YAAY,MAAM,KAAK,UAAU,EAAE;IAAI,GAAI,KAAK,UAAU,KAAA,IAAY,CAAC,IAAI,EAAE,OAAO,KAAK,KAAK,KAAK,EAAE;GAAG;EACvJ,EAAE;EACF,MAAa,8BAA8B,EAAE,MAAM,OAA4C;GAAE,OAAO,UAAU,OAAO,OAAO,0BAA0B,MAAM,KAAK;EAAE,EAAE;EACzK,MAAa,0BAA0B,EAAE,MAAM,OAAgD;GAAE,OAAO,MAAM,KAAK,CAAC,CAAC,IAAI,0BAA0B,KAAK;EAAE,EAAE;;;ECxC5J,MAAM,eAAe;EACrB,MAAa,wBAAkD;GAC7D,SAAS;GACT,aAAa;IACX;KAAE,QAAQ;KAAW,SAAS;KAAgC,QAAQ;IAA0B;IAChG;KAAE,QAAQ;KAAU,SAAS;KAAyB,QAAQ;IAA0B;IACxF;KAAE,QAAQ;KAAQ,SAAS;KAAyB,QAAQ;IAA4B;IACxF;KAAE,QAAQ;KAAc,SAAS;KAA4B,QAAQ;IAAwB;GAC/F,CAAC,CAAC,KAAK,EAAE,QAAQ,SAAS,cAAc;IACtC,IAAI,GAAG,aAAa,qBAAqB;IAAU,SAAS;IAAqB,WAAW;IAAqB;IACjH,YAAY,EAAE,MAAM,SAAS;IAAG,YAAY,CAAC;KAAE,MAAM;KAAW,MAAM;KAAW,QAAQ;KACvF,OAAO;MAAE,MAAM;MAAU,YAAY,GAAG,aAAa,iBAAiB,OAAO;MAAW,QAAQ;KAAQ;IAAE,CAAC;IAC7G,cAAc,EAAE,WAAW,SAAS;IACpC,QAAQ;KAAE,MAAM;KAAU,YAAY,GAAG,aAAa,iBAAiB,OAAO;KAAU,QAAQ;IAAO;GACzG,EAAE;EACJ;;;;ECLA,MAAa,SAAS;GAAC;GAAS;GAAY;GAAc;GAAU;EAAQ;EAE5E,MAAM,uBAAiD;GACrD,SAAS,sBAAsB;GAC/B,aAAa;IACX,GAAG,sBAAsB;IACzB,GAAG,qBAAqB;IACxB,GAAG,uBAAuB;IAC1B,GAAG,yBAAyB;IAC5B,GAAG,uBAAuB;IAC1B,GAAG,iBAAiB;IACpB,GAAG,sBAAsB;GAC3B;EACF;;EAGA,eAAe,WAAW,KAA6B;GACrD,MAAM,YAAY,IAAI,gBAAgB;GACtC,IAAI,mBAAmB;IAAE,UAAU,MAAM;GAAE,GAAG,oCAAoC;GAClF,MAAM,WAAW,MAAM,IAAI,OAAO,sBAAsB,aAAa,YAAY,IAAI,CAAC,UAAU,QAAQ,YAAY,QAAQ,GAAM,CAAC,CAAC,CAAC;GACrI,UAAU,OAAO,eAAe;GAChC,IAAI,CAAC,SAAS,IAAI,MAAM,IAAI,MAAM,SAAS,MAAM,OAAO;GACxD,IAAI,aAAa,IAAI,OAAO,SAAS,IAAI;IAAE;IAAI;GAAG,CAAC,GAAG,gCAAgC;GAItF,MAAM,IAAI,IAAI,OAAO,KAAK,EAAE;GAC5B,MAAM,SAAS,yBAAyB;IACtC,eAAe,OAAO,WAAW,WAAW;KAC1C,OAAO,eAAe;KACtB,MAAM,MAAM,IAAI,SAAS,KAAK,YAAY,CAAC,CAAC,KAAK;KACjD,IAAI,QAAQ,KAAA,GAAW,MAAM,IAAI,MAAM,WAAW,KAAK,UAAU,SAAS,EAAE,gBAAgB;KAC5F,MAAM,aAAa,IAAI,WAAW,KAAK,YAAY;KACnD,MAAM,YAAY,WAAW,MAAM,MAAK,SAAQ,KAAK,WAAW,SAAS,IAAI,EAAE,CAAC,KAC3E,WAAW,MAAM,MAAK,SAAQ,KAAK,SAAS,IAAI,GAAG;KACxD,OAAO;MACL;MACA,OAAO,IAAI;MACX,KAAK,IAAI,OAAO;MAChB,GAAI,cAAc,KAAA,IAAY,CAAC,IAAI,EAAE,aAAa,UAAU,YAAY;MACxE,QAAQ,IAAI,WAAW,cAClB,IAAI,QAAQ,KAAA,KACZ,CAAC,IAAI,SACL,CAAC,WAAW,mBAAmB,SAAS,IAAI,EAAE;KACrD;IACF;IACA,cAAc,OAAO,UAAU,WAAW;KACxC,OAAO,eAAe;KACtB,MAAM,SAAS,MAAM,IAAI,SAAS,OAAO,SAAS,gBAAgB,KAAA,IAC9D,EAAE,KAAK,SAAS,IAAI,IACpB,EAAE,aAAa,SAAS,YAA2B,CAAC;KACxD,OAAO,eAAe;KACtB,OAAO;IACT;IACA,cAAc,OAAO,iBAAiB,OAAO,WAAW;KACtD,OAAO,eAAe;KACtB,MAAM,UAAU,IAAI,SAAS,QAAQ,eAA4B;KACjE,IAAI,YAAY,KAAA,GACd,MAAM,IAAI,MAAM,iBAAiB,KAAK,UAAU,eAAe,EAAE,uBAAuB;KAE1F,MAAM,SAAS,MAAM,QAAQ,QAAQ,OAAO,KAAK;KACjD,IAAI,CAAC,OAAO,IAAI,MAAM,IAAI,MAAM,GAAG,OAAO,MAAM,KAAK,IAAI,OAAO,MAAM,SAAS;KAC/E,OAAO,eAAe;IACxB;IACA,aAAa,OAAO,SAAS,WAAW;KACtC,MAAM,SAAS,MAAM,IAAI,OAAO,kBAAkB,OAAO,SAAS,MAAM;KACxE,IAAI,CAAC,OAAO,IAAI;MACd,MAAM,QAAQ,IAAI,MAAM,OAAO,MAAM,OAAO;MAI5C,MAAM,OAAO,OAAO,MAAM;MAC1B,MAAM,QAAS,OAAO,MAAM,QAA8C;MAC1E,MAAM;KACR;IACF;IACA,aAAY,oBAAmB;KAC7B,IAAI,SAAS,KAAK,eAA4B;IAChD;IACA,yBAAyB,OAAO,WAAW;GAC7C,CAAC;GACD,IAAI,MAAM,OAAO,2BAA2B,IAAI,MAAM,SAAS;IAC7D,MAAM;IACN,IAAI;IACJ,OAAO;IACP,QAAQ;IACR,aAAa,EAAE,YAAY;IAC3B,eAAkC;KAChC,QAAQ,SAAS,MAAM;KACvB,OAAO;MACL,SAAS,OAAO,SAAS,WAAW;OAClC,MAAM,SAAS,MAAM,IAAI,OAAO,kBAAkB,QAAQ,SAAS,MAAM;OACzE,IAAI,CAAC,OAAO,IAAI,MAAM,IAAI,MAAM,OAAO,MAAM,OAAO;OACpD,OAAO,OAAO;MAChB;MACA,QAAQ,OAAO,SAAS,WAAW;OACjC,MAAM,SAAS,MAAM,IAAI,OAAO,kBAAkB,OAAO,SAAS,MAAM;OACxE,IAAI,CAAC,OAAO,IAAI,MAAM,IAAI,MAAM,OAAO,MAAM,OAAO;OACpD,OAAO,OAAO;MAChB;MACA,MAAM,OAAO,SAAS,WAAW;OAC/B,MAAM,SAAS,MAAM,IAAI,OAAO,kBAAkB,KAAK,SAAS,MAAM;OACtE,IAAI,CAAC,OAAO,IAAI,MAAM,IAAI,MAAM,OAAO,MAAM,OAAO;OACpD,OAAO,OAAO;MAChB;MACA,YAAY,OAAO,SAAS,WAAW;OACrC,MAAM,SAAS,MAAM,IAAI,OAAO,kBAAkB,WAAW,SAAS,MAAM;OAC5E,IAAI,CAAC,OAAO,IAAI,MAAM,IAAI,MAAM,OAAO,MAAM,OAAO;OACpD,OAAO,OAAO;MAChB;KACF;KACA,WAAW;MACT,eAAe,OAAO,SAAS,WAAW;OACxC,MAAM,SAAS,MAAM,IAAI,OAAO,sBAAsB,cAAc,SAAS,MAAM;OACnF,IAAI,CAAC,OAAO,IAAI,MAAM,IAAI,MAAM,OAAO,MAAM,OAAO;OACpD,OAAO,OAAO;MAChB;MACA,mBAAmB,OAAO,SAAS,WAAW;OAC5C,MAAM,SAAS,MAAM,IAAI,OAAO,sBAAsB,kBAAkB,SAAS,MAAM;OACvF,IAAI,CAAC,OAAO,IAAI,MAAM,IAAI,MAAM,OAAO,MAAM,OAAO;OACpD,OAAO,OAAO;MAChB;MACA,SAAS,OAAO,SAAS,WAAW;OAClC,MAAM,SAAS,MAAM,IAAI,OAAO,sBAAsB,QAAQ,SAAS,MAAM;OAC7E,IAAI,CAAC,OAAO,IAAI,MAAM,IAAI,MAAM,OAAO,MAAM,OAAO;OACpD,OAAO,OAAO;MAChB;MACA,MAAM,OAAO,SAAS,WAAW;OAC/B,MAAM,SAAS,MAAM,IAAI,OAAO,sBAAsB,KAAK,SAAS,MAAM;OAC1E,IAAI,CAAC,OAAO,IAAI,MAAM,IAAI,MAAM,OAAO,MAAM,OAAO;OACpD,OAAO,OAAO;MAChB;MACA,MAAM,OAAO,SAAS,WAAW;OAC/B,MAAM,SAAS,MAAM,IAAI,OAAO,sBAAsB,KAAK,SAAS,MAAM;OAC1E,IAAI,CAAC,OAAO,IAAI,MAAM,IAAI,MAAM,OAAO,MAAM,OAAO;OACpD,OAAO,OAAO;MAChB;MACA,QAAQ,OAAO,SAAS,WAAW;OACjC,MAAM,SAAS,MAAM,IAAI,OAAO,sBAAsB,OAAO,SAAS,MAAM;OAC5E,IAAI,CAAC,OAAO,IAAI,MAAM,IAAI,MAAM,OAAO,MAAM,OAAO;OACpD,OAAO,OAAO;MAChB;MACA,YAAY,OAAO,SAAS,WAAW;OACrC,MAAM,SAAS,MAAM,IAAI,OAAO,sBAAsB,WAAW,SAAS,MAAM;OAChF,IAAI,CAAC,OAAO,IAAI,MAAM,IAAI,MAAM,OAAO,MAAM,OAAO;OACpD,OAAO,OAAO;MAChB;KACF;KACA,QAAQ;MACN,MAAM,OAAM,WAAU;OACpB,MAAM,SAAS,MAAM,IAAI,OAAO,mBAAmB,KAAK,MAAM;OAC9D,IAAI,CAAC,OAAO,IAAI,MAAM,IAAI,MAAM,OAAO,MAAM,OAAO;OACpD,OAAO,OAAO;MAChB;MACA,MAAM,OAAO,SAAS,WAAW;OAC/B,MAAM,SAAS,MAAM,IAAI,OAAO,mBAAmB,KAAK,SAAS,MAAM;OACvE,IAAI,CAAC,OAAO,IAAI,MAAM,IAAI,MAAM,OAAO,MAAM,OAAO;OACpD,OAAO,OAAO;MAChB;MACA,OAAO,OAAO,SAAS,WAAW;OAChC,MAAM,SAAS,MAAM,IAAI,OAAO,mBAAmB,MAAM,SAAS,MAAM;OACxE,IAAI,CAAC,OAAO,IAAI,MAAM,IAAI,MAAM,OAAO,MAAM,OAAO;OACpD,OAAO,OAAO;MAChB;KACF;KACA,kBAAkB,OAAO,SAAS,WAAW;MAC3C,MAAM,SAAS,MAAM,IAAI,OAAO,mBAAmB,OAAO,SAAS,MAAM;MACzE,IAAI,CAAC,OAAO,IAAI,MAAM,IAAI,MAAM,OAAO,MAAM,OAAO;MACpD,OAAO,OAAO;KAChB;KACA,oBAAoB,OAAO,SAAS,WAAW;MAC7C,MAAM,SAAS,MAAM,IAAI,OAAO,oBAAoB,KAAK,SAAS,MAAM;MACxE,IAAI,CAAC,OAAO,IAAI,MAAM,IAAI,MAAM,OAAO,MAAM,OAAO;MACpD,OAAO,OAAO;KAChB;KAGA,cAAc,OAAkB;MAC9B,IAAI,SAAS,KAAK,EAAE;KACtB;KACA,eAAe,OAAO,OAAkB;MACtC,MAAM,IAAI,SAAS,KAAK;OAAE,WAAW;OAAI,eAAe;MAAK,CAAC;KAChE;KACA,uBAAuB,OAAO,IAAI,SAAS,WAAW;MACpD,MAAM,SAAS,MAAM,IAAI,OAAO,mBAAmB,SAAS;OAC1D,WAAW;OACX,SAAS,QAAQ;MACnB,GAAG,MAAM;MACT,IAAI,CAAC,OAAO,IAAI;OACd,MAAM,QAAQ,IAAI,MAAM,OAAO,MAAM,OAAO;OAC5C,MAAM,OAAO,OAAO,MAAM;OAC1B,MAAM;MACR;MACA,OAAO,OAAO;KAChB;KACA,eAAe,OAAO,WAAW,aAAa,WAAW,MAAM,OAAO,cACpE,WACA,aACA,MACF;KACA,mBAAmB,OAAO,iBAAiB,WAAW,aAAa,WACjE,MAAM,OAAO,WAAW,iBAAiB,WAAW,aAAa,MAAM;IAC3E;GACF,GAAG,SAAS,CAAC;EACf;;;;;;;EAQA,eAAsB,MAAM,KAA4C;GACtE,MAAM,gBAAgB,MAAM,IAAI,OAAO,OAAO,oBAAoB;GAClE,MAAM,KAAK,IAAI,OACb;IACE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;GACF,GACA,UACF;GACA,IAAI;IACF,MAAM;GACR,SAAS,OAAO;IACd,MAAM,GAAG,QAAQ;IACjB,MAAM,cAAc;IACpB,MAAM;GACR;GACA,OAAO,YAAY;IACjB,MAAM,GAAG,QAAQ;IACjB,MAAM,cAAc;GACtB;EACF"}