teamsync-pdf-viewer 1.8.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"teamsync-pdf-viewer.js","names":[],"sources":["../src/core/busContext.ts","../src/hooks/useViewerBus.ts","../src/utils/zoomUtils.ts","../src/components/Header.tsx","../src/components/AnnotationContextMenu.tsx","../src/utils/linkUtils.ts","../src/components/InsertLinkModal.tsx","../src/hooks/useShortcuts.ts","../src/utils/pageText.ts","../src/hooks/usePdfSearch.ts","../src/components/Sidebar.tsx","../src/components/LeftSidebar.tsx","../src/utils/rotationUtils.ts","../src/components/PageRenderer.tsx","../src/annotations/ids.ts","../src/utils/clipboardUtils.ts","../src/components/TextSelectionTooltip.tsx","../src/utils/findRegexRedactions.ts","../src/utils/layoutUtils.ts","../src/core/pdfAssets.ts","../src/components/DiffHighlightOverlay.tsx","../src/components/SideBySideViewer.tsx","../src/components/CompareToolbar.tsx","../src/components/DiffSummarySidebar.tsx","../src/components/CompareCurtainSlider.tsx","../src/utils/pdfDiffEngine.ts","../src/components/DocumentViewer.tsx","../src/components/SettingsModal.tsx","../src/version.ts","../src/components/AboutModal.tsx","../src/core/eventBus.ts","../src/annotations/geometry.ts","../src/core/export.ts","../src/annotations/xfdf.ts","../src/annotations/AnnotationManager.ts","../src/core/ViewerInstance.ts","../src/core/print.ts","../src/office/officeDetector.ts","../src/office/officeConverter.ts","../src/office/OfficeLoadingOverlay.tsx","../src/office/useOfficeDocument.ts","../src/components/TeamSyncViewer.tsx","../src/core/createWebViewer.tsx"],"sourcesContent":["/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\nimport { createContext } from 'react';\nimport type { ViewerBus } from './eventBus';\n\n/** Provided by <TeamSyncViewer>; every internal component reads its bus from here. */\nexport const ViewerBusContext = createContext<ViewerBus | null>(null);\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\nimport { useContext, useEffect, useRef } from 'react';\nimport { ViewerBusContext } from '../core/busContext';\nimport type { ViewerBus, BusListener } from '../core/eventBus';\n\nexport function useViewerBus(): ViewerBus {\n const bus = useContext(ViewerBusContext);\n if (!bus) {\n throw new Error('[teamsync-pdf-viewer] useViewerBus() must be used inside <TeamSyncViewer>.');\n }\n return bus;\n}\n\n/**\n * Subscribe to a bus event for the lifetime of the component.\n * The latest `listener` is always invoked (no stale closures) without re-subscribing on every render.\n */\nexport function useBusEvent<T = unknown>(type: string, listener: BusListener<T>): void {\n const bus = useViewerBus();\n const ref = useRef(listener);\n ref.current = listener;\n useEffect(() => bus.on<T>(type, (detail) => ref.current(detail)), [bus, type]);\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\n\nexport const MIN_SCALE = 0.1;\nexport const MAX_SCALE = 8.0;\n\nexport const isMobileOrTablet = (): boolean =>\n typeof navigator !== 'undefined' && (\n /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini|Mobile|Tablet/i.test(navigator.userAgent) ||\n (/^((?!chrome|android).)*safari/i.test(navigator.userAgent))\n );\n\nexport const isSafariOrMobile = isMobileOrTablet;\n\nexport const MAX_CANVAS_DIM = 4096;\nexport const MAX_CANVAS_DIM_MOBILE = 2048;\nexport const MAX_CANVAS_PIXELS = 8388608; // 8.4 Megapixels (~32MB RGBA texture buffer)\nexport const MAX_CANVAS_PIXELS_MOBILE = 4194304; // 4.2 Megapixels (~16MB RGBA texture buffer)\n\n/**\n * Calculates the next step when zooming in.\n * - Below 200%: steps by +25%\n * - 200% to 500%: steps by +50%\n * - 500% to 800%: steps by +100%\n */\nexport function calculateNextZoomIn(currentScale: number, maxScale = MAX_SCALE): number {\n const step = currentScale < 2 ? 0.25 : currentScale < 5 ? 0.5 : 1.0;\n return Math.min(maxScale, Math.round((currentScale + step) * 100) / 100);\n}\n\n/**\n * Calculates the next step when zooming out.\n * - At or below 200%: steps by -25%\n * - 200% to 500%: steps by -50%\n * - Above 500%: steps by -100%\n */\nexport function calculateNextZoomOut(currentScale: number, minScale = MIN_SCALE): number {\n const step = currentScale <= 2 ? 0.25 : currentScale <= 5 ? 0.5 : 1.0;\n return Math.max(minScale, Math.round((currentScale - step) * 100) / 100);\n}\n\n/**\n * Clamps and rounds a requested zoom level within [minScale, maxScale].\n */\nexport function clampScale(scale: number, minScale = MIN_SCALE, maxScale = MAX_SCALE): number {\n return Math.min(maxScale, Math.max(minScale, Math.round(scale * 100) / 100));\n}\n\n/**\n * Calculates the target scale to fit a given page width to an available container width,\n * optionally scaled by a width ratio (e.g. 0.7 for 70% of available width).\n */\nexport function calculateFitWidthScale(\n availableWidth: number,\n pageWidth: number,\n ratio = 1.0,\n minScale = MIN_SCALE,\n maxScale = MAX_SCALE\n): number {\n if (availableWidth <= 0 || pageWidth <= 0) return 1.0;\n const effectiveRatio = typeof ratio === 'number' && Number.isFinite(ratio) && ratio > 0 ? ratio : 1.0;\n return clampScale((availableWidth * effectiveRatio) / pageWidth, minScale, maxScale);\n}\n\n/**\n * Calculates the safe rasterization scale for PDF.js viewport rendering so that\n * canvas dimensions and texture memory stay strictly within hardware limits.\n */\nexport function calculateSafeRenderScale(\n scale: number,\n outputScale: number,\n unscaledWidth: number,\n unscaledHeight: number,\n maxDim = isMobileOrTablet() ? MAX_CANVAS_DIM_MOBILE : MAX_CANVAS_DIM,\n maxPixels = isMobileOrTablet() ? MAX_CANVAS_PIXELS_MOBILE : MAX_CANVAS_PIXELS\n): number {\n let renderScale = scale * outputScale;\n if (unscaledWidth * renderScale > maxDim) {\n renderScale = maxDim / unscaledWidth;\n }\n if (unscaledHeight * renderScale > maxDim) {\n renderScale = maxDim / unscaledHeight;\n }\n if ((unscaledWidth * renderScale) * (unscaledHeight * renderScale) > maxPixels) {\n renderScale = Math.sqrt(maxPixels / (unscaledWidth * unscaledHeight));\n }\n return renderScale;\n}\n\nexport interface ScrollCompensationParams {\n prevScale: number;\n newScale: number;\n containerWidth: number;\n containerHeight: number;\n currentScrollLeft: number;\n currentScrollTop: number;\n basePageWidth: number;\n focusPoint?: { vx: number | null; vy: number | null } | null;\n isProgrammatic?: boolean;\n}\n\nexport interface ScrollPosition {\n scrollLeft: number;\n scrollTop: number;\n}\n\n/**\n * Calculates compensating scroll offsets during scale changes.\n * Prevents view jumping or pushing page 1 down on initial fit or programmatic fit.\n */\nexport function calculateScrollCompensation(params: ScrollCompensationParams): ScrollPosition {\n const {\n prevScale,\n newScale,\n containerWidth: cW,\n containerHeight: cH,\n currentScrollLeft,\n currentScrollTop,\n basePageWidth: baseW,\n focusPoint,\n isProgrammatic = false,\n } = params;\n\n // On programmatic fit (e.g. fit-width, fit-page, initial document fit),\n // do not run user-driven center-zoom compensation.\n if (isProgrammatic) {\n return {\n scrollLeft: 0,\n scrollTop: currentScrollTop <= 1 ? 0 : currentScrollTop,\n };\n }\n\n const hasFocusPoint = focusPoint?.vx != null && focusPoint?.vy != null;\n\n // If user is at the top of the document (scrollTop <= 0) and no explicit focus point was set:\n // Keep the top of the page pinned to the top rather than pushing it down into negative space.\n if (!hasFocusPoint && currentScrollTop <= 0) {\n return {\n scrollLeft: 0,\n scrollTop: 0,\n };\n }\n\n const vx = hasFocusPoint ? focusPoint!.vx! : cW / 2;\n const vy = hasFocusPoint ? focusPoint!.vy! : cH / 2;\n\n const x = vx + currentScrollLeft;\n const y = vy + currentScrollTop;\n\n const pLeft1 = Math.max(0, cW / 2 - (baseW * prevScale) / 2);\n const pLeft2 = Math.max(0, cW / 2 - (baseW * newScale) / 2);\n\n const pageX = x - pLeft1;\n const newPageX = pageX * (newScale / prevScale);\n const newX = pLeft2 + newPageX;\n\n return {\n scrollLeft: Math.max(0, newX - vx),\n scrollTop: Math.max(0, (y * (newScale / prevScale)) - vy),\n };\n}\n\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\nimport React, { useState, useRef, useEffect } from 'react';\nimport { \n Menu, PanelLeft,\n Hand, MousePointer, Search, MessageSquare, \n FileText, Download, Maximize, Save, Printer, Settings, Info,\n MinusCircle, PlusCircle, Maximize2, MoveHorizontal, ChevronUp, ChevronDown, ScanSearch,\n FileCode2, File, Copy, Expand, RotateCw, RotateCcw, ShieldCheck, Pen, Layers, FolderOpen\n} from 'lucide-react';\n\nimport type { SDKPermissions } from '../core/types';\nimport type { ViewerPlugin } from '../plugins/types';\nimport { useViewerBus, useBusEvent } from '../hooks/useViewerBus';\nimport { MIN_SCALE, MAX_SCALE } from '../utils/zoomUtils';\n\ninterface HeaderProps {\n activeTab: string;\n setActiveTab: (tab: string) => void;\n leftSidebarOpen: boolean;\n setLeftSidebarOpen: (open: boolean) => void;\n rightSidebarOpen: boolean;\n setRightSidebarOpen: (open: boolean) => void;\n sidebarTab: 'Comments' | 'Search';\n scale: number;\n onZoomIn: () => void;\n onZoomOut: () => void;\n onZoomSet: (scale: number) => void;\n onOpenFile?: () => void;\n onDownload: () => void;\n onFullScreen: () => void;\n onSaveAs: () => void;\n onPrint?: () => void;\n onOpenSettings: () => void;\n onOpenAbout: () => void;\n onOpenSidebarTab: (tab: 'Comments' | 'Search') => void;\n pageTransition: 'continuous' | 'page-by-page';\n setPageTransition: (t: 'continuous' | 'page-by-page') => void;\n pageLayout: 'single' | 'double' | 'cover-facing';\n setPageLayout: (l: 'single' | 'double' | 'cover-facing') => void;\n rotation: number;\n setRotation: (r: number) => void;\n signatureCount?: number;\n enableAnnotations?: boolean;\n enableSign?: boolean;\n plugins?: ViewerPlugin[];\n permissions?: SDKPermissions;\n}\n\nconst TABS = [\n 'View', 'Annotate'\n];\n\nexport default function Header({ \n activeTab, setActiveTab, \n leftSidebarOpen, setLeftSidebarOpen,\n rightSidebarOpen, setRightSidebarOpen: _setRightSidebarOpen,\n sidebarTab,\n scale, onZoomIn, onZoomOut, onZoomSet,\n onOpenFile,\n onDownload, onFullScreen, onSaveAs, onPrint, onOpenSettings, onOpenAbout, onOpenSidebarTab,\n pageTransition, setPageTransition, pageLayout, setPageLayout, rotation, setRotation,\n signatureCount = 0,\n enableAnnotations,\n enableSign = false,\n plugins,\n permissions\n}: HeaderProps) {\n const hasSignPlugin = plugins && plugins.some(p => p.id && p.id.toLowerCase().includes('sign'));\n const isSignVisible = enableSign === true && Boolean(hasSignPlugin);\n const [isMenuOpen, setIsMenuOpen] = useState(false);\n const [isZoomMenuOpen, setIsZoomMenuOpen] = useState(false);\n const [isViewSettingsOpen, setIsViewSettingsOpen] = useState(false);\n const [headerTool, setHeaderTool] = useState<string | null>('select');\n const menuRef = useRef<HTMLDivElement>(null);\n const zoomMenuRef = useRef<HTMLDivElement>(null);\n const viewSettingsRef = useRef<HTMLDivElement>(null);\n const bus = useViewerBus();\n\n useBusEvent<{ tool: string | null }>('action-tool-changed', (d) => setHeaderTool(d?.tool ?? null));\n\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (menuRef.current && !menuRef.current.contains(event.target as Node)) {\n setIsMenuOpen(false);\n }\n if (zoomMenuRef.current && !zoomMenuRef.current.contains(event.target as Node)) {\n setIsZoomMenuOpen(false);\n }\n if (viewSettingsRef.current && !viewSettingsRef.current.contains(event.target as Node)) {\n setIsViewSettingsOpen(false);\n }\n }\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, []);\n\n return (\n <div style={{ \n display: 'flex', \n flexDirection: 'column',\n borderBottom: '1px solid var(--border-color)',\n backgroundColor: 'var(--toolbar-bg)',\n color: 'var(--text-color)'\n }}>\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n height: '48px',\n padding: '0 8px'\n }}>\n {/* Left Section */}\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n <div ref={menuRef} style={{ position: 'relative' }}>\n <IconButton icon={<Menu size={18} />} title=\"Menu\" onClick={() => setIsMenuOpen(!isMenuOpen)} active={isMenuOpen} />\n {isMenuOpen && (\n <div style={{ \n position: 'absolute', top: '100%', left: 0, marginTop: '4px',\n backgroundColor: '#fff', borderRadius: '4px', boxShadow: '0 4px 12px rgba(0,0,0,0.15)',\n width: '220px', zIndex: 1000, display: 'flex', flexDirection: 'column',\n border: '1px solid var(--border-color)', overflow: 'hidden'\n }}>\n {onOpenFile && (\n <MenuOption icon={<FolderOpen size={16} />} label=\"Open PDF...\" onClick={() => { onOpenFile(); setIsMenuOpen(false); }} />\n )}\n <MenuOption icon={<Download size={16} />} label=\"Download\" onClick={() => { onDownload(); setIsMenuOpen(false); }} />\n <MenuOption icon={<Maximize size={16} />} label=\"Enter Full Screen\" onClick={() => { onFullScreen(); setIsMenuOpen(false); }} />\n <MenuOption icon={<Save size={16} />} label=\"Save As\" onClick={() => { onSaveAs(); setIsMenuOpen(false); }} />\n <MenuOption icon={<Printer size={16} />} label=\"Print\" disabled={!onPrint} onClick={() => { onPrint?.(); setIsMenuOpen(false); }} />\n <div style={{ height: '1px', backgroundColor: 'var(--border-color)', margin: '4px 0' }} />\n <MenuOption icon={<Layers size={16} color=\"#0284c7\" />} label=\"Compare PDF (Demo)\" onClick={() => { window.dispatchEvent(new CustomEvent('action-start-compare', { detail: { docA: '/sample_v1.pdf', docB: '/sample_v2.pdf', options: { mode: 'overlay' } } })); setIsMenuOpen(false); }} />\n <MenuOption icon={<Settings size={16} />} label=\"Settings\" onClick={() => { onOpenSettings(); setIsMenuOpen(false); }} />\n </div>\n )}\n </div>\n <IconButton \n icon={<PanelLeft size={18} />} \n title=\"Toggle Left Panel\"\n active={leftSidebarOpen}\n onClick={() => setLeftSidebarOpen(!leftSidebarOpen)} \n />\n <div style={{ width: '1px', height: '24px', backgroundColor: 'var(--border-color)', margin: '0 4px' }} />\n <div ref={viewSettingsRef} style={{ position: 'relative' }}>\n <div style={{ position: 'relative' }}>\n <IconButton \n icon={\n <div style={{ position: 'relative', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n <FileText size={18} />\n <div style={{ position: 'absolute', right: '-4px', bottom: '-4px', backgroundColor: '#fff', borderRadius: '50%', padding: '1px' }}>\n <Settings size={10} color=\"var(--primary)\" />\n </div>\n </div>\n } \n title=\"View Settings\"\n active={isViewSettingsOpen}\n onClick={() => setIsViewSettingsOpen(!isViewSettingsOpen)} \n />\n </div>\n {isViewSettingsOpen && (\n <div style={{ \n position: 'absolute', top: '100%', left: 0, marginTop: '4px',\n backgroundColor: '#fff', borderRadius: '4px', boxShadow: '0 4px 16px rgba(0,0,0,0.15)',\n width: '240px', zIndex: 1000, display: 'flex', flexDirection: 'column',\n border: '1px solid var(--border-color)', overflow: 'hidden'\n }}>\n <div style={{ padding: '12px 16px 8px', fontSize: '12px', fontWeight: 600, color: '#374151' }}>Page Transition</div>\n <MenuOption \n icon={<FileCode2 size={16} />} \n label=\"Continuous Page\" \n selected={pageTransition === 'continuous'}\n onClick={() => { setPageTransition('continuous'); setIsViewSettingsOpen(false); }} \n />\n <MenuOption \n icon={<File size={16} />} \n label=\"Page By Page\" \n selected={pageTransition === 'page-by-page'}\n onClick={() => { setPageTransition('page-by-page'); setIsViewSettingsOpen(false); }} \n />\n \n <div style={{ height: '1px', backgroundColor: 'var(--border-color)', margin: '4px 0' }} />\n \n <div style={{ padding: '12px 16px 8px', fontSize: '12px', fontWeight: 600, color: '#374151' }}>Page Orientation</div>\n <MenuOption \n icon={<RotateCw size={16} />} \n label=\"Rotate Clockwise\" \n onClick={() => { setRotation((rotation + 90) % 360); setIsViewSettingsOpen(false); }} \n />\n <MenuOption \n icon={<RotateCcw size={16} />} \n label=\"Rotate Counterclockwise\" \n onClick={() => { setRotation((rotation - 90 + 360) % 360); setIsViewSettingsOpen(false); }} \n />\n \n <div style={{ height: '1px', backgroundColor: 'var(--border-color)', margin: '4px 0' }} />\n\n <div style={{ padding: '12px 16px 8px', fontSize: '12px', fontWeight: 600, color: '#374151' }}>Page Layout</div>\n <MenuOption \n icon={<File size={16} />} \n label=\"Single Page\" \n selected={pageLayout === 'single'}\n onClick={() => { setPageLayout('single'); setIsViewSettingsOpen(false); }} \n />\n <MenuOption \n icon={<Copy size={16} />} \n label=\"Double Page\" \n selected={pageLayout === 'double'}\n onClick={() => { setPageLayout('double'); setIsViewSettingsOpen(false); }} \n />\n <MenuOption \n icon={<FileText size={16} />} \n label=\"Cover Facing Page\" \n selected={pageLayout === 'cover-facing'}\n onClick={() => { setPageLayout('cover-facing'); setIsViewSettingsOpen(false); }} \n />\n\n <div style={{ height: '1px', backgroundColor: 'var(--border-color)', margin: '4px 0' }} />\n\n <MenuOption \n icon={<Expand size={16} />} \n label=\"Enter Full Screen\" \n onClick={() => { onFullScreen(); setIsViewSettingsOpen(false); }} \n />\n </div>\n )}\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: '4px' }}>\n <div ref={zoomMenuRef} style={{ position: 'relative', display: 'flex', alignItems: 'center' }}>\n <div style={{\n display: 'flex', alignItems: 'center', backgroundColor: '#f3f4f6', \n borderRadius: '4px', border: isZoomMenuOpen ? '1px solid var(--primary)' : '1px solid transparent',\n cursor: 'pointer', userSelect: 'none', height: '32px'\n }}>\n <div \n onClick={() => setIsZoomMenuOpen(!isZoomMenuOpen)}\n style={{ \n padding: '0 8px 0 12px', fontSize: '13px', fontWeight: 500, \n display: 'flex', alignItems: 'center', height: '100%'\n }}\n >\n {Math.round(scale * 100)}%\n </div>\n <div \n onClick={() => setIsZoomMenuOpen(!isZoomMenuOpen)}\n style={{ \n padding: '0 8px', display: 'flex', alignItems: 'center', height: '100%',\n borderLeft: '1px solid #e5e7eb', color: isZoomMenuOpen ? 'var(--primary)' : 'var(--text-color)'\n }}\n >\n {isZoomMenuOpen ? <ChevronUp size={14} /> : <ChevronDown size={14} />}\n </div>\n </div>\n \n {isZoomMenuOpen && (\n <div style={{ \n position: 'absolute', top: '100%', left: 0, marginTop: '4px',\n backgroundColor: '#fff', borderRadius: '4px', boxShadow: '0 4px 16px rgba(0,0,0,0.15)',\n width: '180px', zIndex: 1000, display: 'flex', flexDirection: 'column',\n border: '1px solid var(--border-color)', overflow: 'hidden', padding: '8px 0'\n }}>\n <MenuOption icon={<MoveHorizontal size={16} />} label=\"Fit To Width\" onClick={() => { bus.emit('action-fit-to-width'); setIsZoomMenuOpen(false); }} />\n <MenuOption icon={<Maximize2 size={16} />} label=\"Fit To Page\" onClick={() => { bus.emit('action-fit-to-page'); setIsZoomMenuOpen(false); }} />\n <div style={{ height: '1px', backgroundColor: 'var(--border-color)', margin: '4px 0' }} />\n {[0.25, 0.5, 0.75, 1, 1.25, 1.5, 2, 3, 4, 5, 8].map(zoomLevel => (\n <div \n key={zoomLevel}\n onClick={() => { if(onZoomSet) onZoomSet(zoomLevel); setIsZoomMenuOpen(false); }}\n style={{ \n padding: '6px 44px', fontSize: '13px', cursor: 'pointer', \n backgroundColor: scale === zoomLevel ? '#f3f4f6' : '#fff'\n }}\n onMouseEnter={(e) => e.currentTarget.style.backgroundColor = '#f3f4f6'}\n onMouseLeave={(e) => e.currentTarget.style.backgroundColor = scale === zoomLevel ? '#f3f4f6' : '#fff'}\n >\n {Math.round(zoomLevel * 100)}%\n </div>\n ))}\n <div style={{ height: '1px', backgroundColor: 'var(--border-color)', margin: '4px 0' }} />\n <MenuOption icon={<ScanSearch size={16} />} label=\"Marquee Zoom\" onClick={() => setIsZoomMenuOpen(false)} />\n </div>\n )}\n </div>\n <IconButton \n icon={<MinusCircle size={18} color={scale <= MIN_SCALE ? 'var(--border-color)' : 'var(--text-muted)'} />} \n title=\"Zoom Out\" \n onClick={onZoomOut} \n disabled={scale <= MIN_SCALE}\n />\n <IconButton \n icon={<PlusCircle size={18} color={scale >= MAX_SCALE ? 'var(--border-color)' : 'var(--text-muted)'} />} \n title=\"Zoom In\" \n onClick={onZoomIn} \n disabled={scale >= MAX_SCALE}\n />\n </div>\n <div style={{ width: '1px', height: '24px', backgroundColor: 'var(--border-color)', margin: '0 4px' }} />\n <IconButton icon={<MousePointer size={18} />} title=\"Select Text\" active={headerTool === 'select'} onClick={() => bus.emit('action-set-tool', { tool: 'select' })} />\n <IconButton icon={<Hand size={18} />} title=\"Pan Tool\" active={headerTool === 'pan'} onClick={() => bus.emit('action-set-tool', { tool: 'pan' })} />\n </div>\n\n {/* Center Section: Tabs */}\n <div style={{ display: 'flex', alignItems: 'flex-end', height: '100%', gap: '16px' }}>\n {TABS.filter(tab => !(tab === 'Annotate' && (enableAnnotations === false || permissions?.canAddAnnotations === false))).map(tab => (\n <div \n key={tab}\n onClick={() => setActiveTab(tab)}\n style={{\n fontSize: '13px',\n fontWeight: activeTab === tab ? 500 : 400,\n color: activeTab === tab ? 'var(--primary)' : 'var(--text-muted)',\n cursor: 'pointer',\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n borderBottom: activeTab === tab ? '2px solid var(--primary)' : '2px solid transparent',\n padding: '0 4px'\n }}\n >\n {tab}\n </div>\n ))}\n </div>\n\n {/* Right Section */}\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n \n {/* Sign Button */}\n {isSignVisible && (\n <button \n onClick={() => bus.emit('action-sign')}\n style={{ \n background: '#fff0f0', border: '1px solid #d32f2f', color: '#d32f2f', \n display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '6px',\n height: '32px', padding: '0 12px', borderRadius: '4px', cursor: 'pointer',\n fontWeight: 600, fontSize: '13px'\n }}\n >\n <Pen size={14} color=\"#d32f2f\" fill=\"#d32f2f\" />\n Sign\n </button>\n )}\n \n {/* Verify Button (Only visible if signed) */}\n {signatureCount > 0 && (\n <div \n onClick={() => bus.emit('action-verify')}\n style={{ \n backgroundColor: '#10b981', color: '#000', \n borderRadius: '16px', padding: '4px 12px', \n display: 'flex', alignItems: 'center', gap: '6px', \n cursor: 'pointer', fontWeight: 600, fontSize: '13px'\n }}\n title=\"Verify Signatures\"\n >\n <ShieldCheck size={16} /> Signed · {signatureCount}\n </div>\n )}\n\n <div style={{ width: '1px', height: '24px', backgroundColor: 'var(--border-color)', margin: '0 4px' }} />\n\n <IconButton \n icon={<Info size={18} />} \n title=\"About / Info\"\n onClick={onOpenAbout} \n />\n\n <IconButton \n icon={<Search size={18} />} \n title=\"Search\"\n active={rightSidebarOpen && sidebarTab === 'Search'}\n onClick={() => onOpenSidebarTab('Search')} \n />\n <IconButton \n icon={<MessageSquare size={18} />} \n title=\"Comments\"\n active={rightSidebarOpen && sidebarTab === 'Comments'}\n onClick={() => onOpenSidebarTab('Comments')} \n />\n </div>\n </div>\n </div>\n );\n}\n\nfunction IconButton({ icon, onClick, active = false, disabled = false, title }: { icon: React.ReactNode, onClick?: () => void, active?: boolean, disabled?: boolean, title?: string }) {\n return (\n <button \n title={title}\n onClick={disabled ? undefined : onClick}\n disabled={disabled}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '32px',\n height: '32px',\n border: 'none',\n borderRadius: '4px',\n backgroundColor: active ? '#e6f0fa' : 'transparent',\n color: active ? 'var(--primary)' : 'inherit',\n cursor: disabled ? 'not-allowed' : 'pointer',\n opacity: disabled ? 0.4 : 1,\n outline: 'none',\n userSelect: 'none',\n WebkitUserSelect: 'none',\n }}\n onMouseOver={(e) => {\n if (!active && !disabled) e.currentTarget.style.backgroundColor = 'var(--hover-bg)';\n }}\n onMouseOut={(e) => {\n if (!active && !disabled) e.currentTarget.style.backgroundColor = 'transparent';\n }}\n >\n {icon}\n </button>\n );\n}\n\nfunction MenuOption({ icon, label, onClick, disabled = false, selected = false }: { icon: React.ReactNode, label: string, onClick?: () => void, disabled?: boolean, selected?: boolean }) {\n const [hovered, setHovered] = useState(false);\n return (\n <div \n onClick={disabled ? undefined : onClick}\n onMouseEnter={() => setHovered(!disabled)}\n onMouseLeave={() => setHovered(false)}\n style={{ \n display: 'flex', alignItems: 'center', gap: '12px', padding: '10px 16px', \n cursor: disabled ? 'default' : 'pointer', color: disabled ? '#ccc' : (selected ? '#fff' : 'var(--text-color)'),\n backgroundColor: disabled ? 'transparent' : (selected ? 'var(--primary)' : (hovered ? '#f5f5f5' : 'transparent')),\n fontSize: '13px'\n }}\n >\n <div style={{ color: disabled ? '#ccc' : (selected ? '#fff' : 'var(--text-muted)') }}>{icon}</div>\n <span>{label}</span>\n </div>\n );\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\nimport React from 'react';\nimport { Copy, Trash2, Link as LinkIcon, Edit2 } from 'lucide-react';\nimport type { Annotation } from '../annotations/types';\n\nimport type { SDKPermissions } from '../core/types';\n\ninterface AnnotationContextMenuProps {\n annotation: Annotation;\n position: { top: number; left: number };\n onCopy: () => void;\n onDelete: () => void;\n onUpdateColor: (color: string) => void;\n onOpenLinkModal: () => void;\n permissions?: SDKPermissions;\n}\n\nexport default function AnnotationContextMenu({\n annotation,\n position,\n onCopy,\n onDelete,\n onUpdateColor,\n onOpenLinkModal,\n permissions\n}: AnnotationContextMenuProps) {\n const canAdd = permissions?.canAddAnnotations !== false;\n const canEdit = permissions?.canEditAnnotations !== false;\n const canDelete = permissions?.canDeleteAnnotations !== false;\n\n // Simple predefined colors for quick selection\n const COLORS = ['#ef4444', '#f59e0b', '#10b981', '#3b82f6', '#8b5cf6', '#000000'];\n\n return (\n <div\n style={{\n position: 'absolute',\n top: `${position.top}px`,\n left: `${position.left}px`,\n backgroundColor: '#ffffff',\n border: '1px solid #e5e7eb',\n borderRadius: '6px',\n boxShadow: '0 4px 12px rgba(0,0,0,0.1)',\n display: 'flex',\n alignItems: 'center',\n padding: '4px',\n gap: '4px',\n zIndex: 2000,\n transform: 'translateY(8px)' // Slight offset below the element\n }}\n onClick={(e) => e.stopPropagation()}\n >\n {canAdd && (\n <>\n <MenuButton icon={<Copy size={16} />} title=\"Duplicate\" onClick={onCopy} />\n <div style={{ width: '1px', height: '20px', backgroundColor: '#e5e7eb', margin: '0 4px' }} />\n </>\n )}\n \n {canEdit && (\n <>\n <div style={{ display: 'flex', alignItems: 'center', gap: '2px', padding: '0 4px' }}>\n {COLORS.map(c => (\n <div\n key={c}\n onClick={() => onUpdateColor(c)}\n style={{\n width: '16px',\n height: '16px',\n borderRadius: '50%',\n backgroundColor: c,\n cursor: 'pointer',\n border: annotation.color === c ? '2px solid #374151' : '1px solid transparent'\n }}\n title={`Set color ${c}`}\n />\n ))}\n </div>\n <div style={{ width: '1px', height: '20px', backgroundColor: '#e5e7eb', margin: '0 4px' }} />\n </>\n )}\n\n {canEdit && (\n annotation.type === 'link' ? (\n <button\n title={annotation.linkUrl ? `Edit Link (${annotation.linkUrl})` : 'Edit Link'}\n onClick={onOpenLinkModal}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n height: '32px',\n borderRadius: '4px',\n border: 'none',\n backgroundColor: '#eef2ff',\n cursor: 'pointer',\n color: '#4338ca',\n padding: '0 10px',\n fontSize: '12px',\n fontWeight: 500\n }}\n onMouseEnter={(e) => e.currentTarget.style.backgroundColor = '#e0e7ff'}\n onMouseLeave={(e) => e.currentTarget.style.backgroundColor = '#eef2ff'}\n >\n <Edit2 size={14} />\n Edit Link\n </button>\n ) : (\n <MenuButton icon={<LinkIcon size={16} />} title=\"Link URL or Page\" onClick={onOpenLinkModal} />\n )\n )}\n\n {canDelete && (\n <MenuButton icon={<Trash2 size={16} />} title=\"Delete\" onClick={onDelete} color=\"#ef4444\" />\n )}\n </div>\n );\n}\n\nfunction MenuButton({ icon, title, onClick, color = '#4b5563' }: { icon: React.ReactNode, title: string, onClick: () => void, color?: string }) {\n return (\n <button\n title={title}\n onClick={onClick}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '32px',\n height: '32px',\n borderRadius: '4px',\n border: 'none',\n backgroundColor: 'transparent',\n cursor: 'pointer',\n color: color\n }}\n onMouseEnter={(e) => e.currentTarget.style.backgroundColor = '#f3f4f6'}\n onMouseLeave={(e) => e.currentTarget.style.backgroundColor = 'transparent'}\n >\n {icon}\n </button>\n );\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\n\nexport interface ParsedLinkTarget {\n /** Raw input URL or link target string. */\n rawUrl: string;\n /** True if the link refers only to an internal page jump within the current document (e.g. '#page=5' or '#5'). */\n isInternalPage: boolean;\n /** Clean document URL without page hash if referencing another document (e.g. 'supporting.pdf' or 'https://.../doc.pdf'). */\n docUrl?: string;\n /** Target page number (1-based) if specified (e.g. 5 from '#page=5' or 'doc.pdf#page=5'). */\n pageNumber?: number;\n /** True if this is an external web URL (e.g. 'https://google.com') that is not a PDF/document. */\n isExternalWeb: boolean;\n}\n\n/**\n * Checks whether a given URL or filename refers to a PDF / document rather than a general web page.\n */\nexport function isDocumentUrl(url: string): boolean {\n if (!url) return false;\n const trimmed = url.trim();\n\n // Custom document schemes\n if (/^(doc|pdf|file):/i.test(trimmed)) return true;\n\n // Strip query strings and hash anchors for extension checking\n const cleanPath = trimmed.split(/[?#]/)[0].toLowerCase();\n\n // Direct .pdf extension\n if (cleanPath.endsWith('.pdf')) return true;\n\n // Relative file paths (e.g. 'docs/contract', './exhibits/a.pdf')\n if (!/^[a-z][a-z0-9+.-]*:/i.test(trimmed)) {\n // If it has no scheme / protocol, it's a relative path / filename\n return true;\n }\n\n // REST-like PDF endpoints (e.g. '/api/documents/123/pdf' or '?format=pdf')\n if (cleanPath.endsWith('/pdf') || /[?&]format=pdf(&|$)/i.test(trimmed)) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Parses any link URL into structured destination information, extracting target documents and page numbers.\n */\nexport function parseLinkTarget(linkUrl: string): ParsedLinkTarget {\n const raw = (linkUrl || '').trim();\n if (!raw) {\n return {\n rawUrl: raw,\n isInternalPage: false,\n isExternalWeb: false\n };\n }\n\n // 1. Pure internal anchor: '#page=5' or '#5'\n if (raw.startsWith('#')) {\n const pageMatch = raw.match(/^#(?:page=)?(\\d+)$/i);\n const pageNumber = pageMatch ? parseInt(pageMatch[1], 10) : undefined;\n return {\n rawUrl: raw,\n isInternalPage: true,\n pageNumber: pageNumber && pageNumber > 0 ? pageNumber : undefined,\n isExternalWeb: false\n };\n }\n\n // 2. Custom document schemes: 'doc:supporting.pdf#page=3' or 'pdf:supporting.pdf'\n let normalizedUrl = raw;\n if (/^(doc|pdf):/i.test(raw)) {\n normalizedUrl = raw.replace(/^(doc|pdf):/i, '');\n }\n\n // 3. Extract page hash if present: 'path/doc.pdf#page=4' or 'path/doc.pdf#4'\n let docUrl = normalizedUrl;\n let pageNumber: number | undefined;\n\n const hashIndex = normalizedUrl.indexOf('#');\n if (hashIndex !== -1) {\n const hash = normalizedUrl.slice(hashIndex);\n docUrl = normalizedUrl.slice(0, hashIndex);\n const pageMatch = hash.match(/^#(?:page=)?(\\d+)$/i);\n if (pageMatch) {\n pageNumber = parseInt(pageMatch[1], 10);\n if (isNaN(pageNumber) || pageNumber <= 0) {\n pageNumber = undefined;\n }\n }\n }\n\n const isDoc = isDocumentUrl(docUrl);\n const isWeb = /^https?:\\/\\//i.test(docUrl) && !isDoc;\n\n return {\n rawUrl: raw,\n isInternalPage: false,\n docUrl: isDoc || isWeb ? docUrl : docUrl,\n pageNumber,\n isExternalWeb: isWeb\n };\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\nimport React, { useState } from 'react';\nimport { X } from 'lucide-react';\nimport { parseLinkTarget } from '../utils/linkUtils';\n\ninterface InsertLinkModalProps {\n initialUrl?: string;\n initialText?: string;\n showTextInput?: boolean;\n onClose: () => void;\n onSave: (url: string, text?: string) => void;\n}\n\nexport default function InsertLinkModal({ initialUrl = '', initialText = '', showTextInput = false, onClose, onSave }: InsertLinkModalProps) {\n const isInitialPage = initialUrl.startsWith('#page=');\n const parsedInitial = parseLinkTarget(initialUrl);\n const isInitialDoc = !isInitialPage && Boolean(parsedInitial.docUrl && !parsedInitial.isExternalWeb);\n\n const initialTab: 'url' | 'page' | 'document' = isInitialPage\n ? 'page'\n : isInitialDoc\n ? 'document'\n : 'url';\n\n const [activeTab, setActiveTab] = useState<'url' | 'page' | 'document'>(initialTab);\n const [url, setUrl] = useState(isInitialPage || isInitialDoc ? '' : initialUrl);\n const [page, setPage] = useState(isInitialPage ? initialUrl.replace('#page=', '') : '1');\n const [docUrl, setDocUrl] = useState(isInitialDoc ? parsedInitial.docUrl || '' : '');\n const [docPage, setDocPage] = useState(isInitialDoc && parsedInitial.pageNumber ? String(parsedInitial.pageNumber) : '');\n const [text, setText] = useState(initialText);\n\n const isSaveDisabled =\n activeTab === 'url' ? !url.trim() :\n activeTab === 'page' ? !page.trim() :\n !docUrl.trim();\n\n const handleSave = () => {\n if (isSaveDisabled) return;\n let finalUrl = '';\n if (activeTab === 'page') {\n finalUrl = `#page=${page}`;\n } else if (activeTab === 'document') {\n finalUrl = docPage.trim() ? `${docUrl.trim()}#page=${docPage.trim()}` : docUrl.trim();\n } else {\n finalUrl = url.trim();\n }\n\n if (showTextInput) {\n onSave(finalUrl, text.trim() || finalUrl);\n } else {\n onSave(finalUrl);\n }\n };\n\n const getPlaceholderText = () => {\n if (activeTab === 'url') return url || 'Link text...';\n if (activeTab === 'page') return `Page ${page}`;\n return docUrl ? `${docUrl}${docPage ? ` (Page ${docPage})` : ''}` : 'Document link text...';\n };\n\n return (\n <div style={{\n position: 'fixed', top: 0, left: 0, right: 0, bottom: 0,\n backgroundColor: 'rgba(0,0,0,0.5)', display: 'flex', alignItems: 'center', justifyContent: 'center',\n zIndex: 3000\n }}>\n <div style={{\n backgroundColor: '#fff',\n color: '#333',\n borderRadius: '8px',\n width: '420px',\n boxShadow: '0 10px 25px rgba(0,0,0,0.2)',\n fontFamily: 'sans-serif',\n overflow: 'hidden',\n display: 'flex',\n flexDirection: 'column'\n }}>\n {/* Header */}\n <div style={{ \n padding: '16px', borderBottom: '1px solid #e5e7eb', \n display: 'flex', alignItems: 'center', justifyContent: 'space-between'\n }}>\n <h2 style={{ margin: 0, fontSize: '16px', fontWeight: 600 }}>Insert Link, Page, or Document</h2>\n <button \n onClick={onClose}\n style={{ background: 'none', border: 'none', cursor: 'pointer', color: '#6b7280' }}\n >\n <X size={20} />\n </button>\n </div>\n\n {/* Content */}\n <div style={{ padding: '16px' }}>\n {/* Tabs */}\n <div style={{ display: 'flex', border: '1px solid #2b76b9', borderRadius: '4px', overflow: 'hidden', marginBottom: '16px' }}>\n <div \n onClick={() => setActiveTab('url')}\n style={{ flex: 1, textAlign: 'center', padding: '8px', backgroundColor: activeTab === 'url' ? '#2b76b9' : '#fff', color: activeTab === 'url' ? '#fff' : '#6b7280', fontWeight: 500, fontSize: '13px', cursor: 'pointer' }}>\n Web URL\n </div>\n <div \n onClick={() => setActiveTab('page')}\n style={{ flex: 1, textAlign: 'center', padding: '8px', backgroundColor: activeTab === 'page' ? '#2b76b9' : '#fff', color: activeTab === 'page' ? '#fff' : '#6b7280', fontWeight: 500, fontSize: '13px', cursor: 'pointer' }}>\n This Page\n </div>\n <div \n onClick={() => setActiveTab('document')}\n style={{ flex: 1.2, textAlign: 'center', padding: '8px', backgroundColor: activeTab === 'document' ? '#2b76b9' : '#fff', color: activeTab === 'document' ? '#fff' : '#6b7280', fontWeight: 500, fontSize: '13px', cursor: 'pointer' }}>\n Other Doc\n </div>\n </div>\n\n {/* URL, Page, or Document input */}\n {activeTab === 'url' && (\n <div style={{ marginBottom: showTextInput ? '16px' : '0' }}>\n <label style={{ display: 'block', marginBottom: '8px', fontSize: '13px', fontWeight: 600, color: '#374151' }}>\n Enter Web URL <span style={{ color: '#ef4444' }}>*</span>\n </label>\n <input \n type=\"text\" \n value={url}\n onChange={(e) => setUrl(e.target.value)}\n placeholder=\"https://...\"\n style={{\n width: '100%', padding: '10px', boxSizing: 'border-box',\n border: `1px solid ${!url.trim() ? '#fca5a5' : '#d1d5db'}`, borderRadius: '4px', fontSize: '14px'\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') handleSave();\n }}\n autoFocus\n />\n </div>\n )}\n\n {activeTab === 'page' && (\n <div style={{ marginBottom: showTextInput ? '16px' : '0' }}>\n <label style={{ display: 'block', marginBottom: '8px', fontSize: '13px', fontWeight: 600, color: '#374151' }}>\n Enter Page Number in Current Document <span style={{ color: '#ef4444' }}>*</span>\n </label>\n <input \n type=\"number\" \n value={page}\n min=\"1\"\n onChange={(e) => setPage(e.target.value)}\n placeholder=\"10\"\n style={{\n width: '100%', padding: '10px', boxSizing: 'border-box',\n border: `1px solid ${!page.trim() ? '#fca5a5' : '#d1d5db'}`, borderRadius: '4px', fontSize: '14px'\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') handleSave();\n }}\n autoFocus\n />\n </div>\n )}\n\n {activeTab === 'document' && (\n <div style={{ marginBottom: showTextInput ? '16px' : '0' }}>\n <label style={{ display: 'block', marginBottom: '8px', fontSize: '13px', fontWeight: 600, color: '#374151' }}>\n Document URL or File Name <span style={{ color: '#ef4444' }}>*</span>\n </label>\n <input \n type=\"text\" \n value={docUrl}\n onChange={(e) => setDocUrl(e.target.value)}\n placeholder=\"supporting-doc.pdf or https://...\"\n style={{\n width: '100%', padding: '10px', boxSizing: 'border-box', marginBottom: '12px',\n border: `1px solid ${!docUrl.trim() ? '#fca5a5' : '#d1d5db'}`, borderRadius: '4px', fontSize: '14px'\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') handleSave();\n }}\n autoFocus\n />\n <label style={{ display: 'block', marginBottom: '8px', fontSize: '13px', fontWeight: 600, color: '#374151' }}>\n Target Page <span style={{ color: '#9ca3af', fontWeight: 400, fontSize: '12px' }}>(optional — defaults to page 1)</span>\n </label>\n <input \n type=\"number\" \n value={docPage}\n min=\"1\"\n onChange={(e) => setDocPage(e.target.value)}\n placeholder=\"1\"\n style={{\n width: '100%', padding: '10px', boxSizing: 'border-box',\n border: '1px solid #d1d5db', borderRadius: '4px', fontSize: '14px'\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') handleSave();\n }}\n />\n </div>\n )}\n\n {/* Text to Display (optional, below inputs) */}\n {showTextInput && (\n <div>\n <label style={{ display: 'block', marginBottom: '8px', fontSize: '13px', fontWeight: 600, color: '#374151' }}>\n Text to Display <span style={{ color: '#9ca3af', fontWeight: 400, fontSize: '12px' }}>(optional — defaults to target)</span>\n </label>\n <input \n type=\"text\" \n value={text}\n onChange={(e) => setText(e.target.value)}\n placeholder={getPlaceholderText()}\n style={{\n width: '100%', padding: '10px', boxSizing: 'border-box',\n border: '1px solid #d1d5db', borderRadius: '4px', fontSize: '14px'\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') handleSave();\n }}\n />\n </div>\n )}\n </div>\n \n {/* Footer */}\n <div style={{ padding: '16px', borderTop: '1px solid #e5e7eb', display: 'flex', justifyContent: 'flex-end', backgroundColor: '#f9fafb' }}>\n <button \n onClick={handleSave}\n disabled={isSaveDisabled}\n style={{ \n backgroundColor: isSaveDisabled ? '#93c5fd' : '#2b76b9', color: '#fff', border: 'none', borderRadius: '4px',\n padding: '8px 24px', fontSize: '14px', fontWeight: 500, cursor: isSaveDisabled ? 'not-allowed' : 'pointer'\n }}\n >\n Link\n </button>\n </div>\n </div>\n </div>\n );\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\nimport { useState, useEffect, useCallback } from 'react';\n\nexport type ActionType =\n | 'ROTATE_CW'\n | 'ROTATE_CCW'\n | 'UNDO'\n | 'REDO'\n | 'DELETE'\n | 'COPY'\n | 'PASTE'\n | 'FILE_PICKER'\n | 'SEARCH';\n\nexport interface Shortcut {\n action: ActionType;\n description: string;\n defaultCommand: string;\n command: string;\n}\n\nexport const DEFAULT_SHORTCUTS: Shortcut[] = [\n { action: 'ROTATE_CW', description: 'Rotate the document clockwise', defaultCommand: 'Meta+Shift+=', command: 'Meta+Shift+=' },\n { action: 'ROTATE_CCW', description: 'Rotate the document counterclockwise', defaultCommand: 'Meta+Shift+-', command: 'Meta+Shift+-' },\n { action: 'COPY', description: 'Copy selected text or annotations', defaultCommand: 'Meta+C', command: 'Meta+C' },\n { action: 'PASTE', description: 'Paste text or annotations', defaultCommand: 'Meta+V', command: 'Meta+V' },\n { action: 'UNDO', description: 'Undo an annotation change', defaultCommand: 'Meta+Z', command: 'Meta+Z' },\n { action: 'REDO', description: 'Redo an annotation change', defaultCommand: 'Meta+Shift+Z', command: 'Meta+Shift+Z' },\n { action: 'FILE_PICKER', description: 'Open the file picker', defaultCommand: 'Meta+O', command: 'Meta+O' },\n { action: 'SEARCH', description: 'Open the search overlay', defaultCommand: 'Meta+F', command: 'Meta+F' },\n { action: 'DELETE', description: 'Delete selected annotation', defaultCommand: 'Delete', command: 'Delete' },\n];\n\nconst STORAGE_KEY = 'pdfviewer_shortcuts';\nconst CHANGE_EVENT = 'pdfviewer-shortcuts-changed';\n\nlet cachedShortcuts: Shortcut[] | null = null;\nconst listeners = new Set<() => void>();\n\nexport function loadStoredShortcuts(): Shortcut[] {\n if (typeof window === 'undefined' || !window.localStorage) return DEFAULT_SHORTCUTS;\n try {\n const saved = window.localStorage.getItem(STORAGE_KEY);\n if (saved) {\n const parsed = JSON.parse(saved);\n if (Array.isArray(parsed)) {\n return DEFAULT_SHORTCUTS.map(def => {\n const found = parsed.find((p: Shortcut) => p && p.action === def.action);\n return found && typeof found.command === 'string' ? { ...def, command: found.command } : def;\n });\n }\n }\n } catch {\n // ignore parse errors\n }\n return DEFAULT_SHORTCUTS;\n}\n\nfunction notifySubscribers() {\n listeners.forEach(fn => fn());\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent(CHANGE_EVENT));\n }\n}\n\nexport function useShortcuts() {\n const [shortcuts, setShortcuts] = useState<Shortcut[]>(() => {\n if (!cachedShortcuts) cachedShortcuts = loadStoredShortcuts();\n return cachedShortcuts;\n });\n\n useEffect(() => {\n const sync = () => {\n cachedShortcuts = loadStoredShortcuts();\n setShortcuts(cachedShortcuts);\n };\n\n listeners.add(sync);\n if (typeof window !== 'undefined') {\n window.addEventListener('storage', sync);\n window.addEventListener(CHANGE_EVENT, sync);\n }\n\n return () => {\n listeners.delete(sync);\n if (typeof window !== 'undefined') {\n window.removeEventListener('storage', sync);\n window.removeEventListener(CHANGE_EVENT, sync);\n }\n };\n }, []);\n\n const updateShortcut = useCallback((action: ActionType, newCommand: string) => {\n const base = cachedShortcuts || loadStoredShortcuts();\n const updated = base.map(s => s.action === action ? { ...s, command: newCommand } : s);\n cachedShortcuts = updated;\n if (typeof window !== 'undefined' && window.localStorage) {\n window.localStorage.setItem(STORAGE_KEY, JSON.stringify(updated));\n }\n setShortcuts(updated);\n notifySubscribers();\n }, []);\n\n const resetShortcuts = useCallback(() => {\n cachedShortcuts = DEFAULT_SHORTCUTS;\n if (typeof window !== 'undefined' && window.localStorage) {\n window.localStorage.removeItem(STORAGE_KEY);\n }\n setShortcuts(DEFAULT_SHORTCUTS);\n notifySubscribers();\n }, []);\n\n const getCommand = useCallback((action: ActionType): string => {\n const list = cachedShortcuts || shortcuts;\n const s = list.find(item => item.action === action);\n return s ? s.command : '';\n }, [shortcuts]);\n\n return { shortcuts, updateShortcut, resetShortcuts, getCommand };\n}\n\nexport interface ParsedCommand {\n meta: boolean;\n shift: boolean;\n alt: boolean;\n key: string;\n}\n\nexport function parseCommandString(commandString: string): ParsedCommand {\n if (!commandString) return { meta: false, shift: false, alt: false, key: '' };\n\n const rawTokens = commandString.split('+');\n let meta = false;\n let shift = false;\n let alt = false;\n const keyTokens: string[] = [];\n\n for (let i = 0; i < rawTokens.length; i++) {\n const raw = rawTokens[i].trim();\n const lower = raw.toLowerCase();\n\n if (lower === 'meta' || lower === 'cmd' || lower === 'ctrl' || lower === 'command' || lower === 'control') {\n meta = true;\n } else if (lower === 'shift') {\n shift = true;\n } else if (lower === 'alt' || lower === 'option') {\n alt = true;\n } else if (raw === '' && i > 0 && rawTokens[i - 1] === '') {\n // Handles '+' key when split by '+' e.g. \"Meta++\" or \"Meta+Shift++\"\n keyTokens.push('+');\n } else if (raw !== '') {\n keyTokens.push(raw);\n }\n }\n\n if (commandString.endsWith('+') && keyTokens.length === 0) {\n keyTokens.push('+');\n }\n\n return { meta, shift, alt, key: keyTokens.join('+').toLowerCase() };\n}\n\n// Utility to match KeyboardEvent against a command string\nexport function matchShortcut(e: KeyboardEvent, commandString: string): boolean {\n if (!commandString) return false;\n const parsed = parseCommandString(commandString);\n\n const isMetaPressed = Boolean(e.metaKey || e.ctrlKey);\n if (parsed.meta !== isMetaPressed) return false;\n if (parsed.alt !== Boolean(e.altKey)) return false;\n\n const eventKey = (e.key || '').toLowerCase();\n const targetKey = parsed.key.toLowerCase();\n\n // Delete & Backspace mapping (interchangeable for DELETE action)\n if (targetKey === 'delete' || targetKey === 'backspace') {\n if (parsed.shift !== Boolean(e.shiftKey)) return false;\n return eventKey === 'delete' || eventKey === 'backspace';\n }\n\n // Plus & Equals: on US layout '+' is Shift+'='\n if (targetKey === '=' || targetKey === '+') {\n const isKeyEqualOrPlus = eventKey === '=' || eventKey === '+' || e.code === 'Equal' || e.code === 'NumpadAdd';\n if (!isKeyEqualOrPlus) return false;\n if (parsed.shift && !e.shiftKey) return false;\n if (!parsed.shift && targetKey === '=' && e.shiftKey) return false;\n return true;\n }\n\n // Minus & Underscore: on US layout '_' is Shift+'-'\n if (targetKey === '-' || targetKey === '_') {\n const isKeyMinus = eventKey === '-' || eventKey === '_' || e.code === 'Minus' || e.code === 'NumpadSubtract';\n if (!isKeyMinus) return false;\n if (parsed.shift && !e.shiftKey) return false;\n if (!parsed.shift && targetKey === '-' && e.shiftKey) return false;\n return true;\n }\n\n // Check shift requirement\n if (parsed.shift !== Boolean(e.shiftKey)) return false;\n\n // Direct key or code match\n if (eventKey === targetKey) return true;\n if (e.code && e.code.toLowerCase() === `key${targetKey}`) return true;\n if (e.code && e.code.toLowerCase() === `digit${targetKey}`) return true;\n\n return false;\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * Shared page text builder and coordinate interpolator for PDF search and redaction.\n */\nimport type { SearchBounds } from '../core/types';\n\nexport interface PageText {\n fullText: string;\n itemIndices: number[];\n charIndices: number[];\n normText: string;\n normToRaw: number[];\n}\n\n/**\n * Collapses any consecutive whitespace runs to a single space and trims edges.\n */\nexport function collapseWhitespace(s: string): string {\n return s.replace(/\\s+/g, ' ').trim();\n}\n\n/**\n * Builds raw page text with item/char index source-mapping, followed by a second pass\n * creating normalized text (collapsing any maximal whitespace run to a single space)\n * and a 1-to-1 index map back to raw string indices.\n */\nexport function buildPageText(items: any[]): PageText {\n let fullText = '';\n const itemIndices: number[] = [];\n const charIndices: number[] = [];\n\n // Pass 1: Build raw fullText with item and char index sentinels\n items.forEach((item, index) => {\n const str = item.str ?? '';\n for (let i = 0; i < str.length; i++) {\n itemIndices.push(index);\n charIndices.push(i);\n }\n fullText += str;\n\n if (item.hasEOL) {\n fullText += '\\n';\n itemIndices.push(-1);\n charIndices.push(-1);\n } else {\n fullText += ' ';\n itemIndices.push(-1);\n charIndices.push(-1);\n }\n });\n\n // Pass 2: Collapse maximal runs of /\\s/ into a single ' ' pointing to the run's first raw index\n let normText = '';\n const normToRaw: number[] = [];\n\n let i = 0;\n while (i < fullText.length) {\n const char = fullText[i];\n if (/\\s/.test(char)) {\n const runStart = i;\n while (i < fullText.length && /\\s/.test(fullText[i])) {\n i++;\n }\n normText += ' ';\n normToRaw.push(runStart);\n } else {\n normText += char;\n normToRaw.push(i);\n i++;\n }\n }\n\n return {\n fullText,\n itemIndices,\n charIndices,\n normText,\n normToRaw,\n };\n}\n\n/**\n * Computes bounding boxes in PDF coordinate points for a matched range [rawStart, rawEndExcl) in fullText.\n * Separator sentinels (-1) are skipped, and character positions are interpolated across each TextItem.\n */\nexport function boundsForRawRange(\n items: any[],\n pageText: Pick<PageText, 'itemIndices' | 'charIndices'>,\n rawStart: number,\n rawEndExcl: number\n): SearchBounds[] {\n const { itemIndices, charIndices } = pageText;\n const itemMatches = new Map<number, { min: number; max: number }>();\n\n for (let i = rawStart; i < rawEndExcl; i++) {\n const itemIdx = itemIndices[i];\n const charIdx = charIndices[i];\n if (itemIdx !== undefined && itemIdx !== -1) {\n const existing = itemMatches.get(itemIdx);\n if (existing) {\n existing.min = Math.min(existing.min, charIdx);\n existing.max = Math.max(existing.max, charIdx);\n } else {\n itemMatches.set(itemIdx, { min: charIdx, max: charIdx });\n }\n }\n }\n\n const bounds: SearchBounds[] = [];\n\n itemMatches.forEach((match, itemIndex) => {\n const item = items[itemIndex];\n if (!item || !item.transform) return;\n\n const x = item.transform[4];\n const y = item.transform[5];\n const width = item.width;\n const height = item.height || Math.abs(item.transform[3]);\n const strLen = (item.str ?? '').length;\n\n if (strLen > 0) {\n const charWidth = width / strLen;\n const startX = x + match.min * charWidth;\n const matchWidth = (match.max - match.min + 1) * charWidth;\n bounds.push({ x: startX, y, width: matchWidth, height });\n } else {\n bounds.push({ x, y, width, height });\n }\n });\n\n return bounds;\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\nimport { useState, useCallback } from 'react';\nimport type * as pdfjsLib from 'pdfjs-dist';\nimport type { Redaction, SearchBounds } from '../core/types';\n\nimport { buildPageText, collapseWhitespace, boundsForRawRange } from '../utils/pageText';\n\nexport type { SearchBounds };\n\nexport interface SearchResult {\n id: string;\n pageIndex: number;\n snippet: string;\n matchStartIndex: number;\n matchLength: number;\n bounds: SearchBounds[];\n}\n\n/**\n * Standalone asynchronous text search across all pages (or specified pages) of a PDFDocumentProxy.\n * Sanitizes redacted regions and returns matching snippets and bounding boxes.\n */\nexport async function searchPdfText(\n pdfDoc: pdfjsLib.PDFDocumentProxy,\n query: string,\n redactions: Redaction[] = [],\n onProgress?: (progress: number) => void,\n pages?: number[]\n): Promise<SearchResult[]> {\n if (!pdfDoc || !query.trim()) return [];\n\n const results: SearchResult[] = [];\n const qn = collapseWhitespace(query).toLowerCase();\n if (!qn) return [];\n\n const numPages = pdfDoc.numPages;\n let targetPages: number[];\n if (pages !== undefined) {\n const deduped = Array.from(new Set(pages));\n targetPages = deduped\n .filter(p => Number.isInteger(p) && p >= 1 && p <= numPages)\n .sort((a, b) => a - b);\n if (targetPages.length === 0) {\n onProgress?.(100);\n return [];\n }\n } else {\n targetPages = Array.from({ length: numPages }, (_, i) => i + 1);\n }\n\n const batchSize = 10;\n\n for (let batchStart = 0; batchStart < targetPages.length; batchStart += batchSize) {\n const batchPages = targetPages.slice(batchStart, batchStart + batchSize);\n const batchPromises = batchPages.map(pageNum =>\n (async () => {\n const page = await pdfDoc.getPage(pageNum);\n const textContent = await page.getTextContent();\n\n // --- Text Layer Sanitization ---\n let items = textContent.items as any[];\n if (redactions && redactions.length > 0) {\n const pageRedactions = redactions.filter(r => r.pageIndex === pageNum);\n if (pageRedactions.length > 0) {\n const vp = page.getViewport({ scale: 1 });\n items = items.filter((item: any) => {\n if (!item.str || item.str.trim() === '') return true;\n\n const itemX = item.transform[4];\n const itemY = item.transform[5];\n const itemW = item.width;\n const itemH = item.height || Math.abs(item.transform[3]);\n const itemTopY = vp.height - itemY - itemH;\n\n for (const red of pageRedactions) {\n const intersectX = Math.max(itemX, red.x) < Math.min(itemX + itemW, red.x + red.width);\n const intersectY = Math.max(itemTopY, red.y) < Math.min(itemTopY + itemH, red.y + red.height);\n\n if (intersectX && intersectY) {\n return false; // Intersects redacted region, exclude from search results!\n }\n }\n return true;\n });\n }\n }\n\n const pageText = buildPageText(items);\n const { fullText, normText, normToRaw } = pageText;\n const lowerNormText = normText.toLowerCase();\n let n = 0;\n const pageResults: SearchResult[] = [];\n\n while ((n = lowerNormText.indexOf(qn, n)) !== -1) {\n const rawStart = normToRaw[n];\n const rawEndExcl = normToRaw[n + qn.length - 1] + 1;\n const snippetStart = Math.max(0, rawStart - 30);\n const snippetEnd = Math.min(fullText.length, rawEndExcl + 30);\n const snippet = fullText.substring(snippetStart, snippetEnd).replace(/\\n/g, ' ');\n\n const bounds = boundsForRawRange(items, pageText, rawStart, rawEndExcl);\n\n pageResults.push({\n id: `p${pageNum}-idx${rawStart}`,\n pageIndex: pageNum,\n snippet,\n matchStartIndex: rawStart - snippetStart,\n matchLength: rawEndExcl - rawStart,\n bounds,\n });\n\n n += qn.length;\n }\n\n page.cleanup?.();\n return pageResults;\n })()\n );\n\n const batchResultsArray = await Promise.all(batchPromises);\n batchResultsArray.forEach(pageResults => results.push(...pageResults));\n\n onProgress?.(Math.round(((batchStart + batchPages.length) / targetPages.length) * 100));\n // Yield to main thread to allow UI to render progress bar\n await new Promise(resolve => setTimeout(resolve, 10));\n }\n\n // Stable sort by pageIndex maintains sequential page order and ascending intra-page order\n results.sort((a, b) => a.pageIndex - b.pageIndex);\n\n return results;\n}\n\nexport function usePdfSearch(pdfDoc: pdfjsLib.PDFDocumentProxy | null, redactions: Redaction[] = []) {\n const [isSearching, setIsSearching] = useState(false);\n const [searchResults, setSearchResults] = useState<SearchResult[]>([]);\n const [searchProgress, setSearchProgress] = useState(0);\n\n const search = useCallback(\n async (query: string) => {\n if (!pdfDoc || !query.trim()) {\n setSearchResults([]);\n return;\n }\n\n setIsSearching(true);\n setSearchProgress(0);\n\n try {\n const results = await searchPdfText(pdfDoc, query, redactions, p => setSearchProgress(p));\n setSearchResults(results);\n } catch (error) {\n console.error('Search error:', error);\n } finally {\n setIsSearching(false);\n setSearchProgress(100);\n }\n },\n [pdfDoc, redactions]\n );\n\n return { search, searchResults, isSearching, searchProgress, clearSearch: () => setSearchResults([]) };\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\nimport React, { useState, useEffect, useRef } from 'react';\nimport { Trash2, MessageSquare, MessageCircle, Type, Search, X, Link as LinkIcon } from 'lucide-react';\nimport { type SearchResult } from '../hooks/usePdfSearch';\nimport { useBusEvent } from '../hooks/useViewerBus';\n\ninterface SidebarProps {\n isOpen: boolean;\n annotations: any[];\n setAnnotations: (anns: any[]) => void;\n selectedAnnotationId: string | null;\n setSelectedAnnotationId: (id: string | null) => void;\n // Search Props\n onSearch: (query: string) => void;\n searchResults: SearchResult[];\n isSearching: boolean;\n searchProgress: number;\n onResultClick: (result: SearchResult) => void;\n activeTab: 'Comments' | 'Search';\n setActiveTab: (tab: 'Comments' | 'Search') => void;\n onLinkClick?: (url: string, annotation?: any, e?: React.MouseEvent) => void;\n}\n\nexport default function Sidebar({ \n isOpen, annotations, setAnnotations, selectedAnnotationId, setSelectedAnnotationId,\n onSearch, searchResults, isSearching, searchProgress, onResultClick,\n activeTab, setActiveTab, onLinkClick\n}: SidebarProps) {\n const [searchQuery, setSearchQuery] = useState('');\n const [sidebarWidth, setSidebarWidth] = useState(320);\n const [isResizing, setIsResizing] = useState(false);\n const searchInputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n const handleMouseMove = (e: MouseEvent) => {\n if (!isResizing) return;\n const newWidth = Math.min(Math.max(e.clientX, 200), 600);\n setSidebarWidth(newWidth);\n };\n const handleMouseUp = () => setIsResizing(false);\n \n if (isResizing) {\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n } else {\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n }\n return () => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n }, [isResizing]);\n\n useEffect(() => {\n const handler = setTimeout(() => {\n onSearch(searchQuery);\n }, 500);\n return () => clearTimeout(handler);\n }, [searchQuery, onSearch]);\n\n useEffect(() => {\n if (isOpen && activeTab === 'Search') {\n const timer = setTimeout(() => {\n searchInputRef.current?.focus();\n searchInputRef.current?.select();\n }, 50);\n return () => clearTimeout(timer);\n }\n }, [isOpen, activeTab]);\n\n useBusEvent('action-focus-search', () => {\n if (searchInputRef.current) {\n searchInputRef.current.focus();\n searchInputRef.current.select();\n }\n });\n\n const comments = annotations.filter(a => ['note', 'callout', 'text', 'link'].includes(a.type));\n\n const handleDelete = (id: string) => {\n setAnnotations(annotations.filter(a => a.id !== id));\n if (selectedAnnotationId === id) setSelectedAnnotationId(null);\n };\n\n return (\n <div style={{\n width: isOpen ? `${sidebarWidth}px` : '0px',\n height: '100%',\n backgroundColor: '#f9fafb',\n display: 'flex',\n flexShrink: 0,\n zIndex: 10,\n transition: isResizing ? 'none' : 'width 0.3s cubic-bezier(0.4, 0, 0.2, 1)',\n position: 'relative'\n }}>\n {/* Inner container to clip content smoothly */}\n <div style={{\n width: `${sidebarWidth}px`,\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden'\n }}>\n <div style={{\n padding: '16px',\n borderBottom: '1px solid var(--border-color)',\n backgroundColor: '#fff',\n display: 'flex',\n flexDirection: 'column',\n gap: '12px',\n flexShrink: 0\n }}>\n <div style={{ display: 'flex', gap: '16px' }}>\n <button \n onClick={() => setActiveTab('Search')}\n style={{ \n background: 'none', border: 'none', padding: '4px 0', cursor: 'pointer', fontSize: '14px',\n fontWeight: activeTab === 'Search' ? 600 : 400, color: activeTab === 'Search' ? 'var(--primary)' : 'var(--text-muted)',\n borderBottom: activeTab === 'Search' ? '2px solid var(--primary)' : '2px solid transparent'\n }}\n >\n Search\n </button>\n <button \n onClick={() => setActiveTab('Comments')}\n style={{ \n background: 'none', border: 'none', padding: '4px 0', cursor: 'pointer', fontSize: '14px',\n fontWeight: activeTab === 'Comments' ? 600 : 400, color: activeTab === 'Comments' ? 'var(--primary)' : 'var(--text-muted)',\n borderBottom: activeTab === 'Comments' ? '2px solid var(--primary)' : '2px solid transparent'\n }}\n >\n Comments\n </button>\n </div>\n\n {activeTab === 'Search' && (\n <div style={{ position: 'relative', marginBottom: '16px' }}>\n <Search size={16} color=\"#64748b\" style={{ position: 'absolute', left: '12px', top: '10px' }} />\n <input \n ref={searchInputRef}\n type=\"text\" \n placeholder=\"Search...\" \n value={searchQuery}\n onChange={e => setSearchQuery(e.target.value)}\n onKeyDown={e => {\n if (e.key === 'Enter') {\n e.preventDefault();\n onSearch(searchQuery);\n }\n }}\n style={{\n width: '100%',\n padding: '8px 32px 8px 36px',\n border: '1px solid var(--border-color)',\n borderRadius: '4px',\n fontSize: '13px',\n outline: 'none',\n boxSizing: 'border-box'\n }}\n />\n {searchQuery && (\n <button \n onClick={() => {\n setSearchQuery('');\n onSearch('');\n }}\n style={{\n position: 'absolute',\n right: '10px',\n top: '50%',\n transform: 'translateY(-50%)',\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n padding: 0,\n color: 'var(--text-muted)'\n }}\n title=\"Clear search\"\n >\n <X size={14} />\n </button>\n )}\n </div>\n )}\n </div>\n\n <div style={{ flex: 1, overflowY: 'auto', padding: '12px', display: 'flex', flexDirection: 'column', gap: '8px' }}>\n \n {activeTab === 'Comments' && (\n <>\n {comments.length === 0 && (\n <div style={{ color: 'var(--text-muted)', fontSize: '13px', textAlign: 'center', marginTop: '24px' }}>\n No comments on this document.\n </div>\n )}\n {comments.map(comment => (\n <div \n key={comment.id}\n onClick={() => setSelectedAnnotationId(comment.id)}\n style={{\n padding: '12px',\n backgroundColor: '#fff',\n border: selectedAnnotationId === comment.id ? '2px solid var(--primary)' : '1px solid var(--border-color)',\n borderRadius: '6px',\n cursor: 'pointer',\n boxShadow: '0 1px 2px rgba(0,0,0,0.05)'\n }}\n >\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: '8px' }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px', color: 'var(--text-muted)' }}>\n {comment.type === 'note' && <MessageSquare size={14} />}\n {comment.type === 'callout' && <MessageCircle size={14} />}\n {comment.type === 'text' && <Type size={14} />}\n {comment.type === 'link' && <LinkIcon size={14} />}\n <span style={{ fontSize: '12px', textTransform: 'capitalize' }}>{comment.type}</span>\n {comment.author && <span style={{ fontSize: '11px', color: 'var(--text-muted)' }}>· {comment.author}</span>}\n </div>\n <button \n onClick={(e) => { e.stopPropagation(); handleDelete(comment.id); }}\n style={{ background: 'none', border: 'none', color: '#ef4444', cursor: 'pointer', padding: '4px' }}\n title=\"Delete Comment\"\n >\n <Trash2 size={14} />\n </button>\n </div>\n \n <div style={{ fontSize: '14px', color: 'var(--text-color)', whiteSpace: 'pre-wrap', wordBreak: 'break-word' }}>\n {comment.type === 'link' ? (\n <a\n href={comment.linkUrl}\n onClick={(e) => {\n if (onLinkClick && comment.linkUrl) {\n e.preventDefault();\n onLinkClick(comment.linkUrl, comment, e);\n }\n }}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{ color: 'var(--primary)', textDecoration: 'none', cursor: 'pointer' }}\n >\n {comment.linkUrl || <span style={{ fontStyle: 'italic', color: 'var(--text-muted)' }}>Empty link</span>}\n </a>\n ) : (\n comment.text || <span style={{ fontStyle: 'italic', color: 'var(--text-muted)' }}>Empty comment</span>\n )}\n </div>\n </div>\n ))}\n </>\n )}\n\n {activeTab === 'Search' && (\n <>\n {isSearching && (\n <div style={{ fontSize: '13px', color: 'var(--text-muted)', textAlign: 'center', marginTop: '16px' }}>\n Searching... {searchProgress}%\n </div>\n )}\n {!isSearching && searchQuery && searchResults.length === 0 && (\n <div style={{ fontSize: '13px', color: 'var(--text-muted)', textAlign: 'center', marginTop: '16px' }}>\n No results found.\n </div>\n )}\n {!isSearching && searchResults.length > 0 && (\n <div style={{ fontSize: '12px', color: 'var(--text-muted)', marginBottom: '8px' }}>\n {searchResults.length} results found\n </div>\n )}\n \n {/* Group results by page */}\n {!isSearching && Array.from(new Set(searchResults.map(r => r.pageIndex))).map(pageNum => {\n const pageResults = searchResults.filter(r => r.pageIndex === pageNum);\n return (\n <div key={`page-${pageNum}`} style={{ marginBottom: '16px' }}>\n <div style={{ fontSize: '12px', color: 'var(--text-muted)', marginBottom: '4px' }}>Page {pageNum}</div>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '4px' }}>\n {pageResults.map(result => (\n <div \n key={result.id} \n onClick={() => onResultClick(result)}\n style={{\n padding: '8px',\n backgroundColor: '#fff',\n border: '1px solid var(--border-color)',\n borderRadius: '4px',\n cursor: 'pointer',\n fontSize: '13px',\n color: 'var(--text-color)'\n }}\n >\n {result.snippet.substring(0, result.matchStartIndex)}\n <span style={{ fontWeight: 700, color: 'var(--primary)' }}>\n {result.snippet.substring(result.matchStartIndex, result.matchStartIndex + result.matchLength)}\n </span>\n {result.snippet.substring(result.matchStartIndex + result.matchLength)}\n </div>\n ))}\n </div>\n </div>\n );\n })}\n </>\n )}\n \n </div>\n \n </div>\n\n {/* Resizer Handle */}\n {isOpen && (\n <div \n onMouseDown={() => setIsResizing(true)}\n style={{\n position: 'absolute',\n top: 0,\n right: 0,\n width: '6px',\n height: '100%',\n cursor: 'col-resize',\n zIndex: 20,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: 'transparent'\n }}\n >\n {/* Vertical Pill */}\n <div style={{\n width: '6px',\n height: '40px',\n backgroundColor: '#fff',\n border: '1px solid #d1d5db',\n borderRadius: '4px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '1px',\n boxShadow: '0 1px 3px rgba(0,0,0,0.1)'\n }}>\n <div style={{ width: '1px', height: '16px', backgroundColor: '#9ca3af' }} />\n <div style={{ width: '1px', height: '16px', backgroundColor: '#9ca3af' }} />\n </div>\n <div style={{ position: 'absolute', top: 0, right: 0, width: '1px', height: '100%', backgroundColor: 'var(--border-color)', zIndex: -1 }} />\n </div>\n )}\n </div>\n );\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\nimport React, { useState, useEffect, useRef } from 'react';\nimport * as pdfjsLib from 'pdfjs-dist';\nimport { Copy, List, Bookmark, MoreHorizontal, CheckSquare, Minus, Plus } from 'lucide-react';\n\ninterface ThumbnailProps {\n pdfDoc: pdfjsLib.PDFDocumentProxy;\n pageIndex: number;\n isActive: boolean;\n onClick: () => void;\n scale: number;\n}\n\nconst Thumbnail = ({ pdfDoc, pageIndex, isActive, onClick, scale }: ThumbnailProps) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const [isVisible, setIsVisible] = useState(false);\n const [aspectRatio, setAspectRatio] = useState<number>(0.77); // Default to roughly 8.5x11\n\n // Use IntersectionObserver to only render thumbnails that are near the viewport\n useEffect(() => {\n const observer = new IntersectionObserver((entries) => {\n if (entries[0].isIntersecting) {\n setIsVisible(true);\n } else {\n setIsVisible(false);\n }\n }, { rootMargin: '500px' });\n \n if (containerRef.current) observer.observe(containerRef.current);\n return () => observer.disconnect();\n }, []);\n\n useEffect(() => {\n if (!isVisible) return;\n\n let renderTask: any = null;\n let isCancelled = false;\n\n const renderPage = async () => {\n try {\n const page = await pdfDoc.getPage(pageIndex);\n if (isCancelled) return;\n \n // Update aspect ratio based on actual page size\n const vp = page.getViewport({ scale: 1 });\n setAspectRatio(vp.width / vp.height);\n\n const viewport = page.getViewport({ scale });\n const canvas = canvasRef.current;\n if (!canvas) return;\n \n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n \n const outputScale = Math.min(window.devicePixelRatio || 1, 2);\n canvas.width = Math.floor(viewport.width * outputScale);\n canvas.height = Math.floor(viewport.height * outputScale);\n canvas.style.width = `${viewport.width}px`;\n canvas.style.height = `${viewport.height}px`;\n\n renderTask = page.render({\n canvasContext: ctx,\n canvas: canvas,\n transform: [outputScale, 0, 0, outputScale, 0, 0],\n viewport: viewport\n });\n await renderTask.promise;\n } catch (e: any) {\n if (e.name !== 'RenderingCancelledException') {\n console.error(\"Thumbnail render error\", e);\n }\n }\n };\n \n renderPage();\n \n return () => {\n isCancelled = true;\n if (renderTask) {\n renderTask.cancel();\n }\n };\n }, [pdfDoc, pageIndex, scale, isVisible]);\n\n // Base width is usually around 800 at scale 1. So we calculate a dummy width based on scale.\n const estimatedWidth = 800 * scale;\n const estimatedHeight = estimatedWidth / aspectRatio;\n\n return (\n <div \n ref={containerRef}\n onClick={onClick}\n style={{\n display: 'flex', flexDirection: 'column', alignItems: 'center', cursor: 'pointer',\n padding: '8px', boxSizing: 'border-box',\n minHeight: `${estimatedHeight + 30}px` // +30 for the text label\n }}\n >\n {isVisible ? (\n <div style={{\n border: isActive ? '2px solid var(--primary)' : '1px solid #ccc',\n padding: '2px', backgroundColor: '#fff',\n boxShadow: '0 2px 4px rgba(0,0,0,0.1)'\n }}>\n <canvas ref={canvasRef} style={{ display: 'block', backgroundColor: '#fff' }} />\n </div>\n ) : (\n <div style={{\n width: `${estimatedWidth}px`, height: `${estimatedHeight}px`,\n backgroundColor: '#eaeaea', border: '1px solid #ccc'\n }} />\n )}\n <span style={{ marginTop: '8px', fontSize: '12px', color: isActive ? 'var(--primary)' : '#555', fontWeight: isActive ? 'bold' : 'normal' }}>\n {pageIndex}\n </span>\n </div>\n );\n};\n\ninterface LeftSidebarProps {\n isOpen: boolean;\n pdfDoc: pdfjsLib.PDFDocumentProxy | null;\n pageNum: number;\n setPageNum: (p: number) => void;\n}\n\nexport default function LeftSidebar({ isOpen, pdfDoc, pageNum, setPageNum }: LeftSidebarProps) {\n const [activeTab, setActiveTab] = useState<'Thumbnails' | 'Outline' | 'Bookmarks'>('Thumbnails');\n const [sidebarWidth, setSidebarWidth] = useState(250);\n const [isResizing, setIsResizing] = useState(false);\n \n // Slider goes from 0 (small) to 100 (large)\n const [zoomPercent, setZoomPercent] = useState(30); \n \n // Convert 0-100 to a pdfjs scale (e.g. 0.1 to 0.4)\n const thumbScale = 0.1 + (zoomPercent / 100) * 0.3;\n\n useEffect(() => {\n const handleMouseMove = (e: MouseEvent) => {\n if (!isResizing) return;\n const newWidth = Math.min(Math.max(e.clientX, 150), 500);\n setSidebarWidth(newWidth);\n };\n const handleMouseUp = () => setIsResizing(false);\n \n if (isResizing) {\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n } else {\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n }\n return () => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n }, [isResizing]);\n\n const numPages = pdfDoc ? pdfDoc.numPages : 0;\n \n // Generate array [1, 2, ..., numPages]\n const pagesArray = Array.from({ length: numPages }, (_, i) => i + 1);\n\n return (\n <div style={{\n width: isOpen ? `${sidebarWidth}px` : '0px',\n height: '100%',\n backgroundColor: '#f9fafb',\n display: 'flex',\n flexShrink: 0,\n zIndex: 10,\n transition: isResizing ? 'none' : 'width 0.3s cubic-bezier(0.4, 0, 0.2, 1)',\n position: 'relative',\n borderRight: isOpen ? '1px solid var(--border-color)' : 'none'\n }}>\n <div style={{\n width: `${sidebarWidth}px`,\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden'\n }}>\n {/* Top Tabs */}\n <div style={{\n display: 'flex', borderBottom: '1px solid var(--border-color)', backgroundColor: '#fff', padding: '4px'\n }}>\n <button \n onClick={() => setActiveTab('Thumbnails')}\n style={{ flex: 1, padding: '8px', background: activeTab === 'Thumbnails' ? 'var(--primary)' : 'none', color: activeTab === 'Thumbnails' ? '#fff' : 'var(--text-muted)', border: 'none', borderRadius: '4px', cursor: 'pointer', display: 'flex', justifyContent: 'center' }}\n title=\"Page Thumbnails\"\n >\n <Copy size={16} />\n </button>\n <button \n onClick={() => setActiveTab('Outline')}\n style={{ flex: 1, padding: '8px', background: activeTab === 'Outline' ? 'var(--primary)' : 'none', color: activeTab === 'Outline' ? '#fff' : 'var(--text-muted)', border: 'none', borderRadius: '4px', cursor: 'pointer', display: 'flex', justifyContent: 'center' }}\n title=\"Document Outline\"\n >\n <List size={16} />\n </button>\n <button \n onClick={() => setActiveTab('Bookmarks')}\n style={{ flex: 1, padding: '8px', background: activeTab === 'Bookmarks' ? 'var(--primary)' : 'none', color: activeTab === 'Bookmarks' ? '#fff' : 'var(--text-muted)', border: 'none', borderRadius: '4px', cursor: 'pointer', display: 'flex', justifyContent: 'center' }}\n title=\"Bookmarks\"\n >\n <Bookmark size={16} />\n </button>\n <button \n style={{ flex: 1, padding: '8px', background: 'none', color: 'var(--text-muted)', border: 'none', borderRadius: '4px', cursor: 'pointer', display: 'flex', justifyContent: 'center' }}\n title=\"More Options\"\n >\n <MoreHorizontal size={16} />\n </button>\n </div>\n\n {activeTab === 'Thumbnails' && (\n <>\n {/* Zoom Slider */}\n <div style={{ display: 'flex', alignItems: 'center', padding: '12px 16px', gap: '8px', borderBottom: '1px solid var(--border-color)', backgroundColor: '#fff' }}>\n <Minus size={14} color=\"var(--text-muted)\" style={{ cursor: 'pointer' }} onClick={() => setZoomPercent(Math.max(0, zoomPercent - 10))} />\n <input \n type=\"range\" \n min=\"0\" max=\"100\" \n value={zoomPercent} \n onChange={(e) => setZoomPercent(parseInt(e.target.value))}\n style={{ flex: 1, height: '4px', accentColor: 'var(--primary)' }}\n />\n <Plus size={14} color=\"var(--text-muted)\" style={{ cursor: 'pointer' }} onClick={() => setZoomPercent(Math.min(100, zoomPercent + 10))} />\n </div>\n\n {/* Thumbnails List */}\n <div style={{ flex: 1, overflowY: 'auto', padding: '8px 0', backgroundColor: '#f1f1f1' }}>\n {pdfDoc && pagesArray.map(p => (\n <Thumbnail \n key={p} \n pdfDoc={pdfDoc} \n pageIndex={p} \n isActive={p === pageNum} \n onClick={() => setPageNum(p)}\n scale={thumbScale}\n />\n ))}\n {!pdfDoc && (\n <div style={{ padding: '20px', textAlign: 'center', color: '#888', fontSize: '13px' }}>\n No document loaded\n </div>\n )}\n </div>\n\n {/* Multi-Select Footer */}\n <div style={{ borderTop: '1px solid var(--border-color)', padding: '16px', backgroundColor: '#fff' }}>\n <div style={{ fontSize: '12px', color: 'var(--text-color)', marginBottom: '8px' }}>\n Multi-Select Pages - e.g. 1, 3, 5-10\n </div>\n <div style={{ display: 'flex', gap: '8px' }}>\n <input \n type=\"text\"\n placeholder=\"e.g. 1, 3, 5-10\"\n style={{ flex: 1, padding: '6px 8px', fontSize: '13px', border: '1px solid #ccc', borderRadius: '4px', outline: 'none' }}\n />\n <button style={{ padding: '6px 8px', background: '#fff', border: '1px solid #ccc', borderRadius: '4px', cursor: 'pointer', display: 'flex', alignItems: 'center' }}>\n <CheckSquare size={16} color=\"var(--text-color)\" />\n </button>\n </div>\n </div>\n </>\n )}\n \n {activeTab !== 'Thumbnails' && (\n <div style={{ padding: '20px', textAlign: 'center', color: '#888', fontSize: '13px' }}>\n No content available for {activeTab}.\n </div>\n )}\n </div>\n\n {/* Resize Handle */}\n <div \n onMouseDown={() => setIsResizing(true)}\n style={{\n width: '6px',\n height: '100%',\n position: 'absolute',\n right: '-3px',\n cursor: 'col-resize',\n zIndex: 20\n }}\n />\n </div>\n );\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\n\n/**\n * Converts screen/canvas coordinates in rotated page space to canonical unrotated page space.\n */\nexport function convertToUnrotated(rawX: number, rawY: number, rotation: number, unW: number, unH: number) {\n const normRot = ((rotation % 360) + 360) % 360;\n if (normRot === 90) {\n return { x: rawY, y: unH - rawX };\n }\n if (normRot === 180) {\n return { x: unW - rawX, y: unH - rawY };\n }\n if (normRot === 270) {\n return { x: unW - rawY, y: rawX };\n }\n return { x: rawX, y: rawY };\n}\n\n/**\n * Converts canonical unrotated page coordinates to rotated page space.\n */\nexport function convertToRotated(unX: number, unY: number, rotation: number, unW: number, unH: number) {\n const normRot = ((rotation % 360) + 360) % 360;\n if (normRot === 90) {\n return { x: unH - unY, y: unX };\n }\n if (normRot === 180) {\n return { x: unW - unX, y: unH - unY };\n }\n if (normRot === 270) {\n return { x: unY, y: unW - unX };\n }\n return { x: unX, y: unY };\n}\n\n/**\n * Converts a rectangle from unrotated page space to rotated page space.\n */\nexport function convertToRotatedRect(x: number, y: number, width: number, height: number, rotation: number, unW: number, unH: number) {\n const normRot = ((rotation % 360) + 360) % 360;\n if (normRot === 90) {\n return { x: unH - (y + height), y: x, width: height, height: width };\n }\n if (normRot === 180) {\n return { x: unW - (x + width), y: unH - (y + height), width, height };\n }\n if (normRot === 270) {\n return { x: y, y: unW - (x + width), width: height, height: width };\n }\n return { x, y, width, height };\n}\n\n/**\n * Returns SVG transform string for SVG groups to match page rotation.\n */\nexport function getRotationTransform(rotation: number, unW: number, unH: number): string | undefined {\n const normRot = ((rotation % 360) + 360) % 360;\n if (normRot === 90) return `translate(${unH}, 0) rotate(90)`;\n if (normRot === 180) return `translate(${unW}, ${unH}) rotate(180)`;\n if (normRot === 270) return `translate(0, ${unW}) rotate(270)`;\n return undefined;\n}\n\n/** Normalizes any degree value into [0, 360). */\nexport function normalizeRotation(rotation: number): number {\n return ((rotation % 360) + 360) % 360;\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\nimport React, { useEffect, useRef, useState } from 'react';\nimport * as pdfjsLib from 'pdfjs-dist';\nimport { type SearchResult } from '../hooks/usePdfSearch';\nimport type { Redaction, WatermarkOptions, TransientHighlight } from '../core/types';\nimport type { Annotation } from '../annotations/types';\nimport { getRotationTransform, convertToRotatedRect, normalizeRotation } from '../utils/rotationUtils';\nimport { calculateSafeRenderScale } from '../utils/zoomUtils';\n\nexport type { Annotation };\n\ninterface PageRendererProps {\n pageNum: number;\n pdfDoc: pdfjsLib.PDFDocumentProxy;\n scale: number;\n rotation: number;\n containerWidth: number;\n containerHeight: number;\n scrollTop: number;\n scrollLeft: number;\n pageTop: number;\n pageLeft?: number;\n basePageWidth: number;\n basePageHeight: number;\n \n // App state\n activeTab: string;\n activeTool: string | null;\n annotations: Annotation[];\n selectedAnnotationId: string | null;\n activeSearchResult: SearchResult | null;\n transientHighlights?: TransientHighlight[];\n\n // Handlers\n onMouseDown: (e: React.MouseEvent<Element>, pageNum: number) => void;\n onMouseMove: (e: React.MouseEvent<Element>, pageNum: number) => void;\n onMouseUp: (e: React.MouseEvent<Element>, pageNum: number) => void;\n onAnnotationClick: (id: string, e: React.MouseEvent) => void;\n onAnnotationDoubleClick?: (id: string, e: React.MouseEvent) => void;\n onStartResize?: (id: string, handle: string, e: React.MouseEvent, pageNum: number) => void;\n onStartMove?: (id: string, e: React.MouseEvent, pageNum: number) => void;\n onAnnotationMouseEnter: (id: string) => void;\n onClearSelection: () => void;\n watermark?: WatermarkOptions;\n watermarkText?: string;\n redactions?: Redaction[];\n onDiscardRedaction?: (redaction: Redaction) => void;\n /** Called after the page canvas has been painted (used for first-page-rendered telemetry). */\n onRendered?: (pageNum: number) => void;\n /** Whether to hide annotations and transient highlights until the page canvas has finished rendering. Default: true. */\n hideAnnotationsUntilPageRendered?: boolean;\n onLinkClick?: (url: string, annotation?: Annotation, e?: React.MouseEvent) => void;\n}\n\nfunction PageRendererComponent({\n pageNum, pdfDoc, scale, rotation, containerWidth: _containerWidth, containerHeight: _containerHeight,\n scrollTop: _scrollTop, scrollLeft: _scrollLeft, pageTop, pageLeft = 0, basePageWidth, basePageHeight,\n activeTab, activeTool, annotations, selectedAnnotationId, activeSearchResult, transientHighlights,\n onMouseDown, onMouseMove, onMouseUp, onAnnotationClick, onAnnotationDoubleClick, onStartResize, onStartMove,\n onAnnotationMouseEnter, onClearSelection,\n watermark, watermarkText, redactions, onDiscardRedaction, onRendered,\n hideAnnotationsUntilPageRendered = true, onLinkClick\n}: PageRendererProps) {\n const onRenderedRef = useRef(onRendered);\n useEffect(() => {\n onRenderedRef.current = onRendered;\n }, [onRendered]);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const textLayerRef = useRef<HTMLDivElement>(null);\n const renderTaskRef = useRef<any>(null);\n const pageProxyRef = useRef<pdfjsLib.PDFPageProxy | null>(null);\n const hasRenderedOnceRef = useRef(false);\n const [isCanvasRendered, setIsCanvasRendered] = useState(false);\n const [textContent, setTextContent] = useState<any>(null);\n\n const scaledWidth = basePageWidth * scale;\n const scaledHeight = basePageHeight * scale;\n\n const [prevDocAndPage, setPrevDocAndPage] = useState({ pdfDoc, pageNum, rotation });\n if (prevDocAndPage.pdfDoc !== pdfDoc || prevDocAndPage.pageNum !== pageNum || prevDocAndPage.rotation !== rotation) {\n setPrevDocAndPage({ pdfDoc, pageNum, rotation });\n setIsCanvasRendered(false);\n }\n\n useEffect(() => {\n hasRenderedOnceRef.current = false;\n }, [pdfDoc, pageNum, rotation]);\n\n // Intersection logic for canvas rendering (tile rendering to save memory)\n useEffect(() => {\n let isCancelled = false;\n let timer: any = null;\n\n const renderCanvas = async () => {\n if (!canvasRef.current || !pdfDoc) return;\n if (renderTaskRef.current) {\n try { renderTaskRef.current.cancel(); } catch {}\n renderTaskRef.current = null;\n }\n\n let currentPage: pdfjsLib.PDFPageProxy | null = null;\n try {\n const page = await pdfDoc.getPage(pageNum);\n if (isCancelled) {\n try { page.cleanup?.(); } catch {}\n return;\n }\n currentPage = page;\n pageProxyRef.current = page;\n\n const outputScale = Math.min(window.devicePixelRatio || 1, 2);\n const normalizedRot = normalizeRotation(page.rotate + rotation);\n const unscaledViewport = page.getViewport({ scale: 1.0, rotation: normalizedRot });\n\n let renderScale = calculateSafeRenderScale(\n scale,\n outputScale,\n unscaledViewport.width,\n unscaledViewport.height\n );\n\n let viewport = page.getViewport({ scale: renderScale, rotation: normalizedRot });\n\n const tempCanvas = document.createElement('canvas');\n tempCanvas.width = Math.floor(viewport.width);\n tempCanvas.height = Math.floor(viewport.height);\n let ctx = tempCanvas.getContext('2d');\n if (!ctx) {\n // If GPU canvas memory allocation fails, fall back to safe half scale\n renderScale = renderScale * 0.5;\n viewport = page.getViewport({ scale: renderScale, rotation: normalizedRot });\n tempCanvas.width = Math.floor(viewport.width);\n tempCanvas.height = Math.floor(viewport.height);\n ctx = tempCanvas.getContext('2d');\n }\n if (!ctx || isCancelled) {\n tempCanvas.width = 0;\n tempCanvas.height = 0;\n return;\n }\n\n const renderTask = page.render({\n canvasContext: ctx,\n canvas: tempCanvas,\n viewport: viewport\n });\n renderTaskRef.current = renderTask;\n await renderTask.promise;\n renderTaskRef.current = null;\n \n // --- Pixel Masking (Redactions) ---\n if (redactions && redactions.length > 0) {\n ctx.save();\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n const unW = rotation % 180 === 0 ? basePageWidth : basePageHeight;\n const unH = rotation % 180 === 0 ? basePageHeight : basePageWidth;\n \n for (const redaction of redactions) {\n if (redaction.pageIndex === pageNum) {\n const rotRect = convertToRotatedRect(redaction.x, redaction.y, redaction.width, redaction.height, rotation, unW, unH);\n const vX = rotRect.x * renderScale;\n const vY = rotRect.y * renderScale;\n const vW = rotRect.width * renderScale;\n const vH = rotRect.height * renderScale;\n \n if (redaction.status === 'applied' || redaction.status === undefined) {\n ctx.fillStyle = '#000000';\n ctx.fillRect(Math.floor(vX), Math.floor(vY), Math.ceil(vW), Math.ceil(vH));\n } else {\n ctx.fillStyle = 'rgba(0, 0, 0, 0.45)';\n ctx.fillRect(Math.floor(vX), Math.floor(vY), Math.ceil(vW), Math.ceil(vH));\n ctx.lineWidth = Math.max(1, 2 * (renderScale / (scale || 1)));\n ctx.strokeStyle = '#dc2626';\n ctx.strokeRect(Math.floor(vX), Math.floor(vY), Math.ceil(vW), Math.ceil(vH));\n }\n }\n }\n ctx.restore();\n }\n\n // --- Forensic Watermark Rendering ---\n const wm = watermark || (watermarkText ? { text: watermarkText, opacity: 0.15, size: 24, mode: 'tiled', color: '#000000' } : undefined);\n if (wm && wm.text) {\n ctx.save();\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n \n const opacity = wm.opacity ?? 0.15;\n const mode = wm.mode ?? 'tiled';\n const defaultSize = mode === 'single' ? 48 : 18;\n const size = (wm.size ?? defaultSize) * renderScale;\n const text = wm.text;\n \n ctx.fillStyle = wm.color ?? '#000000';\n ctx.globalAlpha = opacity;\n ctx.font = `600 ${size}px sans-serif`;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n \n const canvasW = tempCanvas.width;\n const canvasH = tempCanvas.height;\n \n if (mode === 'single') {\n ctx.translate(canvasW / 2, canvasH / 2);\n ctx.rotate(-Math.PI / 4);\n ctx.fillText(text, 0, 0);\n } else {\n const stepX = size * text.length * 0.8 + 100 * renderScale;\n const stepY = 180 * renderScale;\n const diag = Math.sqrt(canvasW * canvasW + canvasH * canvasH);\n \n ctx.translate(canvasW / 2, canvasH / 2);\n ctx.rotate(-Math.PI / 4);\n \n for (let y = -diag; y < diag; y += stepY) {\n const rowOffset = (Math.abs(y / stepY) % 2) * (stepX / 2);\n for (let x = -diag; x < diag; x += stepX) {\n ctx.fillText(text, x + rowOffset, y);\n }\n }\n }\n ctx.restore();\n }\n\n // Transfer rendered contents to displayed canvas element\n const destCanvas = canvasRef.current;\n if (destCanvas && !isCancelled) {\n destCanvas.width = tempCanvas.width;\n destCanvas.height = tempCanvas.height;\n const destCtx = destCanvas.getContext('2d');\n if (destCtx) {\n destCtx.drawImage(tempCanvas, 0, 0);\n }\n hasRenderedOnceRef.current = true;\n setIsCanvasRendered(true);\n onRenderedRef.current?.(pageNum);\n }\n // Immediately release offscreen canvas GPU texture memory\n tempCanvas.width = 0;\n tempCanvas.height = 0;\n } catch (err: any) {\n if (err?.name !== 'RenderingCancelledException') {\n console.error(`Page ${pageNum} render failed:`, err);\n }\n } finally {\n if (currentPage) {\n try { currentPage.cleanup?.(); } catch {}\n }\n if (pageProxyRef.current === currentPage) {\n pageProxyRef.current = null;\n }\n }\n };\n\n // 0ms on first render, 150ms debounce on subsequent scale changes to allow\n // rapid zoom clicks to scale smoothly at 60 FPS via GPU CSS transforms\n // while PDF.js vector rendering fires once the zoom motion settles.\n const delay = hasRenderedOnceRef.current ? 150 : 0;\n timer = setTimeout(renderCanvas, delay);\n\n return () => {\n isCancelled = true;\n if (timer) clearTimeout(timer);\n if (renderTaskRef.current) {\n try { renderTaskRef.current.cancel(); } catch {}\n renderTaskRef.current = null;\n }\n if (pageProxyRef.current) {\n try { pageProxyRef.current.cleanup?.(); } catch {}\n pageProxyRef.current = null;\n }\n };\n }, [pageNum, pdfDoc, scale, rotation, basePageWidth, basePageHeight, watermark, watermarkText, redactions]);\n\n // Load TextContent independently\n useEffect(() => {\n let isCancelled = false;\n const fetchText = async () => {\n try {\n const page = await pdfDoc.getPage(pageNum);\n const text = await page.getTextContent();\n \n // --- Text Layer Sanitization (Anti-Copy/Paste) ---\n if (redactions && redactions.length > 0) {\n const pageRedactions = redactions.filter(r => r.pageIndex === pageNum);\n if (pageRedactions.length > 0) {\n // Filter out text items that intersect with redactions\n text.items = text.items.filter((item: any) => {\n if (item.str.trim() === '') return true; // Keep whitespace items for layout\n\n // item.transform: [scaleX, skewY, skewX, scaleY, tx, ty]\n // tx, ty are PDF coordinates (bottom-left origin)\n const itemX = item.transform[4];\n const itemY = item.transform[5];\n const itemW = item.width;\n const itemH = item.height; // Approximate height\n\n for (const red of pageRedactions) {\n // Check AABB intersection\n const intersectX = Math.max(itemX, red.x) < Math.min(itemX + itemW, red.x + red.width);\n const intersectY = Math.max(itemY, red.y) < Math.min(itemY + itemH, red.y + red.height);\n \n if (intersectX && intersectY) {\n return false; // Intersects, permanently remove from DOM\n }\n }\n return true;\n });\n }\n }\n \n if (!isCancelled) setTextContent(text);\n } catch {}\n };\n fetchText();\n return () => { isCancelled = true; };\n }, [pdfDoc, pageNum, redactions]);\n\n // Render TextLayer\n useEffect(() => {\n const container = textLayerRef.current;\n if (!textContent || !container) return;\n let isCancelled = false;\n\n const renderText = async () => {\n try {\n const page = await pdfDoc.getPage(pageNum);\n if (isCancelled) return;\n const viewport = page.getViewport({ scale: 1, rotation: normalizeRotation(page.rotate + rotation) });\n\n let sanitizedTextContent = textContent;\n if (redactions && redactions.length > 0) {\n const pageRedactions = redactions.filter(r => r.pageIndex === pageNum);\n if (pageRedactions.length > 0) {\n const filteredItems = textContent.items.filter((item: any) => {\n if (!item.str || item.str.trim() === '') return true;\n const itemX = item.transform[4];\n const itemY = item.transform[5];\n const itemW = item.width;\n const itemH = item.height || Math.abs(item.transform[3]);\n const itemTopY = viewport.height - itemY - itemH;\n\n for (const red of pageRedactions) {\n const intersectX = Math.max(itemX, red.x) < Math.min(itemX + itemW, red.x + red.width);\n const intersectY = Math.max(itemTopY, red.y) < Math.min(itemTopY + itemH, red.y + red.height);\n if (intersectX && intersectY) {\n return false;\n }\n }\n return true;\n });\n sanitizedTextContent = { ...textContent, items: filteredItems };\n }\n }\n\n if (isCancelled) return;\n container.innerHTML = '';\n const textLayer = new pdfjsLib.TextLayer({\n textContentSource: sanitizedTextContent,\n container: container,\n viewport: viewport\n });\n await textLayer.render();\n } catch (e) {\n if (!isCancelled) {\n console.error(\"TextLayer render failed:\", e);\n }\n }\n };\n renderText();\n return () => {\n isCancelled = true;\n };\n }, [textContent, pdfDoc, pageNum, rotation, redactions]);\n\n // Load Native PDF Link Annotations\n const [nativeLinks, setNativeLinks] = useState<Array<{ id: string; rect: number[]; url: string }>>([]);\n useEffect(() => {\n let isCancelled = false;\n const fetchNativeLinks = async () => {\n try {\n const page = await pdfDoc.getPage(pageNum);\n const annotations = await page.getAnnotations({ intent: 'display' });\n if (isCancelled) return;\n const links: Array<{ id: string; rect: number[]; url: string }> = [];\n for (let i = 0; i < annotations.length; i++) {\n const a = annotations[i];\n if (a.subtype === 'Link' && Array.isArray(a.rect) && a.rect.length === 4) {\n let targetUrl = a.url;\n if (!targetUrl && a.dest) {\n targetUrl = typeof a.dest === 'string' ? `#${a.dest}` : Array.isArray(a.dest) && typeof a.dest[0] === 'number' ? `#page=${a.dest[0] + 1}` : undefined;\n }\n if (targetUrl) {\n links.push({\n id: a.id || `native-link-${pageNum}-${i}`,\n rect: a.rect,\n url: targetUrl\n });\n }\n }\n }\n if (!isCancelled) setNativeLinks(links);\n } catch {\n // Ignore native annotation retrieval failures\n }\n };\n fetchNativeLinks();\n return () => {\n isCancelled = true;\n };\n }, [pdfDoc, pageNum]);\n\n const pageAnnotations = annotations.filter(a => a.pageIndex === pageNum);\n const isOverlayVisible = !hideAnnotationsUntilPageRendered || isCanvasRendered;\n\n return (\n <div \n id={`pdf-page-${pageNum}`}\n className=\"pdf-page-container\"\n onClick={() => { if (activeTool === null || activeTool === 'select') onClearSelection(); }}\n style={{\n position: 'absolute',\n top: `${pageTop}px`,\n left: pageLeft !== undefined ? `${pageLeft}px` : '0px',\n width: `${scaledWidth}px`,\n height: `${scaledHeight}px`,\n backgroundColor: '#fff',\n boxShadow: '0 2px 10px rgba(0,0,0,0.1)',\n marginBottom: '16px'\n }}\n >\n <canvas ref={canvasRef} style={{ position: 'absolute', width: '100%', height: '100%', left: 0, top: 0 }} />\n \n <div \n ref={textLayerRef}\n className=\"textLayer\"\n style={{\n position: 'absolute',\n top: 0, left: 0,\n transform: `scale(${scale})`,\n transformOrigin: 'top left',\n pointerEvents: (isOverlayVisible && activeTool !== 'pan') ? 'auto' : 'none',\n opacity: isOverlayVisible ? 1 : 0,\n visibility: isOverlayVisible ? 'visible' : 'hidden',\n width: `${basePageWidth}px`,\n height: `${basePageHeight}px`,\n zIndex: 2\n }}\n />\n\n {/* Transient Citation / Search Highlights Layer */}\n {((activeSearchResult && activeSearchResult.pageIndex === pageNum) || (transientHighlights && transientHighlights.length > 0)) && (() => {\n const unW = rotation % 180 === 0 ? basePageWidth : basePageHeight;\n const unH = rotation % 180 === 0 ? basePageHeight : basePageWidth;\n\n return (\n <div style={{\n position: 'absolute', top: 0, left: 0, width: '100%', height: '100%',\n pointerEvents: 'none', zIndex: 6,\n visibility: isOverlayVisible ? 'visible' : 'hidden',\n opacity: isOverlayVisible ? 1 : 0\n }}>\n <style>{`\n @keyframes tspdf-transient-pulse {\n 0% {\n box-shadow: 0 0 0 0 rgba(234, 179, 8, 0.75), 0 0 8px rgba(234, 179, 8, 0.4);\n }\n 50% {\n box-shadow: 0 0 0 6px rgba(234, 179, 8, 0.25), 0 0 18px rgba(234, 179, 8, 0.7);\n }\n 100% {\n box-shadow: 0 0 0 0 rgba(234, 179, 8, 0.75), 0 0 8px rgba(234, 179, 8, 0.4);\n }\n }\n `}</style>\n {/* Active search result */}\n {activeSearchResult && activeSearchResult.pageIndex === pageNum && activeSearchResult.bounds.map((b, idx) => {\n const rot = convertToRotatedRect(b.x, unH - b.y - b.height, b.width, b.height, rotation, unW, unH);\n return (\n <div key={`search-${idx}`} style={{\n position: 'absolute',\n left: `${rot.x * scale}px`,\n top: `${rot.y * scale}px`,\n width: `${rot.width * scale}px`,\n height: `${rot.height * scale}px`,\n backgroundColor: 'rgba(255, 255, 0, 0.4)',\n border: '1px solid rgba(255, 255, 0, 0.8)',\n borderRadius: '2px',\n boxShadow: '0 0 4px rgba(255, 255, 0, 0.5)'\n }} />\n );\n })}\n\n {/* Transient Highlights (Citations, external highlights) */}\n {transientHighlights && transientHighlights.filter(th => th.pageIndex === pageNum).map((th, thIdx) => (\n <React.Fragment key={th.id || `th-${thIdx}`}>\n {th.bounds.map((b, bIdx) => {\n const rot = convertToRotatedRect(b.x, unH - b.y - b.height, b.width, b.height, rotation, unW, unH);\n const bg = th.color || 'rgba(250, 204, 21, 0.45)';\n const border = th.borderColor || 'rgba(234, 179, 8, 0.85)';\n return (\n <div\n key={`th-box-${bIdx}`}\n style={{\n position: 'absolute',\n left: `${rot.x * scale}px`,\n top: `${rot.y * scale}px`,\n width: `${rot.width * scale}px`,\n height: `${rot.height * scale}px`,\n backgroundColor: bg,\n border: `1.5px solid ${border}`,\n borderRadius: '3px',\n animation: th.pulse !== false ? 'tspdf-transient-pulse 2s infinite ease-in-out' : 'none',\n boxShadow: '0 0 6px rgba(234, 179, 8, 0.4)',\n zIndex: 7\n }}\n >\n {th.tooltip && bIdx === 0 && (\n <div style={{\n position: 'absolute',\n bottom: '100%',\n left: '50%',\n transform: 'translateX(-50%)',\n marginBottom: '4px',\n backgroundColor: '#0f172a',\n color: '#ffffff',\n fontSize: '11px',\n fontWeight: 600,\n padding: '3px 8px',\n borderRadius: '4px',\n whiteSpace: 'nowrap',\n boxShadow: '0 2px 8px rgba(0,0,0,0.25)',\n zIndex: 10,\n pointerEvents: 'none'\n }}>\n {th.tooltip.length > 60 ? `${th.tooltip.slice(0, 60)}...` : th.tooltip}\n </div>\n )}\n </div>\n );\n })}\n </React.Fragment>\n ))}\n </div>\n );\n })()}\n \n {/* SVG Annotation Overlay */}\n {(() => {\n const unW = rotation % 180 === 0 ? basePageWidth : basePageHeight;\n const unH = rotation % 180 === 0 ? basePageHeight : basePageWidth;\n const rotTransform = getRotationTransform(rotation, unW, unH);\n return (\n <svg \n style={{ \n position: 'absolute', top: 0, left: 0, width: '100%', height: '100%', \n cursor: ['Annotate', 'Shapes'].includes(activeTab) && activeTool ? (activeTool === 'eraser' ? 'cell' : 'crosshair') : 'default', \n pointerEvents: (activeTool === null || activeTool === 'pan' || activeTool === 'select' || !isOverlayVisible) ? 'none' : 'auto',\n zIndex: 10,\n visibility: isOverlayVisible ? 'visible' : 'hidden',\n opacity: isOverlayVisible ? 1 : 0\n }}\n viewBox={`0 0 ${basePageWidth} ${basePageHeight}`}\n onMouseDown={(e) => onMouseDown(e, pageNum)}\n onMouseMove={(e) => onMouseMove(e, pageNum)}\n onMouseUp={(e) => onMouseUp(e, pageNum)}\n onMouseLeave={(e) => onMouseUp(e, pageNum)}\n >\n <g transform={rotTransform}>\n {/* Native PDF links */}\n {nativeLinks.map((nl) => {\n const x = nl.rect[0];\n const y = basePageHeight - nl.rect[3];\n const w = Math.max(0, nl.rect[2] - nl.rect[0]);\n const h = Math.max(0, nl.rect[3] - nl.rect[1]);\n return (\n <rect\n key={nl.id}\n x={x}\n y={y}\n width={w}\n height={h}\n fill=\"transparent\"\n style={{ pointerEvents: 'all', cursor: 'pointer' }}\n onClick={(e) => {\n if (activeTab === 'View') {\n e.stopPropagation();\n onLinkClick?.(nl.url, undefined, e);\n }\n }}\n >\n <title>{nl.url}</title>\n </rect>\n );\n })}\n <React.Fragment>\n {pageAnnotations.map(ann => {\n const fillColor = (ann.type === 'text' || ann.type === 'callout') ? 'transparent' : `${ann.color}${Math.floor(ann.opacity * 255).toString(16).padStart(2, '0')}`;\n const strokeColor = ann.color;\n const isSelected = selectedAnnotationId === ann.id;\n const blendMode = (ann.type === 'highlight' || ann.opacity < 1) && !['text', 'note', 'callout', 'signature'].includes(ann.type) ? 'multiply' : 'normal';\n\n const interactionProps = {\n onMouseEnter: () => onAnnotationMouseEnter(ann.id),\n onClick: (e: React.MouseEvent) => {\n onAnnotationClick(ann.id, e);\n },\n onDoubleClick: (e: React.MouseEvent) => {\n onAnnotationDoubleClick?.(ann.id, e);\n },\n onMouseDown: (e: React.MouseEvent) => {\n if (isSelected && onStartMove) {\n e.stopPropagation();\n onStartMove(ann.id, e, pageNum);\n }\n },\n style: { \n pointerEvents: 'all' as any,\n cursor: activeTool === 'eraser' ? 'pointer' : (isSelected ? 'move' : 'pointer')\n }\n };\n\n let shape = null;\n\n if (ann.type === 'rectangle') {\n shape = <rect x={ann.x} y={ann.y} width={ann.width} height={ann.height} fill={fillColor} stroke={strokeColor} strokeWidth={ann.strokeWidth} style={{ mixBlendMode: blendMode }} />;\n } else if (ann.type === 'text' && ann.text) {\n const boxW = ann.width && ann.width > 0 ? ann.width : 180;\n const boxH = ann.height && ann.height > 0 ? ann.height : 40;\n shape = (\n <g>\n <rect x={ann.x} y={ann.y} width={boxW} height={boxH} fill=\"transparent\" style={{ pointerEvents: 'all' }} />\n <foreignObject x={ann.x} y={ann.y} width={boxW} height={boxH} style={{ overflow: 'visible', pointerEvents: 'none' }}>\n <div\n style={{\n width: `${boxW}px`,\n minHeight: `${boxH}px`,\n wordBreak: 'break-word',\n overflowWrap: 'break-word',\n whiteSpace: 'pre-wrap',\n color: strokeColor,\n fontSize: '16px',\n fontFamily: 'sans-serif',\n lineHeight: '1.25',\n userSelect: 'none',\n boxSizing: 'border-box',\n padding: '2px 4px'\n }}\n >\n {ann.text}\n </div>\n </foreignObject>\n </g>\n );\n } else if (ann.type === 'ellipse') {\n shape = <ellipse cx={ann.x + ann.width/2} cy={ann.y + ann.height/2} rx={ann.width/2} ry={ann.height/2} fill={fillColor} stroke={strokeColor} strokeWidth={ann.strokeWidth} style={{ mixBlendMode: blendMode }} />;\n } else if (ann.type === 'line' && ann.points) {\n shape = (\n <g style={{ mixBlendMode: blendMode }}>\n <line x1={ann.points[0].x} y1={ann.points[0].y} x2={ann.points[1].x} y2={ann.points[1].y} stroke=\"transparent\" strokeWidth={Math.max(10, ann.strokeWidth * 3)} />\n <line x1={ann.points[0].x} y1={ann.points[0].y} x2={ann.points[1].x} y2={ann.points[1].y} stroke={strokeColor} strokeWidth={ann.strokeWidth} />\n </g>\n );\n } else if (ann.type === 'arrow' && ann.points) {\n const [p1, p2] = ann.points;\n const angle = Math.atan2(p2.y - p1.y, p2.x - p1.x);\n const headLen = 15 + ann.strokeWidth;\n const h1 = { x: p2.x - headLen * Math.cos(angle - Math.PI / 6), y: p2.y - headLen * Math.sin(angle - Math.PI / 6) };\n const h2 = { x: p2.x - headLen * Math.cos(angle + Math.PI / 6), y: p2.y - headLen * Math.sin(angle + Math.PI / 6) };\n shape = (\n <g style={{ mixBlendMode: blendMode }}>\n <line x1={p1.x} y1={p1.y} x2={p2.x} y2={p2.y} stroke=\"transparent\" strokeWidth={Math.max(10, ann.strokeWidth * 3)} />\n <line x1={p1.x} y1={p1.y} x2={p2.x} y2={p2.y} stroke={strokeColor} strokeWidth={ann.strokeWidth} />\n <path d={`M ${h1.x} ${h1.y} L ${p2.x} ${p2.y} L ${h2.x} ${h2.y}`} fill=\"none\" stroke={strokeColor} strokeWidth={ann.strokeWidth} strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </g>\n );\n } else if (ann.type === 'highlight' && ann.width !== undefined && ann.height !== undefined) {\n const hlRects = ann.rects && ann.rects.length > 0 ? ann.rects : [{ x: ann.x, y: ann.y, width: ann.width, height: ann.height }];\n shape = (\n <g style={{ mixBlendMode: 'multiply' }}>\n {hlRects.map((r, i) => (\n <rect key={i} x={r.x} y={r.y} width={r.width} height={r.height} fill={strokeColor} opacity={ann.opacity} />\n ))}\n </g>\n );\n } else if (ann.type === 'underline') {\n const ulRects = ann.rects && ann.rects.length > 0 ? ann.rects : [{ x: ann.x, y: ann.y, width: ann.width, height: ann.height }];\n const th = ann.strokeWidth || 2;\n shape = (\n <g>\n {ulRects.map((r, i) => (\n <React.Fragment key={i}>\n <rect x={r.x} y={r.y} width={r.width} height={r.height} fill=\"transparent\" />\n <line\n x1={r.x}\n y1={r.y + r.height - th / 2}\n x2={r.x + r.width}\n y2={r.y + r.height - th / 2}\n stroke={strokeColor}\n strokeWidth={th}\n strokeLinecap=\"round\"\n />\n </React.Fragment>\n ))}\n </g>\n );\n } else if (ann.type === 'strikeout') {\n const soRects = ann.rects && ann.rects.length > 0 ? ann.rects : [{ x: ann.x, y: ann.y, width: ann.width, height: ann.height }];\n const th = ann.strokeWidth || 2;\n shape = (\n <g>\n {soRects.map((r, i) => (\n <React.Fragment key={i}>\n <rect x={r.x} y={r.y} width={r.width} height={r.height} fill=\"transparent\" />\n <line\n x1={r.x}\n y1={r.y + r.height / 2}\n x2={r.x + r.width}\n y2={r.y + r.height / 2}\n stroke={strokeColor}\n strokeWidth={th}\n strokeLinecap=\"round\"\n />\n </React.Fragment>\n ))}\n </g>\n );\n } else if (ann.type === 'squiggly') {\n const sqRects = ann.rects && ann.rects.length > 0 ? ann.rects : [{ x: ann.x, y: ann.y, width: ann.width, height: ann.height }];\n const th = ann.strokeWidth || 1.5;\n const generateSquigglyD = (x: number, y: number, width: number) => {\n let d = `M ${x} ${y}`;\n const step = 4;\n let up = true;\n for (let cx = x; cx < x + width; cx += step) {\n const nextX = Math.min(cx + step, x + width);\n const midX = cx + (nextX - cx) / 2;\n const dy = up ? -2.5 : 2.5;\n d += ` Q ${midX} ${y + dy}, ${nextX} ${y}`;\n up = !up;\n }\n return d;\n };\n shape = (\n <g>\n {sqRects.map((r, i) => (\n <React.Fragment key={i}>\n <rect x={r.x} y={r.y} width={r.width} height={r.height} fill=\"transparent\" />\n <path\n d={generateSquigglyD(r.x, r.y + r.height - 2, r.width)}\n fill=\"none\"\n stroke={strokeColor}\n strokeWidth={th}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </React.Fragment>\n ))}\n </g>\n );\n } else if (ann.type === 'opaque') {\n // Imported annotation this viewer cannot edit/render natively: outline + kind label.\n shape = (\n <g>\n <rect x={ann.x} y={ann.y} width={ann.width} height={ann.height} fill=\"none\" stroke={strokeColor} strokeWidth=\"1\" strokeDasharray=\"3,2\" opacity={0.8} />\n {ann.opaqueKind && ann.width > 40 && (\n <text x={ann.x + 2} y={ann.y - 2} fill={strokeColor} fontSize=\"8px\" fontFamily=\"sans-serif\" opacity={0.8}>{ann.opaqueKind}</text>\n )}\n </g>\n );\n } else if (ann.type === 'link' && ann.width !== undefined && ann.height !== undefined) {\n if (ann.text) {\n const linkColor = ann.color && ann.color !== 'transparent' ? strokeColor : '#007bff';\n shape = (\n <text x={ann.x} y={ann.y + 16} fill={linkColor} fontSize=\"16px\" fontFamily=\"sans-serif\" textDecoration=\"underline\" style={{ cursor: 'pointer' }}>\n {ann.text}\n </text>\n );\n } else {\n const borderColor = ann.color && ann.color !== 'transparent' ? strokeColor : '#007bff';\n shape = <rect x={ann.x} y={ann.y} width={ann.width} height={ann.height} fill=\"transparent\" stroke={isSelected ? borderColor : `${borderColor}80`} strokeWidth={isSelected ? \"2\" : \"1\"} strokeDasharray={isSelected ? \"none\" : \"4\"} />;\n }\n } else if (ann.type === 'freehand' && (ann.strokes?.length || ann.points)) {\n const strokes = ann.strokes && ann.strokes.length > 0 ? ann.strokes : [ann.points ?? []];\n shape = (\n <g style={{ mixBlendMode: blendMode }}>\n {strokes.filter(st => st.length > 0).map((st, i) => {\n const d = `M ${st.map(p => `${p.x},${p.y}`).join(' L ')}`;\n return (\n <React.Fragment key={i}>\n <path d={d} fill=\"none\" stroke=\"transparent\" strokeWidth={Math.max(10, ann.strokeWidth * 3)} strokeLinejoin=\"round\" strokeLinecap=\"round\" />\n <path d={d} fill=\"none\" stroke={strokeColor} strokeWidth={ann.strokeWidth} strokeLinejoin=\"round\" strokeLinecap=\"round\" />\n </React.Fragment>\n );\n })}\n </g>\n );\n } else if (ann.type === 'note') {\n shape = (\n <g transform={`translate(${ann.x}, ${ann.y})`}>\n <rect width=\"24\" height=\"24\" rx=\"4\" fill={fillColor} stroke={strokeColor} strokeWidth={ann.strokeWidth} />\n <path d=\"M6 12h12M6 8h12M6 16h8\" stroke=\"#fff\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </g>\n );\n } else if (ann.type === 'callout' && ann.points) {\n shape = (\n <g>\n <line x1={ann.points[0].x} y1={ann.points[0].y} x2={ann.points[1].x} y2={ann.points[1].y} stroke={strokeColor} strokeWidth={ann.strokeWidth} strokeDasharray=\"4\" />\n <rect x={ann.points[1].x} y={ann.points[1].y} width={ann.text ? ann.text.length * 8 + 20 : 100} height=\"24\" fill=\"#fff\" stroke={strokeColor} strokeWidth={ann.strokeWidth} />\n <text x={ann.points[1].x + 10} y={ann.points[1].y + 16} fill={strokeColor} fontSize=\"14px\" fontFamily=\"sans-serif\">{ann.text}</text>\n </g>\n );\n } else if (ann.type === 'signature' && ann.imageUrl) {\n const dateStr = ann.timestamp ? new Date(ann.timestamp).toLocaleDateString('en-GB', { day: 'numeric', month: 'short', year: 'numeric' }) : '';\n const signerText = ann.signer ? `Digitally signed by ${ann.signer} · ${dateStr}` : '';\n \n shape = (\n <g>\n <image href={ann.imageUrl} x={ann.x} y={ann.y} width={ann.width} height={ann.height} preserveAspectRatio=\"xMidYMid meet\" />\n {signerText && (\n <text \n x={(ann.x || 0) + (ann.width || 200) / 2} \n y={(ann.y || 0) + (ann.height || 60) + 16} \n fill=\"#666\" \n fontSize=\"11px\" \n fontFamily=\"sans-serif\" \n textAnchor=\"middle\"\n >\n {signerText}\n </text>\n )}\n </g>\n );\n } else if (ann.type === 'digital_signature_placeholder') {\n const dateStr = ann.timestamp ? new Date(ann.timestamp).toLocaleString('en-GB') : '';\n const ax = ann.x || 0;\n const ay = ann.y || 0;\n const aw = ann.width || 350;\n const ah = ann.height || 70;\n const iconW = aw * 0.15;\n \n shape = (\n <g>\n <rect x={ax} y={ay} width={aw} height={ah} fill=\"rgba(255, 255, 255, 0.9)\" stroke=\"#94a3b8\" strokeWidth=\"1\" />\n <line x1={ax + iconW} y1={ay} x2={ax + iconW} y2={ay + ah} stroke=\"#e2e8f0\" strokeWidth=\"1\" />\n \n {/* Shield Icon Approximation */}\n <g transform={`translate(${ax + iconW/2 - 12}, ${ay + ah/2 - 14})`}>\n <path d=\"M22 6 L22 14 Q22 20 12 24 Q2 20 2 14 L2 6 L12 2 Z\" fill=\"none\" stroke=\"#0284c7\" strokeWidth=\"2\" strokeLinejoin=\"round\" />\n <path d=\"M7 13 L10 16 L17 8\" fill=\"none\" stroke=\"#0284c7\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </g>\n \n <text x={ax + iconW + 10} y={ay + 25} fill=\"#0f172a\" fontSize=\"11.5px\" fontWeight=\"bold\" fontFamily=\"sans-serif\">\n Digitally signed by {ann.signer || 'sanjiv@costacloud.com'}\n </text>\n <text x={ax + iconW + 10} y={ay + 42} fill=\"#334155\" fontSize=\"10px\" fontFamily=\"sans-serif\">\n Date: {dateStr}\n </text>\n <text x={ax + iconW + 10} y={ay + 57} fill=\"#334155\" fontSize=\"10px\" fontFamily=\"sans-serif\">\n Reason: Document Approval\n </text>\n </g>\n );\n }\n\n return (\n <g key={ann.id} {...interactionProps}>\n {shape}\n {isSelected && (() => {\n const w = ann.width && ann.width > 0 ? ann.width : 32;\n const h = ann.height && ann.height > 0 ? ann.height : 32;\n const isResizable = ['text', 'rectangle', 'ellipse', 'highlight', 'underline', 'strikeout', 'squiggly'].includes(ann.type);\n const handleCoords: Record<string, { x: number; y: number; cursor: string }> = {\n nw: { x: ann.x, y: ann.y, cursor: 'nwse-resize' },\n n: { x: ann.x + w / 2, y: ann.y, cursor: 'ns-resize' },\n ne: { x: ann.x + w, y: ann.y, cursor: 'nesw-resize' },\n e: { x: ann.x + w, y: ann.y + h / 2, cursor: 'ew-resize' },\n se: { x: ann.x + w, y: ann.y + h, cursor: 'nwse-resize' },\n s: { x: ann.x + w / 2, y: ann.y + h, cursor: 'ns-resize' },\n sw: { x: ann.x, y: ann.y + h, cursor: 'nesw-resize' },\n w: { x: ann.x, y: ann.y + h / 2, cursor: 'ew-resize' },\n };\n\n return (\n <g className=\"tspdf-annotation-selection\">\n <rect \n x={ann.x - 4} y={ann.y - 4} \n width={w + 8} \n height={h + 8} \n fill=\"none\" stroke=\"var(--primary)\" strokeWidth=\"1.5\" strokeDasharray=\"4\" \n style={{ pointerEvents: 'none' }}\n />\n {!ann.readOnly && isResizable && onStartResize && Object.entries(handleCoords).map(([handleKey, hInfo]) => (\n <rect\n key={handleKey}\n x={hInfo.x - 4}\n y={hInfo.y - 4}\n width={8}\n height={8}\n fill=\"#ffffff\"\n stroke=\"var(--primary)\"\n strokeWidth=\"1.5\"\n rx={1}\n style={{ cursor: hInfo.cursor, pointerEvents: 'all' }}\n onMouseDown={(e) => {\n e.stopPropagation();\n onStartResize(ann.id, handleKey, e, pageNum);\n }}\n />\n ))}\n </g>\n );\n })()}\n </g>\n );\n })}\n\n {redactions && redactions.filter(r => r.pageIndex === pageNum && r.status === 'pending').map((r, idx) => (\n <g \n key={r.id || `pending-${idx}`} \n style={{ cursor: 'pointer' }}\n onClick={(e) => {\n e.stopPropagation();\n onDiscardRedaction?.(r);\n }}\n >\n <title>Click to discard this redaction</title>\n <rect \n x={r.x} \n y={r.y} \n width={r.width} \n height={r.height} \n fill=\"rgba(0, 0, 0, 0.45)\" \n stroke=\"#dc2626\" \n strokeWidth={2} \n strokeDasharray=\"4\"\n />\n <text \n x={r.x + 4} \n y={r.y + Math.min(r.height - 2, 14)} \n fill=\"#ef4444\" \n fontSize=\"10px\" \n fontWeight=\"bold\"\n letterSpacing=\"0.5px\"\n >\n PENDING REDACTION\n </text>\n {/* Top-right Discard X Badge */}\n {r.width > 24 && r.height > 16 && (\n <g transform={`translate(${r.x + r.width - 18}, ${r.y + 2})`}>\n <rect width=\"16\" height=\"16\" rx=\"4\" fill=\"#dc2626\" />\n <path d=\"M4.5 4.5 L11.5 11.5 M11.5 4.5 L4.5 11.5\" stroke=\"#ffffff\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </g>\n )}\n </g>\n ))}\n </React.Fragment>\n </g>\n </svg>\n );\n })()}\n </div>\n );\n}\n\nconst PageRenderer = React.memo(PageRendererComponent, (prevProps, nextProps) => {\n return prevProps.pageNum === nextProps.pageNum &&\n prevProps.pdfDoc === nextProps.pdfDoc &&\n prevProps.scale === nextProps.scale &&\n prevProps.rotation === nextProps.rotation &&\n prevProps.basePageWidth === nextProps.basePageWidth &&\n prevProps.basePageHeight === nextProps.basePageHeight &&\n prevProps.pageTop === nextProps.pageTop &&\n prevProps.pageLeft === nextProps.pageLeft &&\n prevProps.activeTab === nextProps.activeTab &&\n prevProps.activeTool === nextProps.activeTool &&\n prevProps.selectedAnnotationId === nextProps.selectedAnnotationId &&\n prevProps.activeSearchResult === nextProps.activeSearchResult &&\n prevProps.watermark === nextProps.watermark &&\n prevProps.watermarkText === nextProps.watermarkText &&\n prevProps.redactions === nextProps.redactions &&\n prevProps.annotations === nextProps.annotations &&\n prevProps.transientHighlights === nextProps.transientHighlights &&\n prevProps.hideAnnotationsUntilPageRendered === nextProps.hideAnnotationsUntilPageRendered;\n});\n\nexport default PageRenderer;\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * Stable, collision-free annotation ids. They double as the XFDF `name` attribute, which hosts use\n * to match persisted rows to live annotations, so they must never be timestamps.\n */\nexport function newAnnotationId(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n // Fallback for very old runtimes: 128 bits from Math.random, formatted like a UUID v4.\n const hex = Array.from({ length: 32 }, () => Math.floor(Math.random() * 16).toString(16)).join('');\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-4${hex.slice(13, 16)}-a${hex.slice(17, 20)}-${hex.slice(20, 32)}`;\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * Cross-environment clipboard utility with secure and fallback execCommand copying.\n */\n\nexport async function copyTextToClipboard(text: string): Promise<boolean> {\n if (!text) return false;\n\n // Modern asynchronous Clipboard API (supported in secure HTTPS / localhost contexts)\n if (typeof navigator !== 'undefined' && navigator.clipboard && typeof navigator.clipboard.writeText === 'function') {\n try {\n await navigator.clipboard.writeText(text);\n return true;\n } catch {\n // Fallback below if permission was denied or running in an iframe / non-secure context\n }\n }\n\n // Fallback using textarea + document.execCommand('copy')\n if (typeof document !== 'undefined') {\n try {\n const textArea = document.createElement('textarea');\n textArea.value = text;\n textArea.setAttribute('readonly', '');\n textArea.style.contain = 'strict';\n textArea.style.position = 'fixed';\n textArea.style.left = '-9999px';\n textArea.style.top = '-9999px';\n textArea.style.opacity = '0';\n document.body.appendChild(textArea);\n textArea.select();\n textArea.setSelectionRange(0, text.length);\n const successful = document.execCommand('copy');\n document.body.removeChild(textArea);\n return successful;\n } catch (err) {\n console.error('Failed to copy text to clipboard fallback:', err);\n return false;\n }\n }\n\n return false;\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * Floating quick-action copy pill rendered directly above active text selections.\n */\nimport React, { useEffect, useState, useCallback, useRef } from 'react';\nimport { Copy, Check, Highlighter, Underline, Strikethrough } from 'lucide-react';\nimport { copyTextToClipboard } from '../utils/clipboardUtils';\n\ninterface TextSelectionTooltipProps {\n containerRef: React.RefObject<HTMLDivElement | null>;\n onCopy?: (text: string) => void;\n onAnnotateSelection?: (type: 'highlight' | 'underline' | 'strikeout' | 'squiggly') => void;\n}\n\nexport const TextSelectionTooltip: React.FC<TextSelectionTooltipProps> = ({ containerRef, onCopy, onAnnotateSelection }) => {\n const [selectedText, setSelectedText] = useState<string>('');\n const [position, setPosition] = useState<{ top: number; left: number } | null>(null);\n const [copied, setCopied] = useState<boolean>(false);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const updatePosition = useCallback(() => {\n if (typeof window === 'undefined') return;\n const selection = window.getSelection();\n\n if (!selection || selection.isCollapsed || !selection.rangeCount || !containerRef.current) {\n setPosition(null);\n setSelectedText('');\n return;\n }\n\n const range = selection.getRangeAt(0);\n const commonAncestor = range.commonAncestorContainer;\n\n // Verify the selection is inside our viewer container\n if (!containerRef.current.contains(commonAncestor)) {\n setPosition(null);\n setSelectedText('');\n return;\n }\n\n const text = selection.toString().trim();\n if (!text) {\n setPosition(null);\n setSelectedText('');\n return;\n }\n\n const rangeRect = range.getBoundingClientRect();\n if (rangeRect.width === 0 && rangeRect.height === 0) {\n setPosition(null);\n setSelectedText('');\n return;\n }\n\n const containerRect = containerRef.current.getBoundingClientRect();\n const centerX = rangeRect.left + rangeRect.width / 2;\n const relLeft = centerX - containerRect.left + containerRef.current.scrollLeft;\n \n // Position 38px above selection by default; flip below if too close to container top\n let relTop = rangeRect.top - containerRect.top + containerRef.current.scrollTop - 38;\n if (relTop < containerRef.current.scrollTop + 8) {\n relTop = rangeRect.bottom - containerRect.top + containerRef.current.scrollTop + 8;\n }\n\n setSelectedText(text);\n setPosition({ top: relTop, left: relLeft });\n }, [containerRef]);\n\n useEffect(() => {\n const handleSelectionChange = () => {\n // Debounce slightly to let mouse-up complete selection bounding box\n requestAnimationFrame(updatePosition);\n };\n\n document.addEventListener('selectionchange', handleSelectionChange);\n const container = containerRef.current;\n if (container) {\n container.addEventListener('scroll', updatePosition, { passive: true });\n }\n\n return () => {\n document.removeEventListener('selectionchange', handleSelectionChange);\n if (container) {\n container.removeEventListener('scroll', updatePosition);\n }\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, [containerRef, updatePosition]);\n\n const handleCopy = async (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n if (!selectedText) return;\n\n const success = await copyTextToClipboard(selectedText);\n if (success) {\n setCopied(true);\n onCopy?.(selectedText);\n\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n timeoutRef.current = setTimeout(() => {\n setCopied(false);\n }, 1500);\n }\n };\n\n if (!position || !selectedText) {\n return null;\n }\n\n return (\n <div\n role=\"toolbar\"\n aria-label=\"Selection actions\"\n style={{\n position: 'absolute',\n top: `${position.top}px`,\n left: `${position.left}px`,\n transform: 'translateX(-50%)',\n zIndex: 50,\n display: 'flex',\n alignItems: 'center',\n backgroundColor: '#0f172a',\n borderRadius: '6px',\n padding: '3px 6px',\n boxShadow: '0 4px 14px rgba(0, 0, 0, 0.25), 0 0 0 1px rgba(255, 255, 255, 0.1)',\n pointerEvents: 'auto',\n userSelect: 'none',\n whiteSpace: 'nowrap',\n animation: 'tspdf-fade-in 0.15s ease-out'\n }}\n onMouseDown={(e) => {\n // Prevent clicking the tooltip from clearing the active DOM text selection\n e.preventDefault();\n e.stopPropagation();\n }}\n >\n <style>{`\n @keyframes tspdf-fade-in {\n from { opacity: 0; transform: translate(-50%, 4px); }\n to { opacity: 1; transform: translate(-50%, 0); }\n }\n `}</style>\n <button\n onClick={handleCopy}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '5px',\n background: 'transparent',\n border: 'none',\n color: copied ? '#4ade80' : '#f8fafc',\n cursor: 'pointer',\n fontSize: '12px',\n fontWeight: 500,\n padding: '3px 6px',\n borderRadius: '4px',\n transition: 'background-color 0.15s, color 0.15s'\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = 'rgba(255, 255, 255, 0.12)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n }}\n title=\"Copy selected text\"\n >\n {copied ? <Check size={13} color=\"#4ade80\" /> : <Copy size={13} color=\"#f8fafc\" />}\n <span>{copied ? 'Copied!' : 'Copy'}</span>\n </button>\n\n {onAnnotateSelection && (\n <>\n <div style={{ width: '1px', height: '16px', backgroundColor: 'rgba(255, 255, 255, 0.2)', margin: '0 4px' }} />\n <button\n onClick={(e) => { e.preventDefault(); e.stopPropagation(); onAnnotateSelection('highlight'); }}\n style={{\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n width: '24px', height: '24px', background: 'transparent', border: 'none',\n borderRadius: '4px', cursor: 'pointer', padding: 0\n }}\n onMouseEnter={(e) => { e.currentTarget.style.backgroundColor = 'rgba(255, 255, 255, 0.12)'; }}\n onMouseLeave={(e) => { e.currentTarget.style.backgroundColor = 'transparent'; }}\n title=\"Highlight selected text\"\n >\n <Highlighter size={13} color=\"#fbc02d\" />\n </button>\n <button\n onClick={(e) => { e.preventDefault(); e.stopPropagation(); onAnnotateSelection('underline'); }}\n style={{\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n width: '24px', height: '24px', background: 'transparent', border: 'none',\n borderRadius: '4px', cursor: 'pointer', padding: 0\n }}\n onMouseEnter={(e) => { e.currentTarget.style.backgroundColor = 'rgba(255, 255, 255, 0.12)'; }}\n onMouseLeave={(e) => { e.currentTarget.style.backgroundColor = 'transparent'; }}\n title=\"Underline selected text\"\n >\n <Underline size={13} color=\"#f8fafc\" />\n </button>\n <button\n onClick={(e) => { e.preventDefault(); e.stopPropagation(); onAnnotateSelection('strikeout'); }}\n style={{\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n width: '24px', height: '24px', background: 'transparent', border: 'none',\n borderRadius: '4px', cursor: 'pointer', padding: 0\n }}\n onMouseEnter={(e) => { e.currentTarget.style.backgroundColor = 'rgba(255, 255, 255, 0.12)'; }}\n onMouseLeave={(e) => { e.currentTarget.style.backgroundColor = 'transparent'; }}\n title=\"Strikeout selected text\"\n >\n <Strikethrough size={13} color=\"#f8fafc\" />\n </button>\n <button\n onClick={(e) => { e.preventDefault(); e.stopPropagation(); onAnnotateSelection('squiggly'); }}\n style={{\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n width: '24px', height: '24px', background: 'transparent', border: 'none',\n borderRadius: '4px', cursor: 'pointer', padding: 0\n }}\n onMouseEnter={(e) => { e.currentTarget.style.backgroundColor = 'rgba(255, 255, 255, 0.12)'; }}\n onMouseLeave={(e) => { e.currentTarget.style.backgroundColor = 'transparent'; }}\n title=\"Squiggly underline selected text\"\n >\n <svg width={13} height={13} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#4ade80\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M4 18c1.5-2 2.5-2 4 0s2.5 2 4 0 2.5-2 4 0 2.5 2 4 0\" />\n </svg>\n </button>\n </>\n )}\n </div>\n );\n};\nexport default TextSelectionTooltip;\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\nimport * as pdfjsLib from 'pdfjs-dist';\nimport type { Redaction } from '../core/types';\nimport { buildPageText } from './pageText';\n\nexport async function findRegexRedactions(\n pdfDoc: pdfjsLib.PDFDocumentProxy,\n regexes: RegExp[]\n): Promise<Redaction[]> {\n const redactions: Redaction[] = [];\n if (!pdfDoc || !regexes || regexes.length === 0) return redactions;\n\n const numPages = pdfDoc.numPages;\n // Pre-compile global regex instances once outside the page loop\n const globalRegexes = regexes.map(r => new RegExp(r, r.flags.includes('g') ? r.flags : r.flags + 'g'));\n\n for (let pageNum = 1; pageNum <= numPages; pageNum++) {\n try {\n const page = await pdfDoc.getPage(pageNum);\n const viewport = page.getViewport({ scale: 1 });\n const textContent = await page.getTextContent();\n const items = textContent.items as any[];\n \n const { fullText, itemIndices, charIndices } = buildPageText(items);\n\n // Find matches for each pre-compiled regex\n for (const globalRegex of globalRegexes) {\n globalRegex.lastIndex = 0; // Reset state for global regex reuse\n const matches = [...fullText.matchAll(globalRegex)];\n\n for (const match of matches) {\n if (match.index === undefined) continue;\n \n const matchStart = match.index;\n const matchLength = match[0].length;\n \n // Track involved TextItems\n const itemMatches = new Map<number, { min: number; max: number }>();\n for (let i = matchStart; i < matchStart + matchLength; i++) {\n const itemIdx = itemIndices[i];\n const charIdx = charIndices[i];\n if (itemIdx !== undefined && itemIdx !== -1) {\n const existing = itemMatches.get(itemIdx);\n if (existing) {\n existing.min = Math.min(existing.min, charIdx);\n existing.max = Math.max(existing.max, charIdx);\n } else {\n itemMatches.set(itemIdx, { min: charIdx, max: charIdx });\n }\n }\n }\n \n // Calculate bounding boxes for each involved item\n itemMatches.forEach((matchInfo, itemIndex) => {\n const item = items[itemIndex];\n if (!item || !item.transform) return;\n \n // TextItem transforms: [scaleX, skewY, skewX, scaleY, tx, ty]\n // PDF origin is bottom-left\n const tx = item.transform[4];\n const ty = item.transform[5];\n const scaleY = Math.abs(item.transform[3]);\n \n const strLen = (item.str ?? '').length;\n const charWidth = strLen > 0 ? item.width / strLen : item.width;\n \n const startX = tx + (matchInfo.min * charWidth);\n const matchWidth = ((matchInfo.max - matchInfo.min) + 1) * charWidth;\n const matchHeight = item.height || scaleY;\n \n const padding = 2;\n const topY = viewport.height - ty - matchHeight;\n \n redactions.push({\n id: `regex-${pageNum}-${Math.random().toString(36).substr(2, 9)}`,\n pageIndex: pageNum,\n x: startX - padding,\n y: topY - padding,\n width: matchWidth + (padding * 2),\n height: matchHeight + (padding * 2),\n status: 'pending'\n });\n });\n }\n }\n \n // Memory Management: Clear parsed text structures for this page to prevent >1GB OOM crashes\n page.cleanup();\n \n // Thread Management: Yield to the main thread every 10 pages so the UI doesn't freeze\n if (pageNum % 10 === 0) {\n await new Promise(resolve => setTimeout(resolve, 0));\n }\n } catch (e) {\n console.error(`Failed to process page ${pageNum} for regex redaction`, e);\n }\n }\n\n return redactions;\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\n\nexport interface PageDimension {\n width: number;\n height: number;\n}\n\nexport interface RowLayout {\n heights: number[];\n tops: number[];\n total: number;\n}\n\n/** Standard US Letter dimensions in PDF points (72 points/inch: 8.5 x 11 inches). */\nexport const DEFAULT_FALLBACK_DIMS: PageDimension = { width: 612, height: 792 };\n\n/**\n * Pre-allocates an array of page dimensions for the entire document up front,\n * reserving estimated space based on a sample page (e.g. Page 1).\n */\nexport function estimatePageDimensions(\n numPages: number,\n sampleDim: PageDimension = DEFAULT_FALLBACK_DIMS\n): PageDimension[] {\n if (numPages <= 0) return [];\n const dim = { width: sampleDim.width, height: sampleDim.height };\n return Array.from({ length: numPages }, () => ({ ...dim }));\n}\n\n/**\n * Computes row heights, vertical tops, and total container scroll height\n * for given rows of pages and scale.\n */\nexport function computeRowLayout(\n rows: number[][],\n dimsFor: (page: number) => PageDimension,\n scale: number,\n gap = 16\n): RowLayout {\n const heights = rows.map((row) => {\n if (row.length === 0) return gap;\n const maxHeight = Math.max(...row.map((p) => dimsFor(p).height));\n return maxHeight * scale + gap;\n });\n\n const tops: number[] = [];\n let acc = 0;\n for (const h of heights) {\n tops.push(acc);\n acc += h;\n }\n\n return { heights, tops, total: acc };\n}\n\n/**\n * Checks if any page dimension in array A differs from array B beyond a tolerance.\n */\nexport function hasDimensionMismatch(\n dimsA: PageDimension[],\n dimsB: PageDimension[],\n tolerance = 0.5\n): boolean {\n if (dimsA.length !== dimsB.length) return true;\n for (let i = 0; i < dimsA.length; i++) {\n const a = dimsA[i];\n const b = dimsB[i];\n if (\n Math.abs(a.width - b.width) > tolerance ||\n Math.abs(a.height - b.height) > tolerance\n ) {\n return true;\n }\n }\n return false;\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * pdf.js asset configuration.\n *\n * The library never bundles or inlines the pdf.js worker (that produced a 5 MB bundle with a\n * `data:` URL worker, which strict Content-Security-Policies reject). Hosts serve the worker,\n * CMaps, standard fonts and wasm decoders from their own origin and tell us where they live.\n *\n * Next.js example (copy from node_modules/pdfjs-dist into public/pdfjs/):\n * configurePdfAssets({\n * workerSrc: '/pdfjs/pdf.worker.min.mjs',\n * cMapUrl: '/pdfjs/cmaps/',\n * standardFontDataUrl: '/pdfjs/standard_fonts/',\n * wasmUrl: '/pdfjs/wasm/',\n * });\n *\n * Vite example:\n * import workerSrc from 'pdfjs-dist/build/pdf.worker.min.mjs?url';\n * configurePdfAssets({ workerSrc });\n */\nimport * as pdfjsLib from 'pdfjs-dist';\nimport type { DocumentInitParameters } from 'pdfjs-dist/types/src/display/api';\n\nexport interface PdfAssetPaths {\n /** URL of `pdf.worker.min.mjs` matching the installed pdfjs-dist version. REQUIRED. */\n workerSrc?: string;\n /** Directory URL (trailing slash) of the packed CMaps — needed for CJK/Indic text. */\n cMapUrl?: string;\n /** Directory URL (trailing slash) of the standard 14 font substitutes. */\n standardFontDataUrl?: string;\n /** Directory URL (trailing slash) of the wasm decoders (JPX/OpenJPEG, qcms). */\n wasmUrl?: string;\n /** Directory URL (trailing slash) of ICC profiles. */\n iccUrl?: string;\n}\n\nlet configured: PdfAssetPaths = {};\n\nexport function configurePdfAssets(paths: PdfAssetPaths): void {\n configured = { ...configured, ...paths };\n if (paths.workerSrc) {\n pdfjsLib.GlobalWorkerOptions.workerSrc = paths.workerSrc;\n }\n}\n\nexport function getPdfAssetPaths(): Readonly<PdfAssetPaths> {\n return configured;\n}\n\n/** True once a worker URL has been configured (either via configurePdfAssets or directly on pdf.js). */\nexport function isWorkerConfigured(): boolean {\n return Boolean(configured.workerSrc || pdfjsLib.GlobalWorkerOptions.workerSrc);\n}\n\n/**\n * Throws a descriptive error when the worker has not been configured. Called lazily right before\n * the first `getDocument()` — never at module scope, so importing the package is side-effect free\n * and safe under SSR.\n */\nexport function assertWorkerConfigured(): void {\n if (isWorkerConfigured()) return;\n throw new Error(\n '[teamsync-pdf-viewer] pdf.js worker not configured. Call configurePdfAssets({ workerSrc }) ' +\n 'with the URL of pdf.worker.min.mjs (same pdfjs-dist version) before loading a document, or ' +\n 'pass `assets={{ workerSrc }}` to <TeamSyncViewer>.'\n );\n}\n\n/** Extra `getDocument()` parameters derived from the configured asset paths. */\nexport function getDocumentParams(): Partial<DocumentInitParameters> {\n const params: Partial<DocumentInitParameters> = {};\n if (configured.cMapUrl) {\n params.cMapUrl = configured.cMapUrl;\n params.cMapPacked = true;\n }\n if (configured.standardFontDataUrl) params.standardFontDataUrl = configured.standardFontDataUrl;\n if (configured.wasmUrl) params.wasmUrl = configured.wasmUrl;\n if (configured.iccUrl) params.iccUrl = configured.iccUrl;\n return params;\n}\n\n/** pdfjs-dist version this build was compiled against (useful for worker-version mismatch checks). */\nexport const pdfjsVersion: string = pdfjsLib.version;\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\n\nimport React, { useState } from 'react';\nimport type { DiffBoundingBox } from '../types/compare';\n\ninterface DiffHighlightOverlayProps {\n boxes: DiffBoundingBox[];\n scale: number;\n colorScheme?: 'deletions' | 'additions' | 'all';\n selectedDiffId?: string | null;\n onSelectDiff?: (id: string) => void;\n}\n\nexport default function DiffHighlightOverlay({\n boxes,\n scale,\n colorScheme = 'all',\n selectedDiffId,\n onSelectDiff\n}: DiffHighlightOverlayProps) {\n const [hoveredId, setHoveredId] = useState<string | null>(null);\n\n if (!boxes || boxes.length === 0) return null;\n\n const filteredBoxes = boxes.filter(b => {\n if (colorScheme === 'deletions') return b.type === 'deletion' || b.type === 'modification';\n if (colorScheme === 'additions') return b.type === 'addition' || b.type === 'modification';\n return true;\n });\n\n return (\n <div\n className=\"tspdf-diff-highlight-overlay\"\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n pointerEvents: 'none',\n zIndex: 15\n }}\n >\n <style>{`\n @keyframes tspdf-diff-pulse {\n 0% {\n box-shadow: 0 0 0 0 rgba(2, 132, 199, 0.8), 0 0 12px rgba(2, 132, 199, 0.5);\n }\n 50% {\n box-shadow: 0 0 0 6px rgba(2, 132, 199, 0.35), 0 0 24px rgba(2, 132, 199, 0.8);\n }\n 100% {\n box-shadow: 0 0 0 0 rgba(2, 132, 199, 0.8), 0 0 12px rgba(2, 132, 199, 0.5);\n }\n }\n `}</style>\n {filteredBoxes.map((box) => {\n const isSelected = selectedDiffId === box.id;\n const isHovered = hoveredId === box.id;\n\n let bg = 'rgba(245, 158, 11, 0.22)';\n let border = '1.5px solid #f59e0b';\n let labelColor = '#d97706';\n let labelPrefix = 'Changed';\n\n if (box.type === 'deletion') {\n bg = isSelected ? 'rgba(225, 29, 72, 0.35)' : 'rgba(225, 29, 72, 0.22)';\n border = isSelected ? '2px solid #e11d48' : '1.5px solid #e11d48';\n labelColor = '#e11d48';\n labelPrefix = 'Removed';\n } else if (box.type === 'addition') {\n bg = isSelected ? 'rgba(16, 185, 129, 0.35)' : 'rgba(16, 185, 129, 0.22)';\n border = isSelected ? '2px solid #10b981' : '1.5px solid #10b981';\n labelColor = '#059669';\n labelPrefix = 'Added';\n }\n\n const x = box.x * scale;\n const y = box.y * scale;\n const w = box.width * scale;\n const h = box.height * scale;\n\n return (\n <div\n key={box.id}\n id={`diff-highlight-${box.id}`}\n onClick={(e) => {\n e.stopPropagation();\n onSelectDiff?.(box.id);\n }}\n onMouseEnter={() => setHoveredId(box.id)}\n onMouseLeave={() => setHoveredId(null)}\n style={{\n position: 'absolute',\n left: `${x}px`,\n top: `${y}px`,\n width: `${w}px`,\n height: `${h}px`,\n backgroundColor: bg,\n border: border,\n borderRadius: '4px',\n cursor: 'pointer',\n pointerEvents: 'auto',\n animation: isSelected ? 'tspdf-diff-pulse 1.8s infinite ease-in-out' : 'none',\n boxShadow: isSelected\n ? '0 0 0 3px #0284c7, 0 4px 16px rgba(2, 132, 199, 0.5)'\n : isHovered\n ? '0 0 0 2px rgba(0,0,0,0.25)'\n : 'none',\n transition: 'all 0.15s ease-in-out',\n zIndex: isSelected ? 30 : isHovered ? 25 : 15\n }}\n title={`${labelPrefix}: ${box.text}`}\n >\n {(isHovered || isSelected) && (\n <div\n style={{\n position: 'absolute',\n bottom: '100%',\n left: '50%',\n transform: 'translateX(-50%)',\n marginBottom: '6px',\n backgroundColor: '#0f172a',\n color: '#ffffff',\n fontSize: '11px',\n fontWeight: 600,\n padding: '4px 10px',\n borderRadius: '6px',\n whiteSpace: 'nowrap',\n boxShadow: '0 4px 14px rgba(0,0,0,0.3)',\n zIndex: 40,\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n pointerEvents: 'none'\n }}\n >\n <span style={{ color: labelColor, fontWeight: 700, textTransform: 'uppercase', fontSize: '10px' }}>\n {labelPrefix}\n </span>\n <span style={{ maxWidth: '220px', overflow: 'hidden', textOverflow: 'ellipsis' }}>\n \"{box.text}\"\n </span>\n <div style={{\n position: 'absolute',\n top: '100%',\n left: '50%',\n transform: 'translateX(-50%)',\n width: 0,\n height: 0,\n borderLeft: '5px solid transparent',\n borderRight: '5px solid transparent',\n borderTop: '5px solid #0f172a'\n }} />\n </div>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\n\nimport React, { useRef, useEffect, useState } from 'react';\nimport * as pdfjsLib from 'pdfjs-dist';\nimport PageRenderer from './PageRenderer';\nimport DiffHighlightOverlay from './DiffHighlightOverlay';\nimport type { SDKPermissions, WatermarkOptions, Redaction } from '../core/types';\nimport type { DiffBoundingBox } from '../types/compare';\n\ninterface SideBySideViewerProps {\n pdfDocA: pdfjsLib.PDFDocumentProxy | null;\n pdfDocB: pdfjsLib.PDFDocumentProxy | null;\n pageNum: number;\n scale: number;\n rotation: number;\n basePageDims: { width: number; height: number };\n activeTab: string;\n activeTool: string | null;\n annotations: any[];\n permissions?: SDKPermissions;\n watermark?: WatermarkOptions;\n watermarkText?: string;\n redactions?: Redaction[];\n diffsA?: DiffBoundingBox[];\n diffsB?: DiffBoundingBox[];\n selectedDiffId?: string | null;\n onSelectDiff?: (id: string) => void;\n onScrollSync?: (scrollTop: number, scrollLeft: number) => void;\n hideAnnotationsUntilPageRendered?: boolean;\n}\n\nexport default function SideBySideViewer({\n pdfDocA,\n pdfDocB,\n pageNum,\n scale,\n rotation,\n basePageDims,\n activeTab,\n activeTool,\n annotations,\n watermark,\n watermarkText,\n redactions,\n diffsA = [],\n diffsB = [],\n selectedDiffId,\n onSelectDiff,\n hideAnnotationsUntilPageRendered = true\n}: SideBySideViewerProps) {\n const containerARef = useRef<HTMLDivElement>(null);\n const containerBRef = useRef<HTMLDivElement>(null);\n const isSyncingRef = useRef(false);\n\n // Synchronize scrolling between Panel A and Panel B\n useEffect(() => {\n const elA = containerARef.current;\n const elB = containerBRef.current;\n if (!elA || !elB) return;\n\n const syncAtoB = () => {\n if (isSyncingRef.current) return;\n isSyncingRef.current = true;\n elB.scrollTop = elA.scrollTop;\n elB.scrollLeft = elA.scrollLeft;\n setTimeout(() => { isSyncingRef.current = false; }, 10);\n };\n\n const syncBtoA = () => {\n if (isSyncingRef.current) return;\n isSyncingRef.current = true;\n elA.scrollTop = elB.scrollTop;\n elA.scrollLeft = elB.scrollLeft;\n setTimeout(() => { isSyncingRef.current = false; }, 10);\n };\n\n elA.addEventListener('scroll', syncAtoB);\n elB.addEventListener('scroll', syncBtoA);\n\n return () => {\n elA.removeEventListener('scroll', syncAtoB);\n elB.removeEventListener('scroll', syncBtoA);\n };\n }, []);\n\n // Smooth scroll to selected diff box\n useEffect(() => {\n if (!selectedDiffId) return;\n const allDiffs = [...(diffsA || []), ...(diffsB || [])];\n const targetBox = allDiffs.find(d => d.id === selectedDiffId);\n if (targetBox && containerARef.current) {\n const viewH = containerARef.current.clientHeight || 600;\n const targetY = targetBox.y * scale;\n const scrollToY = Math.max(0, targetY - viewH / 3);\n containerARef.current.scrollTo({\n top: scrollToY,\n behavior: 'smooth'\n });\n }\n }, [selectedDiffId, diffsA, diffsB, scale]);\n\n const [dimsA, setDimsA] = useState<{ width: number; height: number }>(basePageDims);\n const [dimsB, setDimsB] = useState<{ width: number; height: number }>(basePageDims);\n\n useEffect(() => {\n if (pdfDocA) {\n pdfDocA.getPage(pageNum).then(page => {\n const vp = page.getViewport({ scale: 1, rotation: (page.rotate + rotation) % 360 });\n setDimsA({ width: vp.width, height: vp.height });\n }).catch(() => {});\n }\n }, [pdfDocA, pageNum, rotation]);\n\n useEffect(() => {\n if (pdfDocB) {\n pdfDocB.getPage(pageNum).then(page => {\n const vp = page.getViewport({ scale: 1, rotation: (page.rotate + rotation) % 360 });\n setDimsB({ width: vp.width, height: vp.height });\n }).catch(() => {});\n }\n }, [pdfDocB, pageNum, rotation]);\n\n const scaledWidthA = (dimsA.width || 600) * scale;\n const scaledHeightA = (dimsA.height || 800) * scale;\n\n const scaledWidthB = (dimsB.width || 600) * scale;\n const scaledHeightB = (dimsB.height || 800) * scale;\n\n return (\n <div style={{ flex: 1, display: 'flex', minHeight: 0, width: '100%', height: '100%', overflow: 'hidden' }}>\n {/* Panel A - Document A (Base) */}\n <div\n ref={containerARef}\n style={{\n flex: 1,\n height: '100%',\n overflow: 'auto',\n backgroundColor: '#f1f5f9',\n borderRight: '2px solid #cbd5e1',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n padding: '16px'\n }}\n >\n <div style={{\n marginBottom: '8px', padding: '4px 12px', borderRadius: '4px',\n backgroundColor: '#e11d48', color: '#ffffff', fontSize: '11px', fontWeight: 600\n }}>\n Document A (Base) - Page {pageNum}\n </div>\n <div style={{ position: 'relative', width: `${scaledWidthA}px`, height: `${scaledHeightA}px`, boxShadow: '0 4px 12px rgba(0,0,0,0.15)' }}>\n {pdfDocA && (\n <PageRenderer\n pageNum={pageNum}\n pdfDoc={pdfDocA}\n scale={scale}\n rotation={rotation}\n scrollTop={0}\n scrollLeft={0}\n pageTop={0}\n basePageWidth={dimsA.width}\n basePageHeight={dimsA.height}\n containerWidth={scaledWidthA}\n containerHeight={scaledHeightA}\n activeTab={activeTab}\n activeTool={activeTool}\n annotations={annotations}\n selectedAnnotationId={null}\n activeSearchResult={null}\n onMouseDown={() => {}}\n onMouseMove={() => {}}\n onMouseUp={() => {}}\n onAnnotationMouseEnter={() => {}}\n onAnnotationClick={() => {}}\n onClearSelection={() => {}}\n watermark={watermark}\n watermarkText={watermarkText}\n redactions={redactions}\n hideAnnotationsUntilPageRendered={hideAnnotationsUntilPageRendered}\n />\n )}\n <DiffHighlightOverlay\n boxes={diffsA}\n scale={scale}\n colorScheme=\"deletions\"\n selectedDiffId={selectedDiffId}\n onSelectDiff={onSelectDiff}\n />\n </div>\n </div>\n\n {/* Panel B - Document B (Comparison) */}\n <div\n ref={containerBRef}\n style={{\n flex: 1,\n height: '100%',\n overflow: 'auto',\n backgroundColor: '#f1f5f9',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n padding: '16px'\n }}\n >\n <div style={{\n marginBottom: '8px', padding: '4px 12px', borderRadius: '4px',\n backgroundColor: '#0284c7', color: '#ffffff', fontSize: '11px', fontWeight: 600\n }}>\n Document B (Comparison) - Page {pageNum}\n </div>\n <div style={{ position: 'relative', width: `${scaledWidthB}px`, height: `${scaledHeightB}px`, boxShadow: '0 4px 12px rgba(0,0,0,0.15)' }}>\n {pdfDocB && (\n <PageRenderer\n pageNum={pageNum}\n pdfDoc={pdfDocB}\n scale={scale}\n rotation={rotation}\n scrollTop={0}\n scrollLeft={0}\n pageTop={0}\n basePageWidth={dimsB.width}\n basePageHeight={dimsB.height}\n containerWidth={scaledWidthB}\n containerHeight={scaledHeightB}\n activeTab={activeTab}\n activeTool={activeTool}\n annotations={annotations}\n selectedAnnotationId={null}\n activeSearchResult={null}\n onMouseDown={() => {}}\n onMouseMove={() => {}}\n onMouseUp={() => {}}\n onAnnotationMouseEnter={() => {}}\n onAnnotationClick={() => {}}\n onClearSelection={() => {}}\n watermark={watermark}\n watermarkText={watermarkText}\n redactions={redactions}\n hideAnnotationsUntilPageRendered={hideAnnotationsUntilPageRendered}\n />\n )}\n <DiffHighlightOverlay\n boxes={diffsB}\n scale={scale}\n colorScheme=\"additions\"\n selectedDiffId={selectedDiffId}\n onSelectDiff={onSelectDiff}\n />\n </div>\n </div>\n </div>\n );\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\n\nimport React from 'react';\nimport { Layers, Columns, FileText, SlidersHorizontal, ChevronLeft, ChevronRight, X } from 'lucide-react';\nimport type { CompareMode, CompareState } from '../types/compare';\n\ninterface CompareToolbarProps {\n compareState: CompareState;\n onSetMode: (mode: CompareMode) => void;\n onSetColors: (colorA: string, colorB: string) => void;\n onToggleCurtain: () => void;\n onPrevDiff: () => void;\n onNextDiff: () => void;\n onExit: () => void;\n}\n\nexport default function CompareToolbar({\n compareState,\n onSetMode,\n onSetColors,\n onToggleCurtain,\n onPrevDiff,\n onNextDiff,\n onExit\n}: CompareToolbarProps) {\n const { mode, colorA, colorB, showCurtain, diffItems, currentDiffIndex } = compareState;\n\n return (\n <div style={{\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n padding: '6px 16px',\n backgroundColor: '#1e293b',\n color: '#f8fafc',\n borderBottom: '1px solid #334155',\n height: '42px',\n fontSize: '13px',\n zIndex: 100\n }}>\n {/* Compare Status Badge */}\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px', fontWeight: 600, color: '#38bdf8' }}>\n <Layers size={16} />\n <span>Document Compare</span>\n </div>\n\n <div style={{ width: '1px', height: '20px', backgroundColor: '#475569' }} />\n\n {/* Mode Switcher */}\n <div style={{ display: 'flex', backgroundColor: '#0f172a', borderRadius: '6px', padding: '2px' }}>\n <button\n onClick={() => onSetMode('overlay')}\n style={{\n display: 'flex', alignItems: 'center', gap: '6px',\n padding: '4px 10px', borderRadius: '4px', border: 'none',\n backgroundColor: mode === 'overlay' ? '#0284c7' : 'transparent',\n color: mode === 'overlay' ? '#ffffff' : '#94a3b8',\n cursor: 'pointer', fontSize: '12px', fontWeight: 500\n }}\n title=\"Overlay Color Blend Diff\"\n >\n <Layers size={14} />\n <span>Overlay Diff</span>\n </button>\n\n <button\n onClick={() => onSetMode('side-by-side')}\n style={{\n display: 'flex', alignItems: 'center', gap: '6px',\n padding: '4px 10px', borderRadius: '4px', border: 'none',\n backgroundColor: mode === 'side-by-side' ? '#0284c7' : 'transparent',\n color: mode === 'side-by-side' ? '#ffffff' : '#94a3b8',\n cursor: 'pointer', fontSize: '12px', fontWeight: 500\n }}\n title=\"Side-by-Side Synchronized MultiViewer\"\n >\n <Columns size={14} />\n <span>Side-by-Side</span>\n </button>\n\n <button\n onClick={() => onSetMode('semantic')}\n style={{\n display: 'flex', alignItems: 'center', gap: '6px',\n padding: '4px 10px', borderRadius: '4px', border: 'none',\n backgroundColor: mode === 'semantic' ? '#0284c7' : 'transparent',\n color: mode === 'semantic' ? '#ffffff' : '#94a3b8',\n cursor: 'pointer', fontSize: '12px', fontWeight: 500\n }}\n title=\"Semantic Text & Structured Diff\"\n >\n <FileText size={14} />\n <span>Text Diff</span>\n </button>\n </div>\n\n {/* Mode Specific Controls */}\n {mode === 'overlay' && (\n <>\n <div style={{ width: '1px', height: '20px', backgroundColor: '#475569' }} />\n \n {/* Color Tint Selectors */}\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '4px' }}>\n <span style={{ fontSize: '11px', color: '#94a3b8' }}>Doc A:</span>\n <input\n type=\"color\"\n value={colorA}\n onChange={(e) => onSetColors(e.target.value, colorB)}\n style={{ width: '22px', height: '22px', border: 'none', borderRadius: '4px', cursor: 'pointer', backgroundColor: 'transparent' }}\n title=\"Document A Tint Color (Deletions)\"\n />\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: '4px' }}>\n <span style={{ fontSize: '11px', color: '#94a3b8' }}>Doc B:</span>\n <input\n type=\"color\"\n value={colorB}\n onChange={(e) => onSetColors(colorA, e.target.value)}\n style={{ width: '22px', height: '22px', border: 'none', borderRadius: '4px', cursor: 'pointer', backgroundColor: 'transparent' }}\n title=\"Document B Tint Color (Additions)\"\n />\n </div>\n </div>\n\n <button\n onClick={onToggleCurtain}\n style={{\n display: 'flex', alignItems: 'center', gap: '4px',\n padding: '4px 8px', borderRadius: '4px', border: '1px solid #475569',\n backgroundColor: showCurtain ? '#0369a1' : 'transparent',\n color: '#f8fafc', cursor: 'pointer', fontSize: '12px'\n }}\n title=\"Toggle Wipe Curtain Slider\"\n >\n <SlidersHorizontal size={14} />\n <span>Curtain Slider</span>\n </button>\n </>\n )}\n\n {/* Diff Navigation Counter */}\n {diffItems.length > 0 && (\n <>\n <div style={{ width: '1px', height: '20px', backgroundColor: '#475569' }} />\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px' }}>\n <button\n onClick={onPrevDiff}\n style={{ padding: '2px 6px', borderRadius: '4px', border: 'none', backgroundColor: '#334155', color: '#f8fafc', cursor: 'pointer' }}\n title=\"Previous Difference\"\n >\n <ChevronLeft size={14} />\n </button>\n <span style={{ fontSize: '12px', color: '#cbd5e1', minWidth: '70px', textAlign: 'center' }}>\n {currentDiffIndex + 1} of {diffItems.length} diffs\n </span>\n <button\n onClick={onNextDiff}\n style={{ padding: '2px 6px', borderRadius: '4px', border: 'none', backgroundColor: '#334155', color: '#f8fafc', cursor: 'pointer' }}\n title=\"Next Difference\"\n >\n <ChevronRight size={14} />\n </button>\n </div>\n </>\n )}\n\n <div style={{ flex: 1 }} />\n\n {/* Exit Compare Button */}\n <button\n onClick={onExit}\n style={{\n display: 'flex', alignItems: 'center', gap: '4px',\n padding: '4px 10px', borderRadius: '4px', border: 'none',\n backgroundColor: '#dc2626', color: '#ffffff',\n cursor: 'pointer', fontSize: '12px', fontWeight: 600\n }}\n title=\"Exit Compare Mode\"\n >\n <X size={14} />\n <span>Exit Compare</span>\n </button>\n </div>\n );\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\n\nimport React from 'react';\nimport { Layers, FileText, CheckCircle2, MinusCircle, PlusCircle, AlertCircle } from 'lucide-react';\nimport type { DiffItem, TextDiffSegment } from '../types/compare';\n\ninterface DiffSummarySidebarProps {\n isOpen: boolean;\n onClose: () => void;\n diffItems: DiffItem[];\n textDiffs: TextDiffSegment[];\n currentDiffIndex: number;\n onSelectDiff: (index: number, item?: DiffItem) => void;\n onJumpToPage: (pageIndex: number) => void;\n}\n\nexport default function DiffSummarySidebar({\n isOpen,\n diffItems,\n textDiffs,\n currentDiffIndex,\n onSelectDiff,\n onJumpToPage\n}: DiffSummarySidebarProps) {\n if (!isOpen) return null;\n\n return (\n <div style={{\n width: '320px',\n height: '100%',\n backgroundColor: '#ffffff',\n borderLeft: '1px solid #e2e8f0',\n display: 'flex',\n flexDirection: 'column',\n flexShrink: 0,\n zIndex: 80\n }}>\n {/* Header */}\n <div style={{\n padding: '12px 16px',\n borderBottom: '1px solid #e2e8f0',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n backgroundColor: '#f8fafc'\n }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px', fontWeight: 600, fontSize: '14px', color: '#0f172a' }}>\n <Layers size={18} color=\"#0284c7\" />\n <span>Compare Summary</span>\n </div>\n <span style={{\n fontSize: '11px', padding: '2px 8px', borderRadius: '12px',\n backgroundColor: '#0284c7', color: '#ffffff', fontWeight: 600\n }}>\n {diffItems.length} Differences\n </span>\n </div>\n\n {/* List Content */}\n <div style={{ flex: 1, overflowY: 'auto', padding: '12px' }}>\n {diffItems.length > 0 && (\n <div>\n <div style={{ fontSize: '12px', fontWeight: 600, color: '#64748b', marginBottom: '8px', display: 'flex', alignItems: 'center', gap: '4px' }}>\n <Layers size={14} />\n <span>Differences on Page ({diffItems.length})</span>\n </div>\n\n {diffItems.map((item, idx) => {\n const isSelected = idx === currentDiffIndex;\n const isDel = item.type === 'deletion';\n const isAdd = item.type === 'addition';\n\n let badgeColor = isDel ? '#e11d48' : isAdd ? '#10b981' : '#f59e0b';\n let badgeBg = isDel ? '#ffe4e6' : isAdd ? '#dcfce7' : '#fef3c7';\n let badgeLabel = isDel ? 'Removed' : isAdd ? 'Added' : 'Changed';\n\n return (\n <div\n key={item.id}\n onClick={() => {\n onSelectDiff(idx, item);\n if (item.pageIndex) onJumpToPage(item.pageIndex);\n }}\n style={{\n padding: '10px 12px',\n borderRadius: '6px',\n backgroundColor: isSelected ? '#f0f9ff' : '#ffffff',\n border: isSelected ? '2px solid #0284c7' : '1px solid #e2e8f0',\n borderLeft: isSelected ? '4px solid #0284c7' : `3px solid ${badgeColor}`,\n marginBottom: '8px',\n cursor: 'pointer',\n fontSize: '12px',\n boxShadow: isSelected ? '0 2px 8px rgba(2, 132, 199, 0.18)' : '0 1px 3px rgba(0,0,0,0.03)',\n transition: 'all 0.15s ease'\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', marginBottom: '4px' }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px' }}>\n {isDel && <MinusCircle size={13} color=\"#e11d48\" />}\n {isAdd && <PlusCircle size={13} color=\"#10b981\" />}\n {!isDel && !isAdd && <AlertCircle size={13} color=\"#f59e0b\" />}\n <span style={{\n fontSize: '10px',\n fontWeight: 700,\n textTransform: 'uppercase',\n padding: '1px 6px',\n borderRadius: '4px',\n backgroundColor: badgeBg,\n color: badgeColor\n }}>\n {badgeLabel}\n </span>\n </div>\n <span style={{ fontSize: '11px', color: '#64748b', fontWeight: 600 }}>\n Page {item.pageIndex}\n </span>\n </div>\n <div style={{\n fontSize: '12px',\n color: isSelected ? '#0369a1' : '#334155',\n fontWeight: isSelected ? 600 : 400,\n lineHeight: '1.4',\n wordBreak: 'break-word'\n }}>\n {item.description}\n </div>\n </div>\n );\n })}\n </div>\n )}\n\n {textDiffs.length > 0 && diffItems.length === 0 && (\n <div style={{ marginBottom: '16px' }}>\n <div style={{ fontSize: '12px', fontWeight: 600, color: '#64748b', marginBottom: '8px', display: 'flex', alignItems: 'center', gap: '4px' }}>\n <FileText size={14} />\n <span>Text Differences</span>\n </div>\n\n {textDiffs.filter(t => t.type !== 'equal').map((seg, i) => (\n <div\n key={`text-diff-${i}`}\n onClick={() => onJumpToPage(seg.pageIndex)}\n style={{\n padding: '8px 12px',\n borderRadius: '6px',\n backgroundColor: seg.type === 'add' ? '#f0fdf4' : '#fef2f2',\n border: `1px solid ${seg.type === 'add' ? '#bbf7d0' : '#fecaca'}`,\n marginBottom: '8px',\n cursor: 'pointer',\n fontSize: '12px',\n lineHeight: '1.4'\n }}\n >\n <div style={{ display: 'flex', justifyContent: 'space-between', marginBottom: '4px', fontSize: '10px', color: '#64748b', fontWeight: 600 }}>\n <span>Page {seg.pageIndex}</span>\n <span style={{ color: seg.type === 'add' ? '#16a34a' : '#dc2626', textTransform: 'uppercase' }}>\n {seg.type === 'add' ? '+ Addition' : '- Deletion'}\n </span>\n </div>\n <div style={{\n color: seg.type === 'add' ? '#15803d' : '#b91c1c',\n textDecoration: seg.type === 'delete' ? 'line-through' : 'none',\n fontFamily: 'monospace',\n wordBreak: 'break-word'\n }}>\n {seg.text.length > 120 ? `${seg.text.substring(0, 120)}...` : seg.text}\n </div>\n </div>\n ))}\n </div>\n )}\n\n {diffItems.length === 0 && textDiffs.filter(t => t.type !== 'equal').length === 0 && (\n <div style={{ padding: '32px 16px', textAlign: 'center', color: '#64748b' }}>\n <CheckCircle2 size={32} color=\"#16a34a\" style={{ margin: '0 auto 8px auto' }} />\n <div style={{ fontWeight: 600, fontSize: '14px', color: '#0f172a' }}>Documents Match</div>\n <div style={{ fontSize: '12px', marginTop: '4px' }}>No visual or structural differences detected between the two PDF documents.</div>\n </div>\n )}\n </div>\n </div>\n );\n}\n\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\n\nimport React, { useRef, useState, useEffect } from 'react';\nimport { GripVertical } from 'lucide-react';\n\ninterface CompareCurtainSliderProps {\n positionPercent: number; // 0 to 100\n onChangePosition: (pos: number) => void;\n containerRef: React.RefObject<HTMLDivElement | null>;\n}\n\nexport default function CompareCurtainSlider({\n positionPercent,\n onChangePosition,\n containerRef\n}: CompareCurtainSliderProps) {\n const [isDragging, setIsDragging] = useState(false);\n const sliderRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handleMouseMove = (e: MouseEvent) => {\n if (!isDragging || !containerRef.current) return;\n const rect = containerRef.current.getBoundingClientRect();\n const relativeX = e.clientX - rect.left;\n const newPercent = Math.max(0, Math.min(100, (relativeX / rect.width) * 100));\n onChangePosition(newPercent);\n };\n\n const handleMouseUp = () => {\n if (isDragging) {\n setIsDragging(false);\n }\n };\n\n if (isDragging) {\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n }\n\n return () => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n }, [isDragging, containerRef, onChangePosition]);\n\n return (\n <div\n ref={sliderRef}\n style={{\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: `${positionPercent}%`,\n width: '4px',\n backgroundColor: '#0284c7',\n boxShadow: '0 0 8px rgba(2, 132, 199, 0.8)',\n zIndex: 90,\n cursor: 'ew-resize',\n transform: 'translateX(-50%)'\n }}\n onMouseDown={(e) => {\n e.preventDefault();\n setIsDragging(true);\n }}\n >\n {/* Center Handle Badge */}\n <div style={{\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n width: '28px',\n height: '40px',\n backgroundColor: '#0284c7',\n color: '#ffffff',\n borderRadius: '6px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n boxShadow: '0 2px 8px rgba(0,0,0,0.3)',\n cursor: 'ew-resize'\n }}>\n <GripVertical size={16} />\n </div>\n </div>\n );\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\n\nimport type * as pdfjsLib from 'pdfjs-dist';\nimport type { TextDiffSegment, DiffItem, DiffBoundingBox } from '../types/compare';\n\nexport interface PageDiffResult {\n diffsA: DiffBoundingBox[];\n diffsB: DiffBoundingBox[];\n summary: DiffItem[];\n}\n\nexport interface WordToken {\n text: string;\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n/**\n * Extracts individual words with precise unscaled viewport bounding boxes from a PDF.js page.\n */\nexport async function extractWordsFromPage(page: pdfjsLib.PDFPageProxy): Promise<WordToken[]> {\n const vp = page.getViewport({ scale: 1, rotation: page.rotate });\n const textContent = await page.getTextContent();\n const wordTokens: WordToken[] = [];\n\n for (const item of textContent.items as any[]) {\n if (!item.str || typeof item.str !== 'string') continue;\n const str = item.str;\n if (str.trim().length === 0) continue;\n\n const tx = item.transform[4];\n const ty = item.transform[5];\n const itemWidth = item.width || 0;\n const fontSize = Math.sqrt((item.transform[0] || 0) ** 2 + (item.transform[1] || 0) ** 2) || 12;\n const itemHeight = item.height || fontSize;\n\n const [vx1, vy1] = vp.convertToViewportPoint(tx, ty + itemHeight);\n const [vx2, vy2] = vp.convertToViewportPoint(tx + itemWidth, ty);\n\n const itemX = Math.min(vx1, vx2);\n const itemY = Math.min(vy1, vy2);\n const itemW = Math.max(Math.abs(vx2 - vx1), 4);\n const itemH = Math.max(Math.abs(vy2 - vy1), 8);\n\n const parts = str.split(/(\\s+)/);\n let offset = 0;\n const totalChars = str.length || 1;\n\n for (const p of parts) {\n const charRatio = p.length / totalChars;\n const wWidth = itemW * charRatio;\n const wX = itemX + (offset / totalChars) * itemW;\n offset += p.length;\n\n if (p.trim().length > 0) {\n wordTokens.push({\n text: p.trim(),\n x: wX,\n y: itemY,\n width: Math.max(wWidth, 6),\n height: itemH\n });\n }\n }\n }\n\n return wordTokens;\n}\n\n/**\n * Computes exact text difference bounding boxes on a page for both Document A and Document B.\n */\nexport async function computePageDiffBoxes(\n pdfDocA: pdfjsLib.PDFDocumentProxy,\n pdfDocB: pdfjsLib.PDFDocumentProxy,\n pageIndex: number\n): Promise<PageDiffResult> {\n const [pageA, pageB] = await Promise.all([\n pdfDocA.getPage(pageIndex),\n pdfDocB.getPage(Math.min(pageIndex, pdfDocB.numPages))\n ]);\n\n const [wordsA, wordsB] = await Promise.all([\n extractWordsFromPage(pageA),\n extractWordsFromPage(pageB)\n ]);\n\n const textArrA = wordsA.map(w => w.text);\n const textArrB = wordsB.map(w => w.text);\n\n // Myers diff on word tokens\n const n = textArrA.length;\n const m = textArrB.length;\n const max = n + m;\n const v = new Int32Array(2 * max + 1);\n v[1] = 0;\n const trace: Int32Array[] = [];\n\n for (let d = 0; d <= max; d++) {\n trace.push(v.slice());\n for (let k = -d; k <= d; k += 2) {\n let x: number;\n if (k === -d || (k !== d && v[k - 1 + max] < v[k + 1 + max])) {\n x = v[k + 1 + max];\n } else {\n x = v[k - 1 + max] + 1;\n }\n let y = x - k;\n while (x < n && y < m && textArrA[x] === textArrB[y]) {\n x++;\n y++;\n }\n v[k + max] = x;\n if (x >= n && y >= m) {\n break;\n }\n }\n if (v[n - m + max] >= n && (v[n - m + max] - (n - m)) >= m) break;\n }\n\n // Backtrack\n let x = n;\n let y = m;\n const delIndicesA: number[] = [];\n const addIndicesB: number[] = [];\n\n for (let d = trace.length - 1; d >= 0; d--) {\n const vArr = trace[d];\n const k = x - y;\n let prevK: number;\n if (k === -d || (k !== d && vArr[k - 1 + max] < vArr[k + 1 + max])) {\n prevK = k + 1;\n } else {\n prevK = k - 1;\n }\n const prevX = vArr[prevK + max];\n const prevY = prevX - prevK;\n\n while (x > prevX && y > prevY) {\n x--;\n y--;\n }\n\n if (d > 0) {\n if (x === prevX) {\n addIndicesB.push(y - 1);\n y--;\n } else if (y === prevY) {\n delIndicesA.push(x - 1);\n x--;\n }\n }\n }\n\n delIndicesA.reverse();\n addIndicesB.reverse();\n\n const diffsA = groupWordsIntoBoxes(delIndicesA.map(i => wordsA[i]), pageIndex, 'deletion');\n const diffsB = groupWordsIntoBoxes(addIndicesB.map(i => wordsB[i]), pageIndex, 'addition');\n\n const summary: DiffItem[] = [];\n for (const d of diffsA) {\n summary.push({\n id: d.id,\n pageIndex,\n type: 'deletion',\n description: `Removed \"${d.text.length > 40 ? d.text.slice(0, 40) + '...' : d.text}\"`,\n x: d.x,\n y: d.y,\n width: d.width,\n height: d.height\n });\n }\n for (const a of diffsB) {\n summary.push({\n id: a.id,\n pageIndex,\n type: 'addition',\n description: `Added \"${a.text.length > 40 ? a.text.slice(0, 40) + '...' : a.text}\"`,\n x: a.x,\n y: a.y,\n width: a.width,\n height: a.height\n });\n }\n\n return { diffsA, diffsB, summary };\n}\n\nfunction groupWordsIntoBoxes(words: WordToken[], pageIndex: number, type: 'addition' | 'deletion' | 'modification'): DiffBoundingBox[] {\n if (words.length === 0) return [];\n const boxes: DiffBoundingBox[] = [];\n\n let currentWords: WordToken[] = [words[0]];\n\n for (let i = 1; i < words.length; i++) {\n const prev = currentWords[currentWords.length - 1];\n const curr = words[i];\n\n const sameLine = Math.abs(curr.y - prev.y) < Math.max(prev.height, curr.height) * 0.6;\n const nearby = curr.x - (prev.x + prev.width) < 30;\n\n if (sameLine && nearby) {\n currentWords.push(curr);\n } else {\n boxes.push(createBoxFromTokens(currentWords, pageIndex, type, boxes.length + 1));\n currentWords = [curr];\n }\n }\n\n if (currentWords.length > 0) {\n boxes.push(createBoxFromTokens(currentWords, pageIndex, type, boxes.length + 1));\n }\n\n return boxes;\n}\n\nfunction createBoxFromTokens(tokens: WordToken[], pageIndex: number, type: 'addition' | 'deletion' | 'modification', seq: number): DiffBoundingBox {\n const minX = Math.min(...tokens.map(t => t.x));\n const minY = Math.min(...tokens.map(t => t.y));\n const maxX = Math.max(...tokens.map(t => t.x + t.width));\n const maxY = Math.max(...tokens.map(t => t.y + t.height));\n const text = tokens.map(t => t.text).join(' ');\n\n return {\n id: `diff-box-${pageIndex}-${type}-${seq}-${Math.round(minX)}-${Math.round(minY)}`,\n pageIndex,\n type,\n text,\n x: Math.max(0, minX - 2),\n y: Math.max(0, minY - 1),\n width: maxX - minX + 4,\n height: maxY - minY + 2\n };\n}\n\n/**\n * Lightweight client-side Myers Diff algorithm for raw text comparison.\n */\nexport function computeTextDiff(textA: string, textB: string, pageIndex: number): TextDiffSegment[] {\n const wordsA = textA.split(/(\\s+)/);\n const wordsB = textB.split(/(\\s+)/);\n\n const n = wordsA.length;\n const m = wordsB.length;\n const max = n + m;\n const v = new Int32Array(2 * max + 1);\n v[1] = 0;\n\n const trace: Int32Array[] = [];\n\n for (let d = 0; d <= max; d++) {\n trace.push(v.slice());\n for (let k = -d; k <= d; k += 2) {\n let x: number;\n if (k === -d || (k !== d && v[k - 1 + max] < v[k + 1 + max])) {\n x = v[k + 1 + max];\n } else {\n x = v[k - 1 + max] + 1;\n }\n let y = x - k;\n while (x < n && y < m && wordsA[x] === wordsB[y]) {\n x++;\n y++;\n }\n v[k + max] = x;\n if (x >= n && y >= m) {\n return buildDiffResult(trace, wordsA, wordsB, pageIndex);\n }\n }\n }\n\n return [\n { type: 'delete', text: textA, pageIndex },\n { type: 'add', text: textB, pageIndex }\n ];\n}\n\nfunction buildDiffResult(trace: Int32Array[], wordsA: string[], wordsB: string[], pageIndex: number): TextDiffSegment[] {\n let x = wordsA.length;\n let y = wordsB.length;\n const max = wordsA.length + wordsB.length;\n const rawResult: { type: 'equal' | 'add' | 'delete'; text: string }[] = [];\n\n for (let d = trace.length - 1; d >= 0; d--) {\n const v = trace[d];\n const k = x - y;\n\n let prevK: number;\n if (k === -d || (k !== d && v[k - 1 + max] < v[k + 1 + max])) {\n prevK = k + 1;\n } else {\n prevK = k - 1;\n }\n\n const prevX = v[prevK + max];\n const prevY = prevX - prevK;\n\n while (x > prevX && y > prevY) {\n rawResult.push({ type: 'equal', text: wordsA[x - 1] });\n x--;\n y--;\n }\n\n if (d > 0) {\n if (x === prevX) {\n rawResult.push({ type: 'add', text: wordsB[y - 1] });\n y--;\n } else if (y === prevY) {\n rawResult.push({ type: 'delete', text: wordsA[x - 1] });\n x--;\n }\n }\n }\n\n rawResult.reverse();\n\n const consolidated: TextDiffSegment[] = [];\n for (const item of rawResult) {\n if (consolidated.length > 0 && consolidated[consolidated.length - 1].type === item.type) {\n consolidated[consolidated.length - 1].text += item.text;\n } else {\n consolidated.push({ ...item, pageIndex });\n }\n }\n\n return consolidated;\n}\n\n/**\n * Colorizes a rendered page canvas with a custom hex tint.\n */\nexport function tintCanvas(ctx: CanvasRenderingContext2D, width: number, height: number, colorHex: string, opacity: number = 0.75) {\n ctx.save();\n ctx.globalCompositeOperation = 'source-atop';\n ctx.fillStyle = colorHex;\n ctx.globalAlpha = opacity;\n ctx.fillRect(0, 0, width, height);\n ctx.restore();\n}\n\n/**\n * Computes pixel-level difference bounding boxes between two rendered page canvases.\n */\nexport function computeCanvasPixelDiff(\n canvasA: HTMLCanvasElement,\n canvasB: HTMLCanvasElement,\n pageIndex: number,\n scale: number\n): DiffItem[] {\n const width = Math.min(canvasA.width, canvasB.width);\n const height = Math.min(canvasA.height, canvasB.height);\n if (width === 0 || height === 0) return [];\n\n const ctxA = canvasA.getContext('2d');\n const ctxB = canvasB.getContext('2d');\n if (!ctxA || !ctxB) return [];\n\n const imgDataA = ctxA.getImageData(0, 0, width, height);\n const imgDataB = ctxB.getImageData(0, 0, width, height);\n const dataA = imgDataA.data;\n const dataB = imgDataB.data;\n\n const diffItems: DiffItem[] = [];\n const GRID_SIZE = 32;\n const threshold = 30;\n\n for (let gy = 0; gy < height; gy += GRID_SIZE) {\n for (let gx = 0; gx < width; gx += GRID_SIZE) {\n let diffPixels = 0;\n const cellW = Math.min(GRID_SIZE, width - gx);\n const cellH = Math.min(GRID_SIZE, height - gy);\n\n for (let y = gy; y < gy + cellH; y += 4) {\n for (let x = gx; x < gx + cellW; x += 4) {\n const idx = (y * width + x) * 4;\n const dr = Math.abs(dataA[idx] - dataB[idx]);\n const dg = Math.abs(dataA[idx + 1] - dataB[idx + 1]);\n const db = Math.abs(dataA[idx + 2] - dataB[idx + 2]);\n\n if (dr + dg + db > threshold) {\n diffPixels++;\n }\n }\n }\n\n if (diffPixels > 3) {\n diffItems.push({\n id: `diff-${pageIndex}-${gx}-${gy}`,\n pageIndex,\n type: 'modification',\n description: `Visual difference detected at Page ${pageIndex} (${Math.round(gx / scale)}px, ${Math.round(gy / scale)}px)`,\n x: gx / scale,\n y: gy / scale,\n width: cellW / scale,\n height: cellH / scale\n });\n }\n }\n }\n\n return diffItems;\n}\n\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\nimport React, { useEffect, useRef, useState, useCallback, useMemo, useSyncExternalStore } from 'react';\nimport * as pdfjsLib from 'pdfjs-dist';\nimport 'pdfjs-dist/web/pdf_viewer.css';\nimport { Pen, Type, Minus, Eraser, Square, Circle as CircleIcon, Highlighter, ChevronLeft, ChevronRight, Brush, MessageSquareQuote, ArrowUpRight, ShieldCheck, Link as LinkIcon, EyeOff, Trash2, Undo2, Redo2, Underline, Strikethrough } from 'lucide-react';\nimport AnnotationContextMenu from './AnnotationContextMenu';\nimport InsertLinkModal from './InsertLinkModal';\nimport { matchShortcut, useShortcuts } from '../hooks/useShortcuts';\nimport Sidebar from './Sidebar';\nimport LeftSidebar from './LeftSidebar';\nimport { usePdfSearch, type SearchResult } from '../hooks/usePdfSearch';\nimport PageRenderer from './PageRenderer';\nimport type { Annotation } from '../annotations/types';\nimport { newAnnotationId } from '../annotations/ids';\nimport type { AnnotationManager } from '../annotations/AnnotationManager';\nimport type { Redaction, WatermarkOptions, SDKPermissions, PdfAssetPaths, TransientHighlight, ToolMode, InitialScale, LinkClickEvent, WebViewerInstance } from '../core/types';\nimport { parseLinkTarget } from '../utils/linkUtils';\nimport TextSelectionTooltip from './TextSelectionTooltip';\nimport { findRegexRedactions } from '../utils/findRegexRedactions';\nimport { convertToUnrotated, convertToRotated, normalizeRotation } from '../utils/rotationUtils';\nimport { clampScale, calculateFitWidthScale, calculateScrollCompensation } from '../utils/zoomUtils';\nimport { estimatePageDimensions, computeRowLayout, DEFAULT_FALLBACK_DIMS } from '../utils/layoutUtils';\nimport { useViewerBus, useBusEvent } from '../hooks/useViewerBus';\nimport { assertWorkerConfigured, configurePdfAssets, getDocumentParams } from '../core/pdfAssets';\nimport SideBySideViewer from './SideBySideViewer';\nimport CompareToolbar from './CompareToolbar';\nimport DiffSummarySidebar from './DiffSummarySidebar';\nimport CompareCurtainSlider from './CompareCurtainSlider';\nimport DiffHighlightOverlay from './DiffHighlightOverlay';\nimport type { CompareState, TextDiffSegment, DiffItem, DiffBoundingBox } from '../types/compare';\nimport { computeTextDiff, computePageDiffBoxes } from '../utils/pdfDiffEngine';\n\nexport interface DocumentLoadErrorInfo {\n url: string;\n passwordRequired: boolean;\n}\n\ninterface DocumentViewerProps {\n leftSidebarOpen: boolean;\n rightSidebarOpen: boolean;\n activeTab: string;\n /** Canonical annotation list, history, permissions and XFDF (owned by the viewer instance). */\n annotationManager: AnnotationManager;\n initialDoc?: string;\n /** Bump to force a reload of the same URL (retry after a load error). */\n loadNonce?: number;\n /** Send cookies with the document request. */\n withCredentials?: boolean;\n /** pdf.js asset locations, applied right before the document is opened. */\n assets?: PdfAssetPaths;\n /** Render the thumbnails (left) and comments/search (right) panels. Default true. */\n sidebars?: boolean;\n redactions?: Redaction[];\n regexRedactions?: RegExp[];\n scale: number;\n setScale: (scale: number | ((prev: number) => number)) => void;\n sidebarTab: 'Comments' | 'Search';\n setSidebarTab: (tab: 'Comments' | 'Search') => void;\n onAnnotationsChange?: (annotations: Annotation[]) => void;\n /** Reports the combined (prop + regex + manual) redaction list whenever it changes. */\n onRedactionsChange?: (redactions: Redaction[]) => void;\n /** Fires once per user click of Apply in the confirmation modal with all applied redactions. */\n onRedactionsApplied?: (redactions: Redaction[]) => void;\n onDocumentLoaded?: (doc: pdfjsLib.PDFDocumentProxy, url: string) => void;\n onLoadError?: (error: Error, info: DocumentLoadErrorInfo) => void;\n /** Fires once per loaded document, after the first page canvas has been painted. */\n onFirstPageRendered?: (pageNumber: number) => void;\n /** Fires whenever any page canvas has finished rendering. */\n onPageRendered?: (pageNumber: number) => void;\n onPageChange?: (pageNumber: number, numPages: number) => void;\n pageTransition: 'continuous' | 'page-by-page';\n pageLayout: 'single' | 'double' | 'cover-facing';\n rotation: number;\n setRotation: (r: number | ((prev: number) => number)) => void;\n watermark?: WatermarkOptions;\n watermarkText?: string;\n enableAnnotations?: boolean;\n initialPage?: number;\n page?: number;\n transientHighlights?: TransientHighlight[];\n permissions?: SDKPermissions;\n /** Whether to hide annotations and transient highlights until the page canvas has finished rendering. Default: true. */\n hideAnnotationsUntilPageRendered?: boolean;\n enableTextSelection?: boolean;\n defaultTool?: 'select' | 'pan';\n showSelectionTooltip?: boolean;\n initialScale?: InitialScale;\n initialWidthRatio?: number;\n responsive?: boolean;\n instance?: WebViewerInstance;\n targetViewer?:\n | WebViewerInstance\n | React.RefObject<WebViewerInstance | null>\n | (() => WebViewerInstance | null)\n | string;\n resolveLinkUrl?: (\n linkUrl: string,\n context: { sourceViewer: WebViewerInstance; annotation?: Annotation }\n ) => string | { url: string; page?: number } | Promise<string | { url: string; page?: number } | null> | null;\n onLinkClick?: (event: LinkClickEvent) => boolean | void | Promise<void>;\n}\n\nexport default function DocumentViewer({\n leftSidebarOpen, rightSidebarOpen, activeTab, annotationManager, initialDoc, loadNonce = 0, withCredentials = false, assets, sidebars = true,\n redactions, regexRedactions, scale, setScale, sidebarTab, setSidebarTab, onAnnotationsChange, onRedactionsChange, onRedactionsApplied,\n onDocumentLoaded, onLoadError, onFirstPageRendered, onPageRendered, onPageChange,\n pageTransition, pageLayout, rotation, setRotation, watermark, watermarkText, enableAnnotations: _enableAnnotations, initialPage, page, transientHighlights, permissions,\n hideAnnotationsUntilPageRendered = true,\n enableTextSelection = true,\n defaultTool = 'select',\n showSelectionTooltip = true,\n initialScale,\n initialWidthRatio,\n responsive = true,\n instance,\n targetViewer,\n resolveLinkUrl,\n onLinkClick,\n}: DocumentViewerProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const bus = useViewerBus();\n const [pdfDoc, setPdfDoc] = useState<pdfjsLib.PDFDocumentProxy | null>(null);\n const [loadError, setLoadError] = useState<Error | null>(null);\n const [pageNum, setPageNum] = useState(1);\n const [manualRedactions, setManualRedactions] = useState<Redaction[]>([]);\n const { getCommand } = useShortcuts();\n\n // Compare Mode State\n const [pdfDocB, setPdfDocB] = useState<pdfjsLib.PDFDocumentProxy | null>(null);\n const [compareState, setCompareState] = useState<CompareState>({\n isActive: false,\n mode: 'overlay',\n colorA: '#e11d48',\n colorB: '#2563eb',\n opacityA: 0.8,\n opacityB: 0.8,\n blendMode: 'difference',\n showCurtain: false,\n curtainPosition: 50,\n diffItems: [],\n currentDiffIndex: 0\n });\n const [textDiffs, setTextDiffs] = useState<TextDiffSegment[]>([]);\n const [isDiffSidebarOpen, setIsDiffSidebarOpen] = useState(false);\n\n // Latest-callback refs: parents may pass inline functions without re-triggering effects.\n const callbacksRef = useRef({ onRedactionsChange, onRedactionsApplied, onDocumentLoaded, onLoadError, onFirstPageRendered, onPageRendered, onPageChange });\n callbacksRef.current = { onRedactionsChange, onRedactionsApplied, onDocumentLoaded, onLoadError, onFirstPageRendered, onPageRendered, onPageChange };\n const assetsRef = useRef(assets);\n assetsRef.current = assets;\n\n const loadDocA = useCallback(async (docSource: string | ArrayBuffer | Uint8Array) => {\n try {\n assertWorkerConfigured();\n if (assetsRef.current) configurePdfAssets(assetsRef.current);\n const params: any = typeof docSource === 'string' ? { url: docSource } : { data: docSource };\n if (withCredentials) params.withCredentials = true;\n Object.assign(params, getDocumentParams());\n const loadingTask = pdfjsLib.getDocument(params);\n const loadedDocA = await loadingTask.promise;\n setPdfDoc(loadedDocA);\n callbacksRef.current.onDocumentLoaded?.(loadedDocA, typeof docSource === 'string' ? docSource : 'documentA.pdf');\n } catch (err: any) {\n console.error('Failed to load comparison document A:', err);\n }\n }, [withCredentials]);\n\n const loadCompareDoc = useCallback(async (docSource: string | ArrayBuffer | Uint8Array) => {\n try {\n assertWorkerConfigured();\n if (assetsRef.current) configurePdfAssets(assetsRef.current);\n const params: any = typeof docSource === 'string' ? { url: docSource } : { data: docSource };\n if (withCredentials) params.withCredentials = true;\n Object.assign(params, getDocumentParams());\n const loadingTask = pdfjsLib.getDocument(params);\n const loadedDocB = await loadingTask.promise;\n setPdfDocB(loadedDocB);\n setCompareState(prev => ({\n ...prev,\n isActive: true,\n diffItems: [\n { id: 'diff-1', pageIndex: 1, type: 'modification', description: 'Page 1 Differences detected' }\n ]\n }));\n setIsDiffSidebarOpen(true);\n } catch (err: any) {\n console.error('Failed to load comparison document B:', err);\n }\n }, [withCredentials]);\n\n useEffect(() => {\n if (compareState.isActive && pdfDoc && pdfDocB) {\n let cancelled = false;\n const computeAllDiffs = async () => {\n try {\n const totalPages = Math.min(pdfDoc.numPages, pdfDocB.numPages);\n let allSummary: DiffItem[] = [];\n const mapA: Record<number, DiffBoundingBox[]> = {};\n const mapB: Record<number, DiffBoundingBox[]> = {};\n\n for (let p = 1; p <= totalPages; p++) {\n const { diffsA, diffsB, summary } = await computePageDiffBoxes(pdfDoc, pdfDocB, p);\n if (cancelled) return;\n mapA[p] = diffsA;\n mapB[p] = diffsB;\n allSummary = allSummary.concat(summary);\n }\n\n if (!cancelled) {\n setCompareState(prev => ({\n ...prev,\n diffItems: allSummary,\n pageDiffsA: mapA,\n pageDiffsB: mapB\n }));\n }\n\n const pA = await pdfDoc.getPage(pageNum);\n const pB = await pdfDocB.getPage(Math.min(pageNum, pdfDocB.numPages));\n const textContentA = await pA.getTextContent();\n const textContentB = await pB.getTextContent();\n\n const strA = textContentA.items.map((i: any) => i.str).join(' ');\n const strB = textContentB.items.map((i: any) => i.str).join(' ');\n\n const diffs = computeTextDiff(strA, strB, pageNum);\n if (!cancelled) setTextDiffs(diffs);\n } catch (e) {\n console.error('Error computing document diffs:', e);\n }\n };\n computeAllDiffs();\n return () => { cancelled = true; };\n }\n }, [compareState.isActive, pdfDoc, pdfDocB, pageNum]);\n\n // Public Event Listeners for Compare APIs\n useEffect(() => {\n const handleStartCompare = (data: any) => {\n const { docA, docB, options } = data || {};\n if (options) {\n setCompareState(prev => ({\n ...prev,\n mode: options.mode || prev.mode,\n colorA: options.colorA || prev.colorA,\n colorB: options.colorB || prev.colorB,\n opacityA: options.opacityA || prev.opacityA,\n opacityB: options.opacityB || prev.opacityB,\n blendMode: options.blendMode || prev.blendMode\n }));\n }\n if (docA) {\n loadDocA(docA);\n }\n if (docB) {\n loadCompareDoc(docB);\n }\n };\n\n const handleStopCompare = () => {\n setCompareState(prev => ({ ...prev, isActive: false }));\n setPdfDocB(null);\n setTextDiffs([]);\n };\n\n const handleSetCompareMode = (mode: string) => {\n if (mode) setCompareState(prev => ({ ...prev, mode: mode as any }));\n };\n\n const handleSetCompareColors = (colorA: string, colorB: string) => {\n if (colorA && colorB) setCompareState(prev => ({ ...prev, colorA, colorB }));\n };\n\n const offStart = bus.on('action-start-compare', handleStartCompare);\n const offStop = bus.on('action-stop-compare', handleStopCompare);\n const offMode = bus.on<{ mode: string }>('action-set-compare-mode', (d) => d && handleSetCompareMode(d.mode));\n const offColors = bus.on<{ colorA: string; colorB: string }>('action-set-compare-colors', (d) => d && handleSetCompareColors(d.colorA, d.colorB));\n\n const windowStart = (e: any) => handleStartCompare(e.detail);\n const windowStop = () => handleStopCompare();\n const windowMode = (e: any) => handleSetCompareMode(e.detail?.mode);\n const windowColors = (e: any) => handleSetCompareColors(e.detail?.colorA, e.detail?.colorB);\n\n window.addEventListener('action-start-compare', windowStart);\n window.addEventListener('action-stop-compare', windowStop);\n window.addEventListener('action-set-compare-mode', windowMode);\n window.addEventListener('action-set-compare-colors', windowColors);\n\n return () => {\n offStart(); offStop(); offMode(); offColors();\n window.removeEventListener('action-start-compare', windowStart);\n window.removeEventListener('action-stop-compare', windowStop);\n window.removeEventListener('action-set-compare-mode', windowMode);\n window.removeEventListener('action-set-compare-colors', windowColors);\n };\n }, [bus, loadDocA, loadCompareDoc]);\n\n // Provide combinedRedactions to usePdfSearch but wait, combinedRedactions is computed later in the file.\n // We can just move the combinedRedactions useMemo up before usePdfSearch, \n // or we can pass an empty array initially and it will update.\n // Let's just move usePdfSearch below combinedRedactions.\n const [activeSearchResult, setActiveSearchResult] = useState<SearchResult | null>(null);\n\n // Per-page base dimensions (scale 1, UI rotation composed with the page's /Rotate). Index =\n // pageNumber - 1. Populated progressively after load so mixed-size documents lay out correctly.\n const [pageDims, setPageDims] = useState<Array<{ width: number; height: number }>>([]);\n const fallbackDims = pageDims[0] ?? DEFAULT_FALLBACK_DIMS;\n const dimsFor = useCallback(\n (p: number) => pageDims[p - 1] ?? fallbackDims,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [pageDims, fallbackDims.width, fallbackDims.height]\n );\n const [scrollPos, setScrollPos] = useState({ top: 0, left: 0 });\n const [containerDimensions, setContainerDimensions] = useState<{ width: number; height: number }>({\n width: 0,\n height: 0,\n });\n\n useEffect(() => {\n if (containerRef.current) {\n const c = containerRef.current;\n setContainerDimensions({ width: c.clientWidth, height: c.clientHeight });\n }\n }, []);\n const [isPanning, setIsPanning] = useState(false);\n const panStartRef = useRef<{ x: number, y: number, scrollLeft: number, scrollTop: number } | null>(null);\n\n const GAP = 16;\n\n // Rows of pages (1 or 2 per row depending on layout)\n const rows = useMemo(() => {\n const r: number[][] = [];\n if (!pdfDoc) return r;\n if (pageLayout === 'single') {\n for (let i = 1; i <= pdfDoc.numPages; i++) r.push([i]);\n } else if (pageLayout === 'double') {\n for (let i = 1; i <= pdfDoc.numPages; i += 2) {\n r.push([i, i + 1].filter(p => p <= pdfDoc.numPages));\n }\n } else if (pageLayout === 'cover-facing') {\n r.push([1]);\n for (let i = 2; i <= pdfDoc.numPages; i += 2) {\n r.push([i, i + 1].filter(p => p <= pdfDoc.numPages));\n }\n }\n return r;\n }, [pdfDoc, pageLayout]);\n\n // Row geometry in scaled pixels: each row is as tall as its tallest page (+ gap).\n const rowLayout = useMemo(() => {\n return computeRowLayout(rows, dimsFor, scale, GAP);\n }, [rows, scale, dimsFor]);\n\n const rowsRef = useRef(rows);\n rowsRef.current = rows;\n const scaleRef = useRef(scale);\n scaleRef.current = scale;\n const rowLayoutRef = useRef(rowLayout);\n rowLayoutRef.current = rowLayout;\n const pageTransitionRef = useRef(pageTransition);\n pageTransitionRef.current = pageTransition;\n const visibleRowRef = useRef(0);\n\n const rowIndexOfPage = useCallback((p: number) => rows.findIndex(row => row.includes(p)), [rows]);\n\n const rowIndexAtOffset = useCallback((y: number) => {\n const tops = rowLayout.tops;\n if (tops.length === 0) return 0;\n let lo = 0, hi = tops.length - 1;\n while (lo < hi) {\n const mid = (lo + hi + 1) >> 1;\n if (tops[mid] <= y) lo = mid; else hi = mid - 1;\n }\n return lo;\n }, [rowLayout]);\n\n const scrollToPage = useCallback((p: number, options: { smooth?: boolean } = {}) => {\n const clampedPage = pdfDoc ? Math.max(1, Math.min(p, pdfDoc.numPages)) : Math.max(1, p);\n setPageNum(clampedPage);\n const i = rowIndexOfPage(clampedPage);\n if (i >= 0 && containerRef.current) {\n if (options.smooth) {\n containerRef.current.scrollTo({ top: rowLayout.tops[i], behavior: 'smooth' });\n } else {\n containerRef.current.scrollTop = rowLayout.tops[i];\n }\n }\n }, [pdfDoc, rowIndexOfPage, rowLayout]);\n\n useEffect(() => {\n const handleGoToPage = (detail?: { page: number; smooth?: boolean }) => {\n if (detail?.page) {\n scrollToPage(detail.page, { smooth: detail.smooth ?? true });\n }\n };\n const offGoToPage = bus.on<{ page: number; smooth?: boolean }>('action-go-to-page', (d) => handleGoToPage(d));\n const windowGoToPage = (e: any) => handleGoToPage(e.detail);\n window.addEventListener('action-go-to-page', windowGoToPage);\n\n return () => {\n offGoToPage();\n window.removeEventListener('action-go-to-page', windowGoToPage);\n };\n }, [bus, scrollToPage]);\n\n const handleSearchResultClick = (result: SearchResult) => {\n setPageNum(result.pageIndex);\n setActiveSearchResult(result);\n scrollToPage(result.pageIndex);\n };\n\n const handleSelectDiff = useCallback((idx: number, item?: DiffItem) => {\n const diffItem = item || compareState.diffItems[idx];\n setCompareState(prev => ({ ...prev, currentDiffIndex: idx }));\n\n if (!diffItem) return;\n\n if (diffItem.pageIndex && diffItem.pageIndex !== pageNum) {\n setPageNum(diffItem.pageIndex);\n }\n\n const targetY = (diffItem.y ?? 0) * scale;\n const targetX = (diffItem.x ?? 0) * scale;\n\n if (containerRef.current) {\n const p = diffItem.pageIndex || pageNum;\n const rIdx = rowIndexOfPage(p);\n const rowTop = pageTransition === 'continuous' && rIdx >= 0 ? (rowLayout.tops[rIdx] ?? 0) : 0;\n const viewHeight = containerRef.current.clientHeight || 600;\n const viewWidth = containerRef.current.clientWidth || 800;\n\n const scrollToY = Math.max(0, rowTop + targetY - viewHeight / 3);\n const scrollToX = Math.max(0, targetX - viewWidth / 4);\n\n containerRef.current.scrollTo({\n top: scrollToY,\n left: scrollToX,\n behavior: 'smooth'\n });\n }\n }, [compareState.diffItems, pageNum, scale, pageTransition, rowIndexOfPage, rowLayout.tops]);\n\n // The annotation list lives in the AnnotationManager (undo/redo, permissions, events, XFDF).\n const annotations = useSyncExternalStore(annotationManager.subscribe, annotationManager.getSnapshot, annotationManager.getSnapshot);\n const [activeTool, setActiveTool] = useState<ToolMode>(defaultTool);\n \n // Set default tools when switching tabs\n useEffect(() => {\n if (activeTab === 'Annotate') {\n setActiveTool('highlight');\n setCurrentColor('#fbc02d');\n setCurrentOpacity(0.5);\n setCurrentStrokeWidth(16);\n } else if (activeTab === 'Shapes') {\n setActiveTool('rectangle');\n setCurrentOpacity(1);\n setCurrentStrokeWidth(2);\n } else if (activeTab === 'Fill and Sign') {\n setActiveTool('signature');\n } else if (activeTab === 'View') {\n setActiveTool(defaultTool);\n }\n }, [activeTab, defaultTool]);\n\n useEffect(() => {\n bus.emit('action-tool-changed', { tool: activeTool });\n }, [activeTool, bus]);\n \n\n\n // Style State\n const [currentColor, setCurrentColor] = useState('#d32f2f');\n const [currentStrokeWidth, setCurrentStrokeWidth] = useState(2);\n const [currentOpacity, setCurrentOpacity] = useState(0.8);\n\n const [isDrawing, setIsDrawing] = useState(false);\n const [activeDrawingPageNum, setActiveDrawingPageNum] = useState<number | null>(null);\n const [startPos, setStartPos] = useState({ x: 0, y: 0 });\n const [currentPos, setCurrentPos] = useState({ x: 0, y: 0 });\n const [freehandPoints, setFreehandPoints] = useState<{ x: number, y: number }[]>([]);\n \n // Text Tool State\n const [activeTextEditor, setActiveTextEditor] = useState<{ x: number, y: number, type: 'text' | 'note' | 'callout' | 'link', annId?: string, points?: {x: number, y: number}[], pageIndex: number } | null>(null);\n const [currentText, setCurrentText] = useState('');\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n const [selectedAnnotationId, setSelectedAnnotationId] = useState<string | null>(null);\n const [contextMenuPos, setContextMenuPos] = useState<{ top: number; left: number } | null>(null);\n const [isLinkModalOpen, setIsLinkModalOpen] = useState(false);\n const justCreatedLinkRef = useRef(false);\n const clipboardAnnotationRef = useRef<Annotation | null>(null);\n\n\n useBusEvent<{ tool: ToolMode }>('action-set-tool', (d) => setActiveTool(d?.tool ?? null));\n\n useEffect(() => {\n const handleSelection = () => {\n const text = typeof window !== 'undefined' ? window.getSelection()?.toString() ?? '' : '';\n bus.emit('action-text-selected', { text });\n };\n document.addEventListener('selectionchange', handleSelection);\n return () => document.removeEventListener('selectionchange', handleSelection);\n }, [bus]);\n\n const zoomFocusRef = useRef<{vx: number | null, vy: number | null}>({ vx: null, vy: null });\n const prevScaleRef = useRef(scale);\n const isProgrammaticScaleRef = useRef(false);\n const initialFitDoneRef = useRef(false);\n\n type ActiveFitMode = { type: 'fit-width'; ratio: number } | { type: 'fit-page' } | null;\n\n const initialWidthRatioValue = typeof initialWidthRatio === 'number' && Number.isFinite(initialWidthRatio) && initialWidthRatio > 0\n ? initialWidthRatio\n : (typeof initialScale === 'object' && initialScale !== null && initialScale.type === 'fit-width' && typeof initialScale.ratio === 'number' && initialScale.ratio > 0\n ? initialScale.ratio\n : undefined);\n\n const activeFitModeRef = useRef<ActiveFitMode>(\n typeof initialWidthRatioValue === 'number'\n ? { type: 'fit-width', ratio: initialWidthRatioValue }\n : (initialScale === 'fit-width' || initialScale === undefined)\n ? { type: 'fit-width', ratio: 1.0 }\n : initialScale === 'fit-page'\n ? { type: 'fit-page' }\n : null\n );\n\n useEffect(() => {\n initialFitDoneRef.current = false;\n if (typeof initialWidthRatioValue === 'number') {\n activeFitModeRef.current = { type: 'fit-width', ratio: initialWidthRatioValue };\n } else if (initialScale === 'fit-width' || initialScale === undefined) {\n activeFitModeRef.current = { type: 'fit-width', ratio: 1.0 };\n } else if (initialScale === 'fit-page') {\n activeFitModeRef.current = { type: 'fit-page' };\n } else {\n activeFitModeRef.current = null;\n }\n }, [pdfDoc, initialScale, initialWidthRatioValue]);\n\n // Unified scroll offset maintenance for user-driven scale changes (wheel or toolbar)\n useEffect(() => {\n if (prevScaleRef.current !== scale) {\n const s = prevScaleRef.current;\n const newScale = scale;\n prevScaleRef.current = scale;\n \n const container = containerRef.current;\n if (!container) return;\n\n const isProgrammatic = isProgrammaticScaleRef.current || !initialFitDoneRef.current || initialScrollDoneRef.current !== pdfDoc;\n if (!isProgrammatic) {\n // User manually altered zoom (toolbar buttons, wheel, shortcuts) -> clear auto-fit\n activeFitModeRef.current = null;\n }\n initialFitDoneRef.current = true;\n isProgrammaticScaleRef.current = false;\n\n const newPos = calculateScrollCompensation({\n prevScale: s,\n newScale,\n containerWidth: container.clientWidth,\n containerHeight: container.clientHeight,\n currentScrollLeft: container.scrollLeft,\n currentScrollTop: container.scrollTop,\n basePageWidth: dimsFor(pageNum).width,\n focusPoint: zoomFocusRef.current,\n isProgrammatic,\n });\n\n zoomFocusRef.current = { vx: null, vy: null };\n\n if (isProgrammatic && pageNum > 1 && pageTransition === 'continuous') {\n const rIdx = rowIndexOfPage(pageNum);\n if (rIdx >= 0) {\n container.scrollTop = rowLayout.tops[rIdx] ?? 0;\n }\n container.scrollLeft = 0;\n } else {\n container.scrollLeft = newPos.scrollLeft;\n container.scrollTop = newPos.scrollTop;\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [scale]);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n const handleWheel = (e: WheelEvent) => {\n if (e.metaKey || e.ctrlKey) {\n e.preventDefault();\n \n const rect = container.getBoundingClientRect();\n const clientX = e.clientX;\n const clientY = e.clientY;\n \n const multiplier = Math.exp(-e.deltaY * 0.002);\n \n setScale(s => {\n const roundedScale = clampScale(s * multiplier);\n if (roundedScale !== s) {\n zoomFocusRef.current = { \n vx: clientX - rect.left, \n vy: clientY - rect.top \n };\n }\n return roundedScale;\n });\n }\n };\n\n container.addEventListener('wheel', handleWheel, { passive: false });\n return () => container.removeEventListener('wheel', handleWheel);\n }, [setScale]);\n\n // Commit a new list to the manager (diffed into add/modify/delete, permission-checked, undoable).\n const commitAnnotations = useCallback((newAnns: Annotation[]) => {\n annotationManager.commit(newAnns);\n }, [annotationManager]);\n\n useBusEvent<{ tempAnn: Annotation }>('action-commit-digital-signature-local', (d) => {\n if (d?.tempAnn) commitAnnotations([...annotations, d.tempAnn]);\n });\n\n const handleUndo = useCallback(() => { annotationManager.undo(); }, [annotationManager]);\n const handleRedo = useCallback(() => { annotationManager.redo(); }, [annotationManager]);\n\n // Live resizing & moving state for annotations\n const [liveResizingAnn, setLiveResizingAnn] = useState<Annotation | null>(null);\n const [liveMovingAnn, setLiveMovingAnn] = useState<Annotation | null>(null);\n const resizingRef = useRef<{\n annId: string;\n handle: string;\n startX: number;\n startY: number;\n initialAnn: Annotation;\n pageIndex: number;\n } | null>(null);\n const movingRef = useRef<{\n annId: string;\n startX: number;\n startY: number;\n initialAnn: Annotation;\n pageIndex: number;\n } | null>(null);\n\n const latestResizingAnnRef = useRef<Annotation | null>(null);\n latestResizingAnnRef.current = liveResizingAnn;\n const latestMovingAnnRef = useRef<Annotation | null>(null);\n latestMovingAnnRef.current = liveMovingAnn;\n\n const handleStartResize = useCallback((id: string, handle: string, e: React.MouseEvent, pageNum: number) => {\n const ann = annotations.find(a => a.id === id);\n if (!ann || permissions?.canEditAnnotations === false || !annotationManager.canEdit(ann)) return;\n const initialAnn = {\n ...ann,\n width: ann.width && ann.width > 0 ? ann.width : 180,\n height: ann.height && ann.height > 0 ? ann.height : 40\n };\n resizingRef.current = {\n annId: id,\n handle,\n startX: e.clientX,\n startY: e.clientY,\n initialAnn,\n pageIndex: pageNum\n };\n setLiveResizingAnn(initialAnn);\n }, [annotations, annotationManager, permissions]);\n\n const handleStartMove = useCallback((id: string, e: React.MouseEvent, pageNum: number) => {\n const ann = annotations.find(a => a.id === id);\n if (!ann || permissions?.canEditAnnotations === false || !annotationManager.canEdit(ann)) return;\n movingRef.current = {\n annId: id,\n startX: e.clientX,\n startY: e.clientY,\n initialAnn: { ...ann },\n pageIndex: pageNum\n };\n setLiveMovingAnn({ ...ann });\n }, [annotations, annotationManager, permissions]);\n\n const handleAnnotationDoubleClick = useCallback((id: string, e: React.MouseEvent) => {\n e.stopPropagation();\n const ann = annotations.find(a => a.id === id);\n if (ann && (ann.type === 'text' || ann.type === 'note' || ann.type === 'callout')) {\n if (permissions?.canEditAnnotations === false || !annotationManager.canEdit(ann)) {\n setSelectedAnnotationId(id);\n return;\n }\n setActiveTextEditor({\n x: ann.x,\n y: ann.y,\n type: ann.type as any,\n annId: ann.id,\n points: ann.points,\n pageIndex: ann.pageIndex\n });\n setCurrentText(ann.text || '');\n if (ann.color) setCurrentColor(ann.color);\n setSelectedAnnotationId(id);\n }\n }, [annotations, annotationManager, permissions]);\n\n useEffect(() => {\n const handleWindowMouseMove = (e: MouseEvent) => {\n if (resizingRef.current) {\n const { handle, startX, startY, initialAnn } = resizingRef.current;\n let dx = (e.clientX - startX) / scale;\n let dy = (e.clientY - startY) / scale;\n if (rotation === 90) {\n const tmp = dx; dx = dy; dy = -tmp;\n } else if (rotation === 180) {\n dx = -dx; dy = -dy;\n } else if (rotation === 270) {\n const tmp = dx; dx = -dy; dy = tmp;\n }\n\n let newW = initialAnn.width;\n let newH = initialAnn.height;\n let newX = initialAnn.x;\n let newY = initialAnn.y;\n\n if (handle.includes('e')) {\n newW = Math.max(30, initialAnn.width + dx);\n }\n if (handle.includes('s')) {\n newH = Math.max(16, initialAnn.height + dy);\n }\n if (handle.includes('w')) {\n newW = Math.max(30, initialAnn.width - dx);\n newX = initialAnn.x + (initialAnn.width - newW);\n }\n if (handle.includes('n')) {\n newH = Math.max(16, initialAnn.height - dy);\n newY = initialAnn.y + (initialAnn.height - newH);\n }\n\n setLiveResizingAnn({\n ...initialAnn,\n x: newX,\n y: newY,\n width: newW,\n height: newH\n });\n } else if (movingRef.current) {\n const { startX, startY, initialAnn } = movingRef.current;\n let dx = (e.clientX - startX) / scale;\n let dy = (e.clientY - startY) / scale;\n if (rotation === 90) {\n const tmp = dx; dx = dy; dy = -tmp;\n } else if (rotation === 180) {\n dx = -dx; dy = -dy;\n } else if (rotation === 270) {\n const tmp = dx; dx = -dy; dy = tmp;\n }\n\n setLiveMovingAnn({\n ...initialAnn,\n x: Math.max(0, initialAnn.x + dx),\n y: Math.max(0, initialAnn.y + dy)\n });\n }\n };\n\n const handleWindowMouseUp = () => {\n if (resizingRef.current) {\n if (latestResizingAnnRef.current) {\n const finalAnn = latestResizingAnnRef.current;\n commitAnnotations(annotations.map(a => a.id === finalAnn.id ? finalAnn : a));\n }\n resizingRef.current = null;\n setLiveResizingAnn(null);\n }\n if (movingRef.current) {\n if (latestMovingAnnRef.current) {\n const finalAnn = latestMovingAnnRef.current;\n commitAnnotations(annotations.map(a => a.id === finalAnn.id ? finalAnn : a));\n }\n movingRef.current = null;\n setLiveMovingAnn(null);\n }\n };\n\n window.addEventListener('mousemove', handleWindowMouseMove);\n window.addEventListener('mouseup', handleWindowMouseUp);\n return () => {\n window.removeEventListener('mousemove', handleWindowMouseMove);\n window.removeEventListener('mouseup', handleWindowMouseUp);\n };\n }, [scale, rotation, annotations, commitAnnotations]);\n\n const handleAnnotateSelection = useCallback((type: 'highlight' | 'underline' | 'strikeout' | 'squiggly') => {\n if (permissions?.canAddAnnotations === false) return;\n if (typeof window === 'undefined') return;\n const sel = window.getSelection();\n if (!sel || sel.isCollapsed || !sel.rangeCount) return;\n const range = sel.getRangeAt(0);\n const clientRects = Array.from(range.getClientRects());\n if (clientRects.length === 0) return;\n\n let node: Node | null = range.commonAncestorContainer;\n while (node && !(node instanceof HTMLElement && node.classList.contains('pdf-page-container'))) {\n node = node.parentNode;\n }\n if (!node || !(node instanceof HTMLElement)) return;\n\n const pageNumAttr = node.getAttribute('data-page-number') || node.id.replace('pdf-page-', '');\n const targetPage = parseInt(pageNumAttr, 10);\n if (!targetPage) return;\n\n const pageRect = node.getBoundingClientRect();\n const dims = dimsFor(targetPage);\n const unW = rotation % 180 === 0 ? dims.width : dims.height;\n const unH = rotation % 180 === 0 ? dims.height : dims.width;\n\n const rects = clientRects.map(r => {\n const rawX = (r.left - pageRect.left) / scale;\n const rawY = (r.top - pageRect.top) / scale;\n const rawW = r.width / scale;\n const rawH = r.height / scale;\n const p1 = convertToUnrotated(rawX, rawY, rotation, unW, unH);\n const p2 = convertToUnrotated(rawX + rawW, rawY + rawH, rotation, unW, unH);\n return {\n x: Math.min(p1.x, p2.x),\n y: Math.min(p1.y, p2.y),\n width: Math.abs(p2.x - p1.x),\n height: Math.abs(p2.y - p1.y)\n };\n }).filter(r => r.width > 2 && r.height > 2);\n\n if (rects.length === 0) return;\n\n const minX = Math.min(...rects.map(r => r.x));\n const minY = Math.min(...rects.map(r => r.y));\n const maxX = Math.max(...rects.map(r => r.x + r.width));\n const maxY = Math.max(...rects.map(r => r.y + r.height));\n\n const color = type === 'highlight' ? '#fbc02d' : type === 'squiggly' ? '#388e3c' : currentColor || '#d32f2f';\n const opacity = type === 'highlight' ? 0.5 : 1;\n const strokeWidth = type === 'squiggly' ? 1.5 : 2;\n\n const annId = newAnnotationId();\n commitAnnotations([...annotations, {\n id: annId,\n type,\n pageIndex: targetPage,\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY,\n rects: rects.length > 1 ? rects : undefined,\n color,\n strokeWidth,\n opacity\n }]);\n\n sel.removeAllRanges();\n }, [annotations, commitAnnotations, currentColor, dimsFor, permissions, rotation, scale]);\n\n // Keyboard shortcuts are delivered by <TeamSyncViewer> from its root element, so they only apply\n // to the viewer instance that currently has focus (several viewers can share a page).\n useBusEvent<KeyboardEvent>('viewer-keydown', (e) => {\n const isInput = document.activeElement?.tagName === 'TEXTAREA' || document.activeElement?.tagName === 'INPUT';\n\n if (matchShortcut(e, getCommand('ROTATE_CW'))) {\n e.preventDefault();\n setRotation(r => (r + 90) % 360);\n return;\n }\n if (matchShortcut(e, getCommand('ROTATE_CCW'))) {\n e.preventDefault();\n setRotation(r => (r - 90) % 360);\n return;\n }\n if (matchShortcut(e, getCommand('UNDO'))) {\n e.preventDefault();\n handleUndo();\n return;\n }\n if (matchShortcut(e, getCommand('REDO'))) {\n e.preventDefault();\n handleRedo();\n return;\n }\n if (matchShortcut(e, getCommand('SEARCH'))) {\n e.preventDefault();\n bus.emit('action-open-search');\n return;\n }\n if (matchShortcut(e, getCommand('FILE_PICKER'))) {\n e.preventDefault();\n bus.emit('action-open-file-picker');\n return;\n }\n\n // Annotation clipboard & manipulation (only when not typing in text fields)\n if (!isInput && !activeTextEditor) {\n if (matchShortcut(e, getCommand('COPY'))) {\n const selectedText = typeof window !== 'undefined' ? window.getSelection()?.toString() : '';\n if (selectedText && selectedText.length > 0) {\n bus.emit('action-text-copied', { text: selectedText });\n return;\n }\n if (selectedAnnotationId) {\n const annToCopy = annotations.find(a => a.id === selectedAnnotationId);\n if (annToCopy) {\n e.preventDefault();\n clipboardAnnotationRef.current = annToCopy;\n }\n return;\n }\n }\n if (matchShortcut(e, getCommand('PASTE')) && clipboardAnnotationRef.current) {\n e.preventDefault();\n const base = clipboardAnnotationRef.current;\n const newAnn: Annotation = {\n ...base,\n id: newAnnotationId(),\n pageIndex: pageNum,\n x: base.x + 20,\n y: base.y + 20,\n author: undefined,\n authorId: undefined,\n createdAt: undefined,\n modifiedAt: undefined,\n readOnly: undefined,\n xfdfExtras: undefined\n };\n commitAnnotations([...annotations, newAnn]);\n setSelectedAnnotationId(newAnn.id);\n return;\n }\n if (matchShortcut(e, getCommand('DELETE')) && selectedAnnotationId) {\n e.preventDefault();\n commitAnnotations(annotations.filter(a => a.id !== selectedAnnotationId));\n setSelectedAnnotationId(null);\n return;\n }\n if (e.key === 'Enter' && selectedAnnotationId && !activeTextEditor) {\n const ann = annotations.find(a => a.id === selectedAnnotationId);\n if (ann && (ann.type === 'text' || ann.type === 'note' || ann.type === 'callout')) {\n e.preventDefault();\n setActiveTextEditor({\n x: ann.x,\n y: ann.y,\n type: ann.type as any,\n annId: ann.id,\n points: ann.points,\n pageIndex: ann.pageIndex\n });\n setCurrentText(ann.text || '');\n if (ann.color) setCurrentColor(ann.color);\n return;\n }\n }\n }\n });\n\n useEffect(() => {\n if (activeTextEditor && textareaRef.current) {\n setTimeout(() => {\n textareaRef.current?.focus();\n }, 10);\n }\n }, [activeTextEditor]);\n\n useEffect(() => {\n if (onAnnotationsChange) {\n onAnnotationsChange(annotations);\n }\n }, [annotations, onAnnotationsChange]);\n\n // --- Dynamic Regex Redactions ---\n const [autoRedactions, setAutoRedactions] = useState<Redaction[]>([]);\n \n useEffect(() => {\n if (pdfDoc && regexRedactions && regexRedactions.length > 0) {\n let cancelled = false;\n findRegexRedactions(pdfDoc, regexRedactions).then(results => {\n if (!cancelled) setAutoRedactions(results);\n });\n return () => { cancelled = true; };\n } else {\n setAutoRedactions([]);\n }\n }, [pdfDoc, regexRedactions]);\n\n const [isCommitModalOpen, setIsCommitModalOpen] = useState(false);\n\n const combinedRedactions = useMemo(() => {\n return [...(redactions || []), ...autoRedactions, ...manualRedactions];\n }, [redactions, autoRedactions, manualRedactions]);\n\n // Share the live redaction list with the instance (export needs it) instead of window globals.\n useEffect(() => {\n callbacksRef.current.onRedactionsChange?.(combinedRedactions);\n }, [combinedRedactions]);\n\n const pendingRedactionsCount = useMemo(() => {\n return combinedRedactions.filter(r => r.status === 'pending').length;\n }, [combinedRedactions]);\n\n const handleDiscardAllRedactions = useCallback(() => {\n setManualRedactions(prev => prev.filter(r => r.status === 'applied'));\n setAutoRedactions(prev => prev.filter(r => r.status === 'applied'));\n }, []);\n\n const handleDiscardRedaction = useCallback((red: Redaction) => {\n setManualRedactions(prev => prev.filter(r => r !== red && r.id !== red.id));\n setAutoRedactions(prev => prev.filter(r => r !== red && r.id !== red.id));\n }, []);\n\n const { search, searchResults, isSearching, searchProgress } = usePdfSearch(pdfDoc, combinedRedactions);\n\n useEffect(() => {\n if (searchResults.length === 0) {\n setActiveSearchResult(null);\n }\n }, [searchResults]);\n\n // Load the document. Re-runs when the URL or the reload nonce changes; the previous loading task\n // (and its worker transport) is destroyed on cleanup so documents never leak across loads.\n const firstPageRenderedRef = useRef(false);\n useEffect(() => {\n setPdfDoc(null);\n setLoadError(null);\n setPageNum(1);\n setPageDims([]);\n firstPageRenderedRef.current = false;\n if (!initialDoc) return;\n\n const url = initialDoc;\n let cancelled = false;\n let loadingTask: pdfjsLib.PDFDocumentLoadingTask | null = null;\n\n const loadPdf = async () => {\n try {\n if (assetsRef.current) configurePdfAssets(assetsRef.current);\n assertWorkerConfigured();\n loadingTask = pdfjsLib.getDocument({ url, withCredentials, ...getDocumentParams() });\n const doc = await loadingTask.promise;\n // If the effect was cleaned up meanwhile, the loading task (and its worker transport)\n // has already been destroyed by the cleanup function.\n if (cancelled) return;\n try {\n const p1 = await doc.getPage(1);\n if (!cancelled) {\n const vp1 = p1.getViewport({ scale: 1, rotation: normalizeRotation(p1.rotate + rotation) });\n setPageDims(estimatePageDimensions(doc.numPages, { width: vp1.width, height: vp1.height }));\n }\n } catch {}\n if (cancelled) return;\n setPdfDoc(doc);\n callbacksRef.current.onDocumentLoaded?.(doc, url);\n } catch (error: any) {\n if (cancelled) return;\n const err = error instanceof Error ? error : new Error(String(error?.message ?? error));\n const passwordRequired = error?.name === 'PasswordException';\n console.error('[teamsync-pdf-viewer] Error loading PDF:', err.message, err);\n setLoadError(err);\n callbacksRef.current.onLoadError?.(err, { url, passwordRequired });\n }\n };\n loadPdf();\n\n return () => {\n cancelled = true;\n if (loadingTask) {\n loadingTask.destroy().catch(() => {});\n }\n };\n }, [initialDoc, loadNonce, withCredentials, rotation]);\n\n const handlePageRendered = useCallback((renderedPage: number) => {\n callbacksRef.current.onPageRendered?.(renderedPage);\n if (firstPageRenderedRef.current) return;\n firstPageRenderedRef.current = true;\n callbacksRef.current.onFirstPageRendered?.(renderedPage);\n }, []);\n\n useEffect(() => {\n if (pdfDoc) callbacksRef.current.onPageChange?.(pageNum, pdfDoc.numPages);\n }, [pageNum, pdfDoc]);\n\n // Scroll to the target page (page ?? initialPage) as soon as row geometry is known,\n // and handle subsequent page/initialPage prop updates when citations are clicked.\n const initialScrollDoneRef = useRef<pdfjsLib.PDFDocumentProxy | null>(null);\n const lastTargetPageRef = useRef<number | undefined>(undefined);\n useEffect(() => {\n const target = page ?? initialPage;\n if (!pdfDoc || !target) return;\n if (initialScrollDoneRef.current === pdfDoc && lastTargetPageRef.current === target) return;\n if (pageDims.length < Math.min(target, pdfDoc.numPages)) return;\n\n const isInitial = initialScrollDoneRef.current !== pdfDoc;\n initialScrollDoneRef.current = pdfDoc;\n lastTargetPageRef.current = target;\n const t = setTimeout(() => scrollToPage(target, { smooth: !isInitial }), 50);\n return () => clearTimeout(t);\n }, [pdfDoc, page, initialPage, pageDims.length, scrollToPage]);\n\n // Measure base dimensions up front and reserve estimated space for all pages to avoid layout jumps / shaking on scroll.\n useEffect(() => {\n if (!pdfDoc) return;\n let cancelled = false;\n const doc = pdfDoc;\n\n (async () => {\n // 1. Measure Page 1 up front to obtain baseline page dimensions\n let p1: pdfjsLib.PDFPageProxy;\n try {\n p1 = await doc.getPage(1);\n } catch {\n return;\n }\n if (cancelled) return;\n\n const vp1 = p1.getViewport({ scale: 1, rotation: normalizeRotation(p1.rotate + rotation) });\n const p1Dim = { width: vp1.width, height: vp1.height };\n\n // 2. Reserve estimated space up front for all pages based on Page 1\n setPageDims((prev) => {\n if (\n prev.length === doc.numPages &&\n Math.abs((prev[0]?.width ?? 0) - p1Dim.width) <= 0.5 &&\n Math.abs((prev[0]?.height ?? 0) - p1Dim.height) <= 0.5\n ) {\n return prev;\n }\n return estimatePageDimensions(doc.numPages, p1Dim);\n });\n\n if (doc.numPages <= 1) return;\n\n // 3. Measure remaining page dimensions up front in parallel batches\n const allDims = estimatePageDimensions(doc.numPages, p1Dim);\n let mismatch = false;\n const batchSize = 25;\n\n for (let start = 2; start <= doc.numPages; start += batchSize) {\n if (cancelled) return;\n const end = Math.min(doc.numPages, start + batchSize - 1);\n const batchPromises: Promise<void>[] = [];\n\n for (let p = start; p <= end; p++) {\n const pageNum = p;\n batchPromises.push((async () => {\n try {\n const page = await doc.getPage(pageNum);\n if (cancelled) return;\n const vp = page.getViewport({ scale: 1, rotation: normalizeRotation(page.rotate + rotation) });\n if (Math.abs(vp.width - p1Dim.width) > 0.5 || Math.abs(vp.height - p1Dim.height) > 0.5) {\n mismatch = true;\n }\n allDims[pageNum - 1] = { width: vp.width, height: vp.height };\n } catch {\n // Retain estimated p1Dim\n }\n })());\n }\n\n await Promise.all(batchPromises);\n }\n\n if (cancelled) return;\n\n // 4. Update pageDims only if any page had different dimensions than the page 1 estimate\n if (mismatch) {\n const container = containerRef.current;\n if (container && container.scrollTop > 0 && pageTransitionRef.current === 'continuous') {\n const cRow = visibleRowRef.current;\n const newLayout = computeRowLayout(\n rowsRef.current,\n (p) => allDims[p - 1] ?? p1Dim,\n scaleRef.current,\n GAP\n );\n const oldTop = rowLayoutRef.current.tops[cRow] ?? 0;\n const newTop = newLayout.tops[cRow] ?? 0;\n const delta = newTop - oldTop;\n if (delta !== 0) {\n container.scrollTop += delta;\n }\n }\n setPageDims(allDims);\n }\n })();\n\n return () => {\n cancelled = true;\n };\n }, [pdfDoc, rotation]);\n\n // Dynamic Fit to Width calculation\n const handleFitToWidth = useCallback(\n (detail?: { ratio?: number } | number) => {\n const dims = dimsFor(pageNum);\n if (!containerRef.current || !dims.width) return;\n const availableWidth = containerRef.current.clientWidth - 48;\n const rawRatio = typeof detail === 'number' ? detail : detail?.ratio;\n const effectiveRatio =\n typeof rawRatio === 'number' && Number.isFinite(rawRatio) && rawRatio > 0\n ? rawRatio\n : (typeof initialWidthRatioValue === 'number' && !detail ? initialWidthRatioValue : 1.0);\n\n activeFitModeRef.current = { type: 'fit-width', ratio: effectiveRatio };\n\n if (availableWidth > 0 && dims.width > 0) {\n const newScale = calculateFitWidthScale(availableWidth, dims.width, effectiveRatio);\n if (newScale !== scale) {\n isProgrammaticScaleRef.current = true;\n setScale(newScale);\n } else {\n isProgrammaticScaleRef.current = false;\n }\n if (containerRef.current && (pageNum === 1 || containerRef.current.scrollTop <= 1)) {\n containerRef.current.scrollTop = 0;\n containerRef.current.scrollLeft = 0;\n }\n }\n },\n [dimsFor, pageNum, scale, setScale, initialWidthRatioValue]\n );\n\n // Dynamic Fit to Page calculation\n const handleFitToPage = useCallback(() => {\n activeFitModeRef.current = { type: 'fit-page' };\n const dims = dimsFor(pageNum);\n if (!containerRef.current || !dims.width || !dims.height) return;\n const availableWidth = containerRef.current.clientWidth - 48;\n const availableHeight = containerRef.current.clientHeight - 48;\n if (availableWidth > 0 && availableHeight > 0 && dims.width > 0 && dims.height > 0) {\n const scaleX = availableWidth / dims.width;\n const scaleY = availableHeight / dims.height;\n const newScale = clampScale(Math.min(scaleX, scaleY));\n if (newScale !== scale) {\n isProgrammaticScaleRef.current = true;\n setScale(newScale);\n } else {\n isProgrammaticScaleRef.current = false;\n }\n if (containerRef.current && (pageNum === 1 || containerRef.current.scrollTop <= 1)) {\n containerRef.current.scrollTop = 0;\n containerRef.current.scrollLeft = 0;\n }\n }\n }, [dimsFor, pageNum, scale, setScale]);\n\n useBusEvent('action-fit-to-width', (detail) => handleFitToWidth(detail as { ratio?: number } | number | undefined));\n useBusEvent('action-fit-to-page', () => handleFitToPage());\n\n // Responsive container resize observer: automatically refits scale if in a fit or width-ratio mode\n useEffect(() => {\n if (responsive === false) return;\n const container = containerRef.current;\n if (!container || typeof ResizeObserver === 'undefined') return;\n\n let rafId: number | null = null;\n let prevWidth = container.clientWidth;\n let prevHeight = container.clientHeight;\n\n const handleResize = () => {\n const currentWidth = container.clientWidth;\n const currentHeight = container.clientHeight;\n\n if (currentWidth <= 0 || currentHeight <= 0) return;\n if (Math.abs(currentWidth - prevWidth) < 1 && Math.abs(currentHeight - prevHeight) < 1) return;\n\n prevWidth = currentWidth;\n prevHeight = currentHeight;\n\n setContainerDimensions({ width: currentWidth, height: currentHeight });\n\n if (!activeFitModeRef.current) return;\n\n if (rafId) cancelAnimationFrame(rafId);\n rafId = requestAnimationFrame(() => {\n const mode = activeFitModeRef.current;\n if (mode?.type === 'fit-width') {\n handleFitToWidth({ ratio: mode.ratio });\n } else if (mode?.type === 'fit-page') {\n handleFitToPage();\n }\n });\n };\n\n const observer = new ResizeObserver(handleResize);\n observer.observe(container);\n window.addEventListener('resize', handleResize);\n\n return () => {\n observer.disconnect();\n window.removeEventListener('resize', handleResize);\n if (rafId) cancelAnimationFrame(rafId);\n };\n }, [responsive, handleFitToWidth, handleFitToPage]);\n\n const getUnrotatedPoint = (e: React.MouseEvent<Element>, pageNumber: number) => {\n const rect = e.currentTarget.getBoundingClientRect();\n const rawX = (e.clientX - rect.left) / scale;\n const rawY = (e.clientY - rect.top) / scale;\n const dims = dimsFor(pageNumber);\n const unW = rotation % 180 === 0 ? dims.width : dims.height;\n const unH = rotation % 180 === 0 ? dims.height : dims.width;\n return convertToUnrotated(rawX, rawY, rotation, unW, unH);\n };\n\n const handleMouseDown = (e: React.MouseEvent<Element>, targetPageNum: number) => {\n if (!activeTool) return;\n \n const { x, y } = getUnrotatedPoint(e, targetPageNum);\n\n if (activeTool === 'text' || activeTool === 'note') {\n e.preventDefault();\n return;\n }\n\n if (activeTool === 'eraser') {\n setIsDrawing(true);\n return;\n }\n\n setStartPos({ x, y });\n setCurrentPos({ x, y });\n if (activeTool === 'freehand') {\n setIsDrawing(true);\n setFreehandPoints([{ x, y }]);\n setActiveDrawingPageNum(targetPageNum);\n } else if (['rectangle', 'ellipse', 'line', 'arrow', 'highlight', 'underline', 'strikeout', 'squiggly', 'redaction'].includes(activeTool)) {\n setIsDrawing(true);\n setActiveDrawingPageNum(targetPageNum);\n } else if (['callout', 'link'].includes(activeTool)) {\n setIsDrawing(true);\n setActiveDrawingPageNum(targetPageNum);\n }\n };\n\n const commitTextAnnotation = () => {\n if (activeTextEditor && currentText.trim()) {\n if (activeTextEditor.annId) {\n commitAnnotations(annotations.map(a => \n a.id === activeTextEditor.annId ? { ...a, text: currentText } : a\n ));\n } else {\n const annId = newAnnotationId();\n const defaultWidth = Math.max(160, Math.min(320, currentText.length * 9 + 20));\n const lineCount = currentText.split('\\n').length;\n const defaultHeight = Math.max(36, lineCount * 22);\n commitAnnotations([...annotations, {\n id: annId,\n type: activeTextEditor.type,\n pageIndex: activeTextEditor.pageIndex,\n x: activeTextEditor.x,\n y: activeTextEditor.y,\n width: defaultWidth,\n height: defaultHeight,\n text: currentText,\n points: activeTextEditor.points,\n color: currentColor, strokeWidth: currentStrokeWidth, opacity: currentOpacity\n }]);\n }\n }\n setActiveTextEditor(null);\n setCurrentText('');\n if (activeTool === 'text') {\n setActiveTool(null);\n }\n };\n\n const handleMouseMove = (e: React.MouseEvent<Element>, targetPageNum: number) => {\n if (!isDrawing) return;\n \n const { x, y } = getUnrotatedPoint(e, targetPageNum);\n setCurrentPos({ x, y });\n\n if (activeTool === 'freehand') {\n setFreehandPoints(prev => [...prev, { x, y }]);\n }\n };\n\n const handleMouseUp = (e: React.MouseEvent<Element>, targetPageNum: number) => {\n if (activeTool === 'text' || activeTool === 'note' || activeTool === 'digital_signature' || activeTool === 'link') {\n if (activeTool === 'link') {\n const { x, y } = getUnrotatedPoint(e, targetPageNum);\n if (permissions?.canAddAnnotations === false) return;\n \n // Auto create a link box at click location\n const linkId = newAnnotationId();\n const newLinkAnn: any = {\n id: linkId,\n type: 'link',\n pageIndex: targetPageNum,\n x,\n y,\n width: 120,\n height: 35,\n text: 'Open Link',\n linkUrl: 'https://',\n color: 'transparent',\n strokeWidth: 0,\n opacity: 1,\n points: []\n };\n commitAnnotations([...annotations, newLinkAnn]);\n setSelectedAnnotationId(linkId);\n setIsLinkModalOpen(true);\n setActiveTool(null);\n return;\n } else if (activeTool === 'text' || activeTool === 'note') {\n const { x, y } = getUnrotatedPoint(e, targetPageNum);\n if (permissions?.canAddAnnotations === false) return;\n if (activeTextEditor) {\n commitTextAnnotation();\n }\n setActiveTextEditor({ x, y, type: activeTool as any, pageIndex: targetPageNum });\n setCurrentText('');\n }\n return;\n }\n\n if (!isDrawing) return;\n setIsDrawing(false);\n setActiveDrawingPageNum(null);\n if (!activeTool) return;\n \n if (activeTool === 'freehand') {\n if (freehandPoints.length > 2) {\n // Calculate bounding box for freehand to store x, y, width, height (simplified)\n const xs = freehandPoints.map(p => p.x);\n const ys = freehandPoints.map(p => p.y);\n const minX = Math.min(...xs);\n const maxX = Math.max(...xs);\n const minY = Math.min(...ys);\n const maxY = Math.max(...ys);\n \n commitAnnotations([...annotations, { \n id: newAnnotationId(), type: activeTool as any, pageIndex: targetPageNum,\n x: minX, y: minY, width: maxX - minX, height: maxY - minY,\n points: [...freehandPoints],\n strokes: [[...freehandPoints]],\n color: currentColor, strokeWidth: currentStrokeWidth, opacity: currentOpacity\n }]);\n }\n setFreehandPoints([]);\n } else {\n let width = Math.abs(currentPos.x - startPos.x);\n let height = Math.abs(currentPos.y - startPos.y);\n if (width > 5 || height > 5) {\n let x = Math.min(startPos.x, currentPos.x);\n let y = Math.min(startPos.y, currentPos.y);\n const points = (activeTool === 'line' || activeTool === 'arrow' || activeTool === 'callout') ? [startPos, currentPos] : undefined;\n \n if (['highlight', 'underline', 'strikeout', 'squiggly', 'redaction'].includes(activeTool) && height < 18) {\n height = Math.max(18, height);\n y = startPos.y - 9; // Center the highlight or redaction on the mouse path\n }\n \n if (activeTool === 'callout') {\n if (permissions?.canAddAnnotations === false) return;\n setActiveTextEditor({ x: currentPos.x, y: currentPos.y, type: 'callout', points, pageIndex: targetPageNum });\n setCurrentText('');\n return;\n }\n\n if (activeTool === 'redaction') {\n if (permissions?.canRedact === false) return;\n setManualRedactions(prev => [...prev, {\n id: `manual-${Date.now()}-${Math.random().toString(36).substr(2, 6)}`,\n pageIndex: targetPageNum,\n x,\n y,\n width,\n height,\n status: 'pending'\n }]);\n return;\n }\n\n if (permissions?.canAddAnnotations === false) return;\n\n commitAnnotations([...annotations, { \n id: newAnnotationId(), type: activeTool as any, pageIndex: targetPageNum, x, y, width, height, points,\n color: currentColor, strokeWidth: currentStrokeWidth, opacity: currentOpacity\n }]);\n }\n }\n };\n\n const handleEraserMove = (id: string) => {\n if (activeTool === 'eraser' && isDrawing) {\n commitAnnotations(annotations.filter(a => a.id !== id));\n }\n };\n\n const handleLinkClick = useCallback(async (linkUrl: string, ann?: Annotation, e?: React.MouseEvent) => {\n const parsed = parseLinkTarget(linkUrl);\n let defaultPrevented = false;\n\n const linkEvent: LinkClickEvent = {\n url: linkUrl,\n docUrl: parsed.docUrl,\n pageNumber: parsed.pageNumber,\n isInternalPage: parsed.isInternalPage,\n annotation: ann,\n originalEvent: e,\n preventDefault: () => {\n defaultPrevented = true;\n },\n get defaultPrevented() {\n return defaultPrevented;\n }\n };\n\n bus.emit('linkClicked', linkEvent);\n try {\n const res = await onLinkClick?.(linkEvent);\n if (res === false) {\n defaultPrevented = true;\n }\n } catch (err) {\n console.error('[teamsync-pdf-viewer] onLinkClick error:', err);\n }\n\n if (defaultPrevented) return;\n\n // Internal page jump\n if (parsed.isInternalPage && parsed.pageNumber) {\n scrollToPage(parsed.pageNumber);\n return;\n }\n\n // Resolve link if custom resolver provided\n let effectiveDocUrl = parsed.docUrl;\n let effectivePage = parsed.pageNumber;\n\n if (resolveLinkUrl && instance) {\n try {\n const resolved = await resolveLinkUrl(linkUrl, {\n sourceViewer: instance,\n annotation: ann\n });\n if (resolved) {\n if (typeof resolved === 'string') {\n const reParsed = parseLinkTarget(resolved);\n effectiveDocUrl = reParsed.docUrl ?? resolved;\n effectivePage = reParsed.pageNumber ?? effectivePage;\n } else {\n effectiveDocUrl = resolved.url;\n effectivePage = resolved.page ?? effectivePage;\n }\n }\n } catch (err) {\n console.error('[teamsync-pdf-viewer] resolveLinkUrl error:', err);\n }\n }\n\n // Check targetViewer\n const target = instance?.getTargetViewer();\n if (target && effectiveDocUrl) {\n try {\n await target.loadOrNavigate(effectiveDocUrl, { page: effectivePage });\n return;\n } catch (err) {\n console.error('[teamsync-pdf-viewer] Failed to open document in targetViewer:', err);\n }\n }\n\n // Fallback: window.open\n let linkHref = effectiveDocUrl || linkUrl;\n if (effectivePage && !linkHref.includes('#page=')) {\n linkHref = `${linkHref}#page=${effectivePage}`;\n }\n if (!/^https?:\\/\\//i.test(linkHref) && !linkHref.startsWith('/') && !linkHref.startsWith('./') && !linkHref.startsWith('#')) {\n linkHref = 'https://' + linkHref;\n }\n const win = window.open(linkHref, '_blank', 'noopener,noreferrer');\n if (win) win.opener = null;\n }, [bus, instance, onLinkClick, resolveLinkUrl, scrollToPage]);\n\n // Sync targetViewer with WebViewerInstance\n useEffect(() => {\n if (instance && targetViewer !== undefined) {\n instance.setTargetViewer(targetViewer);\n }\n }, [instance, targetViewer]);\n\n // Listen for programmatic link openings\n useEffect(() => {\n return bus.on('action-open-link', (data: any) => {\n if (data?.url) {\n handleLinkClick(data.url);\n }\n });\n }, [bus, handleLinkClick]);\n\n const handleEraserClick = (id: string, e: React.MouseEvent) => {\n e.stopPropagation();\n if (activeTool === 'eraser') {\n if (permissions?.canDeleteAnnotations === false) return;\n commitAnnotations(annotations.filter(a => a.id !== id));\n if (selectedAnnotationId === id) {\n setSelectedAnnotationId(null);\n setContextMenuPos(null);\n }\n } else if (activeTool === null || activeTool === 'pan' || activeTool === 'select') {\n const ann = annotations.find(a => a.id === id);\n if (ann && ann.linkUrl && activeTab === 'View') {\n handleLinkClick(ann.linkUrl, ann, e);\n return;\n } else if (ann && (ann.type === 'note' || ann.type === 'callout')) {\n if (permissions?.canEditAnnotations === false || !annotationManager.canEdit(ann)) {\n setSelectedAnnotationId(id);\n return;\n }\n // Open edit mode for note / callout\n setActiveTextEditor({ x: ann.x, y: ann.y, type: ann.type as any, annId: ann.id, points: ann.points, pageIndex: ann.pageIndex });\n setCurrentText(ann.text || '');\n if (ann.color) setCurrentColor(ann.color);\n } else if (ann && ann.type === 'text') {\n setSelectedAnnotationId(id);\n } else if (ann && ann.type === 'link') {\n if (permissions?.canEditAnnotations === false || !annotationManager.canEdit(ann)) {\n setSelectedAnnotationId(id);\n return;\n }\n setIsLinkModalOpen(true);\n }\n setSelectedAnnotationId(id);\n \n const container = containerRef.current;\n const containerRect = container?.getBoundingClientRect();\n if (containerRect && container) {\n setContextMenuPos({\n top: e.clientY - containerRect.top + container.scrollTop,\n left: e.clientX - containerRect.left + container.scrollLeft\n });\n }\n }\n };\n\n const handleScroll = (e: React.UIEvent<HTMLDivElement>) => {\n setScrollPos({\n top: e.currentTarget.scrollTop,\n left: e.currentTarget.scrollLeft\n });\n visibleRowRef.current = rowIndexAtOffset(e.currentTarget.scrollTop);\n };\n\n useEffect(() => {\n if (pdfDoc && containerRef.current && pageTransition === 'continuous') {\n const midPoint = scrollPos.top + containerRef.current.clientHeight / 2;\n const cRowIndex = Math.max(0, Math.min(rows.length - 1, rowIndexAtOffset(midPoint)));\n const currentPage = rows[cRowIndex] ? rows[cRowIndex][0] : 1;\n if (currentPage !== pageNum) {\n setPageNum(currentPage);\n }\n }\n }, [scrollPos.top, scale, pdfDoc, pageNum, rowIndexAtOffset, pageTransition, rows]);\n\n return (\n <div style={{ flex: 1, display: 'flex', minHeight: 0, backgroundColor: 'var(--bg-color)', overflow: 'hidden' }}>\n {sidebars && (\n <LeftSidebar\n isOpen={leftSidebarOpen}\n pdfDoc={pdfDoc}\n pageNum={pageNum}\n setPageNum={(p) => scrollToPage(p)}\n />\n )}\n <div style={{ flex: 1, display: 'flex', flexDirection: 'column', minWidth: 0, minHeight: 0, backgroundColor: 'var(--bg-color)', overflow: 'hidden' }}>\n {/* Compare Sub-toolbar */}\n {compareState.isActive && (\n <CompareToolbar\n compareState={compareState}\n onSetMode={(mode) => setCompareState(prev => ({ ...prev, mode }))}\n onSetColors={(colorA, colorB) => setCompareState(prev => ({ ...prev, colorA, colorB }))}\n onToggleCurtain={() => setCompareState(prev => ({ ...prev, showCurtain: !prev.showCurtain }))}\n onPrevDiff={() => {\n if (compareState.diffItems.length === 0) return;\n const newIdx = (compareState.currentDiffIndex - 1 + compareState.diffItems.length) % compareState.diffItems.length;\n handleSelectDiff(newIdx);\n }}\n onNextDiff={() => {\n if (compareState.diffItems.length === 0) return;\n const newIdx = (compareState.currentDiffIndex + 1) % compareState.diffItems.length;\n handleSelectDiff(newIdx);\n }}\n onExit={() => {\n setCompareState(prev => ({ ...prev, isActive: false }));\n setPdfDocB(null);\n setTextDiffs([]);\n }}\n />\n )}\n {/* Sub-toolbar */}\n {activeTab === 'Annotate' && (\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px', padding: '8px 16px', backgroundColor: '#fff', borderBottom: '1px solid var(--border-color)', height: '40px' }}>\n <ToolButton icon={<Undo2 size={16} />} disabled={!annotationManager.canUndo} onClick={handleUndo} label=\"Undo\" />\n <ToolButton icon={<Redo2 size={16} />} disabled={!annotationManager.canRedo} onClick={handleRedo} label=\"Redo\" />\n <div style={{ width: '1px', height: '24px', backgroundColor: 'var(--border-color)', margin: '0 4px' }} />\n\n <ToolButton icon={<Highlighter size={16} />} active={activeTool === 'highlight'} onClick={() => { setActiveTool('highlight'); setCurrentColor('#fbc02d'); setCurrentOpacity(0.5); setCurrentStrokeWidth(16); }} label=\"Text Highlight\" />\n <ToolButton icon={<Underline size={16} />} active={activeTool === 'underline'} onClick={() => { setActiveTool('underline'); setCurrentColor('#d32f2f'); setCurrentOpacity(1); setCurrentStrokeWidth(2); }} label=\"Underline\" />\n <ToolButton icon={<Strikethrough size={16} />} active={activeTool === 'strikeout'} onClick={() => { setActiveTool('strikeout'); setCurrentColor('#d32f2f'); setCurrentOpacity(1); setCurrentStrokeWidth(2); }} label=\"Strikeout\" />\n <ToolButton icon={<SquigglyIcon size={16} />} active={activeTool === 'squiggly'} onClick={() => { setActiveTool('squiggly'); setCurrentColor('#388e3c'); setCurrentOpacity(1); setCurrentStrokeWidth(1.5); }} label=\"Squiggly\" />\n <ToolButton icon={<Brush size={16} />} active={activeTool === 'freehand'} onClick={() => { setActiveTool('freehand'); setCurrentColor('#000000'); setCurrentOpacity(1); setCurrentStrokeWidth(2); }} label=\"Marker\" />\n <ToolButton icon={<Type size={16} />} active={activeTool === 'text'} onClick={() => { setActiveTool('text'); setCurrentColor('#000000'); setCurrentOpacity(1); }} label=\"Text\" />\n {permissions?.canRedact !== false && (\n <ToolButton icon={<EyeOff size={16} />} active={activeTool === 'redaction'} onClick={() => { setActiveTool('redaction'); setCurrentColor('#000000'); setCurrentOpacity(1); }} label=\"Redact\" />\n )}\n \n <div style={{ width: '1px', height: '24px', backgroundColor: 'var(--border-color)', margin: '0 8px' }} />\n \n\n <div style={{ display: 'flex', gap: '4px', borderRight: '1px solid var(--border-color)', paddingRight: '8px' }}>\n <ToolButton icon={<MessageSquareQuote size={16} />} active={activeTool === 'callout'} onClick={() => { setActiveTool('callout'); setCurrentOpacity(1); setCurrentStrokeWidth(2); }} label=\"Callout\" />\n </div>\n <div style={{ display: 'flex', gap: '4px' }}>\n <ToolButton icon={<Pen size={16} />} active={activeTool === 'freehand' && currentOpacity === 1} onClick={() => { setActiveTool('freehand'); setCurrentOpacity(1); setCurrentStrokeWidth(2); }} label=\"Freehand\" />\n {permissions?.canDeleteAnnotations !== false && (\n <ToolButton icon={<Eraser size={16} />} active={activeTool === 'eraser'} onClick={() => setActiveTool('eraser')} label=\"Eraser\" />\n )}\n </div>\n\n <div style={{ width: '1px', height: '24px', backgroundColor: 'var(--border-color)', margin: '0 8px' }} />\n\n <div style={{ display: 'flex', gap: '4px' }}>\n <ToolButton icon={<Minus size={16} />} active={activeTool === 'line'} onClick={() => setActiveTool('line')} label=\"Line\" />\n <ToolButton icon={<ArrowUpRight size={16} />} active={activeTool === 'arrow'} onClick={() => setActiveTool('arrow')} label=\"Arrow\" />\n <ToolButton icon={<Square size={16} />} active={activeTool === 'rectangle'} onClick={() => setActiveTool('rectangle')} label=\"Rectangle\" />\n <ToolButton icon={<CircleIcon size={16} />} active={activeTool === 'ellipse'} onClick={() => setActiveTool('ellipse')} label=\"Ellipse\" />\n <ToolButton icon={<LinkIcon size={16} />} active={activeTool === 'link'} onClick={() => setActiveTool('link')} label=\"Link\" />\n </div>\n \n <div style={{ flex: 1 }} />\n \n <div style={{ display: 'flex', alignItems: 'center', gap: '12px' }}>\n {['line', 'arrow', 'rectangle', 'ellipse', 'freehand', 'highlight', 'underline', 'strikeout', 'squiggly'].includes(activeTool || '') && (\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px', borderRight: '1px solid var(--border-color)', paddingRight: '12px' }}>\n <span style={{ fontSize: '12px', color: '#666', minWidth: '85px' }}>Thickness: <strong>{currentStrokeWidth}px</strong></span>\n <input \n type=\"range\" \n min=\"1\" \n max=\"24\" \n value={Math.min(24, Math.max(1, currentStrokeWidth))} \n onMouseDown={(e) => e.stopPropagation()}\n onChange={(e) => {\n const val = parseInt(e.target.value, 10);\n setCurrentStrokeWidth(val);\n if (selectedAnnotationId && !activeTextEditor) {\n commitAnnotations(annotations.map(a => a.id === selectedAnnotationId ? { ...a, strokeWidth: val } : a));\n }\n }}\n style={{ width: '90px', cursor: 'pointer' }}\n />\n </div>\n )}\n <div style={{ display: 'flex', gap: '4px' }}>\n {['#d32f2f', '#f57c00', '#fbc02d', '#388e3c', '#1976d2', '#7b1fa2', '#000000'].map(color => (\n <button\n key={color}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => {\n setCurrentColor(color);\n // If an annotation is selected but not actively being edited, update its color instantly\n if (selectedAnnotationId && !activeTextEditor) {\n commitAnnotations(annotations.map(a => a.id === selectedAnnotationId ? { ...a, color } : a));\n }\n }}\n style={{\n width: '18px', height: '18px', borderRadius: '50%', backgroundColor: color,\n border: currentColor === color ? '2px solid #000' : '1px solid transparent',\n cursor: 'pointer', outline: 'none', padding: 0\n }}\n />\n ))}\n </div>\n {pendingRedactionsCount > 0 && (\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px', marginLeft: '8px' }}>\n <button\n onClick={() => setIsCommitModalOpen(true)}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n backgroundColor: '#dc2626',\n color: '#ffffff',\n border: 'none',\n borderRadius: '6px',\n padding: '5px 12px',\n fontSize: '12px',\n fontWeight: 600,\n cursor: 'pointer',\n boxShadow: '0 2px 6px rgba(220, 38, 38, 0.3)'\n }}\n title=\"Apply all marked redactions permanently\"\n >\n <ShieldCheck size={16} />\n Apply Redactions ({pendingRedactionsCount})\n </button>\n\n <button\n onClick={handleDiscardAllRedactions}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n backgroundColor: '#ffffff',\n color: '#dc2626',\n border: '1px solid #fca5a5',\n borderRadius: '6px',\n padding: '5px 12px',\n fontSize: '12px',\n fontWeight: 600,\n cursor: 'pointer'\n }}\n title=\"Discard all pending unapplied redactions\"\n >\n <Trash2 size={14} color=\"#dc2626\" />\n Discard Redactions\n </button>\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* Commit Redactions Confirmation Modal */}\n {isCommitModalOpen && (\n <div style={{\n position: 'fixed',\n top: 0, left: 0, right: 0, bottom: 0,\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 9999\n }}>\n <div style={{\n backgroundColor: '#ffffff',\n borderRadius: '12px',\n padding: '24px',\n width: '460px',\n maxWidth: '90vw',\n boxShadow: '0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)'\n }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '12px', marginBottom: '16px' }}>\n <div style={{ width: '40px', height: '40px', borderRadius: '50%', backgroundColor: '#fee2e2', display: 'flex', alignItems: 'center', justifyContent: 'center', color: '#dc2626' }}>\n <ShieldCheck size={24} />\n </div>\n <div>\n <h3 style={{ margin: 0, fontSize: '16px', fontWeight: 600, color: '#111827' }}>Apply Redactions?</h3>\n <p style={{ margin: 0, fontSize: '13px', color: '#6b7280' }}>Permanent content removal</p>\n </div>\n </div>\n <p style={{ fontSize: '14px', color: '#374151', lineHeight: '1.5', marginBottom: '20px' }}>\n You are about to permanently apply <strong>{pendingRedactionsCount} redaction(s)</strong>. Marked areas will be blacked out and underlying text will be permanently removed. This action cannot be undone.\n </p>\n <div style={{ display: 'flex', justifyContent: 'flex-end', gap: '8px' }}>\n <button\n onClick={() => setIsCommitModalOpen(false)}\n style={{\n padding: '8px 14px',\n borderRadius: '6px',\n border: '1px solid #d1d5db',\n backgroundColor: '#ffffff',\n color: '#374151',\n fontSize: '13px',\n fontWeight: 500,\n cursor: 'pointer'\n }}\n >\n Cancel\n </button>\n <button\n onClick={() => {\n handleDiscardAllRedactions();\n setIsCommitModalOpen(false);\n }}\n style={{\n padding: '8px 14px',\n borderRadius: '6px',\n border: '1px solid #fca5a5',\n backgroundColor: '#fef2f2',\n color: '#dc2626',\n fontSize: '13px',\n fontWeight: 600,\n cursor: 'pointer'\n }}\n >\n Discard Redactions\n </button>\n <button\n onClick={() => {\n const nextManual: Redaction[] = manualRedactions.map(r => ({ ...r, status: 'applied' }));\n const nextAuto: Redaction[] = autoRedactions.map(r => ({ ...r, status: 'applied' }));\n const nextProp: Redaction[] = (redactions || []).map(r => ({ ...r, status: 'applied' }));\n const appliedList: Redaction[] = [...nextProp, ...nextAuto, ...nextManual].filter(r => r.status === 'applied');\n setManualRedactions(nextManual);\n setAutoRedactions(nextAuto);\n setIsCommitModalOpen(false);\n callbacksRef.current.onRedactionsApplied?.(appliedList);\n }}\n style={{\n padding: '8px 14px',\n borderRadius: '6px',\n border: 'none',\n backgroundColor: '#dc2626',\n color: '#ffffff',\n fontSize: '13px',\n fontWeight: 600,\n cursor: 'pointer'\n }}\n >\n Apply Redactions\n </button>\n </div>\n </div>\n </div>\n )}\n\n\n\n {/* Main Canvas / Compare Viewport Area */}\n <div style={{ flex: 1, display: 'flex', flexDirection: 'row', minWidth: 0, minHeight: 0, width: '100%', height: '100%', overflow: 'hidden', position: 'relative' }}>\n {compareState.isActive && compareState.mode === 'side-by-side' ? (\n <SideBySideViewer\n pdfDocA={pdfDoc}\n pdfDocB={pdfDocB}\n pageNum={pageNum}\n scale={scale}\n rotation={rotation}\n basePageDims={dimsFor(pageNum)}\n activeTab={activeTab}\n activeTool={activeTool}\n annotations={annotations}\n permissions={permissions}\n watermark={watermark}\n watermarkText={watermarkText}\n redactions={combinedRedactions}\n diffsA={compareState.pageDiffsA?.[pageNum] || []}\n diffsB={compareState.pageDiffsB?.[pageNum] || []}\n selectedDiffId={compareState.diffItems[compareState.currentDiffIndex]?.id}\n onSelectDiff={(id) => {\n const idx = compareState.diffItems.findIndex(d => d.id === id);\n if (idx !== -1) handleSelectDiff(idx);\n }}\n />\n ) : (\n <>\n {activeTool === 'highlight' && (\n <style>{`\n .pdf-viewer-area, .pdf-viewer-area * {\n cursor: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PHBhdGggZD0iTTkgMTFsLTYgNnYzaDlsMy0zIi8+PHBhdGggZD0iTTIyIDEybC00LjYgNC42YTIgMiAwIDAgMS0yLjggMGwtNS4yLTUuMmEyIDIgMCAwIDEgMC0yLjhMMTQgNCIvPjwvc3ZnPg==') 0 24, auto !important;\n }\n `}</style>\n )}\n <div \n className=\"pdf-viewer-area\"\n style={{ \n flex: 1, \n display: 'flex',\n flexDirection: 'column',\n minWidth: 0,\n minHeight: 0,\n overflow: 'hidden', \n position: 'relative', \n backgroundColor: 'var(--bg-color)', \n cursor: isPanning ? 'grabbing' : (activeTool === 'pan' ? 'grab' : (activeTool === 'eraser' ? 'cell' : (activeTool === 'select' || activeTool === null ? 'default' : 'crosshair'))) \n }}\n onMouseMove={(e) => {\n if (isPanning && panStartRef.current && containerRef.current) {\n const dx = e.clientX - panStartRef.current.x;\n const dy = e.clientY - panStartRef.current.y;\n containerRef.current.scrollLeft = panStartRef.current.scrollLeft - dx;\n containerRef.current.scrollTop = panStartRef.current.scrollTop - dy;\n }\n }}\n onMouseLeave={() => {\n if (isPanning) {\n setIsPanning(false);\n panStartRef.current = null;\n }\n }}\n >\n <div \n ref={containerRef}\n onScroll={handleScroll}\n onMouseDown={(e) => {\n if (activeTool === 'pan') {\n if (e.button === 0) {\n setIsPanning(true);\n panStartRef.current = {\n x: e.clientX,\n y: e.clientY,\n scrollLeft: e.currentTarget.scrollLeft,\n scrollTop: e.currentTarget.scrollTop\n };\n }\n }\n }}\n onMouseUp={(_e) => {\n if (isPanning) {\n setIsPanning(false);\n panStartRef.current = null;\n }\n }}\n onContextMenu={(e) => {\n const hasTextSelection = Boolean(typeof window !== 'undefined' && window.getSelection()?.toString().trim());\n if (hasTextSelection) {\n // Allow native browser context menu on selected text (Copy, Search, etc.)\n return;\n }\n // Prevent default browser context menu on canvas\n e.preventDefault();\n e.stopPropagation();\n }}\n style={{ \n width: '100%', \n height: '100%', \n overflow: 'auto',\n position: 'relative'\n }}\n >\n {(() => {\n const renderRow = (row: number[], rIndex: number, isContinuous: boolean) => {\n const rTop = isContinuous ? (rowLayout.tops[rIndex] ?? 0) : 0;\n \n // Virtualization filtering (only for continuous)\n if (isContinuous && containerRef.current) {\n // Scale-aware virtualization buffer: at high zoom levels each page is enormous,\n // so a smaller row buffer prevents mounting excessive gigantic canvas elements in DOM.\n const bufferBefore = scale >= 4 ? 1 : scale >= 2 ? 2 : 4;\n const bufferAfter = scale >= 4 ? 1 : scale >= 2 ? 2 : 5;\n if (rIndex < visibleRowRef.current - bufferBefore || rIndex > visibleRowRef.current + bufferAfter) {\n return null;\n }\n }\n\n // Synthesize live drawing annotation if applicable\n const liveAnn = (isDrawing && activeDrawingPageNum && activeTool && activeTool !== 'eraser') ? (() => {\n if (activeTool === 'freehand') {\n return {\n id: 'temp-live-drawing', type: 'freehand' as const, pageIndex: activeDrawingPageNum,\n x: 0, y: 0, width: 0, height: 0, points: freehandPoints,\n color: currentColor, strokeWidth: currentStrokeWidth, opacity: currentOpacity\n };\n } else if (['highlight', 'underline', 'strikeout', 'squiggly'].includes(activeTool)) {\n let width = Math.abs(currentPos.x - startPos.x);\n let height = Math.abs(currentPos.y - startPos.y);\n let x = Math.min(startPos.x, currentPos.x);\n let y = Math.min(startPos.y, currentPos.y);\n if (height < 18) {\n height = Math.max(18, height);\n y = startPos.y - 9;\n }\n return {\n id: 'temp-live-drawing', type: activeTool as any, pageIndex: activeDrawingPageNum,\n x, y, width, height,\n color: currentColor, strokeWidth: currentStrokeWidth, opacity: activeTool === 'highlight' ? currentOpacity : 1\n };\n } else if (activeTool === 'redaction') {\n let width = Math.abs(currentPos.x - startPos.x);\n let height = Math.abs(currentPos.y - startPos.y);\n let x = Math.min(startPos.x, currentPos.x);\n let y = Math.min(startPos.y, currentPos.y);\n if (height < 18) {\n height = Math.max(18, height);\n y = startPos.y - 9;\n }\n return {\n id: 'temp-live-drawing', type: 'rectangle' as const, pageIndex: activeDrawingPageNum,\n x, y, width, height,\n color: '#000000', strokeWidth: 1, opacity: 0.7\n };\n } else if (['line', 'arrow', 'callout', 'rectangle', 'ellipse', 'link'].includes(activeTool as string)) {\n const width = Math.abs(currentPos.x - startPos.x);\n const height = Math.abs(currentPos.y - startPos.y);\n const x = Math.min(startPos.x, currentPos.x);\n const y = Math.min(startPos.y, currentPos.y);\n const points = (activeTool === 'line' || activeTool === 'arrow' || activeTool === 'callout') ? [startPos, currentPos] : undefined;\n return {\n id: 'temp-live-drawing', type: activeTool as any, pageIndex: activeDrawingPageNum,\n x, y, width, height, points,\n color: currentColor, strokeWidth: currentStrokeWidth, opacity: currentOpacity\n };\n }\n })() : null;\n\n return row.map((p, pIdx) => {\n let pLeft: number | undefined = undefined;\n const cW = containerDimensions.width || containerRef.current?.clientWidth || 0;\n const cH = containerDimensions.height || containerRef.current?.clientHeight || 0;\n const pageDim = dimsFor(p);\n const firstWidth = dimsFor(row[0]).width * scale;\n const thisWidth = pageDim.width * scale;\n if (row.length === 2) {\n if (pIdx === 0) pLeft = Math.max(0, cW / 2 - firstWidth);\n if (pIdx === 1) pLeft = Math.max(firstWidth, cW / 2);\n } else {\n pLeft = Math.max(0, cW / 2 - thisWidth / 2);\n }\n \n const displayAnns = annotations.map(a => (liveResizingAnn && a.id === liveResizingAnn.id ? liveResizingAnn : (liveMovingAnn && a.id === liveMovingAnn.id ? liveMovingAnn : a)));\n const pageAnnotations = (liveAnn && liveAnn.pageIndex === p) ? [...displayAnns, liveAnn] : displayAnns;\n\n return (\n <React.Fragment key={p}>\n <PageRenderer \n pageNum={p}\n pdfDoc={pdfDoc!}\n scale={scale}\n rotation={rotation}\n containerWidth={cW}\n containerHeight={cH}\n scrollTop={scrollPos.top}\n scrollLeft={scrollPos.left}\n pageTop={rTop}\n pageLeft={pLeft}\n basePageWidth={pageDim.width}\n basePageHeight={pageDim.height}\n activeTab={activeTab}\n activeTool={activeTool}\n annotations={pageAnnotations}\n transientHighlights={transientHighlights?.filter(h => h.pageIndex === p) || []}\n selectedAnnotationId={selectedAnnotationId}\n activeSearchResult={activeSearchResult}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n onAnnotationClick={handleEraserClick}\n onAnnotationDoubleClick={handleAnnotationDoubleClick}\n onStartResize={handleStartResize}\n onStartMove={handleStartMove}\n onAnnotationMouseEnter={handleEraserMove}\n onClearSelection={() => {\n if (justCreatedLinkRef.current || isLinkModalOpen) {\n justCreatedLinkRef.current = false;\n return;\n }\n setSelectedAnnotationId(null);\n setContextMenuPos(null);\n }}\n watermark={watermark}\n watermarkText={watermarkText}\n redactions={combinedRedactions}\n onDiscardRedaction={handleDiscardRedaction}\n onRendered={handlePageRendered}\n hideAnnotationsUntilPageRendered={hideAnnotationsUntilPageRendered}\n onLinkClick={handleLinkClick}\n />\n {compareState.isActive && compareState.mode === 'overlay' && pdfDocB && (\n <div style={{\n position: 'absolute',\n top: `${rTop}px`,\n left: pLeft !== undefined ? `${pLeft}px` : '0px',\n width: `${pageDim.width * scale}px`,\n height: `${pageDim.height * scale}px`,\n pointerEvents: 'none',\n mixBlendMode: compareState.blendMode as any,\n opacity: compareState.opacityB,\n zIndex: 12,\n filter: 'contrast(1.2) brightness(0.95)'\n }}>\n <PageRenderer \n pageNum={p}\n pdfDoc={pdfDocB}\n scale={scale}\n rotation={rotation}\n containerWidth={cW}\n containerHeight={cH}\n scrollTop={scrollPos.top}\n scrollLeft={scrollPos.left}\n pageTop={0}\n pageLeft={0}\n basePageWidth={pageDim.width}\n basePageHeight={pageDim.height}\n activeTab={activeTab}\n activeTool={null}\n annotations={[]}\n selectedAnnotationId={null}\n activeSearchResult={null}\n onMouseDown={() => {}}\n onMouseMove={() => {}}\n onMouseUp={() => {}}\n onAnnotationClick={() => {}}\n onAnnotationMouseEnter={() => {}}\n onClearSelection={() => {}}\n />\n </div>\n )}\n {compareState.isActive && (\n <div style={{\n position: 'absolute',\n top: `${rTop}px`,\n left: pLeft !== undefined ? `${pLeft}px` : '0px',\n width: `${pageDim.width * scale}px`,\n height: `${pageDim.height * scale}px`,\n pointerEvents: 'none',\n zIndex: 16\n }}>\n <DiffHighlightOverlay\n boxes={[\n ...(compareState.pageDiffsA?.[p] || []),\n ...(compareState.pageDiffsB?.[p] || [])\n ]}\n scale={scale}\n selectedDiffId={compareState.diffItems[compareState.currentDiffIndex]?.id}\n onSelectDiff={(id) => {\n const idx = compareState.diffItems.findIndex(d => d.id === id);\n if (idx !== -1) handleSelectDiff(idx);\n }}\n />\n </div>\n )}\n {activeTextEditor && activeTextEditor.pageIndex === p && (() => {\n const unW = rotation % 180 === 0 ? pageDim.width : pageDim.height;\n const unH = rotation % 180 === 0 ? pageDim.height : pageDim.width;\n const rotEditorPos = convertToRotated(activeTextEditor.x, activeTextEditor.y, rotation, unW, unH);\n return (\n <div style={{\n position: 'absolute',\n left: `${(pLeft || 0) + rotEditorPos.x * scale}px`,\n top: `${rTop + rotEditorPos.y * scale}px`,\n zIndex: 50,\n backgroundColor: '#fff',\n boxShadow: '0 2px 8px rgba(0,0,0,0.2)',\n borderRadius: '4px',\n display: 'flex',\n flexDirection: 'column'\n }}>\n <textarea\n ref={textareaRef}\n value={currentText}\n onChange={e => setCurrentText(e.target.value)}\n onBlur={(e) => {\n // Only commit on blur if we are not clicking inside the editor container\n if (!e.currentTarget.parentElement?.contains(e.relatedTarget as Node)) {\n commitTextAnnotation();\n }\n }}\n onKeyDown={e => { if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); commitTextAnnotation(); } }}\n style={{\n backgroundColor: 'transparent',\n border: 'none',\n color: currentColor,\n fontSize: '16px',\n fontFamily: 'sans-serif',\n minWidth: '150px',\n minHeight: '40px',\n outline: 'none',\n resize: 'both',\n padding: '8px'\n }}\n placeholder={activeTextEditor.type === 'note' ? \"Note text...\" : \"Type text...\"}\n autoFocus\n />\n <div style={{ display: 'flex', justifyContent: 'flex-end', padding: '4px 8px', borderTop: '1px solid #eee' }}>\n <button \n onMouseDown={(e) => { e.preventDefault(); commitTextAnnotation(); }}\n style={{ padding: '4px 12px', background: 'var(--primary)', color: '#fff', border: 'none', borderRadius: '4px', cursor: 'pointer', fontSize: '12px' }}\n >\n Save\n </button>\n </div>\n </div>\n );\n })()}\n </React.Fragment>\n );\n });\n };\n\n if (pageTransition === 'continuous') {\n return (\n <div style={{ \n position: 'relative', width: '100%', height: `${rowLayout.total}px`\n }}>\n {rows.map((row, rIndex) => renderRow(row, rIndex, true))}\n </div>\n );\n } else {\n const currentRowIndex = Math.max(0, rows.findIndex(row => row.includes(pageNum)));\n const currentRow = rows[currentRowIndex] || [];\n return (\n <div style={{ \n position: 'relative', width: '100%', minHeight: `${rowLayout.heights[currentRowIndex] ?? 0}px`\n }}>\n {renderRow(currentRow, currentRowIndex, false)}\n </div>\n );\n }\n })()}\n </div>\n \n {/* Pagination Controls for Page-By-Page */}\n {pageTransition === 'page-by-page' && pdfDoc && (\n <div style={{\n position: 'absolute',\n bottom: '16px',\n left: '50%',\n transform: 'translateX(-50%)',\n display: 'flex',\n alignItems: 'center',\n gap: '16px',\n backgroundColor: 'rgba(30, 30, 30, 0.8)',\n padding: '8px 16px',\n borderRadius: '24px',\n color: '#fff',\n zIndex: 100,\n boxShadow: '0 4px 12px rgba(0,0,0,0.15)'\n }}>\n <button \n onClick={() => setPageNum(Math.max(1, pageNum - 1))}\n disabled={pageNum <= 1}\n style={{ background: 'none', border: 'none', color: pageNum <= 1 ? '#888' : '#fff', cursor: pageNum <= 1 ? 'default' : 'pointer', display: 'flex', alignItems: 'center' }}\n >\n <ChevronLeft size={20} />\n </button>\n <span style={{ fontSize: '13px', fontWeight: 500 }}>\n Page {pageNum} of {pdfDoc.numPages}\n </span>\n <button \n onClick={() => setPageNum(Math.min(pdfDoc.numPages, pageNum + 1))}\n disabled={pageNum >= pdfDoc.numPages}\n style={{ background: 'none', border: 'none', color: pageNum >= pdfDoc.numPages ? '#888' : '#fff', cursor: pageNum >= pdfDoc.numPages ? 'default' : 'pointer', display: 'flex', alignItems: 'center' }}\n >\n <ChevronRight size={20} />\n </button>\n </div>\n )}\n \n {/* Modals and Overlays */} \n {!pdfDoc && (\n <div style={{\n position: 'absolute',\n top: 0, left: 0, right: 0, bottom: 0,\n display: 'flex',\n flexDirection: 'column',\n gap: '8px',\n alignItems: 'center',\n justifyContent: 'center',\n color: 'var(--text-muted)',\n padding: '24px',\n textAlign: 'center'\n }}>\n {loadError ? (\n <>\n <div style={{ fontWeight: 600, color: 'var(--text-color)' }}>\n {loadError.name === 'PasswordException' ? 'This document is password protected.' : 'The document could not be loaded.'}\n </div>\n <div style={{ fontSize: '12px', maxWidth: '480px', wordBreak: 'break-word' }}>{loadError.message}</div>\n </>\n ) : initialDoc ? 'Loading document…' : 'No document loaded.'}\n </div>\n )}\n\n {/* Pagination Floating Overlay (positioned within the viewer, not the window) */}\n {pdfDoc && (\n <div style={{\n position: 'absolute',\n bottom: '24px',\n left: '50%',\n transform: 'translateX(-50%)',\n backgroundColor: 'rgba(0, 0, 0, 0.75)',\n color: 'white',\n padding: '8px 16px',\n borderRadius: '24px',\n display: 'flex',\n alignItems: 'center',\n gap: '16px',\n zIndex: 100,\n boxShadow: '0 4px 12px rgba(0,0,0,0.2)',\n backdropFilter: 'blur(4px)'\n }}>\n <button \n onClick={() => scrollToPage(Math.max(1, pageNum - 1))}\n disabled={pageNum <= 1}\n style={{ background: 'none', border: 'none', color: pageNum <= 1 ? 'rgba(255,255,255,0.3)' : 'white', cursor: pageNum <= 1 ? 'default' : 'pointer', display: 'flex', padding: 0 }}\n >\n <ChevronLeft size={20} />\n </button>\n <span style={{ fontSize: '13px', fontWeight: 500, minWidth: '80px', textAlign: 'center' }}>\n Page {pageNum} / {pdfDoc.numPages}\n </span>\n <button \n onClick={() => scrollToPage(Math.min(pdfDoc.numPages, pageNum + 1))}\n disabled={pageNum >= pdfDoc.numPages}\n style={{ background: 'none', border: 'none', color: pageNum >= pdfDoc.numPages ? 'rgba(255,255,255,0.3)' : 'white', cursor: pageNum >= pdfDoc.numPages ? 'default' : 'pointer', display: 'flex', padding: 0 }}\n >\n <ChevronRight size={20} />\n </button>\n </div>\n )}\n \n {/* Annotation Context Menu */}\n {selectedAnnotationId && contextMenuPos && (\n <AnnotationContextMenu\n annotation={annotations.find(a => a.id === selectedAnnotationId)!}\n position={contextMenuPos}\n onCopy={() => {\n const annToCopy = annotations.find(a => a.id === selectedAnnotationId);\n if (annToCopy) {\n const newAnn = { ...annToCopy, id: newAnnotationId(), author: undefined, authorId: undefined, createdAt: undefined, modifiedAt: undefined, readOnly: undefined, xfdfExtras: undefined, x: annToCopy.x + 20, y: annToCopy.y + 20 };\n commitAnnotations([...annotations, newAnn]);\n }\n setSelectedAnnotationId(null);\n setContextMenuPos(null);\n }}\n onDelete={() => {\n commitAnnotations(annotations.filter(a => a.id !== selectedAnnotationId));\n setSelectedAnnotationId(null);\n setContextMenuPos(null);\n }}\n onUpdateColor={(color: string) => {\n commitAnnotations(annotations.map(a => a.id === selectedAnnotationId ? { ...a, color } : a));\n }}\n onOpenLinkModal={() => {\n setIsLinkModalOpen(true);\n setContextMenuPos(null);\n }}\n permissions={permissions}\n />\n )}\n {compareState.isActive && compareState.showCurtain && (\n <CompareCurtainSlider\n positionPercent={compareState.curtainPosition}\n onChangePosition={(pos) => setCompareState(prev => ({ ...prev, curtainPosition: pos }))}\n containerRef={containerRef}\n />\n )}\n {enableTextSelection !== false && showSelectionTooltip !== false && (\n <TextSelectionTooltip\n containerRef={containerRef}\n onCopy={(text) => bus.emit('action-text-copied', { text })}\n onAnnotateSelection={handleAnnotateSelection}\n />\n )}\n </div>\n </>\n )}\n\n {compareState.isActive && (\n <DiffSummarySidebar\n isOpen={isDiffSidebarOpen}\n onClose={() => setIsDiffSidebarOpen(false)}\n diffItems={compareState.diffItems}\n textDiffs={textDiffs}\n currentDiffIndex={compareState.currentDiffIndex}\n onSelectDiff={(idx, item) => handleSelectDiff(idx, item)}\n onJumpToPage={(p) => scrollToPage(p)}\n />\n )}\n </div>\n </div>\n \n {isLinkModalOpen && selectedAnnotationId && (\n <InsertLinkModal\n initialUrl={annotations.find(a => a.id === selectedAnnotationId)?.linkUrl || ''}\n initialText={annotations.find(a => a.id === selectedAnnotationId)?.text || ''}\n showTextInput={!annotations.find(a => a.id === selectedAnnotationId)?.width || annotations.find(a => a.id === selectedAnnotationId)?.text === '' || annotations.find(a => a.id === selectedAnnotationId)?.text !== undefined}\n onClose={() => {\n const ann = annotations.find(a => a.id === selectedAnnotationId);\n if (ann && !ann.linkUrl) {\n commitAnnotations(annotations.filter(a => a.id !== selectedAnnotationId));\n }\n setIsLinkModalOpen(false);\n setSelectedAnnotationId(null);\n }}\n onSave={(url, text) => {\n commitAnnotations(annotations.map(a => {\n if (a.id === selectedAnnotationId) {\n const newText = text !== undefined ? text : a.text;\n const newWidth = newText ? Math.max(100, newText.length * 8 + 20) : a.width;\n return { ...a, linkUrl: url, text: newText, width: newWidth };\n }\n return a;\n }));\n setIsLinkModalOpen(false);\n setSelectedAnnotationId(null);\n }}\n />\n )}\n {sidebars && (\n <Sidebar\n isOpen={rightSidebarOpen}\n activeTab={sidebarTab}\n setActiveTab={setSidebarTab}\n annotations={annotations}\n setAnnotations={commitAnnotations}\n selectedAnnotationId={selectedAnnotationId}\n setSelectedAnnotationId={setSelectedAnnotationId}\n onSearch={search}\n searchResults={searchResults}\n isSearching={isSearching}\n searchProgress={searchProgress}\n onResultClick={handleSearchResultClick}\n onLinkClick={handleLinkClick}\n />\n )}\n </div>\n );\n}\n\nfunction ToolButton({ icon, active, onClick, label, disabled }: { icon: React.ReactNode, active?: boolean, onClick: () => void, label: string, disabled?: boolean }) {\n return (\n <button\n onClick={disabled ? undefined : onClick}\n title={label}\n disabled={disabled}\n style={{\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n width: '28px', height: '28px', border: 'none', borderRadius: '4px',\n backgroundColor: active ? '#e6f0fa' : 'transparent',\n color: active ? 'var(--primary)' : 'var(--text-color)',\n cursor: disabled ? 'not-allowed' : 'pointer',\n opacity: disabled ? 0.38 : 1,\n pointerEvents: disabled ? 'none' : 'auto'\n }}\n onMouseEnter={e => { if (!active && !disabled) e.currentTarget.style.backgroundColor = '#f3f4f6'; }}\n onMouseLeave={e => { if (!active && !disabled) e.currentTarget.style.backgroundColor = 'transparent'; }}\n >\n {icon}\n </button>\n );\n}\n\nfunction SquigglyIcon({ size = 16 }: { size?: number }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M4 8v5a4 4 0 0 0 8 0V8\" />\n <path d=\"M4 19c1.5-1.5 2.5-1.5 4 0s2.5 1.5 4 0 2.5-1.5 4 0 2.5 1.5 4 0\" />\n </svg>\n );\n}\n\n\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\nimport React, { useState, useMemo } from 'react';\nimport { X, Edit2, Search, RotateCcw, Check } from 'lucide-react';\nimport { useShortcuts, parseCommandString } from '../hooks/useShortcuts';\nimport type { ActionType, Shortcut } from '../hooks/useShortcuts';\n\ninterface SettingsModalProps {\n onClose: () => void;\n watermarkText: string;\n setWatermarkText: (text: string) => void;\n}\n\nexport default function SettingsModal({ onClose, watermarkText, setWatermarkText }: SettingsModalProps) {\n const { shortcuts, updateShortcut, resetShortcuts } = useShortcuts();\n const [activeTab, setActiveTab] = useState<'General' | 'Keyboard Shortcuts'>('Keyboard Shortcuts');\n const [editingAction, setEditingAction] = useState<ActionType | null>(null);\n const [searchQuery, setSearchQuery] = useState('');\n\n const handleKeyDown = (e: React.KeyboardEvent, action: ActionType) => {\n e.preventDefault();\n e.stopPropagation();\n\n // Escape cancels editing\n if (e.key === 'Escape') {\n setEditingAction(null);\n return;\n }\n\n // Ignore standalone modifier keys\n if (['Meta', 'Control', 'Shift', 'Alt'].includes(e.key)) return;\n\n const parts: string[] = [];\n if (e.metaKey || e.ctrlKey) parts.push('Meta');\n if (e.shiftKey) parts.push('Shift');\n if (e.altKey) parts.push('Alt');\n\n let key = e.key;\n if (key === ' ') key = 'Space';\n if (key === 'Backspace' || key === 'Delete') {\n key = 'Delete';\n } else if (e.shiftKey && (key === '+' || e.code === 'Equal')) {\n key = '=';\n } else if (e.shiftKey && (key === '_' || e.code === 'Minus')) {\n key = '-';\n } else if (key.length === 1) {\n key = key.toUpperCase();\n }\n\n parts.push(key);\n const internalCommand = parts.join('+');\n\n updateShortcut(action, internalCommand);\n setEditingAction(null);\n };\n\n const renderCommandBadges = (cmd: string) => {\n if (!cmd) return <span style={{ color: '#9ca3af', fontStyle: 'italic', fontSize: '13px' }}>None</span>;\n const parsed = parseCommandString(cmd);\n const isMac = typeof navigator !== 'undefined' && /mac/i.test(navigator.platform || navigator.userAgent || '');\n const tokens: string[] = [];\n\n if (parsed.meta) tokens.push(isMac ? '⌘' : 'Ctrl');\n if (parsed.alt) tokens.push(isMac ? '⌥' : 'Alt');\n if (parsed.shift) tokens.push(isMac ? '⇧' : 'Shift');\n if (parsed.key) {\n let k = parsed.key.toUpperCase();\n if (k === 'DELETE') k = isMac ? '⌫ Delete' : 'Del';\n tokens.push(k);\n }\n\n return (\n <div style={{ display: 'flex', gap: '4px', alignItems: 'center', flexWrap: 'wrap' }}>\n {tokens.map((t, idx) => (\n <kbd\n key={idx}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '3px 7px',\n fontSize: '11.5px',\n fontFamily: 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace',\n fontWeight: 600,\n color: '#1f2937',\n backgroundColor: '#f3f4f6',\n border: '1px solid #d1d5db',\n borderRadius: '4px',\n boxShadow: '0 1px 1px rgba(0,0,0,0.06)',\n minWidth: '20px',\n textAlign: 'center',\n }}\n >\n {t}\n </kbd>\n ))}\n </div>\n );\n };\n\n const query = searchQuery.trim().toLowerCase();\n\n const filteredShortcuts = useMemo(() => {\n if (!query) return shortcuts;\n return shortcuts.filter((s: Shortcut) => {\n const descMatch = s.description.toLowerCase().includes(query);\n const actionMatch = s.action.toLowerCase().includes(query);\n const cmdMatch = s.command.toLowerCase().includes(query);\n return descMatch || actionMatch || cmdMatch;\n });\n }, [shortcuts, query]);\n\n const generalMatches = useMemo(() => {\n if (!query) return true;\n return 'forensic watermark persistent diagonal text overlay'.toLowerCase().includes(query) ||\n Boolean(watermarkText && watermarkText.toLowerCase().includes(query));\n }, [query, watermarkText]);\n\n return (\n <div style={{ position: 'fixed', top: 0, left: 0, width: '100%', height: '100%', backgroundColor: 'rgba(0,0,0,0.5)', zIndex: 1000, display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n <div style={{ backgroundColor: '#fff', borderRadius: '8px', width: '800px', height: '620px', maxWidth: '92vw', maxHeight: '92vh', display: 'flex', flexDirection: 'column', boxShadow: '0 10px 25px rgba(0,0,0,0.2)', overflow: 'hidden' }}>\n \n {/* Header */}\n <div style={{ padding: '16px 24px', borderBottom: '1px solid var(--border-color)', display: 'flex', justifyContent: 'space-between', alignItems: 'center', backgroundColor: '#fff' }}>\n <h2 style={{ margin: 0, fontSize: '18px', fontWeight: 600, color: 'var(--text-color)' }}>Settings</h2>\n <button onClick={onClose} style={{ background: 'none', border: 'none', cursor: 'pointer', color: 'var(--text-muted)', display: 'flex', padding: '4px' }}>\n <X size={20} />\n </button>\n </div>\n\n {/* Search Bar */}\n <div style={{ padding: '12px 24px', borderBottom: '1px solid var(--border-color)', backgroundColor: '#fafafa' }}>\n <div style={{ position: 'relative' }}>\n <Search size={16} color=\"var(--text-muted)\" style={{ position: 'absolute', left: '12px', top: '50%', transform: 'translateY(-50%)' }} />\n <input \n type=\"text\" \n placeholder=\"Search shortcuts & settings...\" \n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n style={{\n width: '100%',\n padding: '9px 36px 9px 36px',\n border: '1px solid var(--border-color)',\n borderRadius: '6px',\n fontSize: '13px',\n boxSizing: 'border-box',\n outline: 'none',\n backgroundColor: '#fff',\n }}\n />\n {searchQuery && (\n <button\n onClick={() => setSearchQuery('')}\n style={{\n position: 'absolute', right: '10px', top: '50%', transform: 'translateY(-50%)',\n background: 'none', border: 'none', cursor: 'pointer', color: 'var(--text-muted)', display: 'flex', padding: 0\n }}\n title=\"Clear search\"\n >\n <X size={15} />\n </button>\n )}\n </div>\n </div>\n\n {/* Content */}\n <div style={{ display: 'flex', flex: 1, overflow: 'hidden' }}>\n {/* Sidebar Tabs */}\n <div style={{ width: '200px', borderRight: '1px solid var(--border-color)', backgroundColor: '#f9fafb', display: 'flex', flexDirection: 'column' }}>\n {(['General', 'Keyboard Shortcuts'] as const).map(tab => {\n const badgeCount = tab === 'Keyboard Shortcuts' ? (query ? filteredShortcuts.length : null) : (query && generalMatches ? 1 : null);\n return (\n <div \n key={tab}\n onClick={() => setActiveTab(tab)}\n style={{ \n padding: '12px 20px', \n cursor: 'pointer', \n backgroundColor: activeTab === tab ? '#eef2ff' : 'transparent', \n color: activeTab === tab ? 'var(--primary)' : 'var(--text-color)', \n fontWeight: activeTab === tab ? 600 : 400,\n fontSize: '13.5px',\n borderLeft: activeTab === tab ? '3px solid var(--primary)' : '3px solid transparent',\n transition: 'all 0.15s ease',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center'\n }}\n >\n <span>{tab}</span>\n {badgeCount !== null && (\n <span style={{\n fontSize: '11px',\n padding: '1px 6px',\n borderRadius: '10px',\n backgroundColor: activeTab === tab ? 'var(--primary)' : '#e5e7eb',\n color: activeTab === tab ? '#fff' : '#4b5563',\n fontWeight: 600\n }}>\n {badgeCount}\n </span>\n )}\n </div>\n );\n })}\n </div>\n\n {/* Main Area */}\n <div style={{ flex: 1, overflowY: 'auto', padding: '24px' }}>\n {activeTab === 'Keyboard Shortcuts' && (\n <div>\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: '16px' }}>\n <span style={{ fontSize: '13px', color: 'var(--text-muted)' }}>\n {query ? `${filteredShortcuts.length} of ${shortcuts.length} shortcuts` : `${shortcuts.length} shortcuts available`}\n </span>\n <button\n onClick={resetShortcuts}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n background: 'none',\n border: '1px solid var(--border-color)',\n borderRadius: '4px',\n padding: '4px 10px',\n fontSize: '12px',\n color: 'var(--text-muted)',\n cursor: 'pointer',\n }}\n title=\"Reset all shortcuts to defaults\"\n >\n <RotateCcw size={13} />\n Reset to Defaults\n </button>\n </div>\n\n {filteredShortcuts.length === 0 ? (\n <div style={{ textAlign: 'center', padding: '40px 16px', color: 'var(--text-muted)', fontSize: '13px' }}>\n <div>No shortcuts matching &ldquo;{searchQuery}&rdquo;</div>\n {generalMatches && (\n <div style={{ marginTop: '8px' }}>\n <button\n onClick={() => setActiveTab('General')}\n style={{ background: 'none', border: 'none', color: 'var(--primary)', cursor: 'pointer', fontSize: '13px', fontWeight: 500, textDecoration: 'underline' }}\n >\n Matching setting found in General tab &rarr;\n </button>\n </div>\n )}\n <button\n onClick={() => setSearchQuery('')}\n style={{ marginTop: '8px', background: 'none', border: 'none', color: 'var(--primary)', cursor: 'pointer', fontSize: '13px', fontWeight: 500 }}\n >\n Clear search\n </button>\n </div>\n ) : (\n <table style={{ width: '100%', borderCollapse: 'collapse', fontSize: '13.5px' }}>\n <thead>\n <tr style={{ borderBottom: '1px solid var(--border-color)', textAlign: 'left', color: 'var(--text-muted)', fontSize: '12px' }}>\n <th style={{ padding: '8px 12px', fontWeight: 600, width: '220px' }}>Shortcut</th>\n <th style={{ padding: '8px 12px', fontWeight: 600 }}>Description</th>\n <th style={{ padding: '8px 12px', fontWeight: 600, width: '70px', textAlign: 'center' }}>Action</th>\n </tr>\n </thead>\n <tbody>\n {filteredShortcuts.map((s: Shortcut) => (\n <tr key={s.action} style={{ borderBottom: '1px solid #f0f0f0' }}>\n <td style={{ padding: '12px 12px' }}>\n {editingAction === s.action ? (\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px' }}>\n <input \n autoFocus\n type=\"text\"\n placeholder=\"Press key combo...\"\n onKeyDown={(e) => handleKeyDown(e, s.action)}\n onBlur={() => setEditingAction(null)}\n style={{\n padding: '5px 8px',\n width: '150px',\n border: '2px solid var(--primary)',\n borderRadius: '4px',\n outline: 'none',\n fontSize: '12px',\n backgroundColor: '#eff6ff'\n }}\n />\n <button\n onMouseDown={(e) => { e.preventDefault(); setEditingAction(null); }}\n style={{ background: 'none', border: 'none', cursor: 'pointer', color: '#9ca3af', display: 'flex', padding: '2px' }}\n title=\"Cancel\"\n >\n <X size={14} />\n </button>\n </div>\n ) : (\n renderCommandBadges(s.command)\n )}\n </td>\n <td style={{ padding: '12px 12px', color: '#374151' }}>{s.description}</td>\n <td style={{ padding: '12px 12px', textAlign: 'center' }}>\n {editingAction === s.action ? (\n <span style={{ fontSize: '11px', color: 'var(--primary)', fontWeight: 600 }}>Recording</span>\n ) : (\n <button \n onClick={() => setEditingAction(s.action)}\n style={{\n background: '#f3f4f6',\n border: '1px solid #e5e7eb',\n borderRadius: '4px',\n cursor: 'pointer',\n color: 'var(--text-muted)',\n padding: '4px 8px',\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n fontSize: '12px',\n }}\n title=\"Edit shortcut\"\n >\n <Edit2 size={13} /> Edit\n </button>\n )}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n )}\n </div>\n )}\n \n {activeTab === 'General' && (\n <div>\n {query && !generalMatches ? (\n <div style={{ textAlign: 'center', padding: '40px 16px', color: 'var(--text-muted)', fontSize: '13px' }}>\n <div>No general settings matching &ldquo;{searchQuery}&rdquo;</div>\n {filteredShortcuts.length > 0 && (\n <div style={{ marginTop: '8px' }}>\n <button\n onClick={() => setActiveTab('Keyboard Shortcuts')}\n style={{ background: 'none', border: 'none', color: 'var(--primary)', cursor: 'pointer', fontSize: '13px', fontWeight: 500, textDecoration: 'underline' }}\n >\n {filteredShortcuts.length} matching shortcut{filteredShortcuts.length > 1 ? 's' : ''} found in Keyboard Shortcuts &rarr;\n </button>\n </div>\n )}\n <button\n onClick={() => setSearchQuery('')}\n style={{ marginTop: '8px', background: 'none', border: 'none', color: 'var(--primary)', cursor: 'pointer', fontSize: '13px', fontWeight: 500 }}\n >\n Clear search\n </button>\n </div>\n ) : (\n <div style={{ marginTop: '8px' }}>\n <label style={{ display: 'block', fontSize: '14px', fontWeight: 600, color: '#1f2937', marginBottom: '4px' }}>\n Forensic Watermark\n </label>\n <div style={{ fontSize: '13px', color: 'var(--text-muted)', marginBottom: '12px' }}>\n Add a persistent, diagonal text watermark that overlays all document pages.\n </div>\n <input \n type=\"text\" \n value={watermarkText}\n onChange={(e) => setWatermarkText(e.target.value)}\n placeholder=\"Leave blank to disable watermark\"\n style={{\n width: '100%',\n padding: '9px 12px',\n border: '1px solid var(--border-color)',\n borderRadius: '6px',\n fontSize: '13.5px',\n outline: 'none',\n boxSizing: 'border-box'\n }}\n />\n {watermarkText && (\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px', marginTop: '8px', color: '#16a34a', fontSize: '12.5px' }}>\n <Check size={14} /> Watermark active: &ldquo;{watermarkText}&rdquo;\n </div>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n\n </div>\n </div>\n );\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * TeamSync PDF Viewer SDK Version.\n *\n * This version is automatically synchronized with package.json and GitHub release tags.\n * DO NOT EDIT MANUALLY.\n */\ndeclare const __APP_VERSION__: string | undefined;\n\nexport const VERSION: string =\n typeof __APP_VERSION__ !== 'undefined' ? __APP_VERSION__ : '1.8.0';\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\nimport React from 'react';\nimport { X, Info, ExternalLink } from 'lucide-react';\nimport { VERSION } from '../version';\n\ninterface AboutModalProps {\n onClose: () => void;\n}\n\nexport default function AboutModal({ onClose }: AboutModalProps) {\n const [version, setVersion] = React.useState<string>(VERSION);\n const [releaseUrl, setReleaseUrl] = React.useState<string>(\n `https://github.com/angelbot-ai/TeamSync-PDF-Viewer/releases/tag/v${VERSION}`\n );\n\n React.useEffect(() => {\n let isMounted = true;\n fetch('/api/version')\n .then((res) => {\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return res.json();\n })\n .catch(() => {\n return fetch('https://api.github.com/repos/angelbot-ai/TeamSync-PDF-Viewer/releases/latest')\n .then((res) => {\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return res.json();\n })\n .then((data) => ({\n version: data.tag_name ? data.tag_name.replace(/^v/, '') : VERSION,\n releaseUrl: data.html_url || `https://github.com/angelbot-ai/TeamSync-PDF-Viewer/releases/tag/v${VERSION}`,\n }));\n })\n .then((data) => {\n if (isMounted && data && data.version) {\n setVersion(data.version);\n if (data.releaseUrl) {\n setReleaseUrl(data.releaseUrl);\n }\n }\n })\n .catch(() => {\n // Fallback to static VERSION\n });\n\n return () => {\n isMounted = false;\n };\n }, []);\n return (\n <div style={{\n position: 'fixed', top: 0, left: 0, right: 0, bottom: 0,\n backgroundColor: 'rgba(0,0,0,0.5)', display: 'flex', alignItems: 'center', justifyContent: 'center',\n zIndex: 3000\n }}>\n <div style={{\n backgroundColor: '#fff',\n color: '#333',\n borderRadius: '8px',\n width: '500px',\n maxWidth: '90%',\n boxShadow: '0 10px 25px rgba(0,0,0,0.2)',\n fontFamily: 'sans-serif',\n overflow: 'hidden',\n display: 'flex',\n flexDirection: 'column',\n maxHeight: '90vh'\n }}>\n {/* Header */}\n <div style={{ \n padding: '16px 24px', borderBottom: '1px solid #e5e7eb', \n display: 'flex', alignItems: 'center', justifyContent: 'space-between',\n backgroundColor: '#f9fafb'\n }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n <Info size={20} color=\"#2b76b9\" />\n <h2 style={{ margin: 0, fontSize: '18px', fontWeight: 600, color: '#111827' }}>About</h2>\n </div>\n <button \n onClick={onClose}\n style={{ background: 'none', border: 'none', cursor: 'pointer', color: '#6b7280' }}\n >\n <X size={20} />\n </button>\n </div>\n\n {/* Content */}\n <div style={{ padding: '24px', overflowY: 'auto' }}>\n <div style={{ textAlign: 'center', marginBottom: '24px' }}>\n <h1 style={{ margin: '0 0 8px 0', fontSize: '24px', color: '#1f2937' }}>TeamSync PDF Viewer</h1>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '8px', margin: '4px 0 0 0' }}>\n <span style={{ fontSize: '14px', color: '#6b7280' }}>Version {version}</span>\n <a\n href={releaseUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{\n fontSize: '12px',\n color: '#2b76b9',\n textDecoration: 'none',\n display: 'inline-flex',\n alignItems: 'center',\n gap: '3px',\n padding: '2px 8px',\n borderRadius: '4px',\n backgroundColor: '#eff6ff',\n border: '1px solid #dbeafe',\n fontWeight: 500,\n }}\n title=\"View release notes on GitHub\"\n >\n <span>Release Notes</span>\n <ExternalLink size={12} />\n </a>\n </div>\n <p style={{ margin: '8px 0 0 0', fontSize: '14px', color: '#4b5563' }}>© 2026 AngelBot Ai Pvt Ltd. All rights reserved.</p>\n <a href=\"https://www.teamsync.com\" target=\"_blank\" rel=\"noopener noreferrer\" style={{ display: 'inline-block', margin: '8px 0 0 0', fontSize: '14px', color: '#2b76b9', textDecoration: 'none', fontWeight: 500 }}>www.teamsync.com</a>\n <p style={{ margin: '8px 0 0 0', fontSize: '13px', color: '#4b5563', fontStyle: 'italic' }}>\n Licensed under the Common Public Attribution License Version 1.0 (CPAL).\n </p>\n </div>\n \n <h3 style={{ fontSize: '14px', fontWeight: 600, color: '#374151', borderBottom: '1px solid #e5e7eb', paddingBottom: '8px', marginBottom: '16px' }}>Open Source Licenses & Credits</h3>\n <p style={{ fontSize: '13px', color: '#4b5563', lineHeight: 1.5, marginBottom: '16px' }}>\n This software is made possible by open source software and other third-party libraries that are distributed under their respective licenses:\n </p>\n\n <ul style={{ paddingLeft: '20px', margin: 0, fontSize: '13px', color: '#4b5563', display: 'flex', flexDirection: 'column', gap: '8px' }}>\n <li><strong>pdfjs-dist</strong>: Licensed under the Apache License 2.0. Copyright Mozilla Foundation.</li>\n <li><strong>pdf-lib</strong>: Licensed under the MIT License. Copyright Andrew Dillon.</li>\n <li><strong>react</strong> / <strong>react-dom</strong>: Licensed under the MIT License. Copyright Meta Platforms, Inc.</li>\n <li><strong>lucide-react</strong>: Licensed under the ISC License. Copyright Lucide Contributors.</li>\n <li><strong>node-forge</strong>: Licensed under the BSD-3-Clause License or GPL. Copyright Digital Bazaar, Inc.</li>\n <li><strong>vite</strong>: Licensed under the MIT License. Copyright Evan You and Vite contributors.</li>\n </ul>\n\n <div style={{ marginTop: '16px', fontSize: '13px', textAlign: 'center' }}>\n <a href=\"/ThirdPartyNotices.txt\" target=\"_blank\" rel=\"noopener noreferrer\" style={{ color: '#2b76b9', textDecoration: 'none', fontWeight: 500 }}>\n View Full License Notices\n </a>\n </div>\n </div>\n \n {/* Footer */}\n <div style={{ padding: '16px 24px', backgroundColor: '#f9fafb', borderTop: '1px solid #e5e7eb', display: 'flex', justifyContent: 'flex-end' }}>\n <button \n onClick={onClose}\n style={{ \n backgroundColor: '#2b76b9', color: '#fff', border: 'none', borderRadius: '4px',\n padding: '8px 24px', fontSize: '14px', fontWeight: 500, cursor: 'pointer'\n }}\n >\n Close\n </button>\n </div>\n </div>\n </div>\n );\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * Per-instance event bus.\n *\n * Replaces the former `window.dispatchEvent(new CustomEvent('action-*'))` plumbing so that several\n * viewer instances can coexist on one page without cross-talk, and so that `destroy()` can drop\n * every listener an instance ever registered.\n */\n\nexport type BusListener<T = unknown> = (detail: T) => void;\n\nexport class ViewerBus {\n private readonly listeners = new Map<string, Set<BusListener<any>>>();\n private destroyed = false;\n\n /** Subscribe. Returns an unsubscribe function. */\n on<T = unknown>(type: string, listener: BusListener<T>): () => void {\n if (this.destroyed) return () => {};\n let set = this.listeners.get(type);\n if (!set) {\n set = new Set();\n this.listeners.set(type, set);\n }\n set.add(listener);\n return () => this.off(type, listener);\n }\n\n /** Subscribe for a single delivery. */\n once<T = unknown>(type: string, listener: BusListener<T>): () => void {\n const off = this.on<T>(type, (detail) => {\n off();\n listener(detail);\n });\n return off;\n }\n\n off<T = unknown>(type: string, listener: BusListener<T>): void {\n const set = this.listeners.get(type);\n if (!set) return;\n set.delete(listener);\n if (set.size === 0) this.listeners.delete(type);\n }\n\n /** Dispatch synchronously to every listener. Listener errors are isolated and logged. */\n emit<T = unknown>(type: string, detail?: T): void {\n if (this.destroyed) return;\n const set = this.listeners.get(type);\n if (!set || set.size === 0) return;\n for (const listener of Array.from(set)) {\n try {\n listener(detail as T);\n } catch (err) {\n console.error(`[teamsync-pdf-viewer] listener for \"${type}\" threw`, err);\n }\n }\n }\n\n listenerCount(type?: string): number {\n if (type) return this.listeners.get(type)?.size ?? 0;\n let n = 0;\n for (const set of this.listeners.values()) n += set.size;\n return n;\n }\n\n removeAll(): void {\n this.listeners.clear();\n }\n\n /** Drop every listener and refuse further subscriptions/emissions. */\n destroy(): void {\n this.removeAll();\n this.destroyed = true;\n }\n\n get isDestroyed(): boolean {\n return this.destroyed;\n }\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * Page geometry — the single authority for converting between the viewer's \"base page space\"\n * (pdf.js viewport at scale 1 with the page's intrinsic /Rotate applied; top-left origin, points)\n * and PDF user space (bottom-left origin, as written into XFDF / drawn by pdf-lib).\n *\n * The transform replicates pdf.js `PageViewport` exactly (display_utils.js) so results are\n * identical to `viewport.convertToPdfPoint` / `convertToViewportPoint`, but it only needs the\n * page's `view` (viewBox) and `rotate`, which keeps it synchronous and unit-testable.\n */\nimport type { PDFDocumentProxy, PDFPageProxy } from 'pdfjs-dist';\nimport { normalizeRotation } from '../utils/rotationUtils';\n\nexport type Matrix = [number, number, number, number, number, number];\n\nexport interface PageGeometry {\n /** 1-based page number */\n pageNumber: number;\n /** PDF user-space bounding box [x0, y0, x1, y1] (the CropBox pdf.js renders). */\n viewBox: [number, number, number, number];\n /** Intrinsic page rotation (/Rotate), normalized to 0/90/180/270. */\n rotate: number;\n /** Base page size in points (already swapped for 90/270). */\n width: number;\n height: number;\n /** Base-space (viewer) -> PDF user-space transform is the inverse of this viewport transform. */\n transform: Matrix;\n}\n\nexport interface Rect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface Point {\n x: number;\n y: number;\n}\n\n/** PDF rectangle as XFDF writes it: [llx, lly, urx, ury]. */\nexport type PdfRect = [number, number, number, number];\n\n/** Collapse -0 to 0 so equality checks and XFDF output never see a signed zero. */\nconst z = (n: number): number => (n === 0 ? 0 : n);\n\nfunction applyTransform(p: Point, m: Matrix): Point {\n return { x: z(p.x * m[0] + p.y * m[2] + m[4]), y: z(p.x * m[1] + p.y * m[3] + m[5]) };\n}\n\nfunction applyInverseTransform(p: Point, m: Matrix): Point {\n const d = m[0] * m[3] - m[1] * m[2];\n return {\n x: z((p.x * m[3] - p.y * m[2] + m[2] * m[5] - m[4] * m[3]) / d),\n y: z((-p.x * m[1] + p.y * m[0] + m[4] * m[1] - m[5] * m[0]) / d),\n };\n}\n\n/** Build the geometry for a page from its viewBox and intrinsic rotation (mirrors pdf.js PageViewport at scale 1). */\nexport function createPageGeometry(pageNumber: number, viewBox: [number, number, number, number], rotate: number): PageGeometry {\n const rotation = normalizeRotation(rotate);\n const [x0, y0, x1, y1] = viewBox;\n const centerX = (x1 + x0) / 2;\n const centerY = (y1 + y0) / 2;\n\n let rotateA: number, rotateB: number, rotateC: number, rotateD: number;\n switch (rotation) {\n case 180: rotateA = -1; rotateB = 0; rotateC = 0; rotateD = 1; break;\n case 90: rotateA = 0; rotateB = 1; rotateC = 1; rotateD = 0; break;\n case 270: rotateA = 0; rotateB = -1; rotateC = -1; rotateD = 0; break;\n default: rotateA = 1; rotateB = 0; rotateC = 0; rotateD = -1; break;\n }\n\n let offsetCanvasX: number, offsetCanvasY: number, width: number, height: number;\n if (rotateA === 0) {\n offsetCanvasX = Math.abs(centerY - y0);\n offsetCanvasY = Math.abs(centerX - x0);\n width = Math.abs(y1 - y0);\n height = Math.abs(x1 - x0);\n } else {\n offsetCanvasX = Math.abs(centerX - x0);\n offsetCanvasY = Math.abs(centerY - y0);\n width = x1 - x0;\n height = y1 - y0;\n }\n\n const transform: Matrix = [\n rotateA, rotateB, rotateC, rotateD,\n offsetCanvasX - rotateA * centerX - rotateC * centerY,\n offsetCanvasY - rotateB * centerX - rotateD * centerY,\n ];\n\n return { pageNumber, viewBox: [x0, y0, x1, y1], rotate: rotation, width, height, transform };\n}\n\nexport function geometryFromPage(page: PDFPageProxy): PageGeometry {\n const view = page.view as number[];\n return createPageGeometry(page.pageNumber, [view[0], view[1], view[2], view[3]], page.rotate);\n}\n\n/** Small per-document cache so callers can resolve geometry for many annotations cheaply. */\nexport function createGeometryResolver(pdfDoc: PDFDocumentProxy) {\n const cache = new Map<number, Promise<PageGeometry>>();\n return (pageNumber: number): Promise<PageGeometry> => {\n const n = Math.max(1, Math.min(pdfDoc.numPages, pageNumber));\n let p = cache.get(n);\n if (!p) {\n p = pdfDoc.getPage(n).then(geometryFromPage);\n cache.set(n, p);\n }\n return p;\n };\n}\n\nexport type GeometryResolver = (pageNumber: number) => Promise<PageGeometry>;\n\n// ---- point / rect / path conversions ----------------------------------------------------------\n\nexport function toPdfPoint(g: PageGeometry, p: Point): Point {\n return applyInverseTransform(p, g.transform);\n}\n\nexport function fromPdfPoint(g: PageGeometry, p: Point): Point {\n return applyTransform(p, g.transform);\n}\n\n/** Viewer rect (top-left origin) -> PDF rect [llx, lly, urx, ury]. */\nexport function rectToPdf(g: PageGeometry, r: Rect): PdfRect {\n const a = toPdfPoint(g, { x: r.x, y: r.y });\n const b = toPdfPoint(g, { x: r.x + r.width, y: r.y + r.height });\n return [Math.min(a.x, b.x), Math.min(a.y, b.y), Math.max(a.x, b.x), Math.max(a.y, b.y)];\n}\n\n/** PDF rect [llx, lly, urx, ury] -> viewer rect (top-left origin). */\nexport function rectFromPdf(g: PageGeometry, r: PdfRect): Rect {\n const a = fromPdfPoint(g, { x: r[0], y: r[1] });\n const b = fromPdfPoint(g, { x: r[2], y: r[3] });\n const x = Math.min(a.x, b.x);\n const y = Math.min(a.y, b.y);\n return { x, y, width: Math.abs(b.x - a.x), height: Math.abs(b.y - a.y) };\n}\n\nexport function pathToPdf(g: PageGeometry, points: Point[]): Point[] {\n return points.map((p) => toPdfPoint(g, p));\n}\n\nexport function pathFromPdf(g: PageGeometry, points: Point[]): Point[] {\n return points.map((p) => fromPdfPoint(g, p));\n}\n\n/**\n * XFDF QuadPoints for a viewer rect: x1,y1 (upper-left) x2,y2 (upper-right) x3,y3 (lower-left)\n * x4,y4 (lower-right) in PDF space — the order Acrobat and Apryse write for text markup.\n */\nexport function rectToQuadPoints(g: PageGeometry, r: Rect): number[] {\n const [llx, lly, urx, ury] = rectToPdf(g, r);\n return [llx, ury, urx, ury, llx, lly, urx, lly];\n}\n\n/** Bounding viewer rect of one or more XFDF quads (8 numbers each). */\nexport function quadPointsToRects(g: PageGeometry, quads: number[]): Rect[] {\n const rects: Rect[] = [];\n for (let i = 0; i + 7 < quads.length; i += 8) {\n const xs = [quads[i], quads[i + 2], quads[i + 4], quads[i + 6]];\n const ys = [quads[i + 1], quads[i + 3], quads[i + 5], quads[i + 7]];\n rects.push(rectFromPdf(g, [Math.min(...xs), Math.min(...ys), Math.max(...xs), Math.max(...ys)]));\n }\n return rects;\n}\n\nexport function unionRects(rects: Rect[]): Rect {\n if (rects.length === 0) return { x: 0, y: 0, width: 0, height: 0 };\n const x0 = Math.min(...rects.map((r) => r.x));\n const y0 = Math.min(...rects.map((r) => r.y));\n const x1 = Math.max(...rects.map((r) => r.x + r.width));\n const y1 = Math.max(...rects.map((r) => r.y + r.height));\n return { x: x0, y: y0, width: x1 - x0, height: y1 - y0 };\n}\n\n/** Round to 3 decimals for XFDF output (Apryse writes 3, Acrobat up to 6). */\nexport const fmt = (n: number): string => (Math.round(n * 1000) / 1000).toString();\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * PDF export: bakes annotations + watermark into a copy of the source document and rasterizes\n * redacted pages so the underlying content is destroyed.\n *\n * The source bytes come from the already-loaded pdf.js document (`pdfDocument.getData()`), so the\n * export never re-fetches the URL (presigned URLs are method-bound and may have expired) and never\n * issues HEAD probes.\n *\n * Geometry: every annotation is converted from the viewer's base page space to PDF user space\n * through `annotations/geometry.ts` (the same transform pdf.js uses), so baked markup lands exactly\n * where it was drawn — on any page size, CropBox offset or intrinsic /Rotate.\n */\nimport { PDFDocument, rgb, degrees, StandardFonts, BlendMode, type PDFPage } from 'pdf-lib';\nimport * as pdfjsLib from 'pdfjs-dist';\nimport { getDocumentParams } from './pdfAssets';\nimport type { Annotation } from '../annotations/types';\nimport type { Redaction, WatermarkOptions } from './types';\nimport { createGeometryResolver, pathToPdf, rectToPdf, toPdfPoint, type GeometryResolver, type PageGeometry } from '../annotations/geometry';\n\n/** Refuse to build documents larger than this in the browser (memory safety). */\nexport const MAX_EXPORT_BYTES = 500 * 1024 * 1024;\n\nexport interface ExportInput {\n /** Returns the original document bytes (prefer `pdfDocument.getData()`). */\n getSourceBytes: () => Promise<Uint8Array | ArrayBuffer>;\n /** Page geometry resolver (from the loaded pdf.js document). Derived from the bytes when absent. */\n getPageGeometry?: GeometryResolver;\n annotations: Annotation[];\n redactions: Redaction[];\n watermark?: WatermarkOptions;\n /** Name printed on digital-signature placeholder blocks when the annotation has no signer. */\n signerName?: string;\n}\n\nexport interface ExportOptions {\n /** Bake exactly these annotations instead of the live list. */\n explicitAnnotations?: Annotation[];\n /** Accepted for API compatibility; annotations are always taken from the live list / explicitAnnotations. */\n xfdfString?: string;\n}\n\nconst hexToRgb = (hex: string | undefined) => {\n const safe = hex && /^#[0-9a-f]{6}$/i.test(hex) ? hex : '#000000';\n const r = parseInt(safe.slice(1, 3), 16) / 255;\n const g = parseInt(safe.slice(3, 5), 16) / 255;\n const b = parseInt(safe.slice(5, 7), 16) / 255;\n return rgb(r, g, b);\n};\n\nfunction wrapText(text: string, maxWidth: number, fontSize: number): string[] {\n const approxCharWidth = fontSize * 0.55;\n const maxCharsPerLine = Math.max(1, Math.floor(maxWidth / approxCharWidth));\n const paragraphs = text.split('\\n');\n const lines: string[] = [];\n\n for (const p of paragraphs) {\n if (!p) {\n lines.push('');\n continue;\n }\n const words = p.split(/\\s+/);\n let currentLine = '';\n\n for (const word of words) {\n if (!currentLine) {\n currentLine = word;\n } else if ((currentLine + ' ' + word).length <= maxCharsPerLine) {\n currentLine += ' ' + word;\n } else {\n lines.push(currentLine);\n currentLine = word;\n }\n }\n if (currentLine) {\n lines.push(currentLine);\n }\n }\n return lines;\n}\n\nasync function bakeAnnotation(pdfDoc: PDFDocument, page: PDFPage, g: PageGeometry, ann: Annotation, signerName?: string): Promise<void> {\n const color = hexToRgb(ann.color);\n const opacity = ann.opacity ?? 1;\n const strokeWidth = ann.strokeWidth || 1;\n const rect = rectToPdf(g, { x: ann.x, y: ann.y, width: ann.width, height: ann.height });\n const [llx, lly, urx, ury] = rect;\n const w = urx - llx;\n const h = ury - lly;\n // Text drawn in user space appears rotated by /Rotate in the viewer; counter-rotate so it reads\n // upright the way it was authored.\n const textRotate = degrees(g.rotate);\n const topLeftBaseline = (x: number, y: number, size: number) => toPdfPoint(g, { x, y: y + size });\n\n switch (ann.type) {\n case 'rectangle':\n page.drawRectangle({ x: llx, y: lly, width: w, height: h, color, opacity, borderColor: color, borderWidth: strokeWidth, borderOpacity: 1 });\n return;\n case 'ellipse':\n page.drawEllipse({ x: llx + w / 2, y: lly + h / 2, xScale: w / 2, yScale: h / 2, color, opacity, borderColor: color, borderWidth: strokeWidth, borderOpacity: 1 });\n return;\n case 'highlight': {\n const rects = ann.rects && ann.rects.length > 0 ? ann.rects : [{ x: ann.x, y: ann.y, width: ann.width, height: ann.height }];\n for (const r of rects) {\n const [x0, y0, x1, y1] = rectToPdf(g, r);\n page.drawRectangle({ x: x0, y: y0, width: x1 - x0, height: y1 - y0, color, opacity: opacity < 1 ? opacity : 0.5, blendMode: BlendMode.Multiply });\n }\n return;\n }\n case 'underline': {\n const rects = ann.rects && ann.rects.length > 0 ? ann.rects : [{ x: ann.x, y: ann.y, width: ann.width, height: ann.height }];\n for (const r of rects) {\n const [s, e] = pathToPdf(g, [\n { x: r.x, y: r.y + r.height - 1.5 },\n { x: r.x + r.width, y: r.y + r.height - 1.5 }\n ]);\n page.drawLine({ start: s, end: e, color, opacity, thickness: strokeWidth || 1.5 });\n }\n return;\n }\n case 'strikeout': {\n const rects = ann.rects && ann.rects.length > 0 ? ann.rects : [{ x: ann.x, y: ann.y, width: ann.width, height: ann.height }];\n for (const r of rects) {\n const [s, e] = pathToPdf(g, [\n { x: r.x, y: r.y + r.height / 2 },\n { x: r.x + r.width, y: r.y + r.height / 2 }\n ]);\n page.drawLine({ start: s, end: e, color, opacity, thickness: strokeWidth || 1.5 });\n }\n return;\n }\n case 'squiggly': {\n const rects = ann.rects && ann.rects.length > 0 ? ann.rects : [{ x: ann.x, y: ann.y, width: ann.width, height: ann.height }];\n for (const r of rects) {\n const squigglyPts = [];\n const step = 3;\n let up = true;\n for (let curX = r.x; curX <= r.x + r.width; curX += step) {\n squigglyPts.push({ x: curX, y: r.y + r.height - (up ? 3 : 1) });\n up = !up;\n }\n if (squigglyPts.length >= 2) {\n const pdfPts = pathToPdf(g, squigglyPts);\n for (let i = 1; i < pdfPts.length; i++) {\n page.drawLine({ start: pdfPts[i - 1], end: pdfPts[i], color, opacity, thickness: strokeWidth || 1.5 });\n }\n }\n }\n return;\n }\n case 'line':\n case 'arrow': {\n const pts = ann.points && ann.points.length >= 2 ? ann.points : [{ x: ann.x, y: ann.y }, { x: ann.x + ann.width, y: ann.y + ann.height }];\n const [s, e] = pathToPdf(g, [pts[0], pts[1]]);\n page.drawLine({ start: s, end: e, color, opacity, thickness: strokeWidth });\n if (ann.type === 'arrow') {\n // Arrow head computed in viewer space (same as the on-screen rendering), then converted.\n const p1 = pts[0], p2 = pts[1];\n const angle = Math.atan2(p2.y - p1.y, p2.x - p1.x);\n const headLen = 15 + strokeWidth;\n const h1 = { x: p2.x - headLen * Math.cos(angle - Math.PI / 6), y: p2.y - headLen * Math.sin(angle - Math.PI / 6) };\n const h2 = { x: p2.x - headLen * Math.cos(angle + Math.PI / 6), y: p2.y - headLen * Math.sin(angle + Math.PI / 6) };\n const [ph1, ph2] = pathToPdf(g, [h1, h2]);\n page.drawLine({ start: ph1, end: e, color, opacity, thickness: strokeWidth });\n page.drawLine({ start: ph2, end: e, color, opacity, thickness: strokeWidth });\n }\n return;\n }\n case 'freehand': {\n const strokes = ann.strokes && ann.strokes.length > 0 ? ann.strokes : ann.points ? [ann.points] : [];\n for (const st of strokes) {\n const pdfPts = pathToPdf(g, st);\n for (let i = 1; i < pdfPts.length; i++) {\n page.drawLine({ start: pdfPts[i - 1], end: pdfPts[i], color, opacity, thickness: strokeWidth, lineCap: 1 });\n }\n }\n return;\n }\n case 'text': {\n if (!ann.text) return;\n const boxWidth = ann.width && ann.width > 0 ? ann.width : 200;\n const lines = wrapText(ann.text, boxWidth, 16);\n const lineHeight = 20;\n for (let i = 0; i < lines.length; i++) {\n if (!lines[i]) continue;\n const b = topLeftBaseline(ann.x, ann.y + i * lineHeight, 16);\n page.drawText(lines[i], { x: b.x, y: b.y, size: 16, color, opacity, rotate: textRotate });\n }\n return;\n }\n case 'note': {\n const [nx0, ny0, nx1, ny1] = rectToPdf(g, { x: ann.x, y: ann.y, width: 24, height: 24 });\n page.drawRectangle({ x: nx0, y: ny0, width: nx1 - nx0, height: ny1 - ny0, color: rgb(1, 0.97, 0.7), borderColor: color, borderWidth: strokeWidth });\n if (ann.text) {\n const b = topLeftBaseline(ann.x + 30, ann.y, 14);\n page.drawText(ann.text, { x: b.x, y: b.y, size: 14, color, opacity, rotate: textRotate });\n }\n return;\n }\n case 'callout': {\n const pts = ann.points && ann.points.length >= 2 ? ann.points : [{ x: ann.x, y: ann.y }, { x: ann.x, y: ann.y }];\n const [s, e] = pathToPdf(g, [pts[0], pts[1]]);\n page.drawLine({ start: s, end: e, color, opacity, thickness: strokeWidth });\n if (ann.text) {\n const boxW = ann.text.length * 8 + 20;\n const [bx0, by0, bx1, by1] = rectToPdf(g, { x: pts[1].x, y: pts[1].y, width: boxW, height: 24 });\n page.drawRectangle({ x: bx0, y: by0, width: bx1 - bx0, height: by1 - by0, color: rgb(1, 1, 1), borderColor: color, borderWidth: strokeWidth });\n const b = topLeftBaseline(pts[1].x + 10, pts[1].y + 2, 14);\n page.drawText(ann.text, { x: b.x, y: b.y, size: 14, color, opacity, rotate: textRotate });\n }\n return;\n }\n case 'signature': {\n if (!ann.imageUrl) return;\n const imageBytes = await fetch(ann.imageUrl).then((res) => res.arrayBuffer());\n const image = ann.imageUrl.startsWith('data:image/jpeg') || ann.imageUrl.startsWith('data:image/jpg')\n ? await pdfDoc.embedJpg(imageBytes)\n : await pdfDoc.embedPng(imageBytes);\n page.drawImage(image, { x: llx, y: lly, width: w, height: h, rotate: textRotate });\n return;\n }\n case 'digital_signature_placeholder': {\n const dateStr = ann.timestamp ? new Date(ann.timestamp).toLocaleString('en-GB') : new Date().toLocaleString('en-GB');\n const iconW = w * 0.15;\n page.drawRectangle({ x: llx, y: lly, width: w, height: h, color: rgb(1, 1, 1), borderColor: rgb(148 / 255, 163 / 255, 184 / 255), borderWidth: 1 });\n page.drawLine({ start: { x: llx + iconW, y: lly }, end: { x: llx + iconW, y: lly + h }, color: rgb(226 / 255, 232 / 255, 240 / 255), thickness: 1 });\n page.drawSvgPath('M22 6 L22 14 Q22 20 12 24 Q2 20 2 14 L2 6 L12 2 Z', { x: llx + iconW / 2 - 12, y: lly + h / 2 + 12, borderColor: rgb(2 / 255, 132 / 255, 199 / 255), borderWidth: 2, scale: 1 });\n page.drawSvgPath('M7 13 L10 16 L17 8', { x: llx + iconW / 2 - 12, y: lly + h / 2 + 12, borderColor: rgb(2 / 255, 132 / 255, 199 / 255), borderWidth: 2, scale: 1 });\n page.drawText(`Digitally signed by ${ann.signer || signerName || 'Unknown signer'}`, { x: llx + iconW + 10, y: lly + h - 16, size: 10, color: rgb(15 / 255, 23 / 255, 42 / 255) });\n page.drawText(`Date: ${dateStr}`, { x: llx + iconW + 10, y: lly + h - 28, size: 9, color: rgb(51 / 255, 65 / 255, 85 / 255) });\n page.drawText('Reason: Document Approval', { x: llx + iconW + 10, y: lly + h - 40, size: 9, color: rgb(51 / 255, 65 / 255, 85 / 255) });\n return;\n }\n case 'link':\n case 'opaque':\n default:\n return; // not visual (link) or not ours to render (opaque)\n }\n}\n\nasync function bakeWatermark(pdfDoc: PDFDocument, wm: WatermarkOptions): Promise<void> {\n const wmColor = hexToRgb(wm.color || '#737373');\n const wmOpacity = wm.opacity ?? 0.08;\n const helveticaFont = await pdfDoc.embedFont(StandardFonts.Helvetica);\n const angle = -Math.PI / 4;\n const cosA = Math.cos(angle);\n const sinA = Math.sin(angle);\n\n for (const page of pdfDoc.getPages()) {\n const { width, height } = page.getSize();\n if (wm.mode === 'single') {\n const fontSize = wm.size || 48;\n const textWidth = helveticaFont.widthOfTextAtSize(wm.text, fontSize);\n const dx = -textWidth / 2;\n const dy = -fontSize * 0.35;\n page.drawText(wm.text, {\n x: width / 2 + (dx * cosA - dy * sinA),\n y: height / 2 + (dx * sinA + dy * cosA),\n size: fontSize, font: helveticaFont, color: wmColor, opacity: wmOpacity, rotate: degrees(-45),\n });\n } else {\n const fontSize = wm.size || 18;\n const textWidth = helveticaFont.widthOfTextAtSize(wm.text, fontSize);\n const xStep = textWidth + 150;\n const yStep = 250;\n const dx = -textWidth / 2;\n const dy = -fontSize * 0.35;\n const rotatedDx = dx * cosA - dy * sinA;\n const rotatedDy = dx * sinA + dy * cosA;\n for (let y = -height; y < height * 2; y += yStep) {\n const offset = (Math.abs(y / yStep) % 2) * (xStep / 2);\n for (let x = -width; x < width * 2; x += xStep) {\n page.drawText(wm.text, { x: x + offset + rotatedDx, y: y + rotatedDy, size: fontSize, font: helveticaFont, color: wmColor, opacity: wmOpacity, rotate: degrees(-45) });\n }\n }\n }\n }\n}\n\nasync function rasterizeRedactions(pdfDoc: PDFDocument, redactions: Redaction[]): Promise<PDFDocument> {\n const tempBuffer = await pdfDoc.save();\n const loadingTask = pdfjsLib.getDocument({ data: tempBuffer, ...getDocumentParams() });\n const renderDoc = await loadingTask.promise;\n const flattenedPdf = await PDFDocument.create();\n\n try {\n for (let i = 1; i <= renderDoc.numPages; i++) {\n const pageRedactions = redactions.filter((r) => r.pageIndex === i);\n if (pageRedactions.length > 0) {\n const renderPage = await renderDoc.getPage(i);\n const rasterScale = 2.0;\n const viewport = renderPage.getViewport({ scale: rasterScale });\n const canvas = document.createElement('canvas');\n canvas.width = viewport.width;\n canvas.height = viewport.height;\n const ctx = canvas.getContext('2d');\n if (ctx) {\n await renderPage.render({ canvasContext: ctx, canvas, viewport }).promise;\n ctx.save();\n ctx.fillStyle = '#000000';\n for (const redaction of pageRedactions) {\n ctx.fillRect(\n Math.floor(redaction.x * rasterScale),\n Math.floor(redaction.y * rasterScale),\n Math.ceil(redaction.width * rasterScale),\n Math.ceil(redaction.height * rasterScale)\n );\n }\n ctx.restore();\n const imgDataUrl = canvas.toDataURL('image/jpeg', 0.95);\n const imgBytes = await fetch(imgDataUrl).then((res) => res.arrayBuffer());\n const pdfImage = await flattenedPdf.embedJpg(imgBytes);\n const originalVp = renderPage.getViewport({ scale: 1 });\n const newPage = flattenedPdf.addPage([originalVp.width, originalVp.height]);\n newPage.drawImage(pdfImage, { x: 0, y: 0, width: originalVp.width, height: originalVp.height });\n canvas.width = 0;\n canvas.height = 0;\n }\n renderPage.cleanup();\n } else {\n const [copiedPage] = await flattenedPdf.copyPages(pdfDoc, [i - 1]);\n flattenedPdf.addPage(copiedPage);\n }\n if (i % 5 === 0) await new Promise((resolve) => setTimeout(resolve, 0));\n }\n } finally {\n await loadingTask.destroy().catch(() => {});\n }\n return flattenedPdf;\n}\n\nexport async function buildPdfBytes(input: ExportInput, options: ExportOptions = {}): Promise<Uint8Array> {\n if (options.xfdfString) {\n console.warn('[teamsync-pdf-viewer] getFileData({ xfdfString }) is ignored; import the XFDF through annotationManager.importAnnotations() first.');\n }\n\n const raw = await input.getSourceBytes();\n const sourceBytes = raw instanceof Uint8Array ? raw : new Uint8Array(raw);\n if (sourceBytes.byteLength > MAX_EXPORT_BYTES) {\n const sizeMB = (sourceBytes.byteLength / (1024 * 1024)).toFixed(2);\n throw new Error(\n `File is too large (${sizeMB} MB) to save directly in the browser. ` +\n 'Use exportAnnotations() to save annotation data and apply it on your server.'\n );\n }\n\n const pdfDoc = await PDFDocument.load(sourceBytes, { ignoreEncryption: true });\n const pages = pdfDoc.getPages();\n const anns = options.explicitAnnotations || input.annotations;\n\n // Geometry: prefer the live pdf.js document; otherwise derive it from the bytes.\n let resolveGeometry = input.getPageGeometry;\n let geometryTask: pdfjsLib.PDFDocumentLoadingTask | null = null;\n if (!resolveGeometry && anns.length > 0) {\n geometryTask = pdfjsLib.getDocument({ data: sourceBytes.slice(), ...getDocumentParams() });\n resolveGeometry = createGeometryResolver(await geometryTask.promise);\n }\n\n try {\n for (const ann of anns) {\n const pageIdx = Math.max(0, Math.min((ann.pageIndex || 1) - 1, pages.length - 1));\n const g = await resolveGeometry!(pageIdx + 1);\n await bakeAnnotation(pdfDoc, pages[pageIdx], g, ann, input.signerName);\n }\n } finally {\n if (geometryTask) await geometryTask.destroy().catch(() => {});\n }\n\n if (input.watermark?.text) await bakeWatermark(pdfDoc, input.watermark);\n\n const combinedRedactions = input.redactions || [];\n const finalDoc = combinedRedactions.length > 0 ? await rasterizeRedactions(pdfDoc, combinedRedactions) : pdfDoc;\n return await finalDoc.save();\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * XFDF serializer / parser.\n *\n * Writes the subset of XFDF (ISO 32000 + Acrobat/Apryse conventions) that maps onto this viewer's\n * annotation model, and reads anything back. Elements it cannot model become `opaque`\n * annotations that re-export verbatim, and unknown attributes / children of known elements are\n * preserved in `xfdfExtras`, so a document can round-trip through another viewer (Apryse, Acrobat)\n * without losing metadata. Geometry goes through `annotations/geometry.ts`, the single coordinate\n * authority (base page space <-> PDF user space).\n */\nimport type { Annotation, AnnotationInput, AnnotationPoint } from './types';\nimport { newAnnotationId } from './ids';\nimport {\n fmt,\n pathFromPdf,\n pathToPdf,\n quadPointsToRects,\n rectFromPdf,\n rectToPdf,\n rectToQuadPoints,\n unionRects,\n type GeometryResolver,\n type PageGeometry,\n type PdfRect,\n type Point,\n} from './geometry';\n\nexport const XFDF_NS = 'http://ns.adobe.com/xfdf/';\n\nexport interface XfdfExportOptions {\n /** Annotations to serialize (default: all given). */\n annotList?: Annotation[];\n /** Write the author's display name into `title` (default true). */\n useDisplayAuthor?: boolean;\n}\n\n/** Custom data namespace inside Apryse's `trn-custom-data` element (survives an Apryse round-trip). */\nconst CUSTOM_KEY = 'tspdf';\n\n// ---- helpers ----------------------------------------------------------------------------------\n\nconst escapeXml = (s: string): string =>\n s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;').replace(/'/g, '&apos;');\n\nfunction pad(n: number, w = 2): string {\n return String(n).padStart(w, '0');\n}\n\n/** ISO-8601 -> PDF date `D:YYYYMMDDHHmmSS+HH'mm'`. */\nexport function toPdfDate(iso: string | undefined): string {\n const d = iso ? new Date(iso) : new Date();\n if (Number.isNaN(d.getTime())) return toPdfDate(undefined);\n const tz = -d.getTimezoneOffset();\n const sign = tz >= 0 ? '+' : '-';\n const tzh = pad(Math.floor(Math.abs(tz) / 60));\n const tzm = pad(Math.abs(tz) % 60);\n return `D:${d.getFullYear()}${pad(d.getMonth() + 1)}${pad(d.getDate())}${pad(d.getHours())}${pad(d.getMinutes())}${pad(d.getSeconds())}${sign}${tzh}'${tzm}'`;\n}\n\n/** PDF date -> ISO-8601 (best effort; returns undefined when unparseable). */\nexport function fromPdfDate(pdf: string | null | undefined): string | undefined {\n if (!pdf) return undefined;\n const m = /^D:(\\d{4})(\\d{2})?(\\d{2})?(\\d{2})?(\\d{2})?(\\d{2})?([+\\-Z])?(\\d{2})?'?(\\d{2})?/.exec(pdf.trim());\n if (!m) {\n const t = Date.parse(pdf);\n return Number.isNaN(t) ? undefined : new Date(t).toISOString();\n }\n const [, Y, Mo = '01', D = '01', h = '00', mi = '00', s = '00', tzs, tzh = '00', tzm = '00'] = m;\n let offset = '';\n if (tzs === 'Z' || !tzs) offset = 'Z';\n else offset = `${tzs}${tzh}:${tzm}`;\n const t = Date.parse(`${Y}-${Mo}-${D}T${h}:${mi}:${s}${offset}`);\n return Number.isNaN(t) ? undefined : new Date(t).toISOString();\n}\n\nconst toHexColor = (c: string | undefined): string | undefined => {\n if (!c || c === 'transparent') return undefined;\n if (/^#[0-9a-f]{6}$/i.test(c)) return c.toUpperCase();\n if (/^#[0-9a-f]{3}$/i.test(c)) return `#${c[1]}${c[1]}${c[2]}${c[2]}${c[3]}${c[3]}`.toUpperCase();\n return undefined;\n};\n\nconst attr = (name: string, value: string | number | undefined | null): string =>\n value === undefined || value === null || value === '' ? '' : ` ${name}=\"${escapeXml(String(value))}\"`;\n\nfunction customDataElement(data: Record<string, unknown>): string {\n return `<trn-custom-data bytes=\"${escapeXml(JSON.stringify({ [CUSTOM_KEY]: data }))}\"/>`;\n}\n\nfunction readCustomData(el: Element): Record<string, unknown> {\n const node = Array.from(el.children).find((c) => c.localName === 'trn-custom-data');\n if (!node) return {};\n try {\n const parsed = JSON.parse(node.getAttribute('bytes') || '{}');\n const data = parsed?.[CUSTOM_KEY];\n return data && typeof data === 'object' ? data : {};\n } catch {\n return {};\n }\n}\n\nfunction pointsAttr(points: Point[]): string {\n return points.map((p) => `${fmt(p.x)},${fmt(p.y)}`).join(';');\n}\n\nfunction parsePoints(s: string | null): Point[] {\n if (!s) return [];\n return s\n .split(';')\n .map((pair) => pair.trim().split(/[,\\s]+/).map(Number))\n .filter((xy) => xy.length >= 2 && xy.every((n) => Number.isFinite(n)))\n .map(([x, y]) => ({ x, y }));\n}\n\nfunction parseNumbers(s: string | null): number[] {\n if (!s) return [];\n return s.split(/[,\\s]+/).map(Number).filter((n) => Number.isFinite(n));\n}\n\nfunction pdfRectAttr(r: PdfRect): string {\n return r.map(fmt).join(',');\n}\n\n/** Attributes we own on every element (so they are not carried over from `xfdfExtras`). */\nconst OWNED_ATTRS = new Set([\n 'page', 'rect', 'color', 'interior-color', 'width', 'opacity', 'name', 'title', 'subject', 'date',\n 'creationdate', 'flags', 'coords', 'start', 'end', 'head', 'tail', 'icon', 'IT', 'callout', 'style',\n]);\n/** Child elements we own / regenerate. */\nconst OWNED_CHILDREN = new Set(['contents', 'contents-richtext', 'inklist', 'imagedata', 'OnActivation', 'trn-custom-data', 'defaultstyle', 'defaultappearance', 'popup', 'vertices']);\n\n// ---- export -----------------------------------------------------------------------------------\n\nfunction commonAttrs(a: Annotation, g: PageGeometry, useDisplayAuthor: boolean, rectOverride?: PdfRect): string {\n const rect = rectOverride ?? rectToPdf(g, { x: a.x, y: a.y, width: a.width, height: a.height });\n const created = a.createdAt ?? (a.timestamp ? new Date(a.timestamp).toISOString() : undefined);\n const flags = ['print', ...(a.readOnly ? ['readonly', 'locked'] : [])].join(',');\n return (\n attr('page', a.pageIndex - 1) +\n attr('rect', pdfRectAttr(rect)) +\n attr('name', a.id) +\n (useDisplayAuthor ? attr('title', a.author) : '') +\n attr('date', toPdfDate(a.modifiedAt ?? created)) +\n attr('creationdate', toPdfDate(created)) +\n attr('flags', flags) +\n attr('opacity', a.opacity !== undefined && a.opacity !== 1 ? fmt(a.opacity) : undefined)\n );\n}\n\nfunction extraAttrs(a: Annotation): string {\n const attrs = a.xfdfExtras?.attrs;\n if (!attrs) return '';\n return Object.entries(attrs)\n .filter(([k]) => !OWNED_ATTRS.has(k))\n .map(([k, v]) => attr(k, v))\n .join('');\n}\n\nfunction extraChildren(a: Annotation): string {\n return (a.xfdfExtras?.children ?? []).join('');\n}\n\nfunction customData(a: Annotation, extra: Record<string, unknown> = {}): string {\n const data: Record<string, unknown> = { type: a.type, ...extra };\n if (a.authorId) data.authorId = a.authorId;\n if (a.strokeWidth !== undefined) data.strokeWidth = a.strokeWidth;\n return customDataElement(data);\n}\n\nconst contentsElement = (text: string | undefined): string => (text ? `<contents>${escapeXml(text)}</contents>` : '');\n\nconst defaultStyle = (a: Annotation, size: number): string =>\n `<defaultstyle>font: Helvetica ${size}pt; text-align: left; color: ${toHexColor(a.color) ?? '#000000'}</defaultstyle>` +\n `<defaultappearance>0 0 0 rg /Helv ${size} Tf</defaultappearance>`;\n\n/** Serialize one annotation to an XFDF element (no envelope). */\nexport async function annotationToXfdfFragment(a: Annotation, resolve: GeometryResolver, opts: XfdfExportOptions = {}): Promise<string> {\n if (a.type === 'opaque' && a.rawXfdf) return a.rawXfdf;\n const g = await resolve(a.pageIndex);\n const useDisplayAuthor = opts.useDisplayAuthor !== false;\n const color = toHexColor(a.color);\n const strokeAttrs = attr('color', color) + attr('width', a.strokeWidth);\n const common = (rect?: PdfRect) => commonAttrs(a, g, useDisplayAuthor, rect) + extraAttrs(a);\n const tail = (extra: Record<string, unknown> = {}) => customData(a, extra) + extraChildren(a);\n\n switch (a.type) {\n case 'rectangle':\n return `<square${common()}${strokeAttrs}${attr('interior-color', color)} subject=\"Rectangle\">${tail()}</square>`;\n case 'ellipse':\n return `<circle${common()}${strokeAttrs}${attr('interior-color', color)} subject=\"Ellipse\">${tail()}</circle>`;\n case 'line':\n case 'arrow': {\n const pts = a.points && a.points.length >= 2 ? a.points : [{ x: a.x, y: a.y }, { x: a.x + a.width, y: a.y + a.height }];\n const [s, e] = pathToPdf(g, [pts[0], pts[1]]);\n const rect: PdfRect = [Math.min(s.x, e.x), Math.min(s.y, e.y), Math.max(s.x, e.x), Math.max(s.y, e.y)];\n const head = a.type === 'arrow' ? attr('head', 'OpenArrow') : '';\n return `<line${common(rect)}${strokeAttrs} start=\"${fmt(s.x)},${fmt(s.y)}\" end=\"${fmt(e.x)},${fmt(e.y)}\"${head} subject=\"${a.type === 'arrow' ? 'Arrow' : 'Line'}\">${tail()}</line>`;\n }\n case 'freehand': {\n const strokes = a.strokes && a.strokes.length > 0 ? a.strokes : a.points ? [a.points] : [];\n const gestures = strokes.map((st) => `<gesture>${pointsAttr(pathToPdf(g, st))}</gesture>`).join('');\n const all = strokes.flat();\n const bbox = all.length ? rectToPdf(g, boundsOf(all, a.strokeWidth)) : undefined;\n return `<ink${common(bbox)}${strokeAttrs} subject=\"Free Hand\"><inklist>${gestures}</inklist>${tail()}</ink>`;\n }\n case 'highlight':\n case 'underline':\n case 'strikeout':\n case 'squiggly': {\n const rects = a.rects && a.rects.length > 0 ? a.rects : [{ x: a.x, y: a.y, width: a.width, height: a.height }];\n const coords = rects.flatMap((r) => rectToQuadPoints(g, r)).map(fmt).join(',');\n const bbox = rectToPdf(g, unionRects(rects));\n const tag = a.type;\n const subject = a.type === 'highlight' ? 'Highlight' : a.type === 'underline' ? 'Underline' : a.type === 'strikeout' ? 'StrikeOut' : 'Squiggly';\n return `<${tag}${common(bbox)}${attr('color', color)} coords=\"${coords}\" subject=\"${subject}\">${tail()}</${tag}>`;\n }\n case 'text':\n return `<freetext${common()}${attr('color', color)} subject=\"Free Text\">${contentsElement(a.text)}${defaultStyle(a, 16)}${tail()}</freetext>`;\n case 'callout': {\n const pts = a.points && a.points.length >= 2 ? a.points : [{ x: a.x, y: a.y }, { x: a.x, y: a.y }];\n const [s, e] = pathToPdf(g, [pts[0], pts[1]]);\n const boxRect = rectToPdf(g, { x: pts[1].x, y: pts[1].y, width: a.text ? a.text.length * 8 + 20 : 100, height: 24 });\n const bbox: PdfRect = [Math.min(s.x, boxRect[0]), Math.min(s.y, boxRect[1]), Math.max(e.x, boxRect[2]), Math.max(e.y, boxRect[3])];\n return `<freetext${common(bbox)}${strokeAttrs} IT=\"FreeTextCallout\" callout=\"${fmt(s.x)},${fmt(s.y)},${fmt(e.x)},${fmt(e.y)}\" subject=\"Callout\">${contentsElement(a.text)}${defaultStyle(a, 14)}${tail({ box: boxRect })}</freetext>`;\n }\n case 'note':\n return `<text${common(rectToPdf(g, { x: a.x, y: a.y, width: 24, height: 24 }))}${attr('color', color)} icon=\"Comment\" subject=\"Sticky Note\">${contentsElement(a.text)}${tail()}</text>`;\n case 'link': {\n const url = a.linkUrl ?? '';\n const action = url.startsWith('#page=')\n ? `<OnActivation><Action Trigger=\"U\"><GoTo><Dest><Fit Page=\"${Math.max(0, (parseInt(url.slice(6), 10) || 1) - 1)}\"/></Dest></GoTo></Action></OnActivation>`\n : url\n ? `<OnActivation><Action Trigger=\"U\"><URI Name=\"${escapeXml(url)}\"/></Action></OnActivation>`\n : '';\n return `<link${common()}${attr('color', color)} subject=\"Link\">${action}${contentsElement(a.text)}${tail()}</link>`;\n }\n case 'signature':\n return `<stamp${common()} subject=\"Signature\">${a.imageUrl ? `<imagedata>${escapeXml(a.imageUrl)}</imagedata>` : ''}${tail({ signer: a.signer, signType: a.signType, timestamp: a.timestamp })}</stamp>`;\n case 'digital_signature_placeholder':\n return `<stamp${common()} subject=\"Digital Signature\">${tail({ signer: a.signer, timestamp: a.timestamp })}</stamp>`;\n case 'opaque':\n return a.rawXfdf ?? '';\n default:\n return '';\n }\n}\n\nfunction boundsOf(points: AnnotationPoint[], pad = 0) {\n const xs = points.map((p) => p.x);\n const ys = points.map((p) => p.y);\n const half = pad / 2;\n const x = Math.min(...xs) - half;\n const y = Math.min(...ys) - half;\n return { x, y, width: Math.max(...xs) - x + half, height: Math.max(...ys) - y + half };\n}\n\n/** Serialize annotations to a complete XFDF document. */\nexport async function annotationsToXfdf(annotations: Annotation[], resolve: GeometryResolver, opts: XfdfExportOptions = {}): Promise<string> {\n const list = opts.annotList ?? annotations;\n const fragments = await Promise.all(list.map((a) => annotationToXfdfFragment(a, resolve, opts)));\n return (\n `<?xml version=\"1.0\" encoding=\"UTF-8\"?>` +\n `<xfdf xmlns=\"${XFDF_NS}\" xml:space=\"preserve\"><annots>${fragments.filter(Boolean).join('')}</annots></xfdf>`\n );\n}\n\n// ---- import -----------------------------------------------------------------------------------\n\nfunction collectExtras(el: Element): Annotation['xfdfExtras'] {\n const attrs: Record<string, string> = {};\n for (const a of Array.from(el.attributes)) {\n if (!OWNED_ATTRS.has(a.name) && !a.name.startsWith('xmlns')) attrs[a.name] = a.value;\n }\n const children: string[] = [];\n for (const c of Array.from(el.children)) {\n if (!OWNED_CHILDREN.has(c.localName)) children.push(new XMLSerializer().serializeToString(c));\n }\n // Keep Apryse custom data that is not ours (e.g. teamsyncId) verbatim.\n const custom = Array.from(el.children).find((c) => c.localName === 'trn-custom-data');\n if (custom) {\n try {\n const parsed = JSON.parse(custom.getAttribute('bytes') || '{}');\n if (parsed && typeof parsed === 'object') {\n const rest = { ...parsed };\n delete rest[CUSTOM_KEY];\n if (Object.keys(rest).length > 0) {\n children.push(`<trn-custom-data bytes=\"${escapeXml(JSON.stringify(rest))}\"/>`);\n }\n }\n } catch {\n children.push(new XMLSerializer().serializeToString(custom));\n }\n }\n const out: Annotation['xfdfExtras'] = {};\n if (Object.keys(attrs).length) out.attrs = attrs;\n if (children.length) out.children = children;\n return Object.keys(out).length ? out : undefined;\n}\n\nfunction childText(el: Element, name: string): string | undefined {\n const c = Array.from(el.children).find((x) => x.localName === name);\n return c?.textContent ?? undefined;\n}\n\nfunction baseFromElement(el: Element, g: PageGeometry): Omit<AnnotationInput, 'type'> & { id: string } {\n const rectNums = parseNumbers(el.getAttribute('rect'));\n const rect = rectNums.length === 4 ? rectFromPdf(g, [rectNums[0], rectNums[1], rectNums[2], rectNums[3]]) : { x: 0, y: 0, width: 0, height: 0 };\n const custom = readCustomData(el);\n const color = toHexColor(el.getAttribute('color') || el.getAttribute('interior-color') || undefined) ?? '#000000';\n const opacityAttr = el.getAttribute('opacity');\n const opacity = opacityAttr !== null && Number.isFinite(Number(opacityAttr)) ? Number(opacityAttr) : 1;\n const widthAttr = el.getAttribute('width');\n const strokeWidth = typeof custom.strokeWidth === 'number' ? custom.strokeWidth : widthAttr !== null && Number.isFinite(Number(widthAttr)) ? Number(widthAttr) : 1;\n const flags = (el.getAttribute('flags') || '').toLowerCase();\n const readOnly = flags.includes('readonly') || flags.includes('locked');\n return {\n id: el.getAttribute('name') || newAnnotationId(),\n pageIndex: (parseInt(el.getAttribute('page') || '0', 10) || 0) + 1,\n x: rect.x,\n y: rect.y,\n width: rect.width,\n height: rect.height,\n color,\n strokeWidth,\n opacity,\n author: el.getAttribute('title') || undefined,\n authorId: typeof custom.authorId === 'string' ? custom.authorId : undefined,\n createdAt: fromPdfDate(el.getAttribute('creationdate')),\n modifiedAt: fromPdfDate(el.getAttribute('date')),\n readOnly: readOnly || undefined,\n xfdfExtras: collectExtras(el),\n };\n}\n\nfunction elementToAnnotation(el: Element, g: PageGeometry): Annotation | null {\n const kind = el.localName.toLowerCase();\n const custom = readCustomData(el);\n const base = baseFromElement(el, g);\n\n const opaque = (): Annotation => ({\n ...base,\n type: 'opaque',\n opaqueKind: kind,\n rawXfdf: new XMLSerializer().serializeToString(el),\n xfdfExtras: undefined,\n });\n\n switch (kind) {\n case 'square':\n return { ...base, type: 'rectangle' };\n case 'circle':\n return { ...base, type: 'ellipse' };\n case 'line': {\n const s = parseNumbers(el.getAttribute('start'));\n const e = parseNumbers(el.getAttribute('end'));\n const head = (el.getAttribute('head') || 'None').toLowerCase();\n const tailAttr = (el.getAttribute('tail') || 'None').toLowerCase();\n if (s.length < 2 || e.length < 2) return opaque();\n const [ps, pe] = pathFromPdf(g, [{ x: s[0], y: s[1] }, { x: e[0], y: e[1] }]);\n const bounds = boundsOf([ps, pe]);\n const isArrow = head !== 'none' || tailAttr !== 'none';\n return { ...base, ...bounds, type: isArrow ? 'arrow' : 'line', points: [ps, pe] };\n }\n case 'ink': {\n const gestures = Array.from(el.getElementsByTagName('*')).filter((n) => n.localName === 'gesture');\n const strokes = gestures.map((ge) => pathFromPdf(g, parsePoints(ge.textContent))).filter((st) => st.length > 0);\n if (strokes.length === 0) return opaque();\n const all = strokes.flat();\n return { ...base, ...boundsOf(all), type: 'freehand', points: strokes[0], strokes };\n }\n case 'highlight':\n case 'underline':\n case 'strikeout':\n case 'squiggly': {\n const quads = parseNumbers(el.getAttribute('coords'));\n const rects = quads.length >= 8 ? quadPointsToRects(g, quads) : [{ x: base.x, y: base.y, width: base.width, height: base.height }];\n const bbox = unionRects(rects);\n const type = kind as 'highlight' | 'underline' | 'strikeout' | 'squiggly';\n const defaultOpacity = type === 'highlight' ? 0.5 : 1;\n return {\n ...base,\n ...bbox,\n type,\n rects: rects.length > 1 ? rects : undefined,\n opacity: base.opacity === 1 && type === 'highlight' ? 0.5 : (base.opacity ?? defaultOpacity)\n };\n }\n case 'freetext': {\n const text = childText(el, 'contents') ?? '';\n const it = el.getAttribute('IT') || '';\n const callout = parseNumbers(el.getAttribute('callout'));\n if (it === 'FreeTextCallout' || custom.type === 'callout' || callout.length >= 4) {\n const pts = callout.length >= 4 ? pathFromPdf(g, [{ x: callout[0], y: callout[1] }, { x: callout[2], y: callout[3] }]) : [{ x: base.x, y: base.y }, { x: base.x, y: base.y }];\n return { ...base, type: 'callout', text, points: pts, x: pts[1].x, y: pts[1].y, width: Math.max(100, text.length * 8 + 20), height: 30 };\n }\n return { ...base, type: 'text', text, width: Math.max(base.width, 100), height: Math.max(base.height, 30) };\n }\n case 'text':\n return { ...base, type: 'note', text: childText(el, 'contents') ?? '', width: 24, height: 24 };\n case 'link': {\n const uri = Array.from(el.getElementsByTagName('*')).find((n) => n.localName === 'URI');\n const fit = Array.from(el.getElementsByTagName('*')).find((n) => n.localName === 'Fit' || n.localName === 'XYZ' || n.localName === 'FitH');\n let linkUrl = uri?.getAttribute('Name') ?? '';\n if (!linkUrl && fit) linkUrl = `#page=${(parseInt(fit.getAttribute('Page') || '0', 10) || 0) + 1}`;\n return { ...base, type: 'link', linkUrl, text: childText(el, 'contents') ?? '', color: 'transparent', strokeWidth: 0, opacity: 1, points: [] };\n }\n case 'stamp': {\n const image = childText(el, 'imagedata');\n if (custom.type === 'digital_signature_placeholder') {\n return { ...base, type: 'digital_signature_placeholder', signer: typeof custom.signer === 'string' ? custom.signer : undefined, timestamp: typeof custom.timestamp === 'number' ? custom.timestamp : undefined };\n }\n if (image) {\n return { ...base, type: 'signature', imageUrl: image, signer: typeof custom.signer === 'string' ? custom.signer : undefined, timestamp: typeof custom.timestamp === 'number' ? custom.timestamp : undefined };\n }\n return opaque();\n }\n default:\n return opaque();\n }\n}\n\n/**\n * Parse an XFDF document OR bare annotation elements (a concatenation of fragments) into\n * annotations. Unknown elements become `opaque` (re-exported verbatim).\n */\n/** Remove every `<?xml … ?>` declaration (linear scan — no regex backtracking on hostile input). */\nfunction stripXmlDeclarations(input: string): string {\n let out = '';\n let pos = 0;\n for (;;) {\n const start = input.indexOf('<?xml', pos);\n if (start === -1) break;\n const end = input.indexOf('?>', start + 5);\n if (end === -1) break;\n out += input.slice(pos, start);\n pos = end + 2;\n }\n return out + input.slice(pos);\n}\n\nexport async function parseXfdf(xml: string, resolve: GeometryResolver): Promise<Annotation[]> {\n // Hosts may store one full XFDF document per annotation and concatenate them inside an\n // envelope, so XML declarations can appear anywhere and <xfdf>/<annots> wrappers can nest.\n // Strip every declaration and collect annotation elements from every <annots> at any depth.\n const cleaned = stripXmlDeclarations(xml).trim();\n if (!cleaned) return [];\n // XFDF never carries a DTD; refuse one outright (entity expansion / external entity tricks).\n if (/<!DOCTYPE|<!ENTITY/i.test(cleaned)) {\n throw new Error('[teamsync-pdf-viewer] invalid XFDF: DOCTYPE/ENTITY declarations are not allowed');\n }\n // Parsed as application/xml: the parser is inert (no script execution, no resource loading)\n // and the resulting DOM is only read as data.\n const wrapped = `<xfdf xmlns=\"${XFDF_NS}\"><annots>${cleaned}</annots></xfdf>`;\n const doc = new DOMParser().parseFromString(wrapped, 'application/xml');\n const error = doc.getElementsByTagName('parsererror')[0];\n if (error) throw new Error(`[teamsync-pdf-viewer] invalid XFDF: ${error.textContent?.slice(0, 200)}`);\n\n const WRAPPERS = new Set(['xfdf', 'annots', 'fields', 'f', 'ids']);\n const elements = Array.from(doc.getElementsByTagName('*')).filter(\n (n) => n.parentElement?.localName === 'annots' && !WRAPPERS.has(n.localName)\n );\n const out: Annotation[] = [];\n for (const el of elements) {\n const page = (parseInt(el.getAttribute('page') || '0', 10) || 0) + 1;\n const g = await resolve(page);\n const ann = elementToAnnotation(el, g);\n if (ann) out.push(ann);\n }\n return out;\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * AnnotationManager — the canonical annotation list of a viewer instance.\n *\n * Responsibilities:\n * - single source of truth for the annotation list (React reads it via subscribe/getSnapshot)\n * - undo / redo history for user edits\n * - granular `annotationChanged` events (`add` | `modify` | `delete`, with an `imported` flag)\n * mirroring Apryse's annotationManager so host persistence bridges are near drop-in\n * - authorship stamping and edit permissions (read-only viewer, read-only annotation, other\n * author's annotation) enforced centrally in `commit()`\n * - XFDF import / export through `annotations/xfdf.ts` + `annotations/geometry.ts`\n */\nimport type { PDFDocumentProxy } from 'pdfjs-dist';\nimport type { Annotation, AnnotationInput } from './types';\nimport { newAnnotationId } from './ids';\nimport { createGeometryResolver, type GeometryResolver } from './geometry';\nimport { annotationsToXfdf, annotationToXfdfFragment, parseXfdf, type XfdfExportOptions } from './xfdf';\n\nexport type AnnotationAction = 'add' | 'modify' | 'delete';\n\nexport interface AnnotationChangedEvent {\n annotations: Annotation[];\n action: AnnotationAction;\n /** True when the change came from importAnnotations()/programmatic APIs flagged as imported. */\n imported: boolean;\n}\n\nexport interface CommitOptions {\n /** Mark the change as an import round-trip (not persisted by host bridges, not undoable). */\n imported?: boolean;\n /** Bypass read-only / authorship checks (programmatic host operations). */\n force?: boolean;\n /** Record in the undo history (default: true unless imported). */\n undoable?: boolean;\n}\n\nexport interface ViewerUserInfo {\n id?: string;\n name?: string;\n}\n\ntype ChangedListener = (event: AnnotationChangedEvent) => void;\n\n/** One undoable user action, recorded as the operations it performed (not a snapshot), so undo\n * and redo leave annotations imported in between untouched. */\ninterface HistoryEntry {\n added: Annotation[];\n modified: Array<{ before: Annotation; after: Annotation }>;\n deleted: Annotation[];\n}\n\nconst MAX_HISTORY = 100;\nconst nowIso = () => new Date().toISOString();\n\nexport class AnnotationManager {\n private list: Annotation[] = [];\n private past: HistoryEntry[] = [];\n private future: HistoryEntry[] = [];\n private changedListeners = new Set<ChangedListener>();\n private listListeners = new Set<() => void>();\n private user: ViewerUserInfo = {};\n private readOnly = false;\n private canEditOthers = false;\n private resolver: GeometryResolver | null = null;\n\n // ---- document / user / permissions ------------------------------------------------------\n\n setDocument(doc: PDFDocumentProxy | null): void {\n this.resolver = doc ? createGeometryResolver(doc) : null;\n }\n\n hasDocument(): boolean {\n return this.resolver !== null;\n }\n\n setCurrentUser(name: string, id?: string): void {\n this.user = { name, id: id ?? this.user.id };\n }\n\n setCurrentUserInfo(user: ViewerUserInfo | undefined): void {\n this.user = { ...(user ?? {}) };\n }\n\n getCurrentUser(): string {\n return this.user.name ?? '';\n }\n\n getCurrentUserInfo(): ViewerUserInfo {\n return { ...this.user };\n }\n\n setReadOnly(readOnly: boolean): void {\n this.readOnly = readOnly;\n }\n\n isReadOnly(): boolean {\n return this.readOnly;\n }\n\n /** Allow editing/deleting annotations authored by other users (default false). */\n setCanEditOthers(value: boolean): void {\n this.canEditOthers = value;\n }\n\n /** Whether the current user may modify or delete this annotation through the UI. */\n canEdit(a: Annotation): boolean {\n if (this.readOnly || a.readOnly || a.type === 'opaque') return false;\n if (this.canEditOthers) return true;\n if (!a.authorId && !a.author) return true; // unattributed (legacy / local draft)\n if (a.authorId) return Boolean(this.user.id) && a.authorId === this.user.id;\n return Boolean(this.user.name) && a.author === this.user.name;\n }\n\n canAdd(): boolean {\n return !this.readOnly;\n }\n\n // ---- reading --------------------------------------------------------------------------------\n\n /** The current list. The array reference is stable until the next change. */\n getAnnotationsList(): Annotation[] {\n return this.list;\n }\n\n getAnnotationById(id: string): Annotation | undefined {\n return this.list.find((a) => a.id === id);\n }\n\n /** React `useSyncExternalStore` pair. */\n subscribe = (listener: () => void): (() => void) => {\n this.listListeners.add(listener);\n return () => { this.listListeners.delete(listener); };\n };\n\n getSnapshot = (): Annotation[] => this.list;\n\n addEventListener(type: 'annotationChanged', listener: ChangedListener): () => void {\n if (type !== 'annotationChanged') return () => {};\n this.changedListeners.add(listener);\n return () => this.removeEventListener(type, listener);\n }\n\n removeEventListener(type: 'annotationChanged', listener: ChangedListener): void {\n if (type !== 'annotationChanged') return;\n this.changedListeners.delete(listener);\n }\n\n /** Apryse-compat no-op: React re-renders from the list. */\n drawAnnotationsFromList(_annotations: Annotation[]): void {}\n\n // ---- history --------------------------------------------------------------------------------\n\n get canUndo(): boolean {\n return this.past.length > 0;\n }\n\n get canRedo(): boolean {\n return this.future.length > 0;\n }\n\n undo(): boolean {\n const entry = this.past.pop();\n if (!entry) return false;\n const addedIds = new Set(entry.added.map((a) => a.id));\n const before = new Map(entry.modified.map((m) => [m.after.id, m.before]));\n const next = this.list.filter((a) => !addedIds.has(a.id)).map((a) => before.get(a.id) ?? a);\n for (const d of entry.deleted) if (!next.some((a) => a.id === d.id)) next.push(d);\n this.future.unshift(entry);\n this.apply(next, { force: true, undoable: false, imported: false, keepHistory: true });\n return true;\n }\n\n redo(): boolean {\n const entry = this.future.shift();\n if (!entry) return false;\n const deletedIds = new Set(entry.deleted.map((a) => a.id));\n const after = new Map(entry.modified.map((m) => [m.before.id, m.after]));\n const next = this.list.filter((a) => !deletedIds.has(a.id)).map((a) => after.get(a.id) ?? a);\n for (const ad of entry.added) if (!next.some((a) => a.id === ad.id)) next.push(ad);\n this.past.push(entry);\n this.apply(next, { force: true, undoable: false, imported: false, keepHistory: true });\n return true;\n }\n\n // ---- mutation ---------------------------------------------------------------------------------\n\n /**\n * Replace the whole list (the UI's edit path). Diffs against the current list, enforces\n * permissions (rejected edits keep the previous version), records history and emits one\n * `annotationChanged` event per action.\n */\n commit(next: Annotation[], opts: CommitOptions = {}): Annotation[] {\n return this.apply(next, { ...opts, keepHistory: false });\n }\n\n addAnnotations(inputs: AnnotationInput[], opts: CommitOptions = {}): Annotation[] {\n const withIds = inputs.map((i) => ({ ...i, id: i.id ?? newAnnotationId() }) as Annotation);\n this.commit([...this.list, ...withIds], opts);\n return withIds.map((a) => this.getAnnotationById(a.id)).filter((a): a is Annotation => Boolean(a));\n }\n\n updateAnnotation(id: string, patch: Partial<AnnotationInput>, opts: CommitOptions = {}): Annotation | undefined {\n const existing = this.getAnnotationById(id);\n if (!existing) return undefined;\n this.commit(this.list.map((a) => (a.id === id ? { ...a, ...patch, id } : a)), opts);\n return this.getAnnotationById(id);\n }\n\n deleteAnnotations(targets: Array<Annotation | string>, opts: CommitOptions = {}): void {\n const ids = new Set(targets.map((t) => (typeof t === 'string' ? t : t.id)));\n this.commit(this.list.filter((a) => !ids.has(a.id)), opts);\n }\n\n /** Remove every annotation (e.g. on document switch). Not undoable, emits deletes as imported. */\n clear(): void {\n this.past = [];\n this.future = [];\n this.apply([], { imported: true, force: true, undoable: false, keepHistory: false });\n }\n\n // ---- XFDF -------------------------------------------------------------------------------------\n\n /**\n * Import an XFDF document or bare fragments. Annotations whose `name` already exists are\n * replaced (modify), new ones added; the change is flagged `imported` and is not undoable.\n * Returns the imported annotations as they now exist in the list.\n */\n async importAnnotations(xfdf: string): Promise<Annotation[]> {\n const resolver = this.requireResolver();\n const parsed = await parseXfdf(xfdf, resolver);\n if (parsed.length === 0) return [];\n const incoming = new Map(parsed.map((a) => [a.id, a]));\n const merged = this.list.map((a) => incoming.get(a.id) ?? a);\n for (const a of parsed) if (!this.list.some((x) => x.id === a.id)) merged.push(a);\n this.commit(merged, { imported: true, force: true, undoable: false });\n return parsed.map((a) => this.getAnnotationById(a.id)).filter((a): a is Annotation => Boolean(a));\n }\n\n /**\n * Export as XFDF. With `annotList`, returns the bare fragment(s) for those annotations (the\n * form hosts persist per annotation); without it, a complete XFDF document.\n */\n async exportAnnotations(opts: XfdfExportOptions = {}): Promise<string> {\n const resolver = this.requireResolver();\n if (opts.annotList) {\n const parts = await Promise.all(opts.annotList.map((a) => annotationToXfdfFragment(a, resolver, opts)));\n return parts.join('');\n }\n return annotationsToXfdf(this.list, resolver, opts);\n }\n\n /** Legacy bespoke JSON export (pre-1.2 `exportAnnotations()` shape). */\n exportAnnotationsLegacyJson(): string {\n return JSON.stringify(this.list, null, 2);\n }\n\n // ---- internals ----------------------------------------------------------------------------------\n\n private requireResolver(): GeometryResolver {\n if (!this.resolver) throw new Error('[teamsync-pdf-viewer] no document loaded — XFDF needs page geometry');\n return this.resolver;\n }\n\n private apply(next: Annotation[], opts: CommitOptions & { keepHistory: boolean }): Annotation[] {\n const prev = this.list;\n const imported = Boolean(opts.imported);\n const force = Boolean(opts.force);\n const prevById = new Map(prev.map((a) => [a.id, a]));\n const nextIds = new Set(next.map((a) => a.id));\n\n const added: Annotation[] = [];\n const modified: Annotation[] = [];\n const modifiedPairs: Array<{ before: Annotation; after: Annotation }> = [];\n const deleted: Annotation[] = [];\n const finalList: Annotation[] = [];\n\n for (const a of next) {\n const p = prevById.get(a.id);\n if (!p) {\n if (!imported && !force && this.readOnly) continue; // reject: viewer is read-only\n const stamped = this.stampNew(a, imported);\n added.push(stamped);\n finalList.push(stamped);\n } else if (p !== a) {\n if (!imported && !force && !this.canEdit(p)) {\n finalList.push(p); // reject the edit, keep the previous version\n continue;\n }\n const m: Annotation = imported ? a : { ...a, modifiedAt: nowIso() };\n modified.push(m);\n modifiedPairs.push({ before: p, after: m });\n finalList.push(m);\n } else {\n finalList.push(a);\n }\n }\n for (const p of prev) {\n if (nextIds.has(p.id)) continue;\n if (!imported && !force && !this.canEdit(p)) {\n finalList.push(p); // reject the deletion\n continue;\n }\n deleted.push(p);\n }\n\n if (added.length === 0 && modified.length === 0 && deleted.length === 0) {\n // Nothing effectively changed (all edits rejected or identical list): keep the reference.\n return this.list;\n }\n\n if (!opts.keepHistory && (opts.undoable ?? !imported)) {\n this.past.push({ added, modified: modifiedPairs, deleted });\n if (this.past.length > MAX_HISTORY) this.past.shift();\n this.future = [];\n }\n\n this.list = finalList;\n for (const l of Array.from(this.listListeners)) {\n try { l(); } catch (err) { console.error('[teamsync-pdf-viewer] list listener threw', err); }\n }\n if (added.length) this.emit({ annotations: added, action: 'add', imported });\n if (modified.length) this.emit({ annotations: modified, action: 'modify', imported });\n if (deleted.length) this.emit({ annotations: deleted, action: 'delete', imported });\n return this.list;\n }\n\n private stampNew(a: Annotation, imported: boolean): Annotation {\n if (imported) return a;\n const created = a.createdAt ?? nowIso();\n return {\n ...a,\n author: a.author ?? this.user.name,\n authorId: a.authorId ?? this.user.id,\n createdAt: created,\n modifiedAt: a.modifiedAt ?? created,\n };\n }\n\n private emit(event: AnnotationChangedEvent): void {\n for (const l of Array.from(this.changedListeners)) {\n try { l(event); } catch (err) { console.error('[teamsync-pdf-viewer] annotationChanged listener threw', err); }\n }\n }\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * WebViewerInstance — the imperative handle returned by `createWebViewer()` and exposed through\n * `<TeamSyncViewer ref>`. Keeps the legacy `UI` / `Core` facade for drop-in compatibility.\n */\nimport type React from 'react';\nimport type * as pdfjsLib from 'pdfjs-dist';\nimport { ViewerBus } from './eventBus';\nimport { buildPdfBytes, type ExportOptions } from './export';\nimport type { Annotation } from '../annotations/types';\nimport { AnnotationManager } from '../annotations/AnnotationManager';\nimport { createGeometryResolver } from '../annotations/geometry';\nimport type { Redaction, WatermarkOptions, ViewerEventMap, ViewerEventType, TransientHighlight } from './types';\nimport { searchPdfText, type SearchResult } from '../hooks/usePdfSearch';\nimport { copyTextToClipboard } from '../utils/clipboardUtils';\n\n/** Callbacks the React component installs so the instance can reach live state. */\nexport interface ViewerBinding {\n getAnnotations(): Annotation[];\n getRedactions(): Redaction[];\n getWatermark(): WatermarkOptions | undefined;\n getPdfDocument(): pdfjsLib.PDFDocumentProxy | null;\n getDocumentUrl(): string | undefined;\n getFileName(): string | undefined;\n getCurrentUserName(): string | undefined;\n getCurrentPage(): number;\n getPageCount(): number;\n loadDocument(url: string): void;\n goToPage(pageNumber: number, options?: { smooth?: boolean }): void;\n getTransientHighlights(): TransientHighlight[];\n setTransientHighlights(highlights: TransientHighlight[]): void;\n}\n\nconst noBinding = (): never => {\n throw new Error('[teamsync-pdf-viewer] viewer is not mounted (was destroy() called?)');\n};\n\nexport class WebViewerInstance {\n private static instances = new Map<string, WebViewerInstance>();\n\n /** Retrieve a registered WebViewerInstance by its ID. */\n static getInstance(id: string): WebViewerInstance | undefined {\n return WebViewerInstance.instances.get(id);\n }\n\n /** Register a WebViewerInstance with an ID. */\n static registerInstance(id: string, instance: WebViewerInstance): void {\n WebViewerInstance.instances.set(id, instance);\n }\n\n /** Unregister an instance by its ID. */\n static unregisterInstance(id: string): void {\n WebViewerInstance.instances.delete(id);\n }\n\n /** Clear all registered instances (primarily for testing). */\n static clearInstances(): void {\n WebViewerInstance.instances.clear();\n }\n\n readonly bus: ViewerBus;\n /** Annotation list, history, permissions and XFDF import/export. */\n readonly annotationManager: AnnotationManager;\n /** Root element of the viewer once mounted. */\n element: HTMLElement | null = null;\n /** Unique identifier for this instance. */\n id?: string;\n\n private binding: ViewerBinding | null = null;\n private unmountRoot: (() => void) | null = null;\n private destroyed = false;\n private targetViewerTarget:\n | WebViewerInstance\n | React.RefObject<WebViewerInstance | null>\n | (() => WebViewerInstance | null)\n | string\n | null = null;\n\n constructor(bus: ViewerBus, annotationManager: AnnotationManager = new AnnotationManager(), id?: string) {\n this.bus = bus;\n this.annotationManager = annotationManager;\n if (id) {\n this.id = id;\n WebViewerInstance.registerInstance(id, this);\n }\n }\n\n /** Sets the target viewer instance, ref, getter, or ID to receive cross-document links. */\n setTargetViewer(\n target:\n | WebViewerInstance\n | React.RefObject<WebViewerInstance | null>\n | (() => WebViewerInstance | null)\n | string\n | null\n ): void {\n this.targetViewerTarget = target;\n }\n\n /** Resolves the target viewer instance if configured. */\n getTargetViewer(): WebViewerInstance | null {\n const t = this.targetViewerTarget;\n if (!t) return null;\n if (typeof t === 'string') {\n return WebViewerInstance.getInstance(t) ?? null;\n }\n if (typeof t === 'function') {\n return t();\n }\n if (typeof t === 'object' && 'current' in t) {\n return t.current;\n }\n return t;\n }\n\n // ---- lifecycle -------------------------------------------------------------------------\n\n /** @internal */\n _bind(binding: ViewerBinding, element: HTMLElement | null): void {\n this.binding = binding;\n this.element = element;\n }\n\n /** @internal */\n _unbind(): void {\n this.binding = null;\n }\n\n /** @internal — installed by createWebViewer() so destroy() can unmount the React root. */\n _setUnmount(fn: () => void): void {\n this.unmountRoot = fn;\n }\n\n get isDestroyed(): boolean {\n return this.destroyed;\n }\n\n get isMounted(): boolean {\n return this.binding !== null;\n }\n\n /**\n * Tear the viewer down: unmounts the React tree created by `createWebViewer()`, drops every\n * listener and refuses further use. Safe to call twice.\n */\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n if (this.id) {\n WebViewerInstance.unregisterInstance(this.id);\n }\n try {\n this.bus.emit('destroy', {});\n } finally {\n const unmount = this.unmountRoot;\n this.unmountRoot = null;\n this.binding = null;\n this.element = null;\n this.bus.destroy();\n if (unmount) {\n // React refuses synchronous unmounts from inside its own render/commit phase.\n Promise.resolve().then(unmount);\n }\n }\n }\n\n // ---- events ----------------------------------------------------------------------------\n\n on<K extends ViewerEventType>(type: K, listener: (detail: ViewerEventMap[K]) => void): () => void {\n return this.bus.on(type, listener as (d: unknown) => void);\n }\n\n off<K extends ViewerEventType>(type: K, listener: (detail: ViewerEventMap[K]) => void): void {\n this.bus.off(type, listener as (d: unknown) => void);\n }\n\n // ---- document --------------------------------------------------------------------------\n\n /** Load (or reload) a document by URL. Resolves when loaded, rejects on load error. */\n loadDocument(\n url: string,\n options?: { page?: number; initialPage?: number }\n ): Promise<{ url: string; numPages: number }> {\n const b = this.binding ?? noBinding();\n const targetPage = options?.page ?? options?.initialPage;\n return new Promise((resolve, reject) => {\n const offLoaded = this.bus.on<ViewerEventMap['documentLoaded']>('documentLoaded', (d) => {\n if (d.url !== url) return;\n cleanup();\n if (targetPage && targetPage > 0) {\n setTimeout(() => {\n try {\n this.goToPage(targetPage, { smooth: true });\n } catch {}\n }, 50);\n }\n resolve(d);\n });\n const offError = this.bus.on<ViewerEventMap['documentLoadError']>('documentLoadError', (d) => {\n if (d.url !== url) return;\n cleanup();\n reject(d.error);\n });\n const cleanup = () => {\n offLoaded();\n offError();\n };\n b.loadDocument(url);\n });\n }\n\n /**\n * Loads a document or navigates to a page within it. If the document is already loaded,\n * directly navigates to the requested page without reloading.\n */\n async loadOrNavigate(\n url: string,\n options?: { page?: number; initialPage?: number }\n ): Promise<{ url: string; numPages: number } | void> {\n const targetPage = options?.page ?? options?.initialPage;\n if (this.getDocumentUrl() === url) {\n if (targetPage && targetPage > 0) {\n this.goToPage(targetPage, { smooth: true });\n }\n return;\n }\n return this.loadDocument(url, options);\n }\n\n /**\n * Programmatically trigger link following for a given link URL or target,\n * routing through targetViewer or opening appropriately.\n */\n openLink(linkUrl: string): void {\n this.bus.emit('action-open-link', { url: linkUrl });\n }\n\n getDocumentUrl(): string | undefined {\n return this.binding?.getDocumentUrl();\n }\n\n getPdfDocument(): pdfjsLib.PDFDocumentProxy | null {\n return this.binding?.getPdfDocument() ?? null;\n }\n\n getCurrentPage(): number {\n return this.binding?.getCurrentPage() ?? 0;\n }\n\n getPageCount(): number {\n return this.binding?.getPageCount() ?? 0;\n }\n\n /** Navigate to a specific page number (1-based). */\n goToPage(pageNumber: number, options: { smooth?: boolean } = {}): void {\n const b = this.binding;\n if (b) {\n b.goToPage(pageNumber, options);\n } else {\n this.bus.emit('action-go-to-page', { page: pageNumber, smooth: options.smooth });\n }\n }\n\n /** Set the current page number (1-based). Alias of goToPage. */\n setCurrentPage(pageNumber: number): void {\n this.goToPage(pageNumber);\n }\n\n /**\n * Scale the document to fit the container width.\n *\n * @param ratio - Optional width ratio fraction (e.g. `0.7` for 70% of available width).\n * Defaults to `1.0` (100% full-width fit).\n */\n fitWidth(ratio?: number): void {\n this.bus.emit('action-fit-to-width', typeof ratio === 'number' ? { ratio } : undefined);\n }\n\n /** Alias of `fitWidth`. */\n fitToWidth(ratio?: number): void {\n this.fitWidth(ratio);\n }\n\n /** Scale the document to fit the entire page within the container viewport. */\n fitPage(): void {\n this.bus.emit('action-fit-to-page');\n }\n\n /** Alias of `fitPage`. */\n fitToPage(): void {\n this.fitPage();\n }\n\n /**\n * Search the document for text matches, returning snippets and page bounding boxes.\n *\n * @param query - Search term.\n * @param options - Search options:\n * - `pages`: Specific 1-based page numbers to search. Defaults to all pages.\n */\n async searchText(query: string, options: { pages?: number[] } = {}): Promise<SearchResult[]> {\n const pdf = this.getPdfDocument();\n if (!pdf) return [];\n const b = this.binding;\n const redactions = b ? b.getRedactions() : [];\n return searchPdfText(pdf, query, redactions, undefined, options.pages);\n }\n\n // ---- transient highlights (citations, search matches) -----------------------------------\n\n /** Get the current list of transient highlights. */\n getTransientHighlights(): TransientHighlight[] {\n return this.binding?.getTransientHighlights() ?? [];\n }\n\n /**\n * Set transient visual highlights across one or more pages.\n * These render directly on the PDF canvas but are NEVER saved into AnnotationManager\n * or exported to XFDF.\n */\n setTransientHighlights(highlights: TransientHighlight[]): void {\n const b = this.binding;\n if (b) {\n b.setTransientHighlights(highlights);\n } else {\n this.bus.emit('action-set-transient-highlights', { highlights });\n }\n this.bus.emit('transientHighlightsChanged', { highlights });\n }\n\n /** Add a single transient highlight to the current list. */\n addTransientHighlight(highlight: TransientHighlight): void {\n const current = this.getTransientHighlights();\n this.setTransientHighlights([...current, highlight]);\n }\n\n /** Clear all active transient highlights. */\n clearTransientHighlights(): void {\n this.setTransientHighlights([]);\n }\n\n /**\n * Search for a snippet or citation query, scroll to its page, and highlight it temporarily.\n * Returns the matched SearchResult or null if not found.\n *\n * @param query - The text snippet to locate and highlight.\n * @param options - Navigation and display options:\n * - `pageIndex`: Preferred page (1-based). When `scope: 'page'`, restricts search to this page.\n * - `scope`: Search scope. `'document'` (default) searches all pages, keeping `pageIndex` as a preference.\n * `'page'` restricts the search strictly to `pageIndex` (avoids full-document walk).\n * If `scope: 'page'` is provided without `pageIndex`, it gracefully degrades to `'document'`.\n * - `pulse`: Animate focus ring (default true).\n * - `scrollTo`: Scroll page into view (default true).\n * - `color`: Background highlight color.\n * - `tooltip`: Tooltip text above the highlight (defaults to matched snippet).\n */\n async highlightSnippet(\n query: string,\n options: {\n pageIndex?: number;\n scope?: 'document' | 'page';\n pulse?: boolean;\n scrollTo?: boolean;\n color?: string;\n tooltip?: string;\n } = {}\n ): Promise<SearchResult | null> {\n const searchOptions: { pages?: number[] } = {};\n if (options.scope === 'page' && options.pageIndex) {\n searchOptions.pages = [options.pageIndex];\n }\n const results = await this.searchText(query, searchOptions);\n let match = results[0];\n if (options.pageIndex) {\n match = results.find(r => r.pageIndex === options.pageIndex) || match;\n }\n if (!match) return null;\n\n const highlight: TransientHighlight = {\n id: match.id,\n pageIndex: match.pageIndex,\n bounds: match.bounds,\n color: options.color || 'rgba(250, 204, 21, 0.45)',\n borderColor: 'rgba(234, 179, 8, 0.85)',\n pulse: options.pulse !== false,\n tooltip: options.tooltip || match.snippet,\n };\n\n this.setTransientHighlights([highlight]);\n\n if (options.scrollTo !== false) {\n this.goToPage(match.pageIndex, { smooth: true });\n }\n\n return match;\n }\n\n // ---- annotations / export --------------------------------------------------------------\n\n getAnnotations(): Annotation[] {\n return this.annotationManager.getAnnotationsList();\n }\n\n /** Get the current list of redactions (pending and applied). */\n getRedactions(): Redaction[] {\n return this.binding?.getRedactions() ?? [];\n }\n\n /** Print the exported document (annotations, redactions and watermark baked in). */\n print(): void {\n this.bus.emit('action-print');\n }\n\n /**\n * Build the exported PDF (annotations + watermark baked, redacted pages rasterized).\n * Uses the bytes of the loaded document; never re-fetches the URL.\n */\n async getFileData(options: ExportOptions = {}): Promise<Uint8Array> {\n const b = this.binding ?? noBinding();\n const pdf = b.getPdfDocument();\n const url = b.getDocumentUrl();\n if (!pdf && !url) throw new Error('No document loaded');\n\n const getSourceBytes = async () => {\n if (pdf) return pdf.getData();\n const response = await fetch(url as string);\n if (!response.ok) throw new Error(`Failed to fetch document (${response.status})`);\n return response.arrayBuffer();\n };\n\n return buildPdfBytes(\n {\n getSourceBytes,\n getPageGeometry: pdf ? createGeometryResolver(pdf) : undefined,\n annotations: this.annotationManager.getAnnotationsList(),\n redactions: b.getRedactions(),\n watermark: b.getWatermark(),\n signerName: b.getCurrentUserName(),\n },\n options\n );\n }\n\n /**\n * Returns the currently selected text string from the document viewer, or an empty string if nothing is selected.\n */\n getSelectedText(): string {\n if (typeof window === 'undefined') return '';\n const selection = window.getSelection();\n return selection ? selection.toString() : '';\n }\n\n /**\n * Copies the currently selected text to the system clipboard.\n * Resolves to true if copying succeeded, false otherwise.\n */\n async copySelectedText(): Promise<boolean> {\n const text = this.getSelectedText();\n if (!text) return false;\n const success = await copyTextToClipboard(text);\n if (success) {\n this.bus.emit('textCopied', { text });\n }\n return success;\n }\n\n // ---- legacy facade ---------------------------------------------------------------------\n\n readonly UI = {\n /** Theming is not implemented; kept for API compatibility. */\n setTheme: (_theme: string) => {},\n goToPage: (pageNumber: number) => this.goToPage(pageNumber),\n setCurrentPageNumber: (pageNumber: number) => this.goToPage(pageNumber),\n openElements: (elements: string[]) => this.bus.emit('action-open-elements', { elements }),\n closeElements: (elements: string[]) => this.bus.emit('action-close-elements', { elements }),\n enableElements: (elements: string[]) => this.bus.emit('action-open-elements', { elements }),\n disableElements: (elements: string[]) => this.bus.emit('action-close-elements', { elements }),\n setActiveLeftPanel: (panel: string) => this.bus.emit('action-set-active-left-panel', { panel }),\n setToolMode: (tool: string | null) => {\n let normalizedTool: any = tool;\n if (tool && (tool.toLowerCase() === 'select' || tool.toLowerCase() === 'textselect')) {\n normalizedTool = 'select';\n } else if (tool && tool.toLowerCase() === 'pan') {\n normalizedTool = 'pan';\n }\n this.bus.emit('action-set-tool', { tool: normalizedTool });\n },\n getSelectedText: () => this.getSelectedText(),\n copySelectedText: () => this.copySelectedText(),\n fitWidth: (ratio?: number) => this.bus.emit('action-fit-to-width', typeof ratio === 'number' ? { ratio } : undefined),\n fitPage: () => this.bus.emit('action-fit-to-page'),\n fitToWidth: (ratio?: number) => this.bus.emit('action-fit-to-width', typeof ratio === 'number' ? { ratio } : undefined),\n fitToPage: () => this.bus.emit('action-fit-to-page'),\n startCompare: (docA: any, docB: any, options?: any) => {\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent('action-start-compare', { detail: { docA, docB, options } }));\n }\n },\n stopCompare: () => {\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent('action-stop-compare'));\n }\n },\n setCompareMode: (mode: 'overlay' | 'side-by-side' | 'semantic') => {\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent('action-set-compare-mode', { detail: { mode } }));\n }\n },\n setCompareColors: (colorA: string, colorB: string) => {\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent('action-set-compare-colors', { detail: { colorA, colorB } }));\n }\n },\n };\n\n readonly Core = ((self: WebViewerInstance) => ({\n /** The real AnnotationManager (XFDF import/export, granular events, permissions). */\n get annotationManager(): AnnotationManager {\n return self.annotationManager;\n },\n documentViewer: {\n addEventListener: (event: string, callback: (detail: unknown) => void): (() => void) =>\n self.bus.on(event, callback),\n removeEventListener: (event: string, callback: (detail: unknown) => void): void =>\n self.bus.off(event, callback),\n getCurrentPage: (): number => self.getCurrentPage(),\n getPageCount: (): number => self.getPageCount(),\n goToPage: (pageNumber: number): void => self.goToPage(pageNumber),\n setCurrentPage: (pageNumber: number): void => self.goToPage(pageNumber),\n setCurrentPageNumber: (pageNumber: number): void => self.goToPage(pageNumber),\n getDocument: () => ({\n getFileData: (options?: ExportOptions) => self.getFileData(options),\n }),\n },\n }))(this);\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * Printing: the exported document (annotations / redactions / watermark baked in) is loaded into a\n * hidden iframe and printed through the browser's PDF viewer. Falls back to opening the PDF in a\n * new tab when the frame cannot print (e.g. the browser has no inline PDF viewer).\n */\nexport interface PrintOptions {\n title?: string;\n /** How long the hidden frame is kept alive for the print dialog (default 60s). */\n timeoutMs?: number;\n}\n\nexport async function printPdfBytes(bytes: Uint8Array, opts: PrintOptions = {}): Promise<void> {\n if (typeof document === 'undefined') throw new Error('[teamsync-pdf-viewer] printing needs a browser');\n const blob = new Blob([bytes as BlobPart], { type: 'application/pdf' });\n const url = URL.createObjectURL(blob);\n const iframe = document.createElement('iframe');\n iframe.style.cssText = 'position:fixed;right:0;bottom:0;width:0;height:0;border:0;visibility:hidden;';\n iframe.title = opts.title ?? 'Print';\n iframe.setAttribute('aria-hidden', 'true');\n\n await new Promise<void>((resolve, reject) => {\n let settled = false;\n const cleanup = () => {\n iframe.remove();\n URL.revokeObjectURL(url);\n };\n const finish = () => {\n if (settled) return;\n settled = true;\n setTimeout(cleanup, opts.timeoutMs ?? 60000);\n resolve();\n };\n iframe.onload = () => {\n try {\n const w = iframe.contentWindow;\n if (!w) throw new Error('no frame window');\n w.focus();\n w.print();\n } catch {\n // No inline PDF viewer (or it refused): let the user print from a new tab instead.\n window.open(url, '_blank', 'noopener');\n }\n finish();\n };\n iframe.onerror = () => {\n cleanup();\n if (!settled) {\n settled = true;\n reject(new Error('[teamsync-pdf-viewer] print frame failed to load'));\n }\n };\n document.body.appendChild(iframe);\n iframe.src = url;\n });\n}\n","import type {\n OfficeFileType,\n OfficeDocumentCategory,\n OfficeBadgeMeta,\n OfficeDocumentInfo,\n} from './types';\n\nconst MIME_MAP: Record<string, OfficeFileType> = {\n // Word\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'docx',\n 'application/msword': 'doc',\n // PowerPoint\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation': 'pptx',\n 'application/vnd.ms-powerpoint': 'ppt',\n // Excel\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': 'xlsx',\n 'application/vnd.ms-excel': 'xls',\n};\n\nconst EXTENSION_MAP: Record<string, OfficeFileType> = {\n docx: 'docx',\n doc: 'doc',\n pptx: 'pptx',\n ppt: 'ppt',\n xlsx: 'xlsx',\n xls: 'xls',\n};\n\n/**\n * Extracts file extension from a URL, path, or filename, taking into account query parameters,\n * hash fragments, and standard file paths.\n */\nfunction extractExtension(pathOrUrl: string): string | null {\n try {\n const clean = pathOrUrl.split('#')[0].split('?')[0];\n\n // If the path itself is an API conversion endpoint, it serves PDF output directly\n if (clean.endsWith('/api/convert') || clean.endsWith('/convert')) {\n return null;\n }\n\n // 1. Check for filename param in hash or query (e.g., #filename=report.docx or ?filename=report.docx)\n const urlMatch = pathOrUrl.match(/[?&#](?:filename|file|name)=([^&#]+)/i);\n if (urlMatch && urlMatch[1]) {\n const decoded = decodeURIComponent(urlMatch[1]);\n const ext = extractExtensionFromSimpleName(decoded);\n if (ext) return ext;\n }\n\n // 2. Check path portion without query or hash\n return extractExtensionFromSimpleName(clean);\n } catch {\n return null;\n }\n}\n\nfunction extractExtensionFromSimpleName(name: string): string | null {\n const lastSlash = Math.max(name.lastIndexOf('/'), name.lastIndexOf('\\\\'));\n const filename = lastSlash >= 0 ? name.slice(lastSlash + 1) : name;\n const lastDot = filename.lastIndexOf('.');\n if (lastDot <= 0 || lastDot === filename.length - 1) return null;\n return filename.slice(lastDot + 1).toLowerCase();\n}\n\n/**\n * Detects whether a string URL, File, or Blob represents a supported Microsoft Office document.\n */\nexport function getOfficeFileType(target: unknown): OfficeFileType | null {\n if (!target) return null;\n\n // File or Blob instance\n if (typeof (globalThis as any).Blob !== 'undefined' && target instanceof Blob) {\n if (typeof (globalThis as any).File !== 'undefined' && target instanceof File && target.name) {\n const ext = extractExtension(target.name);\n if (ext && ext in EXTENSION_MAP) {\n return EXTENSION_MAP[ext];\n }\n }\n if (target.type && target.type in MIME_MAP) {\n return MIME_MAP[target.type];\n }\n return null;\n }\n\n // String URL or filename\n if (typeof target === 'string') {\n const ext = extractExtension(target);\n if (ext && ext in EXTENSION_MAP) {\n return EXTENSION_MAP[ext];\n }\n }\n\n return null;\n}\n\n/**\n * Returns true if the given input is a supported Microsoft Office document.\n */\nexport function isOfficeDocument(target: unknown): boolean {\n return getOfficeFileType(target) !== null;\n}\n\n/**\n * Returns the broad document category ('word' | 'powerpoint' | 'excel') for an Office file type.\n */\nexport function getOfficeDocumentCategory(fileType: OfficeFileType): OfficeDocumentCategory {\n switch (fileType) {\n case 'docx':\n case 'doc':\n return 'word';\n case 'pptx':\n case 'ppt':\n return 'powerpoint';\n case 'xlsx':\n case 'xls':\n return 'excel';\n }\n}\n\n/**\n * Returns standard MIME type for an Office file type.\n */\nexport function getOfficeMimeType(fileType: OfficeFileType): string {\n switch (fileType) {\n case 'docx':\n return 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';\n case 'doc':\n return 'application/msword';\n case 'pptx':\n return 'application/vnd.openxmlformats-officedocument.presentationml.presentation';\n case 'ppt':\n return 'application/vnd.ms-powerpoint';\n case 'xlsx':\n return 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';\n case 'xls':\n return 'application/vnd.ms-excel';\n }\n}\n\n/**\n * Metadata used to display themed UI badges, spinners, and icons for Office document types.\n */\nexport function getOfficeBadgeMeta(fileType: OfficeFileType): OfficeBadgeMeta {\n const category = getOfficeDocumentCategory(fileType);\n switch (category) {\n case 'word':\n return {\n category: 'word',\n name: fileType === 'docx' ? 'Word Document (.docx)' : 'Word Document (.doc)',\n extension: fileType.toUpperCase(),\n brandColor: '#185abd',\n darkBrandColor: '#103f91',\n iconName: 'word',\n };\n case 'powerpoint':\n return {\n category: 'powerpoint',\n name: fileType === 'pptx' ? 'PowerPoint Presentation (.pptx)' : 'PowerPoint Presentation (.ppt)',\n extension: fileType.toUpperCase(),\n brandColor: '#d24726',\n darkBrandColor: '#9b2e15',\n iconName: 'powerpoint',\n };\n case 'excel':\n return {\n category: 'excel',\n name: fileType === 'xlsx' ? 'Excel Workbook (.xlsx)' : 'Excel Spreadsheet (.xls)',\n extension: fileType.toUpperCase(),\n brandColor: '#107c41',\n darkBrandColor: '#094e28',\n iconName: 'excel',\n };\n }\n}\n\n/**\n * Inspects a target and returns rich Office metadata if it is an Office document.\n */\nexport function getOfficeDocumentInfo(target: unknown): OfficeDocumentInfo | null {\n const fileType = getOfficeFileType(target);\n if (!fileType) return null;\n\n const category = getOfficeDocumentCategory(fileType);\n const mimeType = getOfficeMimeType(fileType);\n\n let fileName: string | undefined;\n let originalUrl: string | undefined;\n\n if (typeof (globalThis as any).File !== 'undefined' && target instanceof File) {\n fileName = target.name;\n } else if (typeof target === 'string') {\n originalUrl = target;\n const clean = target.split('#')[0].split('?')[0];\n const lastSlash = Math.max(clean.lastIndexOf('/'), clean.lastIndexOf('\\\\'));\n fileName = lastSlash >= 0 ? clean.slice(lastSlash + 1) : clean;\n }\n\n return {\n fileType,\n category,\n fileName,\n originalUrl,\n mimeType,\n };\n}\n\nexport const isOfficeDocumentUrl = isOfficeDocument;\nexport const isOfficeFile = isOfficeDocument;\nexport const detectOfficeType = getOfficeFileType;\nexport function isOfficeExtension(ext: string): boolean {\n return getOfficeFileType(`file.${ext.replace(/^\\./, '')}`) !== null;\n}\nexport const SUPPORTED_OFFICE_EXTENSIONS = ['docx', 'doc', 'pptx', 'ppt', 'xlsx', 'xls'] as const;\n","import type { OfficeConverterConfig, OfficeFileType } from './types';\nimport { getOfficeFileType, getOfficeMimeType } from './officeDetector';\n\n// In-memory cache for converted PDF ArrayBuffers across document switches in the current session\nconst memoryCache = new Map<string, ArrayBuffer>();\n\n/**\n * Computes a cache key for a document (string URL or File/Blob/Buffer).\n */\nasync function computeCacheKey(\n fileOrUrl: string | File | Blob | ArrayBuffer,\n fileType: OfficeFileType\n): Promise<string> {\n if (typeof fileOrUrl === 'string') {\n return `office_cache:${fileType}:${fileOrUrl}`;\n }\n\n if (typeof (globalThis as any).File !== 'undefined' && fileOrUrl instanceof File) {\n return `office_cache:${fileType}:${fileOrUrl.name}:${fileOrUrl.size}:${fileOrUrl.lastModified}`;\n }\n\n if (typeof (globalThis as any).Blob !== 'undefined' && fileOrUrl instanceof Blob) {\n return `office_cache:${fileType}:blob:${fileOrUrl.size}:${fileOrUrl.type}`;\n }\n\n if (fileOrUrl instanceof ArrayBuffer) {\n return `office_cache:${fileType}:buffer:${fileOrUrl.byteLength}`;\n }\n\n return `office_cache:${fileType}:${String(fileOrUrl)}`;\n}\n\n/**\n * Retrieves a cached converted PDF from memory or sessionStorage.\n */\nexport async function getCachedOfficePdf(\n fileOrUrl: string | File | Blob | ArrayBuffer,\n fileType: OfficeFileType,\n cacheMode: OfficeConverterConfig['cache'] = 'memory'\n): Promise<ArrayBuffer | null> {\n if (cacheMode === 'none' || cacheMode === false) return null;\n\n const key = await computeCacheKey(fileOrUrl, fileType);\n\n if (memoryCache.has(key)) {\n return memoryCache.get(key)!.slice(0);\n }\n\n if (cacheMode === 'session' && typeof window !== 'undefined' && window.sessionStorage) {\n try {\n const base64 = window.sessionStorage.getItem(key);\n if (base64) {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n memoryCache.set(key, bytes.buffer);\n return bytes.buffer;\n }\n } catch {\n // Ignore quota exceeded or storage errors\n }\n }\n\n return null;\n}\n\n/**\n * Stores a converted PDF in memory and optionally sessionStorage.\n */\nexport async function setCachedOfficePdf(\n fileOrUrl: string | File | Blob | ArrayBuffer,\n fileType: OfficeFileType,\n pdfBuffer: ArrayBuffer,\n cacheMode: OfficeConverterConfig['cache'] = 'memory'\n): Promise<void> {\n if (cacheMode === 'none' || cacheMode === false) return;\n\n const key = await computeCacheKey(fileOrUrl, fileType);\n memoryCache.set(key, pdfBuffer.slice(0));\n\n if (cacheMode === 'session' && typeof window !== 'undefined' && window.sessionStorage) {\n try {\n // Only cache documents under 5MB in sessionStorage to avoid QuotaExceededError\n if (pdfBuffer.byteLength < 5 * 1024 * 1024) {\n const bytes = new Uint8Array(pdfBuffer);\n let binary = '';\n const chunkSize = 8192;\n for (let i = 0; i < bytes.length; i += chunkSize) {\n binary += String.fromCharCode.apply(null, Array.from(bytes.subarray(i, i + chunkSize)));\n }\n window.sessionStorage.setItem(key, btoa(binary));\n }\n } catch {\n // Ignore sessionStorage failure\n }\n }\n}\n\n/**\n * Clears the converted document cache.\n */\nexport function clearOfficeCache(): void {\n memoryCache.clear();\n if (typeof window !== 'undefined' && window.sessionStorage) {\n try {\n const keysToRemove: string[] = [];\n for (let i = 0; i < window.sessionStorage.length; i++) {\n const k = window.sessionStorage.key(i);\n if (k && k.startsWith('office_cache:')) {\n keysToRemove.push(k);\n }\n }\n keysToRemove.forEach((k) => window.sessionStorage.removeItem(k));\n } catch {}\n }\n}\n\nexport interface ConvertOfficeDocumentResult {\n /** Raw PDF ArrayBuffer ready for PDF.js or downstream processing */\n pdfBuffer: ArrayBuffer;\n /** Browser Blob Object URL (e.g. blob:http...) ready for rendering or iframe preview */\n objectUrl: string;\n /** Whether the document was served from cache */\n fromCache: boolean;\n}\n\n/**\n * Converts an Office document (Word, PowerPoint, Excel) into a standardized PDF ArrayBuffer\n * and Blob URL using either a custom converter or the configured backend microservice.\n */\nexport async function convertOfficeDocument(\n fileOrUrl: string | File | Blob | ArrayBuffer,\n config: OfficeConverterConfig,\n fileName?: string\n): Promise<ConvertOfficeDocumentResult> {\n const fileType = getOfficeFileType(fileOrUrl);\n if (!fileType) {\n throw new Error(\n `Unsupported Office document format. Expected .docx, .doc, .pptx, .ppt, .xlsx, or .xls.`\n );\n }\n\n // 1. Check cache first\n const cacheMode = config.cache ?? 'memory';\n const cached = await getCachedOfficePdf(fileOrUrl, fileType, cacheMode);\n if (cached) {\n const blob = new Blob([cached], { type: 'application/pdf' });\n const objectUrl = URL.createObjectURL(blob);\n return { pdfBuffer: cached, objectUrl, fromCache: true };\n }\n\n let pdfBuffer: ArrayBuffer;\n\n // 2. Custom conversion hook takes precedence if supplied\n if (config.convert) {\n const converted = await config.convert(fileOrUrl, fileType, {\n fileName,\n excelOptions: config.excelOptions,\n });\n\n if (typeof converted === 'string') {\n if (converted.startsWith('blob:') || converted.startsWith('data:') || converted.startsWith('http')) {\n const resp = await fetch(converted);\n pdfBuffer = await resp.arrayBuffer();\n } else {\n throw new Error(`Custom converter returned an invalid URL string: ${converted}`);\n }\n } else if (converted instanceof ArrayBuffer) {\n pdfBuffer = converted;\n } else if (converted instanceof Uint8Array) {\n const copy = new Uint8Array(converted.byteLength);\n copy.set(converted);\n pdfBuffer = copy.buffer;\n } else if (typeof Blob !== 'undefined' && converted instanceof Blob) {\n pdfBuffer = await converted.arrayBuffer();\n } else {\n throw new Error(`Custom converter returned an unsupported data type.`);\n }\n } else {\n // 3. Built-in HTTP backend conversion\n if (!config.endpoint) {\n throw new Error(\n `No conversion endpoint or custom converter configured. Please specify 'officeConverter.endpoint' in viewer options or provide a custom 'officeConverter.convert' function.`\n );\n }\n\n // Prepare headers\n let customHeaders: Record<string, string> = {};\n if (config.headers) {\n customHeaders = typeof config.headers === 'function' ? await config.headers() : { ...config.headers };\n }\n\n if (config.authToken) {\n const token = typeof config.authToken === 'function' ? await config.authToken() : config.authToken;\n if (token) {\n customHeaders['Authorization'] =\n token.startsWith('Bearer ') || token.startsWith('Basic ') ? token : `Bearer ${token}`;\n }\n }\n\n // Resolve file content to Blob/File\n let uploadBlob: Blob;\n let uploadFileName = fileName || `document.${fileType}`;\n\n if (typeof fileOrUrl === 'string') {\n // Fetch source file from URL\n const sourceResp = await fetch(fileOrUrl);\n if (!sourceResp.ok) {\n throw new Error(\n `Failed to fetch Office document from URL: ${fileOrUrl} (HTTP ${sourceResp.status})`\n );\n }\n uploadBlob = await sourceResp.blob();\n if (!fileName) {\n const match = fileOrUrl.match(/[?&#](?:filename|file|name)=([^&#]+)/i);\n if (match && match[1]) {\n const decoded = decodeURIComponent(match[1]);\n const lastSlash = Math.max(decoded.lastIndexOf('/'), decoded.lastIndexOf('\\\\'));\n uploadFileName = lastSlash >= 0 ? decoded.slice(lastSlash + 1) : decoded;\n } else {\n const clean = fileOrUrl.split('#')[0].split('?')[0];\n const lastSlash = Math.max(clean.lastIndexOf('/'), clean.lastIndexOf('\\\\'));\n if (lastSlash >= 0) {\n uploadFileName = clean.slice(lastSlash + 1);\n }\n }\n }\n } else if (typeof (globalThis as any).File !== 'undefined' && fileOrUrl instanceof File) {\n uploadBlob = fileOrUrl;\n uploadFileName = fileOrUrl.name;\n } else if (typeof (globalThis as any).Blob !== 'undefined' && fileOrUrl instanceof Blob) {\n uploadBlob = fileOrUrl;\n } else if (fileOrUrl instanceof ArrayBuffer) {\n uploadBlob = new Blob([fileOrUrl], { type: getOfficeMimeType(fileType) });\n } else {\n throw new Error('Unsupported Office document input source.');\n }\n\n // Ensure uploadFileName always has a valid Office extension so Gotenberg identifies the engine\n if (!uploadFileName.includes('.') || uploadFileName.endsWith('.')) {\n uploadFileName = `${uploadFileName.replace(/\\.$/, '')}.${fileType}`;\n }\n\n // Construct FormData for Gotenberg / LibreOffice microservice.\n // Gotenberg accepts files under the 'files' field name. Providing exactly one file returns the converted PDF directly.\n const formData = new FormData();\n formData.append('files', uploadBlob, uploadFileName);\n\n if (config.excelOptions) {\n if (config.excelOptions.fitToPageWidth) {\n formData.append('fitToPageWidth', 'true');\n }\n if (config.excelOptions.includeGridlines) {\n formData.append('includeGridlines', 'true');\n }\n }\n\n const convertResp = await fetch(config.endpoint, {\n method: 'POST',\n headers: customHeaders,\n body: formData,\n });\n\n if (!convertResp.ok) {\n let errorDetail = '';\n try {\n errorDetail = await convertResp.text();\n } catch {}\n throw new Error(\n `Document conversion service failed with HTTP ${convertResp.status}: ${errorDetail || convertResp.statusText}`\n );\n }\n\n pdfBuffer = await convertResp.arrayBuffer();\n }\n\n // 4. Save to cache\n await setCachedOfficePdf(fileOrUrl, fileType, pdfBuffer, cacheMode);\n\n const blob = new Blob([pdfBuffer], { type: 'application/pdf' });\n const objectUrl = URL.createObjectURL(blob);\n\n return {\n pdfBuffer,\n objectUrl,\n fromCache: false,\n };\n}\n\n/**\n * Convenience helper to convert a remote Office document URL.\n */\nexport async function convertOfficeUrl(\n url: string,\n config: OfficeConverterConfig,\n fileName?: string\n): Promise<ConvertOfficeDocumentResult> {\n return convertOfficeDocument(url, config, fileName);\n}\n\n/**\n * Convenience helper to convert a local Office File or Blob.\n */\nexport async function convertOfficeFile(\n file: File | Blob,\n config: OfficeConverterConfig,\n fileName?: string\n): Promise<ConvertOfficeDocumentResult> {\n return convertOfficeDocument(file, config, fileName);\n}\n\n/**\n * Unified Office converter service object.\n */\nexport const officeConverter = {\n convert: convertOfficeDocument,\n convertDocument: convertOfficeDocument,\n convertUrl: convertOfficeUrl,\n convertFile: convertOfficeFile,\n getCached: getCachedOfficePdf,\n setCached: setCachedOfficePdf,\n clearCache: clearOfficeCache,\n};\n\n","import React from 'react';\nimport type { OfficeFileType } from './types';\nimport { getOfficeBadgeMeta } from './officeDetector';\n\nexport interface OfficeLoadingOverlayProps {\n fileType: OfficeFileType;\n fileName?: string;\n error?: Error | null;\n onRetry?: () => void;\n}\n\nexport const OfficeLoadingOverlay: React.FC<OfficeLoadingOverlayProps> = ({\n fileType,\n fileName,\n error,\n onRetry,\n}) => {\n const meta = getOfficeBadgeMeta(fileType);\n\n return (\n <div\n style={{\n position: 'absolute',\n inset: 0,\n backgroundColor: 'rgba(255, 255, 255, 0.95)',\n backdropFilter: 'blur(4px)',\n zIndex: 100,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '24px',\n color: '#1e293b',\n fontFamily:\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif',\n }}\n >\n <div\n style={{\n maxWidth: '460px',\n width: '100%',\n backgroundColor: '#ffffff',\n borderRadius: '16px',\n boxShadow: '0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1)',\n border: '1px solid #e2e8f0',\n padding: '32px 28px',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n textAlign: 'center',\n }}\n >\n {/* Document Type Badge */}\n <div\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '8px',\n backgroundColor: meta.brandColor,\n color: '#ffffff',\n padding: '6px 14px',\n borderRadius: '9999px',\n fontSize: '12px',\n fontWeight: 600,\n letterSpacing: '0.05em',\n textTransform: 'uppercase',\n marginBottom: '20px',\n boxShadow: `0 4px 12px ${meta.brandColor}40`,\n }}\n >\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\" />\n <polyline points=\"14 2 14 8 20 8\" />\n <line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\" />\n <line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\" />\n <polyline points=\"10 9 9 9 8 9\" />\n </svg>\n {meta.extension} Document\n </div>\n\n {/* Icon & Animation */}\n {!error ? (\n <div style={{ position: 'relative', width: '64px', height: '64px', marginBottom: '20px' }}>\n <svg\n style={{\n animation: 'teamsync-spin 1.2s cubic-bezier(0.4, 0, 0.2, 1) infinite',\n width: '64px',\n height: '64px',\n }}\n viewBox=\"0 0 50 50\"\n >\n <circle\n cx=\"25\"\n cy=\"25\"\n r=\"20\"\n fill=\"none\"\n stroke=\"#e2e8f0\"\n strokeWidth=\"4\"\n />\n <circle\n cx=\"25\"\n cy=\"25\"\n r=\"20\"\n fill=\"none\"\n stroke={meta.brandColor}\n strokeWidth=\"4\"\n strokeDasharray=\"80\"\n strokeDashoffset=\"60\"\n strokeLinecap=\"round\"\n />\n </svg>\n <div\n style={{\n position: 'absolute',\n inset: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontWeight: 700,\n fontSize: '15px',\n color: meta.brandColor,\n }}\n >\n {meta.extension[0]}\n </div>\n </div>\n ) : (\n <div\n style={{\n width: '56px',\n height: '56px',\n borderRadius: '50%',\n backgroundColor: '#fee2e2',\n color: '#ef4444',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n marginBottom: '20px',\n }}\n >\n <svg\n width=\"28\"\n height=\"28\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\" />\n </svg>\n </div>\n )}\n\n {/* Title */}\n <h3\n style={{\n margin: '0 0 8px 0',\n fontSize: '18px',\n fontWeight: 600,\n color: '#0f172a',\n }}\n >\n {error ? 'Conversion Failed' : `Preparing ${meta.name}`}\n </h3>\n\n {/* Filename if available */}\n {fileName && (\n <p\n style={{\n margin: '0 0 12px 0',\n fontSize: '13px',\n color: '#64748b',\n fontWeight: 500,\n maxWidth: '360px',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n title={fileName}\n >\n {fileName}\n </p>\n )}\n\n {/* Body message */}\n <p\n style={{\n margin: '0 0 20px 0',\n fontSize: '13px',\n lineHeight: 1.5,\n color: error ? '#b91c1c' : '#475569',\n }}\n >\n {error\n ? error.message || 'An error occurred while converting the Office document.'\n : 'Rendering document with native fonts, vector graphics, and formatting…'}\n </p>\n\n {/* Action Button on Error */}\n {error && onRetry && (\n <button\n onClick={onRetry}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '6px',\n backgroundColor: meta.brandColor,\n color: '#ffffff',\n border: 'none',\n borderRadius: '8px',\n padding: '9px 18px',\n fontSize: '13px',\n fontWeight: 500,\n cursor: 'pointer',\n transition: 'opacity 0.2s',\n }}\n onMouseOver={(e) => ((e.currentTarget as HTMLElement).style.opacity = '0.9')}\n onMouseOut={(e) => ((e.currentTarget as HTMLElement).style.opacity = '1')}\n >\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"1 4 1 10 7 10\" />\n <path d=\"M3.51 15a9 9 0 1 0 2.13-9.36L1 10\" />\n </svg>\n Retry Conversion\n </button>\n )}\n </div>\n\n <style>{`\n @keyframes teamsync-spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n `}</style>\n </div>\n );\n};\n","/**\n * TeamSync PDF Viewer SDK — Office Pre-Conversion Hook & Helper\n *\n * Implements the Host-Side component of the Enterprise Hybrid Architecture:\n * Allows host applications to pre-convert Office documents before mounting\n * the viewer, cache results, inspect conversion state, and pass ready-to-view\n * PDF URLs directly to <TeamSyncViewer fileUrl={pdfUrl} />.\n */\n\nimport { useState, useEffect, useRef, useCallback } from 'react';\nimport { isOfficeDocument, getOfficeFileType, getOfficeDocumentInfo } from './officeDetector';\nimport { convertOfficeDocument, getCachedOfficePdf } from './officeConverter';\nimport type { OfficeConverterConfig, OfficeFileType, OfficeDocumentInfo } from './types';\n\nexport interface UseOfficeDocumentOptions {\n /** Converter configuration (endpoint, authToken, cache mode, etc.) */\n converterConfig?: OfficeConverterConfig;\n /** Optional file name override */\n fileName?: string;\n /** Whether to automatically convert when the document changes (defaults to true) */\n autoConvert?: boolean;\n}\n\nexport interface UseOfficeDocumentResult {\n /** Whether the input source was identified as a Microsoft Office document */\n isOffice: boolean;\n /** Detected office file type ('docx', 'pptx', 'xlsx', etc.) or null if PDF */\n fileType: OfficeFileType | null;\n /** Detailed metadata about the office document */\n documentInfo: OfficeDocumentInfo | null;\n /** Whether conversion is actively in progress */\n isConverting: boolean;\n /** The final PDF URL ready for the viewer (<TeamSyncViewer fileUrl={pdfUrl} />) */\n pdfUrl: string | null;\n /** Raw PDF ArrayBuffer */\n pdfBuffer: ArrayBuffer | null;\n /** Whether the document was served from memory/session cache */\n fromCache: boolean;\n /** Any error encountered during conversion */\n error: Error | null;\n /** Manually trigger conversion or retry */\n convert: () => Promise<string | null>;\n}\n\n/**\n * React hook that pre-converts Office documents into viewable PDF URLs before viewer mounting.\n * If the input is already a PDF, it passes through immediately with `isConverting: false`.\n */\nexport function useOfficeDocument(\n fileOrUrl: string | File | Blob | ArrayBuffer | null | undefined,\n options: UseOfficeDocumentOptions = {}\n): UseOfficeDocumentResult {\n const { autoConvert = true } = options;\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const [isConverting, setIsConverting] = useState<boolean>(false);\n const [pdfUrl, setPdfUrl] = useState<string | null>(() => {\n // If initially given a string URL that is NOT an office doc, initialize immediately\n if (typeof fileOrUrl === 'string' && !isOfficeDocument(fileOrUrl)) {\n return fileOrUrl;\n }\n return null;\n });\n const [pdfBuffer, setPdfBuffer] = useState<ArrayBuffer | null>(null);\n const [fromCache, setFromCache] = useState<boolean>(false);\n const [error, setError] = useState<Error | null>(null);\n\n const createdObjectUrlRef = useRef<string | null>(null);\n\n const isOffice = fileOrUrl ? isOfficeDocument(fileOrUrl) : false;\n const fileType = fileOrUrl ? getOfficeFileType(fileOrUrl) : null;\n const documentInfo = fileOrUrl ? getOfficeDocumentInfo(fileOrUrl) : null;\n\n const cleanupUrl = useCallback(() => {\n if (createdObjectUrlRef.current) {\n URL.revokeObjectURL(createdObjectUrlRef.current);\n createdObjectUrlRef.current = null;\n }\n }, []);\n\n const runConversion = useCallback(async (): Promise<string | null> => {\n if (!fileOrUrl) {\n cleanupUrl();\n setPdfUrl(null);\n setPdfBuffer(null);\n return null;\n }\n\n const { converterConfig = {}, fileName } = optionsRef.current;\n\n // Pass through PDFs directly\n if (!isOffice) {\n if (typeof fileOrUrl === 'string') {\n cleanupUrl();\n setPdfUrl(fileOrUrl);\n setPdfBuffer(null);\n setFromCache(false);\n setError(null);\n return fileOrUrl;\n }\n if (typeof (globalThis as any).Blob !== 'undefined' && fileOrUrl instanceof Blob) {\n cleanupUrl();\n const url = URL.createObjectURL(fileOrUrl);\n createdObjectUrlRef.current = url;\n setPdfUrl(url);\n setFromCache(false);\n setError(null);\n return url;\n }\n return null;\n }\n\n setIsConverting(true);\n setError(null);\n\n try {\n const result = await convertOfficeDocument(fileOrUrl, converterConfig, fileName);\n cleanupUrl();\n createdObjectUrlRef.current = result.objectUrl;\n\n setPdfUrl(result.objectUrl);\n setPdfBuffer(result.pdfBuffer);\n setFromCache(result.fromCache);\n setIsConverting(false);\n return result.objectUrl;\n } catch (err: any) {\n const convertedError = err instanceof Error ? err : new Error(String(err));\n setError(convertedError);\n setIsConverting(false);\n return null;\n }\n }, [fileOrUrl, isOffice, cleanupUrl]);\n\n useEffect(() => {\n if (autoConvert && fileOrUrl) {\n runConversion();\n }\n return () => {\n cleanupUrl();\n };\n }, [fileOrUrl, autoConvert, runConversion, cleanupUrl]);\n\n return {\n isOffice,\n fileType,\n documentInfo,\n isConverting,\n pdfUrl,\n pdfBuffer,\n fromCache,\n error,\n convert: runConversion,\n };\n}\n\n/**\n * Standalone asynchronous preloader for Office documents.\n * Can be called anywhere (e.g. in loaders, event handlers, or background tasks).\n */\nexport async function preloadOfficeDocument(\n fileOrUrl: string | File | Blob | ArrayBuffer,\n config: OfficeConverterConfig,\n fileName?: string\n): Promise<{\n pdfUrl: string;\n pdfBuffer: ArrayBuffer;\n fromCache: boolean;\n fileType: OfficeFileType | 'pdf';\n}> {\n if (!isOfficeDocument(fileOrUrl)) {\n if (typeof fileOrUrl === 'string') {\n const resp = await fetch(fileOrUrl);\n const buffer = await resp.arrayBuffer();\n return { pdfUrl: fileOrUrl, pdfBuffer: buffer, fromCache: false, fileType: 'pdf' };\n }\n if (typeof (globalThis as any).Blob !== 'undefined' && fileOrUrl instanceof Blob) {\n const buffer = await fileOrUrl.arrayBuffer();\n const url = URL.createObjectURL(fileOrUrl);\n return { pdfUrl: url, pdfBuffer: buffer, fromCache: false, fileType: 'pdf' };\n }\n if (fileOrUrl instanceof ArrayBuffer) {\n const blob = new Blob([fileOrUrl], { type: 'application/pdf' });\n return { pdfUrl: URL.createObjectURL(blob), pdfBuffer: fileOrUrl, fromCache: false, fileType: 'pdf' };\n }\n }\n\n const fileType = getOfficeFileType(fileOrUrl) || 'docx';\n const result = await convertOfficeDocument(fileOrUrl, config, fileName);\n\n return {\n pdfUrl: result.objectUrl,\n pdfBuffer: result.pdfBuffer,\n fromCache: result.fromCache,\n fileType,\n };\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * <TeamSyncViewer> — the embeddable viewer component.\n *\n * Owns every piece of UI state the demo application shell used to own (tabs, panels, zoom, layout,\n * rotation), sizes itself to its container, scopes keyboard shortcuts and the action bus to this\n * instance (several viewers can share a page) and exposes a WebViewerInstance via `ref` / `onReady`.\n */\nimport React, { useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react';\nimport type * as pdfjsLib from 'pdfjs-dist';\n// Library styles are extracted to dist/style.css by the lib build (consumers import\n// 'teamsync-pdf-viewer/style.css'); bundlers keep this import because of `sideEffects` metadata.\nimport '../index.css';\nimport Header from './Header';\nimport DocumentViewer, { type DocumentLoadErrorInfo } from './DocumentViewer';\nimport SettingsModal from './SettingsModal';\nimport AboutModal from './AboutModal';\nimport { ViewerBus } from '../core/eventBus';\nimport { ViewerBusContext } from '../core/busContext';\nimport { WebViewerInstance } from '../core/ViewerInstance';\nimport { AnnotationManager } from '../annotations/AnnotationManager';\nimport { printPdfBytes } from '../core/print';\nimport { useShortcuts, matchShortcut } from '../hooks/useShortcuts';\nimport type { WebViewerOptions, SDKPermissions, Redaction, TransientHighlight, LinkClickEvent } from '../core/types';\nimport type { Annotation } from '../annotations/types';\nimport { calculateNextZoomIn, calculateNextZoomOut, clampScale, MIN_SCALE, MAX_SCALE } from '../utils/zoomUtils';\nimport {\n getOfficeDocumentInfo,\n convertOfficeDocument,\n OfficeLoadingOverlay,\n type OfficeConverterConfig,\n type OfficeFileType,\n} from '../office';\n\nexport interface TeamSyncViewerProps extends Omit<WebViewerOptions, 'path'> {\n /** URL of the PDF to display. Alias of `initialDoc`; `fileUrl` wins when both are set. */\n fileUrl?: string;\n /** Fires once, after mount, with the instance handle. */\n onReady?: (instance: WebViewerInstance) => void;\n onDocumentLoaded?: (info: { url: string; numPages: number }) => void;\n /**\n * Fires when the document could not be loaded. `retry(newUrl?)` reloads — pass a fresh URL when\n * the previous one was a presigned link that expired.\n */\n onDocumentLoadError?: (error: Error, retry: (newUrl?: string) => void, info: DocumentLoadErrorInfo) => void;\n /** Fires once per document, after the first page canvas has been painted. */\n onFirstPageRendered?: (info: { url: string; pageNumber: number }) => void;\n /** Fires whenever any page canvas has finished rendering. */\n onPageRendered?: (info: { url: string; pageNumber: number }) => void;\n /** Fires (in addition to onDocumentLoadError) when the document is password protected. */\n onPasswordRequired?: (info: { url: string }) => void;\n onPageChange?: (pageNumber: number, numPages: number) => void;\n onAnnotationsChange?: (annotations: Annotation[]) => void;\n /** Fires whenever pending or applied redactions change in the viewer. */\n onRedactionsChange?: (redactions: Redaction[]) => void;\n /** Fires once per user click of Apply in the confirmation modal with all applied redactions. */\n onRedactionsApplied?: (redactions: Redaction[]) => void;\n /** Fires whenever transient highlights change. */\n onTransientHighlightsChange?: (highlights: TransientHighlight[]) => void;\n /** Fires whenever the user selects text within the document. */\n onTextSelected?: (info: { text: string }) => void;\n /** Fires whenever text is copied from the document. */\n onTextCopied?: (info: { text: string }) => void;\n /** Unique ID for this viewer instance, enabling other viewers to target it by name. */\n id?: string;\n /**\n * Target viewer instance, ref, getter, or instance ID to open cross-document links in.\n * When a link annotation pointing to another PDF is clicked, the document will automatically\n * be loaded and navigated in this target viewer instance.\n */\n targetViewer?:\n | WebViewerInstance\n | React.RefObject<WebViewerInstance | null>\n | (() => WebViewerInstance | null)\n | string;\n /**\n * Optional custom resolver for cross-document links.\n * Allows transforming relative filenames, document IDs, or URNs into full fetchable document URLs or target pages.\n */\n resolveLinkUrl?: (\n linkUrl: string,\n context: { sourceViewer: WebViewerInstance; annotation?: Annotation }\n ) => string | { url: string; page?: number } | Promise<string | { url: string; page?: number } | null> | null;\n /**\n * Fires when a link annotation or embedded PDF link is clicked.\n * Call `event.preventDefault()` to suppress default behavior.\n */\n onLinkClick?: (event: LinkClickEvent) => boolean | void | Promise<void>;\n /**\n * Configuration for viewing Microsoft Office documents (.docx, .doc, .pptx, .ppt, .xlsx, .xls).\n */\n officeConverter?: OfficeConverterConfig;\n /** Fires when an Office document starts converting to PDF. */\n onOfficeConverting?: (info: { fileType: OfficeFileType; url?: string; fileName?: string }) => void;\n /** Fires when an Office document has successfully converted to PDF. */\n onOfficeConverted?: (info: { fileType: OfficeFileType; url?: string; fromCache: boolean }) => void;\n /** Fires when an Office document conversion encounters an error. */\n onOfficeConversionError?: (info: { fileType: OfficeFileType; error: Error; url?: string }) => void;\n className?: string;\n style?: React.CSSProperties;\n}\n\nconst newId = (): string =>\n typeof crypto !== 'undefined' && 'randomUUID' in crypto ? crypto.randomUUID() : `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n\nexport const TeamSyncViewer = React.forwardRef<WebViewerInstance, TeamSyncViewerProps>(function TeamSyncViewer(props, ref) {\n const {\n fileUrl, initialDoc, initialScale, initialWidthRatio, widthRatio, responsive = true, initialPage, page, transientHighlights: propTransientHighlights,\n plugins, redactions, regexRedactions,\n enableAnnotations, enableSign = false, watermark, permissions, enableRedactions,\n canAddAnnotations, canEditAnnotations, canDeleteAnnotations, readOnly = false,\n assets, withCredentials = false, toolbar = true, sidebars = true, leftPanelOpen = true,\n className, style, hideAnnotationsUntilPageRendered = true,\n enableTextSelection = true, defaultTool = 'select', showSelectionTooltip = true,\n id, targetViewer, resolveLinkUrl, onLinkClick,\n officeConverter, onOfficeConverting, onOfficeConverted, onOfficeConversionError,\n } = props;\n\n // Latest props for callbacks/bindings that must not re-subscribe on every render.\n const latest = useRef(props);\n latest.current = props;\n\n const rootRef = useRef<HTMLDivElement>(null);\n const bus = useMemo(() => new ViewerBus(), []);\n const annotationManager = useMemo(() => new AnnotationManager(), []);\n const instanceRef = useRef<WebViewerInstance | null>(null);\n if (!instanceRef.current) instanceRef.current = new WebViewerInstance(bus, annotationManager, id);\n const instance = instanceRef.current;\n useImperativeHandle(ref, () => instance, [instance]);\n\n useEffect(() => {\n if (id) {\n instance.id = id;\n WebViewerInstance.registerInstance(id, instance);\n return () => {\n WebViewerInstance.unregisterInstance(id);\n };\n }\n }, [instance, id]);\n\n useEffect(() => {\n if (targetViewer !== undefined) {\n instance.setTargetViewer(targetViewer);\n }\n }, [instance, targetViewer]);\n\n // ---- document ------------------------------------------------------------------------------\n const requestedUrl = fileUrl ?? initialDoc;\n const [docUrl, setDocUrl] = useState<string | undefined>(requestedUrl);\n const [loadNonce, setLoadNonce] = useState(0);\n useEffect(() => {\n setDocUrl(requestedUrl);\n }, [requestedUrl]);\n const loadDocument = useCallback((url: string) => {\n setDocUrl(url);\n setLoadNonce((n) => n + 1);\n }, []);\n\n // ---- Office document conversion handling ---------------------------------------------------\n const officeInfo = useMemo(() => getOfficeDocumentInfo(docUrl), [docUrl]);\n const [resolvedPdfUrl, setResolvedPdfUrl] = useState<string | undefined>(\n officeInfo ? undefined : requestedUrl\n );\n const [officeConversionState, setOfficeConversionState] = useState<\n 'idle' | 'converting' | 'converted' | 'error'\n >(officeInfo ? 'converting' : 'idle');\n const [officeConversionError, setOfficeConversionError] = useState<Error | null>(null);\n\n useEffect(() => {\n if (!docUrl) {\n setResolvedPdfUrl(undefined);\n setOfficeConversionState('idle');\n setOfficeConversionError(null);\n return;\n }\n\n if (!officeInfo) {\n // Standard PDF document: pass directly to DocumentViewer\n setResolvedPdfUrl(docUrl);\n setOfficeConversionState('idle');\n setOfficeConversionError(null);\n return;\n }\n\n // Office document detected\n if (!officeConverter) {\n const err = new Error(\n `Document \"${officeInfo.fileName || 'document'}\" is a Microsoft ${officeInfo.category} document (${officeInfo.fileType.toUpperCase()}). To view Office files, configure the 'officeConverter' prop on <TeamSyncViewer> or in WebViewer options.`\n );\n setResolvedPdfUrl(undefined);\n setOfficeConversionState('error');\n setOfficeConversionError(err);\n bus.emit('officeConversionError', { fileType: officeInfo.fileType, error: err, url: docUrl });\n latest.current.onOfficeConversionError?.({ fileType: officeInfo.fileType, error: err, url: docUrl });\n return;\n }\n\n let cancelled = false;\n let convertedObjectUrl: string | null = null;\n\n setOfficeConversionState('converting');\n setOfficeConversionError(null);\n bus.emit('officeConverting', {\n fileType: officeInfo.fileType,\n url: docUrl,\n fileName: officeInfo.fileName,\n });\n latest.current.onOfficeConverting?.({\n fileType: officeInfo.fileType,\n url: docUrl,\n fileName: officeInfo.fileName,\n });\n\n convertOfficeDocument(docUrl, officeConverter, officeInfo.fileName)\n .then((res) => {\n if (cancelled) {\n URL.revokeObjectURL(res.objectUrl);\n return;\n }\n convertedObjectUrl = res.objectUrl;\n setResolvedPdfUrl(res.objectUrl);\n setOfficeConversionState('converted');\n bus.emit('officeConverted', {\n fileType: officeInfo.fileType,\n url: docUrl,\n fromCache: res.fromCache,\n });\n latest.current.onOfficeConverted?.({\n fileType: officeInfo.fileType,\n url: docUrl,\n fromCache: res.fromCache,\n });\n })\n .catch((err) => {\n if (cancelled) return;\n const error = err instanceof Error ? err : new Error(String(err));\n setResolvedPdfUrl(undefined);\n setOfficeConversionState('error');\n setOfficeConversionError(error);\n bus.emit('officeConversionError', {\n fileType: officeInfo.fileType,\n error,\n url: docUrl,\n });\n latest.current.onOfficeConversionError?.({\n fileType: officeInfo.fileType,\n error,\n url: docUrl,\n });\n });\n\n return () => {\n cancelled = true;\n if (convertedObjectUrl) {\n URL.revokeObjectURL(convertedObjectUrl);\n }\n };\n }, [docUrl, loadNonce, officeInfo, officeConverter, bus]);\n\n // ---- UI state (formerly the demo App shell) --------------------------------------------------\n const [activeTab, setActiveTab] = useState('View');\n const [leftSidebarOpen, setLeftSidebarOpen] = useState(sidebars && leftPanelOpen);\n const [rightSidebarOpen, setRightSidebarOpen] = useState(false);\n const [sidebarTab, setSidebarTab] = useState<'Comments' | 'Search'>('Comments');\n const [scale, setScale] = useState(typeof initialScale === 'number' ? initialScale : 1.0);\n const [isSettingsOpen, setIsSettingsOpen] = useState(false);\n const [isAboutModalOpen, setIsAboutModalOpen] = useState(false);\n const [pageTransition, setPageTransition] = useState<'continuous' | 'page-by-page'>('continuous');\n const [pageLayout, setPageLayout] = useState<'single' | 'double' | 'cover-facing'>('single');\n const [rotation, setRotation] = useState(0);\n // Empty by default: hosts opt into watermarks via the `watermark` prop.\n const [watermarkText, setWatermarkText] = useState('');\n\n const effectivePermissions = useMemo<SDKPermissions>(() => {\n if (readOnly) {\n return { canAddAnnotations: false, canEditAnnotations: false, canDeleteAnnotations: false, canRedact: false };\n }\n return {\n canAddAnnotations: permissions?.canAddAnnotations ?? canAddAnnotations ?? enableAnnotations !== false,\n canEditAnnotations: permissions?.canEditAnnotations ?? canEditAnnotations ?? enableAnnotations !== false,\n canDeleteAnnotations: permissions?.canDeleteAnnotations ?? canDeleteAnnotations ?? enableAnnotations !== false,\n canRedact: permissions?.canRedact ?? enableRedactions ?? true,\n };\n }, [readOnly, permissions, canAddAnnotations, canEditAnnotations, canDeleteAnnotations, enableAnnotations, enableRedactions]);\n const annotationsEnabled = !readOnly && enableAnnotations !== false;\n\n // Keep the manager's user / permission state in sync with props.\n const currentUserId = props.currentUser?.id;\n const currentUserName = props.currentUser?.name;\n useEffect(() => {\n annotationManager.setCurrentUserInfo(currentUserId || currentUserName ? { id: currentUserId, name: currentUserName } : undefined);\n }, [annotationManager, currentUserId, currentUserName]);\n useEffect(() => {\n annotationManager.setReadOnly(readOnly);\n }, [annotationManager, readOnly]);\n useEffect(() => {\n annotationManager.setCanEditOthers(Boolean(permissions?.canEditOthers));\n }, [annotationManager, permissions?.canEditOthers]);\n\n // Annotations belong to a document: drop them when a different document is requested.\n useEffect(() => {\n annotationManager.clear();\n annotationManager.setDocument(null);\n }, [annotationManager, docUrl]);\n\n // Relay granular manager events to the instance bus (`instance.on('annotationChanged', ...)`).\n useEffect(() => annotationManager.addEventListener('annotationChanged', (e) => bus.emit('annotationChanged', e)), [annotationManager, bus]);\n\n useEffect(() => {\n if (effectivePermissions.canAddAnnotations === false && activeTab === 'Annotate') setActiveTab('View');\n }, [effectivePermissions.canAddAnnotations, activeTab]);\n\n // ---- live state exposed to the instance ------------------------------------------------------\n const redactionsRef = useRef<Redaction[]>([]);\n const pdfDocRef = useRef<pdfjsLib.PDFDocumentProxy | null>(null);\n const pageRef = useRef({ current: 1, count: 0 });\n const docUrlRef = useRef(docUrl);\n docUrlRef.current = docUrl;\n const signedBytesRef = useRef<Uint8Array | null>(null);\n const initialFitAppliedRef = useRef(false);\n\n // Transient highlights (citations, search matches)\n const [internalTransientHighlights, setInternalTransientHighlights] = useState<TransientHighlight[]>([]);\n const transientHighlights = useMemo(() => {\n return propTransientHighlights ?? internalTransientHighlights;\n }, [propTransientHighlights, internalTransientHighlights]);\n const transientHighlightsRef = useRef(transientHighlights);\n transientHighlightsRef.current = transientHighlights;\n\n const setTransientHighlights = useCallback((highlights: TransientHighlight[]) => {\n setInternalTransientHighlights(highlights);\n latest.current.onTransientHighlightsChange?.(highlights);\n }, []);\n\n useEffect(() => {\n instance._bind(\n {\n getAnnotations: () => annotationManager.getAnnotationsList(),\n getRedactions: () => redactionsRef.current,\n getWatermark: () => latest.current.watermark,\n getPdfDocument: () => pdfDocRef.current,\n getDocumentUrl: () => docUrlRef.current,\n getFileName: () => latest.current.fileName,\n getCurrentUserName: () => latest.current.currentUser?.name,\n getCurrentPage: () => pageRef.current.current,\n getPageCount: () => pageRef.current.count,\n loadDocument,\n goToPage: (pageNum: number, options?: { smooth?: boolean }) => {\n bus.emit('action-go-to-page', { page: pageNum, smooth: options?.smooth });\n },\n getTransientHighlights: () => transientHighlightsRef.current,\n setTransientHighlights,\n },\n rootRef.current\n );\n return () => instance._unbind();\n }, [instance, annotationManager, loadDocument, bus, setTransientHighlights]);\n\n // onReady + autoFocus, exactly once.\n const readyRef = useRef(false);\n useEffect(() => {\n if (readyRef.current) return;\n readyRef.current = true;\n if (latest.current.autoFocus) rootRef.current?.focus({ preventScroll: true });\n latest.current.onReady?.(instance);\n }, [instance]);\n\n // ---- bus wiring (formerly window listeners) --------------------------------------------------\n useEffect(() => {\n const openPanel = (tab: 'Comments' | 'Search') => {\n setRightSidebarOpen(true);\n setSidebarTab(tab);\n };\n\n const offs = [\n bus.on<{ elements?: string[] }>('action-open-elements', (d) => {\n const elements = d?.elements ?? [];\n if (elements.includes('leftPanel')) setLeftSidebarOpen(true);\n if (elements.includes('notesPanel')) openPanel('Comments');\n if (elements.includes('searchPanel')) openPanel('Search');\n }),\n bus.on<{ elements?: string[] }>('action-close-elements', (d) => {\n const elements = d?.elements ?? [];\n if (elements.includes('leftPanel')) setLeftSidebarOpen(false);\n if (elements.includes('notesPanel') || elements.includes('searchPanel')) setRightSidebarOpen(false);\n }),\n bus.on<{ panel?: string }>('action-set-active-left-panel', (d) => {\n const panel = d?.panel;\n if (panel === 'notesPanel') openPanel('Comments');\n else if (panel === 'searchPanel') openPanel('Search');\n else setLeftSidebarOpen(true);\n }),\n bus.on<{ tool: string | null }>('action-tool-changed', (d) => bus.emit('toolChanged', { tool: d?.tool ?? null })),\n bus.on('action-print', async () => {\n try {\n const data = await instance.getFileData();\n await printPdfBytes(data, { title: latest.current.fileName });\n } catch (err) {\n console.error('[teamsync-pdf-viewer] print failed', err);\n bus.emit('action-print-error', { error: err });\n }\n }),\n bus.on('action-download', async () => {\n try {\n let data = signedBytesRef.current;\n if (data) signedBytesRef.current = null; // consume the freshly signed bytes\n else data = await instance.getFileData();\n if (!data) return;\n const blob = new Blob([data as BlobPart], { type: 'application/pdf' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = latest.current.fileName || 'annotated_document.pdf';\n a.click();\n setTimeout(() => URL.revokeObjectURL(url), 1000);\n } catch (err) {\n console.error('[teamsync-pdf-viewer] download failed', err);\n bus.emit('action-download-error', { error: err });\n }\n }),\n bus.on<{ pageIndex: number; x: number; y: number; width: number; height: number }>(\n 'action-process-digital-signature',\n async (d) => {\n try {\n const { pageIndex, x, y, width, height } = d;\n const tempAnn: Annotation = {\n id: newId(),\n type: 'digital_signature_placeholder',\n pageIndex, x, y, width, height,\n color: '#0f172a', strokeWidth: 1, opacity: 1,\n signer: latest.current.currentUser?.name ?? 'Unknown signer',\n timestamp: Date.now(),\n };\n const explicitAnnotations = [...instance.getAnnotations(), tempAnn];\n bus.emit('action-waiting-for-pin-start');\n const data = await instance.getFileData({ explicitAnnotations });\n bus.emit('action-waiting-for-pin-end');\n if (!data) return;\n signedBytesRef.current = data;\n bus.emit('action-commit-digital-signature', { tempAnn });\n } catch (err: any) {\n bus.emit('action-waiting-for-pin-error', { error: err?.message ?? String(err) });\n console.error('[teamsync-pdf-viewer] process signature failed', err);\n }\n }\n ),\n bus.on<{ highlights: TransientHighlight[] }>('action-set-transient-highlights', (d) => {\n setTransientHighlights(d?.highlights ?? []);\n }),\n bus.on('action-clear-transient-highlights', () => {\n setTransientHighlights([]);\n }),\n // No external signing plugin in the loop: commit the placeholder to the page directly.\n bus.on<{ tempAnn: Annotation }>('action-commit-digital-signature', (d) =>\n bus.emit('action-commit-digital-signature-local', d)\n ),\n bus.on<{ text: string }>('action-text-selected', (d) => {\n bus.emit('textSelected', { text: d.text });\n latest.current.onTextSelected?.({ text: d.text });\n }),\n bus.on<{ text: string }>('action-text-copied', (d) => {\n bus.emit('textCopied', { text: d.text });\n latest.current.onTextCopied?.({ text: d.text });\n }),\n ];\n return () => offs.forEach((off) => off());\n }, [bus, instance, setTransientHighlights]);\n\n // ---- DocumentViewer callbacks ----------------------------------------------------------------\n const handleDocumentLoaded = useCallback(\n (doc: pdfjsLib.PDFDocumentProxy, url: string) => {\n pdfDocRef.current = doc;\n annotationManager.setDocument(doc);\n pageRef.current = { current: 1, count: doc.numPages };\n initialFitAppliedRef.current = false;\n const reportedUrl = docUrlRef.current ?? url;\n bus.emit('documentLoaded', { url: reportedUrl, numPages: doc.numPages });\n latest.current.onDocumentLoaded?.({ url: reportedUrl, numPages: doc.numPages });\n },\n [bus, annotationManager]\n );\n\n const handleLoadError = useCallback(\n (error: Error, info: DocumentLoadErrorInfo) => {\n pdfDocRef.current = null;\n annotationManager.setDocument(null);\n bus.emit('documentLoadError', { url: info.url, error, passwordRequired: info.passwordRequired });\n if (info.passwordRequired) latest.current.onPasswordRequired?.({ url: info.url });\n latest.current.onDocumentLoadError?.(error, (newUrl) => loadDocument(newUrl ?? info.url), info);\n },\n [bus, loadDocument, annotationManager]\n );\n\n const handleFirstPageRendered = useCallback(\n (pageNumber: number) => {\n const url = docUrlRef.current ?? '';\n if (!initialFitAppliedRef.current) {\n initialFitAppliedRef.current = true;\n const fit = latest.current.initialScale ?? 'fit-width';\n const widthRatio =\n latest.current.initialWidthRatio ??\n latest.current.widthRatio ??\n (typeof fit === 'object' && fit !== null && fit.type === 'fit-width' ? fit.ratio : undefined);\n if (typeof widthRatio === 'number' && Number.isFinite(widthRatio) && widthRatio > 0) {\n setTimeout(() => bus.emit('action-fit-to-width', { ratio: widthRatio }), 0);\n } else if (fit === 'fit-width') {\n setTimeout(() => bus.emit('action-fit-to-width'), 0);\n } else if (fit === 'fit-page') {\n setTimeout(() => bus.emit('action-fit-to-page'), 0);\n }\n }\n bus.emit('firstPageRendered', { url, pageNumber });\n latest.current.onFirstPageRendered?.({ url, pageNumber });\n },\n [bus]\n );\n\n const handlePageRendered = useCallback(\n (pageNumber: number) => {\n const url = docUrlRef.current ?? '';\n bus.emit('pageRendered', { url, pageNumber });\n latest.current.onPageRendered?.({ url, pageNumber });\n },\n [bus]\n );\n\n const handlePageChange = useCallback(\n (pageNumber: number, numPages: number) => {\n pageRef.current = { current: pageNumber, count: numPages };\n bus.emit('pageChanged', { pageNumber, numPages });\n latest.current.onPageChange?.(pageNumber, numPages);\n },\n [bus]\n );\n\n const handleAnnotationsChange = useCallback(\n (anns: Annotation[]) => {\n bus.emit('annotationsChanged', { annotations: anns });\n latest.current.onAnnotationsChange?.(anns);\n },\n [bus]\n );\n\n const handleRedactionsChange = useCallback(\n (reds: Redaction[]) => {\n redactionsRef.current = reds;\n bus.emit('redactionsChanged', { redactions: reds });\n latest.current.onRedactionsChange?.(reds);\n },\n [bus]\n );\n\n const handleRedactionsApplied = useCallback(\n (reds: Redaction[]) => {\n bus.emit('redactionsApplied', { redactions: reds });\n latest.current.onRedactionsApplied?.(reds);\n },\n [bus]\n );\n\n const { getCommand } = useShortcuts();\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const openSearchSidebar = useCallback(() => {\n if (sidebars) {\n setRightSidebarOpen(true);\n setSidebarTab('Search');\n setTimeout(() => bus.emit('action-focus-search'), 50);\n }\n }, [sidebars, bus]);\n\n const openFilePicker = useCallback(() => {\n fileInputRef.current?.click();\n }, []);\n\n useEffect(() => {\n const offSearch = bus.on('action-open-search', openSearchSidebar);\n const offFilePicker = bus.on('action-open-file-picker', openFilePicker);\n return () => {\n offSearch();\n offFilePicker();\n };\n }, [bus, openSearchSidebar, openFilePicker]);\n\n // Focus root element on mount if document is not currently focused elsewhere\n useEffect(() => {\n if (rootRef.current && (document.activeElement === document.body || !document.activeElement)) {\n rootRef.current.focus({ preventScroll: true });\n }\n }, []);\n\n // Global window keydown fallback so shortcuts fire reliably\n useEffect(() => {\n const handleGlobalKeyDown = (e: KeyboardEvent) => {\n const target = e.target as HTMLElement | null;\n if (\n target?.tagName === 'INPUT' ||\n target?.tagName === 'TEXTAREA' ||\n target?.isContentEditable\n ) {\n return;\n }\n\n const root = rootRef.current;\n if (!root) return;\n\n if (\n document.activeElement === document.body ||\n document.activeElement === document.documentElement ||\n document.activeElement === null ||\n root.contains(document.activeElement)\n ) {\n if (!root.contains(document.activeElement)) {\n if (matchShortcut(e, getCommand('SEARCH'))) {\n e.preventDefault();\n openSearchSidebar();\n return;\n }\n if (matchShortcut(e, getCommand('FILE_PICKER'))) {\n e.preventDefault();\n openFilePicker();\n return;\n }\n bus.emit('viewer-keydown', e);\n }\n }\n };\n\n window.addEventListener('keydown', handleGlobalKeyDown);\n return () => {\n window.removeEventListener('keydown', handleGlobalKeyDown);\n };\n }, [bus, getCommand, openSearchSidebar, openFilePicker]);\n\n // ---- root element handlers -------------------------------------------------------------------\n const handleRootKeyDownCapture = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (matchShortcut(e.nativeEvent, getCommand('SEARCH'))) {\n e.preventDefault();\n openSearchSidebar();\n return;\n }\n if (matchShortcut(e.nativeEvent, getCommand('FILE_PICKER'))) {\n e.preventDefault();\n openFilePicker();\n return;\n }\n bus.emit('viewer-keydown', e.nativeEvent);\n };\n\n // Clicking anywhere inside the viewer makes it the keyboard-shortcut target.\n const handleRootMouseDownCapture = () => {\n const root = rootRef.current;\n if (root && !root.contains(document.activeElement)) root.focus({ preventScroll: true });\n };\n\n const toggleFullscreen = () => {\n const target = rootRef.current ?? document.documentElement;\n if (!document.fullscreenElement) {\n target.requestFullscreen?.().catch(() => {});\n } else {\n document.exitFullscreen?.().catch(() => {});\n }\n };\n\n const openSidebarTab = (tab: 'Comments' | 'Search') => {\n if (!sidebars) return;\n if (rightSidebarOpen && sidebarTab === tab) {\n setRightSidebarOpen(false);\n } else {\n setRightSidebarOpen(true);\n setSidebarTab(tab);\n if (tab === 'Search') {\n setTimeout(() => bus.emit('action-focus-search'), 50);\n }\n }\n };\n\n return (\n <ViewerBusContext.Provider value={bus}>\n <div\n ref={rootRef}\n className={['tspdf-root', className].filter(Boolean).join(' ')}\n style={style}\n tabIndex={-1}\n data-teamsync-pdf-viewer=\"\"\n onKeyDownCapture={handleRootKeyDownCapture}\n onMouseDownCapture={handleRootMouseDownCapture}\n >\n {toolbar && (\n <Header\n activeTab={activeTab}\n setActiveTab={(tab) => {\n if (effectivePermissions.canAddAnnotations === false && tab === 'Annotate') return;\n setActiveTab(tab);\n }}\n leftSidebarOpen={leftSidebarOpen}\n setLeftSidebarOpen={(open) => { if (sidebars) setLeftSidebarOpen(open); }}\n rightSidebarOpen={rightSidebarOpen}\n setRightSidebarOpen={setRightSidebarOpen}\n sidebarTab={sidebarTab}\n scale={scale}\n onZoomIn={() => setScale((s) => calculateNextZoomIn(s))}\n onZoomOut={() => setScale((s) => calculateNextZoomOut(s))}\n onZoomSet={(s) => setScale(clampScale(s))}\n onOpenFile={openFilePicker}\n onDownload={() => bus.emit('action-download')}\n onFullScreen={toggleFullscreen}\n onSaveAs={() => bus.emit('action-download')}\n onPrint={() => bus.emit('action-print')}\n onOpenSettings={() => setIsSettingsOpen(true)}\n onOpenAbout={() => setIsAboutModalOpen(true)}\n onOpenSidebarTab={openSidebarTab}\n pageTransition={pageTransition}\n setPageTransition={setPageTransition}\n pageLayout={pageLayout}\n setPageLayout={setPageLayout}\n rotation={rotation}\n setRotation={setRotation}\n enableAnnotations={annotationsEnabled}\n enableSign={enableSign}\n plugins={plugins}\n permissions={effectivePermissions}\n />\n )}\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".pdf,application/pdf,.docx,.doc,.pptx,.ppt,.xlsx,.xls,application/vnd.openxmlformats-officedocument.wordprocessingml.document,application/msword,application/vnd.openxmlformats-officedocument.presentationml.presentation,application/vnd.ms-powerpoint,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel\"\n style={{ display: 'none' }}\n onChange={(e) => {\n const file = e.target.files?.[0];\n if (file) {\n const url = URL.createObjectURL(file);\n loadDocument(`${url}#filename=${encodeURIComponent(file.name)}`);\n }\n e.target.value = '';\n }}\n aria-hidden=\"true\"\n />\n <div style={{ display: 'flex', flex: 1, minHeight: 0, overflow: 'hidden', position: 'relative' }}>\n {officeInfo && officeConversionState === 'converting' && (\n <OfficeLoadingOverlay\n fileType={officeInfo.fileType}\n fileName={officeInfo.fileName}\n />\n )}\n {officeInfo && officeConversionState === 'error' && (\n <OfficeLoadingOverlay\n fileType={officeInfo.fileType}\n fileName={officeInfo.fileName}\n error={officeConversionError}\n onRetry={() => setLoadNonce((n) => n + 1)}\n />\n )}\n <DocumentViewer\n leftSidebarOpen={sidebars && leftSidebarOpen}\n rightSidebarOpen={sidebars && rightSidebarOpen}\n sidebarTab={sidebarTab}\n setSidebarTab={setSidebarTab}\n sidebars={sidebars}\n activeTab={activeTab}\n annotationManager={annotationManager}\n initialDoc={resolvedPdfUrl}\n loadNonce={loadNonce}\n withCredentials={withCredentials}\n assets={assets}\n redactions={redactions}\n regexRedactions={regexRedactions}\n scale={scale}\n setScale={setScale}\n onAnnotationsChange={handleAnnotationsChange}\n onRedactionsChange={handleRedactionsChange}\n onRedactionsApplied={handleRedactionsApplied}\n onDocumentLoaded={handleDocumentLoaded}\n onLoadError={handleLoadError}\n onFirstPageRendered={handleFirstPageRendered}\n onPageRendered={handlePageRendered}\n onPageChange={handlePageChange}\n pageTransition={pageTransition}\n pageLayout={pageLayout}\n rotation={rotation}\n setRotation={setRotation}\n watermark={watermark}\n watermarkText={watermarkText}\n enableAnnotations={annotationsEnabled}\n initialPage={initialPage}\n page={page}\n transientHighlights={transientHighlights}\n permissions={effectivePermissions}\n hideAnnotationsUntilPageRendered={hideAnnotationsUntilPageRendered}\n enableTextSelection={enableTextSelection}\n defaultTool={defaultTool}\n showSelectionTooltip={showSelectionTooltip}\n initialScale={initialScale}\n initialWidthRatio={initialWidthRatio ?? widthRatio}\n responsive={responsive}\n instance={instance}\n targetViewer={targetViewer}\n resolveLinkUrl={resolveLinkUrl}\n onLinkClick={onLinkClick}\n />\n </div>\n {isSettingsOpen && (\n <SettingsModal onClose={() => setIsSettingsOpen(false)} watermarkText={watermarkText} setWatermarkText={setWatermarkText} />\n )}\n {isAboutModalOpen && <AboutModal onClose={() => setIsAboutModalOpen(false)} />}\n </div>\n </ViewerBusContext.Provider>\n );\n});\n\nexport default TeamSyncViewer;\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * Imperative entry point: mounts <TeamSyncViewer> into an element and resolves with the instance.\n */\nimport React from 'react';\nimport ReactDOM from 'react-dom/client';\nimport { TeamSyncViewer } from '../components/TeamSyncViewer';\nimport type { WebViewerInstance } from './ViewerInstance';\nimport type { WebViewerOptions } from './types';\n\nexport function createWebViewer(options: WebViewerOptions, viewerElement: HTMLElement): Promise<WebViewerInstance> {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return Promise.reject(new Error('[teamsync-pdf-viewer] createWebViewer() requires a browser environment.'));\n }\n if (!viewerElement) {\n return Promise.reject(new Error('[teamsync-pdf-viewer] createWebViewer() needs a container element.'));\n }\n\n return new Promise((resolve) => {\n const root = ReactDOM.createRoot(viewerElement);\n const { path: _path, ...rest } = options;\n root.render(\n <TeamSyncViewer\n {...rest}\n style={{ width: '100%', height: '100%' }}\n onReady={(instance) => {\n instance._setUnmount(() => root.unmount());\n resolve(instance);\n }}\n />\n );\n });\n}\n\n/** @deprecated Use `createWebViewer`. Kept as an alias for drop-in compatibility. */\nexport const WebViewer = createWebViewer;\n"],"mappings":"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"}
1
+ {"version":3,"file":"teamsync-pdf-viewer.js","names":["File","_Fragment","LinkIcon","_Fragment","LinkIcon","_Fragment","MAX_HISTORY","_Fragment","newId","_Fragment","_Fragment","_Fragment","ToolButton","_Fragment","CircleIcon","LinkIcon","_Fragment","createBlobUrl","React","ReactDOM","File$1","pdfjsLib","ViewerBusContext","createContext","useViewerBus","bus","useContext","useBusEvent","ref","useRef","listener","useEffect","type","detail","MIN_SCALE","MAX_SCALE","isMobileOrTablet","MAX_CANVAS_DIM","MAX_CANVAS_DIM_MOBILE","MAX_CANVAS_PIXELS","MAX_CANVAS_PIXELS_MOBILE","calculateNextZoomIn","maxScale","currentScale","calculateNextZoomOut","minScale","clampScale","scale","calculateFitWidthScale","availableWidth","pageWidth","ratio","calculateSafeRenderScale","renderScale","outputScale","unscaledWidth","maxDim","unscaledHeight","maxPixels","calculateScrollCompensation","cW","cH","baseW","params","isProgrammatic","currentScrollTop","hasFocusPoint","focusPoint","vx","vy","x","currentScrollLeft","y","pLeft1","prevScale","newX","newScale","TABS","Header","_setRightSidebarOpen","hasSignPlugin","plugins","p","isSignVisible","enableSign","isMenuOpen","setIsMenuOpen","useState","isZoomMenuOpen","setIsZoomMenuOpen","isViewSettingsOpen","setIsViewSettingsOpen","headerTool","setHeaderTool","menuRef","zoomMenuRef","viewSettingsRef","d","handleClickOutside","event","IconButton","Menu","onOpenFile","MenuOption","FolderOpen","Download","onDownload","Maximize","onFullScreen","Save","onSaveAs","Printer","onPrint","Layers","Settings","onOpenSettings","PanelLeft","leftSidebarOpen","setLeftSidebarOpen","FileText","FileCode2","pageTransition","setPageTransition","RotateCw","setRotation","rotation","RotateCcw","pageLayout","setPageLayout","Copy","Expand","jsx","ChevronUp","ChevronDown","MoveHorizontal","Maximize2","onZoomSet","zoomLevel","ScanSearch","MinusCircle","onZoomOut","PlusCircle","onZoomIn","MousePointer","Hand","tab","enableAnnotations","permissions","setActiveTab","activeTab","Pen","signatureCount","ShieldCheck","Info","onOpenAbout","Search","rightSidebarOpen","sidebarTab","onOpenSidebarTab","MessageSquare","disabled","onClick","active","icon","hovered","setHovered","selected","label","AnnotationContextMenu","canAdd","canEdit","canDelete","position","Fragment","MenuButton","onCopy","onUpdateColor","c","annotation","onOpenLinkModal","Edit2","Link","Trash2","onDelete","isDocumentUrl","url","trimmed","cleanPath","parseLinkTarget","raw","linkUrl","pageMatch","pageNumber","normalizedUrl","docUrl","hashIndex","hash","isDoc","isWeb","sanitizeLinkUrl","InsertLinkModal","isInitialPage","initialUrl","parsedInitial","isInitialDoc","setUrl","page","setPage","setDocUrl","docPage","setDocPage","text","setText","initialText","isSaveDisabled","handleSave","finalUrl","showTextInput","onSave","onClose","X","DEFAULT_SHORTCUTS","STORAGE_KEY","CHANGE_EVENT","cachedShortcuts","listeners","loadStoredShortcuts","saved","parsed","found","def","notifySubscribers","fn","useShortcuts","shortcuts","setShortcuts","sync","useCallback","updated","s","action","newCommand","item","parseCommandString","commandString","rawTokens","meta","shift","alt","keyTokens","i","lower","matchShortcut","isMetaPressed","eventKey","targetKey","collapseWhitespace","buildPageText","fullText","itemIndices","charIndices","str","index","normText","normToRaw","char","runStart","boundsForRawRange","pageText","itemMatches","rawStart","rawEndExcl","itemIdx","charIdx","existing","bounds","items","itemIndex","width","height","strLen","charWidth","startX","match","matchWidth","searchPdfText","pdfDoc","query","results","qn","numPages","targetPages","pages","a","b","onProgress","batchStart","batchPages","batchPromises","pageNum","redactions","pageRedactions","r","vp","itemX","itemY","itemW","itemH","itemTopY","red","intersectX","intersectY","lowerNormText","n","pageResults","snippetStart","snippetEnd","snippet","resolve","usePdfSearch","isSearching","setIsSearching","searchResults","setSearchResults","searchProgress","setSearchProgress","error","Sidebar","searchQuery","setSearchQuery","sidebarWidth","setSidebarWidth","isResizing","setIsResizing","searchInputRef","handleMouseMove","newWidth","handleMouseUp","handler","onSearch","isOpen","timer","comments","annotations","handleDelete","setAnnotations","id","selectedAnnotationId","setSelectedAnnotationId","comment","MessageCircle","Type","e","onLinkClick","onResultClick","result","Thumbnail","containerRef","canvasRef","isVisible","setIsVisible","aspectRatio","setAspectRatio","observer","entries","renderTask","isCancelled","pageIndex","viewport","canvas","ctx","estimatedWidth","estimatedHeight","isActive","LeftSidebar","zoomPercent","setZoomPercent","thumbScale","pagesArray","List","Bookmark","MoreHorizontal","Minus","Plus","setPageNum","CheckSquare","convertToUnrotated","normRot","rawY","unH","rawX","unW","convertToRotated","unY","unX","convertToRotatedRect","getRotationTransform","normalizeRotation","DEFAULT_FORM_OPTIONS","DEFAULT_ROLES","MAX_HISTORY$1","FormManager","initialFields","initialValues","initialRoles","initialOptions","initialUser","err","data","prev","next","f","name","fields","field","newField","idx","recordHistory","oldField","updatedField","updates","removed","value","newValues","defaults","readOnly","roles","l","role","fieldsChanged","roleId","user","opts","fieldId","targetRole","list","flow","curId","currentFieldId","errors","val","displayName","json","rolesList","PRESET_COLORS","PRESET_BG_COLORS","FormFieldEditorModal","localRoles","setLocalRoles","isAddingRole","setIsAddingRole","newRoleName","setNewRoleName","newRoleColor","setNewRoleColor","setName","setLabel","placeholder","setPlaceholder","required","setRequired","defaultValue","setDefaultValue","dateFormat","setDateFormat","options","setOptions","newOptionText","setNewOptionText","setRoleId","flowOrder","setFlowOrder","isSignatureField","signatureType","setSignatureType","signTagText","setSignTagText","textColor","setTextColor","backgroundColor","setBackgroundColor","borderColor","setBorderColor","borderWidth","setBorderWidth","borderRadius","setBorderRadius","fontFamily","setFontFamily","fontSize","setFontSize","fontWeight","setFontWeight","fontStyle","setFontStyle","textAlign","setTextAlign","hasOptions","handleAddOption","handleRemoveOption","handleMoveOption","targetIdx","direction","copy","handleQuickAddRole","newRole","onAddRole","Sliders","Palette","PenTool","User","opt","ArrowUp","ArrowDown","Bold","Italic","align","AlignLeft","AlignCenter","AlignRight","sanitizedName","parsedFlowOrder","FormSignatureModal","isDigital","electronicTab","setElectronicTab","initialSignerName","currentValue","currentUser","defaultSignerName","signerName","setSignerName","initialReason","signingReason","setSigningReason","typedFontIndex","setTypedFontIndex","cursiveFonts","uploadedDataUrl","setUploadedDataUrl","isDrawingRef","strokesRef","hasDrawn","setHasDrawn","penColor","setPenColor","penColorRef","certFingerprint","bytes","redrawCanvas","dpr","rect","w","h","targetWidth","targetHeight","stroke","img","handleGlobalEnd","getCanvasPos","touch","handleStartDraw","pos","handleDraw","activeStroke","handleEndDraw","handleClearCanvas","renderTypedToDataUrl","offscreen","fontObj","nameText","escapeXml","safeName","svg","ALLOWED_SIGNATURE_MIME_TYPES","handleFileUpload","file","reader","ev","handleAdoptAndSign","finalDataUrl","finalSignerName","accentColor","Upload","RefreshCw","font","Check","onClear","newId$1","FormFieldLayer","setFields","formManager","values","setValues","setRoles","currentRoleId","setCurrentRoleId","activeFieldId","setActiveFieldId","selectedFieldId","setSelectedFieldId","editingField","setEditingField","signingField","setSigningField","creationRect","setCreationRect","dragRef","basePageWidth","basePageHeight","unsubFields","unsubData","prevValues","unsubRoles","newRoles","unsubCurrent","curr","unsubActive","actId","unsubOptions","el","handleKeyDown","getPdfCoordinates","isCreating","activeTool","handleMouseDown","pt","dx","dy","startY","initialField","newY","handle","proposedW","proposedH","minX","minY","defaultLabels","existingCount","targetRoleId","selectedRoleFilter","isSig","isDigitalSig","setActiveTool","handleStartMove","handleStartResize","handleDuplicateField","dup","handleDeleteField","handleInputKeyDown","creationBox","rot","isSelected","fieldValue","fieldColor","isFilteredOut","showFlowOrder","nextId","nextRole","handleStyle","isAssignedToOther","isReadOnly","canFillForms","effectiveFontSizePx","effectiveFontFamily","effectiveFontWeight","effectiveFontStyle","effectiveTextAlign","effectiveTextColor","effectiveBgColor","effectiveBorderColor","effectiveBorderWidth","effectiveBorderRadius","isSignature","sigVal","isSigned","baseInputStyle","handleFocus","Lock","currentCheckedList","isChecked","oIdx","PageRendererComponent","_containerWidth","_containerHeight","_scrollTop","_scrollLeft","onRenderedRef","onRendered","pageContainerRef","textLayerRef","renderTaskRef","pageProxyRef","hasRenderedOnceRef","isCanvasRendered","setIsCanvasRendered","textContent","setTextContent","isInViewport","setIsInViewport","entry","scaledWidth","scaledHeight","prevDocAndPage","setPrevDocAndPage","renderCanvas","currentPage","normalizedRot","unscaledViewport","tempCanvas","redaction","rotRect","vX","vY","vW","vH","wm","watermark","watermarkText","opacity","mode","defaultSize","size","canvasW","canvasH","stepX","stepY","diag","rowOffset","destCanvas","destCtx","delay","container","sanitizedTextContent","filteredItems","nativeLinks","setNativeLinks","links","targetUrl","pageAnnotations","isOverlayVisible","hideAnnotationsUntilPageRendered","onClearSelection","pageTop","pageLeft","activeSearchResult","transientHighlights","th","bg","border","bIdx","thIdx","rotTransform","onMouseDown","onMouseMove","onMouseUp","nl","fillColor","ann","strokeColor","blendMode","interactionProps","onAnnotationMouseEnter","onStartMove","shape","boxW","boxH","p1","p2","angle","headLen","h1","h2","hlRects","ulRects","soRects","sqRects","generateSquigglyD","up","cx","nextX","midX","linkColor","strokes","st","dateStr","signerText","ax","ay","aw","ah","iconW","isResizable","handleCoords","onStartResize","handleKey","hInfo","onDiscardRedaction","activeFormTool","setActiveFormTool","PageRenderer","prevProps","nextProps","newAnnotationId","hex","copyTextToClipboard","textArea","successful","TextSelectionTooltip","selectedText","setSelectedText","setPosition","copied","setCopied","timeoutRef","updatePosition","selection","range","commonAncestor","rangeRect","containerRect","relLeft","relTop","handleSelectionChange","onAnnotateSelection","Highlighter","Underline","Strikethrough","findRegexRedactions","regexes","globalRegexes","disabledRegexes","globalRegex","startTime","matches","elapsed","matchStart","matchLength","tx","ty","scaleY","matchInfo","matchHeight","topY","DEFAULT_FALLBACK_DIMS","estimatePageDimensions","dim","sampleDim","computeRowLayout","heights","rows","row","gap","dimsFor","tops","acc","hasDimensionMismatch","dimsA","dimsB","tolerance","configured","configurePdfAssets","paths","getPdfAssetPaths","isWorkerConfigured","assertWorkerConfigured","getDocumentParams","pdfjsVersion","DiffHighlightOverlay","hoveredId","setHoveredId","boxes","filteredBoxes","colorScheme","selectedDiffId","box","isHovered","labelColor","labelPrefix","onSelectDiff","SideBySideViewer","wrapperRef","containerARef","containerBRef","isSyncingRef","splitPercent","setSplitPercent","isDraggingSeparator","setIsDraggingSeparator","isPanning","setIsPanning","panStartRef","panelDimA","setPanelDimA","panelDimB","setPanelDimB","updatePanelDimensions","roA","roB","elA","elB","syncAtoB","maxScrollTopA","maxScrollTopB","maxScrollLeftA","maxScrollLeftB","syncBtoA","handleSeparatorMouseDown","handleSeparatorTouchStart","handleSeparatorDoubleClick","pct","onTouchMove","onDragEnd","handlePanelMouseDown","handleWheel","setDimsA","basePageDims","setDimsB","pdfDocA","pdfDocB","panelW_A","panelH_A","availableWidthA","availableHeightA","fitScaleA","panelW_B","panelH_B","availableWidthB","availableHeightB","fitScaleB","effectiveScaleA","is90Fit","zoomMultiplier","effectiveScaleB","scaledWidthA","scaledHeightA","scaledWidthB","scaledHeightB","targetBox","diffsA","diffsB","viewH","targetY","scrollToY","GripVertical","CompareToolbar","compareState","onSetMode","Columns","colorA","onSetColors","colorB","onToggleCurtain","showCurtain","SlidersHorizontal","onFit90","onSetTool","diffItems","onPrevDiff","ChevronLeft","currentDiffIndex","onNextDiff","ChevronRight","onExit","DiffSummarySidebar","isDel","isAdd","badgeColor","badgeBg","badgeLabel","onJumpToPage","AlertCircle","textDiffs","t","seg","CheckCircle2","CompareCurtainSlider","isDragging","setIsDragging","sliderRef","relativeX","onChangePosition","positionPercent","extractWordsFromPage","wordTokens","itemWidth","itemHeight","vx1","vy1","vx2","vy2","parts","offset","totalChars","wWidth","wX","computePageDiffBoxes","pageA","pageB","wordsA","wordsB","textArrA","textArrB","m","max","v","trace","reachedEnd","k","delIndicesA","addIndicesB","vArr","prevK","prevX","prevY","j","groupWordsIntoBoxes","summary","words","currentWords","sameLine","nearby","createBoxFromTokens","tokens","maxX","maxY","seq","computeTextDiff","textA","textB","buildDiffResult","rawResult","consolidated","tintCanvas","colorHex","computeCanvasPixelDiff","canvasA","canvasB","ctxA","ctxB","imgDataA","imgDataB","dataA","dataB","gy","gx","diffPixels","cellW","cellH","dr","dg","db","PRESET_USER_COLORS","ROLE_TEMPLATES","FormUsersModal","newUserName","setNewUserName","newUserColor","setNewUserColor","errorMsg","setErrorMsg","handleAddUser","onRoleAdded","onUserAdded","nextColorIdx","handleRemoveUser","assignedCount","handleApplyTemplate","template","u","Users","Sparkles","tmpl","FormsToolbar","fileInputRef","isUsersModalOpen","setIsUsersModalOpen","ToolButton$1","Undo2","Redo2","Calendar","ListChecks","ChevronDownSquare","CircleDot","PenLine","setShowFlowOrder","ListOrdered","UserPlus","setSelectedRoleFilter","content","blob","onSwitchToView","Eye","FormFillerActions","setCurrentUser","validationMsg","setValidationMsg","act","unsubUser","currentRole","flowFields","currentFlowIndex","targetFields","targetRequiredCount","targetFilledCount","FileSpreadsheet","roleFieldCount","res","scopeLabel","missingKeys","onDownloadFilledPdf","SignatureIndexFlags","isCollapsed","setIsCollapsed","hoveredFieldId","setHoveredFieldId","newVals","signatureFields","useMemo","relevantSignatures","checkIsSigned","sig","totalPending","handleJumpToSignature","tryFocusAndOpen","fieldEl","originalBoxShadow","retries","flagColor","fieldLabel","DocumentViewer","_enableAnnotations","setPdfDoc","loadError","setLoadError","manualRedactions","setManualRedactions","setPdfDocB","setCompareState","setTextDiffs","isDiffSidebarOpen","setIsDiffSidebarOpen","isCompare90Fit","setIsCompare90Fit","compareZoomMultiplier","setCompareZoomMultiplier","handleCompareZoomIn","handleCompareZoomOut","handleCompareFit90","callbacksRef","assetsRef","assets","httpHeadersRef","httpHeaders","customHeadersRef","customHeaders","rangeChunkSizeRef","rangeChunkSize","disableStreamRef","disableStream","disableAutoFetchRef","disableAutoFetch","disableRangeRef","disableRange","passwordRef","password","resolveNetworkParams","headers","loadDocA","docSource","withCredentials","loadedDocA","loadCompareDoc","loadedDocB","cancelled","totalPages","allSummary","mapA","mapB","pA","pB","textContentA","textContentB","diffs","handleStartCompare","docA","docB","handleStopCompare","handleSetCompareMode","handleSetCompareColors","offStart","offStop","offMode","offColors","windowStart","windowStop","windowMode","windowColors","setActiveSearchResult","pageDims","setPageDims","fallbackDims","scrollPos","setScrollPos","containerDimensions","setContainerDimensions","rowLayout","rowsRef","scaleRef","rowLayoutRef","pageTransitionRef","visibleRowRef","rowIndexOfPage","rowIndexAtOffset","lo","hi","mid","scrollToPage","clampedPage","handleGoToPage","offGoToPage","windowGoToPage","handleSearchResultClick","handleSelectDiff","diffItem","targetX","rIdx","rowTop","viewHeight","viewWidth","scrollToX","target","useSyncExternalStore","annotationManager","defaultTool","setCurrentColor","setCurrentOpacity","setCurrentStrokeWidth","currentColor","currentStrokeWidth","currentOpacity","isDrawing","setIsDrawing","activeDrawingPageNum","setActiveDrawingPageNum","startPos","setStartPos","currentPos","setCurrentPos","freehandPoints","setFreehandPoints","activeTextEditor","setActiveTextEditor","currentText","setCurrentText","textareaRef","contextMenuPos","setContextMenuPos","isLinkModalOpen","setIsLinkModalOpen","justCreatedLinkRef","clipboardAnnotationRef","handleSelection","zoomFocusRef","prevScaleRef","isProgrammaticScaleRef","initialFitDoneRef","initialWidthRatioValue","initialWidthRatio","initialScale","activeFitModeRef","initialScrollDoneRef","newPos","clientX","clientY","multiplier","roundedScale","setScale","commitAnnotations","newAnns","handleUndo","handleRedo","liveResizingAnn","setLiveResizingAnn","liveMovingAnn","setLiveMovingAnn","resizingRef","movingRef","latestResizingAnnRef","latestMovingAnnRef","initialAnn","handleAnnotationDoubleClick","handleWindowMouseMove","tmp","newW","newH","handleWindowMouseUp","finalAnn","handleAnnotateSelection","sel","clientRects","node","pageNumAttr","targetPage","pageRect","dims","rects","rawW","rawH","color","strokeWidth","annId","isInput","getCommand","annToCopy","base","newAnn","onAnnotationsChange","autoRedactions","setAutoRedactions","regexRedactions","isCommitModalOpen","setIsCommitModalOpen","combinedRedactions","pendingRedactionsCount","handleDiscardAllRedactions","handleDiscardRedaction","firstPageRenderedRef","initialDoc","loadingTask","doc","vp1","passwordRequired","loadNonce","handlePageRendered","renderedPage","lastTargetPageRef","initialPage","isInitial","p1Dim","allDims","mismatch","start","end","cRow","newLayout","oldTop","delta","handleFitToWidth","rawRatio","effectiveRatio","handleFitToPage","availableHeight","scaleX","responsive","rafId","prevWidth","prevHeight","handleResize","currentWidth","currentHeight","getUnrotatedPoint","targetPageNum","commitTextAnnotation","defaultWidth","lineCount","defaultHeight","linkId","newLinkAnn","xs","ys","points","handleEraserMove","handleLinkClick","defaultPrevented","linkEvent","effectiveDocUrl","effectivePage","resolveLinkUrl","instance","resolved","reParsed","linkHref","win","targetViewer","handleEraserClick","midPoint","cRowIndex","sidebars","tool","newIdx","ToolButton","SquigglyIcon","Brush","EyeOff","MessageSquareQuote","Eraser","ArrowUpRight","Square","Circle","nextManual","nextAuto","appliedList","renderRow","rTop","isContinuous","rIndex","bufferBefore","bufferAfter","liveAnn","pLeft","pageDim","firstWidth","thisWidth","pIdx","displayAnns","rotEditorPos","currentRowIndex","currentRow","enableTextSelection","showSelectionTooltip","newText","setSidebarTab","search","SettingsModal","editingAction","setEditingAction","key","internalCommand","updateShortcut","renderCommandBadges","cmd","isMac","filteredShortcuts","descMatch","actionMatch","cmdMatch","generalMatches","badgeCount","resetShortcuts","setWatermarkText","VERSION","AboutModal","version","setVersion","releaseUrl","setReleaseUrl","isMounted","ExternalLink","ViewerBus","set","off","z","applyTransform","applyInverseTransform","createPageGeometry","rotate","x0","y0","x1","y1","viewBox","centerX","centerY","rotateA","rotateB","rotateC","rotateD","offsetCanvasX","offsetCanvasY","transform","geometryFromPage","view","createGeometryResolver","cache","toPdfPoint","g","fromPdfPoint","rectToPdf","rectFromPdf","pathToPdf","pathFromPdf","rectToQuadPoints","llx","lly","urx","ury","quadPointsToRects","quads","unionRects","fmt","MAX_EXPORT_BYTES","hexToRgb","safe","rgb","decodeBase64DataUrl","dataUrl","mime","base64Data","globalBuffer","buf","binary","wrapText","approxCharWidth","maxCharsPerLine","maxWidth","paragraphs","lines","currentLine","word","bakeAnnotation","textRotate","degrees","topLeftBaseline","BlendMode","squigglyPts","curX","pdfPts","pts","ph1","ph2","boxWidth","nx0","ny0","nx1","ny1","bx0","by0","bx1","by1","imageBytes","image","bakeWatermark","wmColor","wmOpacity","helveticaFont","StandardFonts","cosA","sinA","textWidth","xStep","rotatedDx","rotatedDy","rasterizeRedactions","tempBuffer","renderDoc","flattenedPdf","PDFDocument","renderPage","imgDataUrl","imgBytes","pdfImage","originalVp","copiedPage","buildPdfBytes","input","sourceBytes","sizeMB","anns","resolveGeometry","geometryTask","pageIdx","form","usedFieldNames","getUniqueFieldName","baseName","counter","uniqueName","filledVal","uniqueFieldName","tf","cb","dd","selectedList","decoded","signer","reason","XFDF_NS","CUSTOM_KEY","pad","toPdfDate","iso","tz","sign","tzh","tzm","fromPdfDate","pdf","Y","Mo","D","mi","tzs","toHexColor","attr","customDataElement","readCustomData","pointsAttr","parsePoints","pair","xy","parseNumbers","pdfRectAttr","OWNED_ATTRS","OWNED_CHILDREN","commonAttrs","rectOverride","created","flags","useDisplayAuthor","extraAttrs","attrs","extraChildren","customData","extra","contentsElement","defaultStyle","annotationToXfdfFragment","strokeAttrs","common","tail","head","gestures","all","boundsOf","coords","bbox","tag","subject","boxRect","half","annotationsToXfdf","collectExtras","children","custom","rest","out","childText","baseFromElement","rectNums","opacityAttr","widthAttr","elementToAnnotation","kind","opaque","tailAttr","ps","pe","isArrow","ge","defaultOpacity","it","callout","uri","fit","stripXmlDeclarations","parseXfdf","cleaned","xml","wrapped","WRAPPERS","elements","MAX_HISTORY","nowIso","AnnotationManager","addedIds","before","deletedIds","after","ad","withIds","inputs","patch","ids","targets","xfdf","incoming","merged","resolver","imported","force","prevById","nextIds","added","modified","modifiedPairs","deleted","finalList","stamped","noBinding","WebViewerInstance","binding","element","unmount","offLoaded","cleanup","offError","reject","highlights","current","highlight","searchOptions","response","success","normalizedTool","self","callback","printPdfBytes","iframe","settled","finish","MIME_MAP","EXTENSION_MAP","extractExtension","clean","pathOrUrl","urlMatch","ext","extractExtensionFromSimpleName","lastSlash","filename","lastDot","getOfficeFileType","isOfficeDocument","getOfficeDocumentCategory","fileType","getOfficeMimeType","getOfficeBadgeMeta","getOfficeDocumentInfo","category","mimeType","fileName","originalUrl","isOfficeDocumentUrl","isOfficeFile","detectOfficeType","isOfficeExtension","SUPPORTED_OFFICE_EXTENSIONS","memoryCache","computeCacheKey","fileOrUrl","createBlobUrl$1","getCachedOfficePdf","cacheMode","base64","setCachedOfficePdf","pdfBuffer","chunkSize","clearOfficeCache","keysToRemove","convertOfficeDocument","config","cached","converted","token","\"Authorization\"","uploadBlob","uploadFileName","sourceResp","formData","convertResp","errorDetail","objectUrl","convertOfficeUrl","convertOfficeFile","officeConverter","OfficeLoadingOverlay","onRetry","createBlobUrl","useOfficeDocument","optionsRef","isConverting","setIsConverting","pdfUrl","setPdfUrl","setPdfBuffer","fromCache","setFromCache","setError","createdObjectUrlRef","isOffice","documentInfo","cleanupUrl","runConversion","converterConfig","convertedError","autoConvert","preloadOfficeDocument","buffer","newId","TeamSyncViewer","propTransientHighlights","propFormManager","props","latest","rootRef","internalFormManager","formFields","formRoles","formOptions","instanceRef","useImperativeHandle","requestedUrl","fileUrl","dynamicDocOptions","setDynamicDocOptions","setLoadNonce","loadDocument","officeInfo","convertedOfficePdfUrl","setConvertedOfficePdfUrl","resolvedPdfUrl","officeConversionState","setOfficeConversionState","officeConversionError","setOfficeConversionError","convertedObjectUrl","leftPanelOpen","setRightSidebarOpen","isSettingsOpen","setIsSettingsOpen","isAboutModalOpen","setIsAboutModalOpen","effectivePermissions","canAddAnnotations","canEditAnnotations","canDeleteAnnotations","enableRedactions","annotationsEnabled","currentUserId","currentUserName","redactionsRef","pdfDocRef","pageRef","docUrlRef","signedBytesRef","initialFitAppliedRef","internalTransientHighlights","setInternalTransientHighlights","transientHighlightsRef","setTransientHighlights","readyRef","openPanel","offs","panel","tempAnn","explicitAnnotations","handleDocumentLoaded","reportedUrl","handleLoadError","info","newUrl","handleFirstPageRendered","widthRatio","handlePageChange","handleAnnotationsChange","handleRedactionsChange","reds","handleRedactionsApplied","openSearchSidebar","openFilePicker","offSearch","offFilePicker","handleGlobalKeyDown","root","className","toolbar","open","createWebViewer","viewerElement","_path","WebViewer"],"sources":["../src/core/busContext.ts","../src/hooks/useViewerBus.ts","../src/utils/zoomUtils.ts","../src/components/Header.tsx","../src/components/AnnotationContextMenu.tsx","../src/utils/linkUtils.ts","../src/components/InsertLinkModal.tsx","../src/hooks/useShortcuts.ts","../src/utils/pageText.ts","../src/hooks/usePdfSearch.ts","../src/components/Sidebar.tsx","../src/components/LeftSidebar.tsx","../src/utils/rotationUtils.ts","../src/forms/FormManager.ts","../src/components/FormFieldEditorModal.tsx","../src/components/FormSignatureModal.tsx","../src/components/FormFieldLayer.tsx","../src/components/PageRenderer.tsx","../src/annotations/ids.ts","../src/utils/clipboardUtils.ts","../src/components/TextSelectionTooltip.tsx","../src/utils/findRegexRedactions.ts","../src/utils/layoutUtils.ts","../src/core/pdfAssets.ts","../src/components/DiffHighlightOverlay.tsx","../src/components/SideBySideViewer.tsx","../src/components/CompareToolbar.tsx","../src/components/DiffSummarySidebar.tsx","../src/components/CompareCurtainSlider.tsx","../src/utils/pdfDiffEngine.ts","../src/components/FormUsersModal.tsx","../src/components/FormsToolbar.tsx","../src/components/FormFillerActions.tsx","../src/components/SignatureIndexFlags.tsx","../src/components/DocumentViewer.tsx","../src/components/SettingsModal.tsx","../src/version.ts","../src/components/AboutModal.tsx","../src/core/eventBus.ts","../src/annotations/geometry.ts","../src/core/export.ts","../src/annotations/xfdf.ts","../src/annotations/AnnotationManager.ts","../src/core/ViewerInstance.ts","../src/core/print.ts","../src/office/officeDetector.ts","../src/office/officeConverter.ts","../src/office/OfficeLoadingOverlay.tsx","../src/office/useOfficeDocument.ts","../src/components/TeamSyncViewer.tsx","../src/core/createWebViewer.tsx"],"sourcesContent":["/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\nimport { createContext } from 'react';\nimport type { ViewerBus } from './eventBus';\n\n/** Provided by <TeamSyncViewer>; every internal component reads its bus from here. */\nexport const ViewerBusContext = createContext<ViewerBus | null>(null);\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\nimport { useContext, useEffect, useRef } from 'react';\nimport { ViewerBusContext } from '../core/busContext';\nimport type { ViewerBus, BusListener } from '../core/eventBus';\n\nexport function useViewerBus(): ViewerBus {\n const bus = useContext(ViewerBusContext);\n if (!bus) {\n throw new Error('[teamsync-pdf-viewer] useViewerBus() must be used inside <TeamSyncViewer>.');\n }\n return bus;\n}\n\n/**\n * Subscribe to a bus event for the lifetime of the component.\n * The latest `listener` is always invoked (no stale closures) without re-subscribing on every render.\n */\nexport function useBusEvent<T = unknown>(type: string, listener: BusListener<T>): void {\n const bus = useViewerBus();\n const ref = useRef(listener);\n ref.current = listener;\n useEffect(() => bus.on<T>(type, (detail) => ref.current(detail)), [bus, type]);\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\n\nexport const MIN_SCALE = 0.1;\nexport const MAX_SCALE = 8.0;\n\nexport const isMobileOrTablet = (): boolean =>\n typeof navigator !== 'undefined' && (\n /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini|Mobile|Tablet/i.test(navigator.userAgent) ||\n (/^((?!chrome|android).)*safari/i.test(navigator.userAgent))\n );\n\nexport const isSafariOrMobile = isMobileOrTablet;\n\nexport const MAX_CANVAS_DIM = 4096;\nexport const MAX_CANVAS_DIM_MOBILE = 2048;\nexport const MAX_CANVAS_PIXELS = 8388608; // 8.4 Megapixels (~32MB RGBA texture buffer)\nexport const MAX_CANVAS_PIXELS_MOBILE = 4194304; // 4.2 Megapixels (~16MB RGBA texture buffer)\n\n/**\n * Calculates the next step when zooming in.\n * - Below 200%: steps by +25%\n * - 200% to 500%: steps by +50%\n * - 500% to 800%: steps by +100%\n */\nexport function calculateNextZoomIn(currentScale: number, maxScale = MAX_SCALE): number {\n const step = currentScale < 2 ? 0.25 : currentScale < 5 ? 0.5 : 1.0;\n return Math.min(maxScale, Math.round((currentScale + step) * 100) / 100);\n}\n\n/**\n * Calculates the next step when zooming out.\n * - At or below 200%: steps by -25%\n * - 200% to 500%: steps by -50%\n * - Above 500%: steps by -100%\n */\nexport function calculateNextZoomOut(currentScale: number, minScale = MIN_SCALE): number {\n const step = currentScale <= 2 ? 0.25 : currentScale <= 5 ? 0.5 : 1.0;\n return Math.max(minScale, Math.round((currentScale - step) * 100) / 100);\n}\n\n/**\n * Clamps and rounds a requested zoom level within [minScale, maxScale].\n */\nexport function clampScale(scale: number, minScale = MIN_SCALE, maxScale = MAX_SCALE): number {\n return Math.min(maxScale, Math.max(minScale, Math.round(scale * 100) / 100));\n}\n\n/**\n * Calculates the target scale to fit a given page width to an available container width,\n * optionally scaled by a width ratio (e.g. 0.7 for 70% of available width).\n */\nexport function calculateFitWidthScale(\n availableWidth: number,\n pageWidth: number,\n ratio = 1.0,\n minScale = MIN_SCALE,\n maxScale = MAX_SCALE\n): number {\n if (availableWidth <= 0 || pageWidth <= 0) return 1.0;\n const effectiveRatio = typeof ratio === 'number' && Number.isFinite(ratio) && ratio > 0 ? ratio : 1.0;\n return clampScale((availableWidth * effectiveRatio) / pageWidth, minScale, maxScale);\n}\n\n/**\n * Calculates the safe rasterization scale for PDF.js viewport rendering so that\n * canvas dimensions and texture memory stay strictly within hardware limits.\n */\nexport function calculateSafeRenderScale(\n scale: number,\n outputScale: number,\n unscaledWidth: number,\n unscaledHeight: number,\n maxDim = isMobileOrTablet() ? MAX_CANVAS_DIM_MOBILE : MAX_CANVAS_DIM,\n maxPixels = isMobileOrTablet() ? MAX_CANVAS_PIXELS_MOBILE : MAX_CANVAS_PIXELS\n): number {\n let renderScale = scale * outputScale;\n if (unscaledWidth * renderScale > maxDim) {\n renderScale = maxDim / unscaledWidth;\n }\n if (unscaledHeight * renderScale > maxDim) {\n renderScale = maxDim / unscaledHeight;\n }\n if ((unscaledWidth * renderScale) * (unscaledHeight * renderScale) > maxPixels) {\n renderScale = Math.sqrt(maxPixels / (unscaledWidth * unscaledHeight));\n }\n return renderScale;\n}\n\nexport interface ScrollCompensationParams {\n prevScale: number;\n newScale: number;\n containerWidth: number;\n containerHeight: number;\n currentScrollLeft: number;\n currentScrollTop: number;\n basePageWidth: number;\n focusPoint?: { vx: number | null; vy: number | null } | null;\n isProgrammatic?: boolean;\n}\n\nexport interface ScrollPosition {\n scrollLeft: number;\n scrollTop: number;\n}\n\n/**\n * Calculates compensating scroll offsets during scale changes.\n * Prevents view jumping or pushing page 1 down on initial fit or programmatic fit.\n */\nexport function calculateScrollCompensation(params: ScrollCompensationParams): ScrollPosition {\n const {\n prevScale,\n newScale,\n containerWidth: cW,\n containerHeight: cH,\n currentScrollLeft,\n currentScrollTop,\n basePageWidth: baseW,\n focusPoint,\n isProgrammatic = false,\n } = params;\n\n // On programmatic fit (e.g. fit-width, fit-page, initial document fit),\n // do not run user-driven center-zoom compensation.\n if (isProgrammatic) {\n return {\n scrollLeft: 0,\n scrollTop: currentScrollTop <= 1 ? 0 : currentScrollTop,\n };\n }\n\n const hasFocusPoint = focusPoint?.vx != null && focusPoint?.vy != null;\n\n // If user is at the top of the document (scrollTop <= 0) and no explicit focus point was set:\n // Keep the top of the page pinned to the top rather than pushing it down into negative space.\n if (!hasFocusPoint && currentScrollTop <= 0) {\n return {\n scrollLeft: 0,\n scrollTop: 0,\n };\n }\n\n const vx = hasFocusPoint ? focusPoint!.vx! : cW / 2;\n const vy = hasFocusPoint ? focusPoint!.vy! : cH / 2;\n\n const x = vx + currentScrollLeft;\n const y = vy + currentScrollTop;\n\n const pLeft1 = Math.max(0, cW / 2 - (baseW * prevScale) / 2);\n const pLeft2 = Math.max(0, cW / 2 - (baseW * newScale) / 2);\n\n const pageX = x - pLeft1;\n const newPageX = pageX * (newScale / prevScale);\n const newX = pLeft2 + newPageX;\n\n return {\n scrollLeft: Math.max(0, newX - vx),\n scrollTop: Math.max(0, (y * (newScale / prevScale)) - vy),\n };\n}\n\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\nimport React, { useState, useRef, useEffect } from 'react';\nimport { \n Menu, PanelLeft,\n Hand, MousePointer, Search, MessageSquare, \n FileText, Download, Maximize, Save, Printer, Settings, Info,\n MinusCircle, PlusCircle, Maximize2, MoveHorizontal, ChevronUp, ChevronDown, ScanSearch,\n FileCode2, File, Copy, Expand, RotateCw, RotateCcw, ShieldCheck, Pen, Layers, FolderOpen\n} from 'lucide-react';\n\nimport type { SDKPermissions } from '../core/types';\nimport type { ViewerPlugin } from '../plugins/types';\nimport { useViewerBus, useBusEvent } from '../hooks/useViewerBus';\nimport { MIN_SCALE, MAX_SCALE } from '../utils/zoomUtils';\n\ninterface HeaderProps {\n activeTab: string;\n setActiveTab: (tab: string) => void;\n leftSidebarOpen: boolean;\n setLeftSidebarOpen: (open: boolean) => void;\n rightSidebarOpen: boolean;\n setRightSidebarOpen: (open: boolean) => void;\n sidebarTab: 'Comments' | 'Search';\n scale: number;\n onZoomIn: () => void;\n onZoomOut: () => void;\n onZoomSet: (scale: number) => void;\n onOpenFile?: () => void;\n onDownload: () => void;\n onFullScreen: () => void;\n onSaveAs: () => void;\n onPrint?: () => void;\n onOpenSettings: () => void;\n onOpenAbout: () => void;\n onOpenSidebarTab: (tab: 'Comments' | 'Search') => void;\n pageTransition: 'continuous' | 'page-by-page';\n setPageTransition: (t: 'continuous' | 'page-by-page') => void;\n pageLayout: 'single' | 'double' | 'cover-facing';\n setPageLayout: (l: 'single' | 'double' | 'cover-facing') => void;\n rotation: number;\n setRotation: (r: number) => void;\n signatureCount?: number;\n enableAnnotations?: boolean;\n enableSign?: boolean;\n plugins?: ViewerPlugin[];\n permissions?: SDKPermissions;\n}\n\nconst TABS = [\n 'View', 'Annotate', 'Forms'\n];\n\nexport default function Header({ \n activeTab, setActiveTab, \n leftSidebarOpen, setLeftSidebarOpen,\n rightSidebarOpen, setRightSidebarOpen: _setRightSidebarOpen,\n sidebarTab,\n scale, onZoomIn, onZoomOut, onZoomSet,\n onOpenFile,\n onDownload, onFullScreen, onSaveAs, onPrint, onOpenSettings, onOpenAbout, onOpenSidebarTab,\n pageTransition, setPageTransition, pageLayout, setPageLayout, rotation, setRotation,\n signatureCount = 0,\n enableAnnotations,\n enableSign = false,\n plugins,\n permissions\n}: HeaderProps) {\n const hasSignPlugin = plugins && plugins.some(p => p.id && p.id.toLowerCase().includes('sign'));\n const isSignVisible = enableSign === true && Boolean(hasSignPlugin);\n const [isMenuOpen, setIsMenuOpen] = useState(false);\n const [isZoomMenuOpen, setIsZoomMenuOpen] = useState(false);\n const [isViewSettingsOpen, setIsViewSettingsOpen] = useState(false);\n const [headerTool, setHeaderTool] = useState<string | null>('select');\n const menuRef = useRef<HTMLDivElement>(null);\n const zoomMenuRef = useRef<HTMLDivElement>(null);\n const viewSettingsRef = useRef<HTMLDivElement>(null);\n const bus = useViewerBus();\n\n useBusEvent<{ tool: string | null }>('action-tool-changed', (d) => setHeaderTool(d?.tool ?? null));\n\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (menuRef.current && !menuRef.current.contains(event.target as Node)) {\n setIsMenuOpen(false);\n }\n if (zoomMenuRef.current && !zoomMenuRef.current.contains(event.target as Node)) {\n setIsZoomMenuOpen(false);\n }\n if (viewSettingsRef.current && !viewSettingsRef.current.contains(event.target as Node)) {\n setIsViewSettingsOpen(false);\n }\n }\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, []);\n\n return (\n <div style={{ \n display: 'flex', \n flexDirection: 'column',\n borderBottom: '1px solid var(--border-color)',\n backgroundColor: 'var(--toolbar-bg)',\n color: 'var(--text-color)'\n }}>\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n height: '48px',\n padding: '0 8px'\n }}>\n {/* Left Section */}\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n <div ref={menuRef} style={{ position: 'relative' }}>\n <IconButton icon={<Menu size={18} />} title=\"Menu\" onClick={() => setIsMenuOpen(!isMenuOpen)} active={isMenuOpen} />\n {isMenuOpen && (\n <div style={{ \n position: 'absolute', top: '100%', left: 0, marginTop: '4px',\n backgroundColor: '#fff', borderRadius: '4px', boxShadow: '0 4px 12px rgba(0,0,0,0.15)',\n width: '220px', zIndex: 1000, display: 'flex', flexDirection: 'column',\n border: '1px solid var(--border-color)', overflow: 'hidden'\n }}>\n {onOpenFile && (\n <MenuOption icon={<FolderOpen size={16} />} label=\"Open PDF...\" onClick={() => { onOpenFile(); setIsMenuOpen(false); }} />\n )}\n <MenuOption icon={<Download size={16} />} label=\"Download\" onClick={() => { onDownload(); setIsMenuOpen(false); }} />\n <MenuOption icon={<Maximize size={16} />} label=\"Enter Full Screen\" onClick={() => { onFullScreen(); setIsMenuOpen(false); }} />\n <MenuOption icon={<Save size={16} />} label=\"Save As\" onClick={() => { onSaveAs(); setIsMenuOpen(false); }} />\n <MenuOption icon={<Printer size={16} />} label=\"Print\" disabled={!onPrint} onClick={() => { onPrint?.(); setIsMenuOpen(false); }} />\n <div style={{ height: '1px', backgroundColor: 'var(--border-color)', margin: '4px 0' }} />\n <MenuOption icon={<Layers size={16} color=\"#0284c7\" />} label=\"Compare PDF (Demo)\" onClick={() => { window.dispatchEvent(new CustomEvent('action-start-compare', { detail: { docA: '/sample_v1.pdf', docB: '/sample_v2.pdf', options: { mode: 'side-by-side' } } })); setIsMenuOpen(false); }} />\n <MenuOption icon={<Settings size={16} />} label=\"Settings\" onClick={() => { onOpenSettings(); setIsMenuOpen(false); }} />\n </div>\n )}\n </div>\n <IconButton \n icon={<PanelLeft size={18} />} \n title=\"Toggle Left Panel\"\n active={leftSidebarOpen}\n onClick={() => setLeftSidebarOpen(!leftSidebarOpen)} \n />\n <div style={{ width: '1px', height: '24px', backgroundColor: 'var(--border-color)', margin: '0 4px' }} />\n <div ref={viewSettingsRef} style={{ position: 'relative' }}>\n <div style={{ position: 'relative' }}>\n <IconButton \n icon={\n <div style={{ position: 'relative', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n <FileText size={18} />\n <div style={{ position: 'absolute', right: '-4px', bottom: '-4px', backgroundColor: '#fff', borderRadius: '50%', padding: '1px' }}>\n <Settings size={10} color=\"var(--primary)\" />\n </div>\n </div>\n } \n title=\"View Settings\"\n active={isViewSettingsOpen}\n onClick={() => setIsViewSettingsOpen(!isViewSettingsOpen)} \n />\n </div>\n {isViewSettingsOpen && (\n <div style={{ \n position: 'absolute', top: '100%', left: 0, marginTop: '4px',\n backgroundColor: '#fff', borderRadius: '4px', boxShadow: '0 4px 16px rgba(0,0,0,0.15)',\n width: '240px', zIndex: 1000, display: 'flex', flexDirection: 'column',\n border: '1px solid var(--border-color)', overflow: 'hidden'\n }}>\n <div style={{ padding: '12px 16px 8px', fontSize: '12px', fontWeight: 600, color: '#374151' }}>Page Transition</div>\n <MenuOption \n icon={<FileCode2 size={16} />} \n label=\"Continuous Page\" \n selected={pageTransition === 'continuous'}\n onClick={() => { setPageTransition('continuous'); setIsViewSettingsOpen(false); }} \n />\n <MenuOption \n icon={<File size={16} />} \n label=\"Page By Page\" \n selected={pageTransition === 'page-by-page'}\n onClick={() => { setPageTransition('page-by-page'); setIsViewSettingsOpen(false); }} \n />\n \n <div style={{ height: '1px', backgroundColor: 'var(--border-color)', margin: '4px 0' }} />\n \n <div style={{ padding: '12px 16px 8px', fontSize: '12px', fontWeight: 600, color: '#374151' }}>Page Orientation</div>\n <MenuOption \n icon={<RotateCw size={16} />} \n label=\"Rotate Clockwise\" \n onClick={() => { setRotation((rotation + 90) % 360); setIsViewSettingsOpen(false); }} \n />\n <MenuOption \n icon={<RotateCcw size={16} />} \n label=\"Rotate Counterclockwise\" \n onClick={() => { setRotation((rotation - 90 + 360) % 360); setIsViewSettingsOpen(false); }} \n />\n \n <div style={{ height: '1px', backgroundColor: 'var(--border-color)', margin: '4px 0' }} />\n\n <div style={{ padding: '12px 16px 8px', fontSize: '12px', fontWeight: 600, color: '#374151' }}>Page Layout</div>\n <MenuOption \n icon={<File size={16} />} \n label=\"Single Page\" \n selected={pageLayout === 'single'}\n onClick={() => { setPageLayout('single'); setIsViewSettingsOpen(false); }} \n />\n <MenuOption \n icon={<Copy size={16} />} \n label=\"Double Page\" \n selected={pageLayout === 'double'}\n onClick={() => { setPageLayout('double'); setIsViewSettingsOpen(false); }} \n />\n <MenuOption \n icon={<FileText size={16} />} \n label=\"Cover Facing Page\" \n selected={pageLayout === 'cover-facing'}\n onClick={() => { setPageLayout('cover-facing'); setIsViewSettingsOpen(false); }} \n />\n\n <div style={{ height: '1px', backgroundColor: 'var(--border-color)', margin: '4px 0' }} />\n\n <MenuOption \n icon={<Expand size={16} />} \n label=\"Enter Full Screen\" \n onClick={() => { onFullScreen(); setIsViewSettingsOpen(false); }} \n />\n </div>\n )}\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: '4px' }}>\n <div ref={zoomMenuRef} style={{ position: 'relative', display: 'flex', alignItems: 'center' }}>\n <div style={{\n display: 'flex', alignItems: 'center', backgroundColor: '#f3f4f6', \n borderRadius: '4px', border: isZoomMenuOpen ? '1px solid var(--primary)' : '1px solid transparent',\n cursor: 'pointer', userSelect: 'none', height: '32px'\n }}>\n <div \n onClick={() => setIsZoomMenuOpen(!isZoomMenuOpen)}\n style={{ \n padding: '0 8px 0 12px', fontSize: '13px', fontWeight: 500, \n display: 'flex', alignItems: 'center', height: '100%'\n }}\n >\n {Math.round(scale * 100)}%\n </div>\n <div \n onClick={() => setIsZoomMenuOpen(!isZoomMenuOpen)}\n style={{ \n padding: '0 8px', display: 'flex', alignItems: 'center', height: '100%',\n borderLeft: '1px solid #e5e7eb', color: isZoomMenuOpen ? 'var(--primary)' : 'var(--text-color)'\n }}\n >\n {isZoomMenuOpen ? <ChevronUp size={14} /> : <ChevronDown size={14} />}\n </div>\n </div>\n \n {isZoomMenuOpen && (\n <div style={{ \n position: 'absolute', top: '100%', left: 0, marginTop: '4px',\n backgroundColor: '#fff', borderRadius: '4px', boxShadow: '0 4px 16px rgba(0,0,0,0.15)',\n width: '180px', zIndex: 1000, display: 'flex', flexDirection: 'column',\n border: '1px solid var(--border-color)', overflow: 'hidden', padding: '8px 0'\n }}>\n <MenuOption icon={<MoveHorizontal size={16} />} label=\"Fit To Width\" onClick={() => { bus.emit('action-fit-to-width'); setIsZoomMenuOpen(false); }} />\n <MenuOption icon={<Maximize2 size={16} />} label=\"Fit To Page\" onClick={() => { bus.emit('action-fit-to-page'); setIsZoomMenuOpen(false); }} />\n <div style={{ height: '1px', backgroundColor: 'var(--border-color)', margin: '4px 0' }} />\n {[0.25, 0.5, 0.75, 1, 1.25, 1.5, 2, 3, 4, 5, 8].map(zoomLevel => (\n <div \n key={zoomLevel}\n onClick={() => { if(onZoomSet) onZoomSet(zoomLevel); setIsZoomMenuOpen(false); }}\n style={{ \n padding: '6px 44px', fontSize: '13px', cursor: 'pointer', \n backgroundColor: scale === zoomLevel ? '#f3f4f6' : '#fff'\n }}\n onMouseEnter={(e) => e.currentTarget.style.backgroundColor = '#f3f4f6'}\n onMouseLeave={(e) => e.currentTarget.style.backgroundColor = scale === zoomLevel ? '#f3f4f6' : '#fff'}\n >\n {Math.round(zoomLevel * 100)}%\n </div>\n ))}\n <div style={{ height: '1px', backgroundColor: 'var(--border-color)', margin: '4px 0' }} />\n <MenuOption icon={<ScanSearch size={16} />} label=\"Marquee Zoom\" onClick={() => setIsZoomMenuOpen(false)} />\n </div>\n )}\n </div>\n <IconButton \n icon={<MinusCircle size={18} color={scale <= MIN_SCALE ? 'var(--border-color)' : 'var(--text-muted)'} />} \n title=\"Zoom Out\" \n onClick={onZoomOut} \n disabled={scale <= MIN_SCALE}\n />\n <IconButton \n icon={<PlusCircle size={18} color={scale >= MAX_SCALE ? 'var(--border-color)' : 'var(--text-muted)'} />} \n title=\"Zoom In\" \n onClick={onZoomIn} \n disabled={scale >= MAX_SCALE}\n />\n </div>\n <div style={{ width: '1px', height: '24px', backgroundColor: 'var(--border-color)', margin: '0 4px' }} />\n <IconButton icon={<MousePointer size={18} />} title=\"Select Text\" active={headerTool === 'select'} onClick={() => bus.emit('action-set-tool', { tool: 'select' })} />\n <IconButton icon={<Hand size={18} />} title=\"Pan Tool\" active={headerTool === 'pan'} onClick={() => bus.emit('action-set-tool', { tool: 'pan' })} />\n </div>\n\n {/* Center Section: Tabs */}\n <div style={{ display: 'flex', alignItems: 'flex-end', height: '100%', gap: '16px' }}>\n {TABS.filter(tab => {\n if (tab === 'Annotate' && (enableAnnotations === false || permissions?.canAddAnnotations === false)) return false;\n if (tab === 'Forms' && permissions?.canCreateForms === false) return false;\n return true;\n }).map(tab => (\n <div \n key={tab}\n onClick={() => setActiveTab(tab)}\n style={{\n fontSize: '13px',\n fontWeight: activeTab === tab ? 500 : 400,\n color: activeTab === tab ? 'var(--primary)' : 'var(--text-muted)',\n cursor: 'pointer',\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n borderBottom: activeTab === tab ? '2px solid var(--primary)' : '2px solid transparent',\n padding: '0 4px'\n }}\n >\n {tab}\n </div>\n ))}\n </div>\n\n {/* Right Section */}\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n \n {/* Sign Button */}\n {isSignVisible && (\n <button \n onClick={() => bus.emit('action-sign')}\n style={{ \n background: '#fff0f0', border: '1px solid #d32f2f', color: '#d32f2f', \n display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '6px',\n height: '32px', padding: '0 12px', borderRadius: '4px', cursor: 'pointer',\n fontWeight: 600, fontSize: '13px'\n }}\n >\n <Pen size={14} color=\"#d32f2f\" fill=\"#d32f2f\" />\n Sign\n </button>\n )}\n \n {/* Verify Button (Only visible if signed) */}\n {signatureCount > 0 && (\n <div \n onClick={() => bus.emit('action-verify')}\n style={{ \n backgroundColor: '#10b981', color: '#000', \n borderRadius: '16px', padding: '4px 12px', \n display: 'flex', alignItems: 'center', gap: '6px', \n cursor: 'pointer', fontWeight: 600, fontSize: '13px'\n }}\n title=\"Verify Signatures\"\n >\n <ShieldCheck size={16} /> Signed · {signatureCount}\n </div>\n )}\n\n <div style={{ width: '1px', height: '24px', backgroundColor: 'var(--border-color)', margin: '0 4px' }} />\n\n <IconButton \n icon={<Info size={18} />} \n title=\"About / Info\"\n onClick={onOpenAbout} \n />\n\n <IconButton \n icon={<Search size={18} />} \n title=\"Search\"\n active={rightSidebarOpen && sidebarTab === 'Search'}\n onClick={() => onOpenSidebarTab('Search')} \n />\n <IconButton \n icon={<MessageSquare size={18} />} \n title=\"Comments\"\n active={rightSidebarOpen && sidebarTab === 'Comments'}\n onClick={() => onOpenSidebarTab('Comments')} \n />\n </div>\n </div>\n </div>\n );\n}\n\nfunction IconButton({ icon, onClick, active = false, disabled = false, title }: { icon: React.ReactNode, onClick?: () => void, active?: boolean, disabled?: boolean, title?: string }) {\n return (\n <button \n title={title}\n onClick={disabled ? undefined : onClick}\n disabled={disabled}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '32px',\n height: '32px',\n border: 'none',\n borderRadius: '4px',\n backgroundColor: active ? '#e6f0fa' : 'transparent',\n color: active ? 'var(--primary)' : 'inherit',\n cursor: disabled ? 'not-allowed' : 'pointer',\n opacity: disabled ? 0.4 : 1,\n outline: 'none',\n userSelect: 'none',\n WebkitUserSelect: 'none',\n }}\n onMouseOver={(e) => {\n if (!active && !disabled) e.currentTarget.style.backgroundColor = 'var(--hover-bg)';\n }}\n onMouseOut={(e) => {\n if (!active && !disabled) e.currentTarget.style.backgroundColor = 'transparent';\n }}\n >\n {icon}\n </button>\n );\n}\n\nfunction MenuOption({ icon, label, onClick, disabled = false, selected = false }: { icon: React.ReactNode, label: string, onClick?: () => void, disabled?: boolean, selected?: boolean }) {\n const [hovered, setHovered] = useState(false);\n return (\n <div \n onClick={disabled ? undefined : onClick}\n onMouseEnter={() => setHovered(!disabled)}\n onMouseLeave={() => setHovered(false)}\n style={{ \n display: 'flex', alignItems: 'center', gap: '12px', padding: '10px 16px', \n cursor: disabled ? 'default' : 'pointer', color: disabled ? '#ccc' : (selected ? '#fff' : 'var(--text-color)'),\n backgroundColor: disabled ? 'transparent' : (selected ? 'var(--primary)' : (hovered ? '#f5f5f5' : 'transparent')),\n fontSize: '13px'\n }}\n >\n <div style={{ color: disabled ? '#ccc' : (selected ? '#fff' : 'var(--text-muted)') }}>{icon}</div>\n <span>{label}</span>\n </div>\n );\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\nimport React from 'react';\nimport { Copy, Trash2, Link as LinkIcon, Edit2 } from 'lucide-react';\nimport type { Annotation } from '../annotations/types';\n\nimport type { SDKPermissions } from '../core/types';\n\ninterface AnnotationContextMenuProps {\n annotation: Annotation;\n position: { top: number; left: number };\n onCopy: () => void;\n onDelete: () => void;\n onUpdateColor: (color: string) => void;\n onOpenLinkModal: () => void;\n permissions?: SDKPermissions;\n}\n\nexport default function AnnotationContextMenu({\n annotation,\n position,\n onCopy,\n onDelete,\n onUpdateColor,\n onOpenLinkModal,\n permissions\n}: AnnotationContextMenuProps) {\n const canAdd = permissions?.canAddAnnotations !== false;\n const canEdit = permissions?.canEditAnnotations !== false;\n const canDelete = permissions?.canDeleteAnnotations !== false;\n\n // Simple predefined colors for quick selection\n const COLORS = ['#ef4444', '#f59e0b', '#10b981', '#3b82f6', '#8b5cf6', '#000000'];\n\n return (\n <div\n style={{\n position: 'absolute',\n top: `${position.top}px`,\n left: `${position.left}px`,\n backgroundColor: '#ffffff',\n border: '1px solid #e5e7eb',\n borderRadius: '6px',\n boxShadow: '0 4px 12px rgba(0,0,0,0.1)',\n display: 'flex',\n alignItems: 'center',\n padding: '4px',\n gap: '4px',\n zIndex: 2000,\n transform: 'translateY(8px)' // Slight offset below the element\n }}\n onClick={(e) => e.stopPropagation()}\n >\n {canAdd && (\n <>\n <MenuButton icon={<Copy size={16} />} title=\"Duplicate\" onClick={onCopy} />\n <div style={{ width: '1px', height: '20px', backgroundColor: '#e5e7eb', margin: '0 4px' }} />\n </>\n )}\n \n {canEdit && (\n <>\n <div style={{ display: 'flex', alignItems: 'center', gap: '2px', padding: '0 4px' }}>\n {COLORS.map(c => (\n <div\n key={c}\n onClick={() => onUpdateColor(c)}\n style={{\n width: '16px',\n height: '16px',\n borderRadius: '50%',\n backgroundColor: c,\n cursor: 'pointer',\n border: annotation.color === c ? '2px solid #374151' : '1px solid transparent'\n }}\n title={`Set color ${c}`}\n />\n ))}\n </div>\n <div style={{ width: '1px', height: '20px', backgroundColor: '#e5e7eb', margin: '0 4px' }} />\n </>\n )}\n\n {canEdit && (\n annotation.type === 'link' ? (\n <button\n title={annotation.linkUrl ? `Edit Link (${annotation.linkUrl})` : 'Edit Link'}\n onClick={onOpenLinkModal}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n height: '32px',\n borderRadius: '4px',\n border: 'none',\n backgroundColor: '#eef2ff',\n cursor: 'pointer',\n color: '#4338ca',\n padding: '0 10px',\n fontSize: '12px',\n fontWeight: 500\n }}\n onMouseEnter={(e) => e.currentTarget.style.backgroundColor = '#e0e7ff'}\n onMouseLeave={(e) => e.currentTarget.style.backgroundColor = '#eef2ff'}\n >\n <Edit2 size={14} />\n Edit Link\n </button>\n ) : (\n <MenuButton icon={<LinkIcon size={16} />} title=\"Link URL or Page\" onClick={onOpenLinkModal} />\n )\n )}\n\n {canDelete && (\n <MenuButton icon={<Trash2 size={16} />} title=\"Delete\" onClick={onDelete} color=\"#ef4444\" />\n )}\n </div>\n );\n}\n\nfunction MenuButton({ icon, title, onClick, color = '#4b5563' }: { icon: React.ReactNode, title: string, onClick: () => void, color?: string }) {\n return (\n <button\n title={title}\n onClick={onClick}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '32px',\n height: '32px',\n borderRadius: '4px',\n border: 'none',\n backgroundColor: 'transparent',\n cursor: 'pointer',\n color: color\n }}\n onMouseEnter={(e) => e.currentTarget.style.backgroundColor = '#f3f4f6'}\n onMouseLeave={(e) => e.currentTarget.style.backgroundColor = 'transparent'}\n >\n {icon}\n </button>\n );\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\n\nexport interface ParsedLinkTarget {\n /** Raw input URL or link target string. */\n rawUrl: string;\n /** True if the link refers only to an internal page jump within the current document (e.g. '#page=5' or '#5'). */\n isInternalPage: boolean;\n /** Clean document URL without page hash if referencing another document (e.g. 'supporting.pdf' or 'https://.../doc.pdf'). */\n docUrl?: string;\n /** Target page number (1-based) if specified (e.g. 5 from '#page=5' or 'doc.pdf#page=5'). */\n pageNumber?: number;\n /** True if this is an external web URL (e.g. 'https://google.com') that is not a PDF/document. */\n isExternalWeb: boolean;\n}\n\n/**\n * Checks whether a given URL or filename refers to a PDF / document rather than a general web page.\n */\nexport function isDocumentUrl(url: string): boolean {\n if (!url) return false;\n const trimmed = url.trim();\n\n // Custom document schemes\n if (/^(doc|pdf|file):/i.test(trimmed)) return true;\n\n // Strip query strings and hash anchors for extension checking\n const cleanPath = trimmed.split(/[?#]/)[0].toLowerCase();\n\n // Direct .pdf extension\n if (cleanPath.endsWith('.pdf')) return true;\n\n // Protocol-relative URLs (e.g. '//evil.com') are external web links unless explicitly pointing to a PDF\n if (trimmed.startsWith('//')) {\n return cleanPath.endsWith('.pdf') || cleanPath.endsWith('/pdf') || /[?&]format=pdf(&|$)/i.test(trimmed);\n }\n\n // Relative file paths (e.g. 'docs/contract', './exhibits/a.pdf')\n if (!/^[a-z][a-z0-9+.-]*:/i.test(trimmed)) {\n // If it has no scheme / protocol, it's a relative path / filename\n return true;\n }\n\n // REST-like PDF endpoints (e.g. '/api/documents/123/pdf' or '?format=pdf')\n if (cleanPath.endsWith('/pdf') || /[?&]format=pdf(&|$)/i.test(trimmed)) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Parses any link URL into structured destination information, extracting target documents and page numbers.\n */\nexport function parseLinkTarget(linkUrl: string): ParsedLinkTarget {\n const raw = (linkUrl || '').trim();\n if (!raw) {\n return {\n rawUrl: raw,\n isInternalPage: false,\n isExternalWeb: false\n };\n }\n\n // 1. Pure internal anchor: '#page=5' or '#5'\n if (raw.startsWith('#')) {\n const pageMatch = raw.match(/^#(?:page=)?(\\d+)$/i);\n const pageNumber = pageMatch ? parseInt(pageMatch[1], 10) : undefined;\n return {\n rawUrl: raw,\n isInternalPage: true,\n pageNumber: pageNumber && pageNumber > 0 ? pageNumber : undefined,\n isExternalWeb: false\n };\n }\n\n // 2. Custom document schemes: 'doc:supporting.pdf#page=3' or 'pdf:supporting.pdf'\n let normalizedUrl = raw;\n if (/^(doc|pdf):/i.test(raw)) {\n normalizedUrl = raw.replace(/^(doc|pdf):/i, '');\n }\n\n // 3. Extract page hash if present: 'path/doc.pdf#page=4' or 'path/doc.pdf#4'\n let docUrl = normalizedUrl;\n let pageNumber: number | undefined;\n\n const hashIndex = normalizedUrl.indexOf('#');\n if (hashIndex !== -1) {\n const hash = normalizedUrl.slice(hashIndex);\n docUrl = normalizedUrl.slice(0, hashIndex);\n const pageMatch = hash.match(/^#(?:page=)?(\\d+)$/i);\n if (pageMatch) {\n pageNumber = parseInt(pageMatch[1], 10);\n if (isNaN(pageNumber) || pageNumber <= 0) {\n pageNumber = undefined;\n }\n }\n }\n\n const isDoc = isDocumentUrl(docUrl);\n const isWeb = (/^https?:\\/\\//i.test(docUrl) || docUrl.startsWith('//')) && !isDoc;\n\n return {\n rawUrl: raw,\n isInternalPage: false,\n docUrl: isDoc || isWeb ? docUrl : docUrl,\n pageNumber,\n isExternalWeb: isWeb\n };\n}\n\n/**\n * Sanitizes a link URL to guarantee safe usage in anchor attributes (e.g. href).\n * Rejects dangerous schemes like javascript:, vbscript:, and data:.\n * Returns '#' if the scheme is unsafe or empty.\n */\nexport function sanitizeLinkUrl(url?: string): string {\n if (!url) return '#';\n const trimmed = url.trim();\n if (!trimmed) return '#';\n\n // Allow internal anchors e.g. '#page=2', '#5'\n if (trimmed.startsWith('#')) return trimmed;\n\n // Normalize protocol-relative URL\n if (trimmed.startsWith('//')) {\n return 'https:' + trimmed;\n }\n\n // Reject explicitly dangerous schemes\n if (/^(javascript|vbscript|data|file):/i.test(trimmed)) {\n return '#';\n }\n\n // If already absolute http/https/mailto/tel, return trimmed\n if (/^(https?|mailto|tel):/i.test(trimmed)) {\n return trimmed;\n }\n\n // If relative path (/docs/sample.pdf, ./sample.pdf, ../sample.pdf)\n if (trimmed.startsWith('/') || trimmed.startsWith('./') || trimmed.startsWith('../')) {\n return trimmed;\n }\n\n // If no scheme, treat as relative\n if (!/^[a-z][a-z0-9+.-]*:/i.test(trimmed)) {\n return trimmed;\n }\n\n // Any other unknown custom scheme: reject\n return '#';\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\nimport React, { useState } from 'react';\nimport { X } from 'lucide-react';\nimport { parseLinkTarget } from '../utils/linkUtils';\n\ninterface InsertLinkModalProps {\n initialUrl?: string;\n initialText?: string;\n showTextInput?: boolean;\n onClose: () => void;\n onSave: (url: string, text?: string) => void;\n}\n\nexport default function InsertLinkModal({ initialUrl = '', initialText = '', showTextInput = false, onClose, onSave }: InsertLinkModalProps) {\n const isInitialPage = initialUrl.startsWith('#page=');\n const parsedInitial = parseLinkTarget(initialUrl);\n const isInitialDoc = !isInitialPage && Boolean(parsedInitial.docUrl && !parsedInitial.isExternalWeb);\n\n const initialTab: 'url' | 'page' | 'document' = isInitialPage\n ? 'page'\n : isInitialDoc\n ? 'document'\n : 'url';\n\n const [activeTab, setActiveTab] = useState<'url' | 'page' | 'document'>(initialTab);\n const [url, setUrl] = useState(isInitialPage || isInitialDoc ? '' : initialUrl);\n const [page, setPage] = useState(isInitialPage ? initialUrl.replace('#page=', '') : '1');\n const [docUrl, setDocUrl] = useState(isInitialDoc ? parsedInitial.docUrl || '' : '');\n const [docPage, setDocPage] = useState(isInitialDoc && parsedInitial.pageNumber ? String(parsedInitial.pageNumber) : '');\n const [text, setText] = useState(initialText);\n\n const isSaveDisabled =\n activeTab === 'url' ? !url.trim() :\n activeTab === 'page' ? !page.trim() :\n !docUrl.trim();\n\n const handleSave = () => {\n if (isSaveDisabled) return;\n let finalUrl = '';\n if (activeTab === 'page') {\n finalUrl = `#page=${page}`;\n } else if (activeTab === 'document') {\n finalUrl = docPage.trim() ? `${docUrl.trim()}#page=${docPage.trim()}` : docUrl.trim();\n } else {\n finalUrl = url.trim();\n }\n\n if (showTextInput) {\n onSave(finalUrl, text.trim() || finalUrl);\n } else {\n onSave(finalUrl);\n }\n };\n\n const getPlaceholderText = () => {\n if (activeTab === 'url') return url || 'Link text...';\n if (activeTab === 'page') return `Page ${page}`;\n return docUrl ? `${docUrl}${docPage ? ` (Page ${docPage})` : ''}` : 'Document link text...';\n };\n\n return (\n <div style={{\n position: 'fixed', top: 0, left: 0, right: 0, bottom: 0,\n backgroundColor: 'rgba(0,0,0,0.5)', display: 'flex', alignItems: 'center', justifyContent: 'center',\n zIndex: 3000\n }}>\n <div style={{\n backgroundColor: '#fff',\n color: '#333',\n borderRadius: '8px',\n width: '420px',\n boxShadow: '0 10px 25px rgba(0,0,0,0.2)',\n fontFamily: 'sans-serif',\n overflow: 'hidden',\n display: 'flex',\n flexDirection: 'column'\n }}>\n {/* Header */}\n <div style={{ \n padding: '16px', borderBottom: '1px solid #e5e7eb', \n display: 'flex', alignItems: 'center', justifyContent: 'space-between'\n }}>\n <h2 style={{ margin: 0, fontSize: '16px', fontWeight: 600 }}>Insert Link, Page, or Document</h2>\n <button \n onClick={onClose}\n style={{ background: 'none', border: 'none', cursor: 'pointer', color: '#6b7280' }}\n >\n <X size={20} />\n </button>\n </div>\n\n {/* Content */}\n <div style={{ padding: '16px' }}>\n {/* Tabs */}\n <div style={{ display: 'flex', border: '1px solid #2b76b9', borderRadius: '4px', overflow: 'hidden', marginBottom: '16px' }}>\n <div \n onClick={() => setActiveTab('url')}\n style={{ flex: 1, textAlign: 'center', padding: '8px', backgroundColor: activeTab === 'url' ? '#2b76b9' : '#fff', color: activeTab === 'url' ? '#fff' : '#6b7280', fontWeight: 500, fontSize: '13px', cursor: 'pointer' }}>\n Web URL\n </div>\n <div \n onClick={() => setActiveTab('page')}\n style={{ flex: 1, textAlign: 'center', padding: '8px', backgroundColor: activeTab === 'page' ? '#2b76b9' : '#fff', color: activeTab === 'page' ? '#fff' : '#6b7280', fontWeight: 500, fontSize: '13px', cursor: 'pointer' }}>\n This Page\n </div>\n <div \n onClick={() => setActiveTab('document')}\n style={{ flex: 1.2, textAlign: 'center', padding: '8px', backgroundColor: activeTab === 'document' ? '#2b76b9' : '#fff', color: activeTab === 'document' ? '#fff' : '#6b7280', fontWeight: 500, fontSize: '13px', cursor: 'pointer' }}>\n Other Doc\n </div>\n </div>\n\n {/* URL, Page, or Document input */}\n {activeTab === 'url' && (\n <div style={{ marginBottom: showTextInput ? '16px' : '0' }}>\n <label style={{ display: 'block', marginBottom: '8px', fontSize: '13px', fontWeight: 600, color: '#374151' }}>\n Enter Web URL <span style={{ color: '#ef4444' }}>*</span>\n </label>\n <input \n type=\"text\" \n value={url}\n onChange={(e) => setUrl(e.target.value)}\n placeholder=\"https://...\"\n style={{\n width: '100%', padding: '10px', boxSizing: 'border-box',\n border: `1px solid ${!url.trim() ? '#fca5a5' : '#d1d5db'}`, borderRadius: '4px', fontSize: '14px'\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') handleSave();\n }}\n autoFocus\n />\n </div>\n )}\n\n {activeTab === 'page' && (\n <div style={{ marginBottom: showTextInput ? '16px' : '0' }}>\n <label style={{ display: 'block', marginBottom: '8px', fontSize: '13px', fontWeight: 600, color: '#374151' }}>\n Enter Page Number in Current Document <span style={{ color: '#ef4444' }}>*</span>\n </label>\n <input \n type=\"number\" \n value={page}\n min=\"1\"\n onChange={(e) => setPage(e.target.value)}\n placeholder=\"10\"\n style={{\n width: '100%', padding: '10px', boxSizing: 'border-box',\n border: `1px solid ${!page.trim() ? '#fca5a5' : '#d1d5db'}`, borderRadius: '4px', fontSize: '14px'\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') handleSave();\n }}\n autoFocus\n />\n </div>\n )}\n\n {activeTab === 'document' && (\n <div style={{ marginBottom: showTextInput ? '16px' : '0' }}>\n <label style={{ display: 'block', marginBottom: '8px', fontSize: '13px', fontWeight: 600, color: '#374151' }}>\n Document URL or File Name <span style={{ color: '#ef4444' }}>*</span>\n </label>\n <input \n type=\"text\" \n value={docUrl}\n onChange={(e) => setDocUrl(e.target.value)}\n placeholder=\"supporting-doc.pdf or https://...\"\n style={{\n width: '100%', padding: '10px', boxSizing: 'border-box', marginBottom: '12px',\n border: `1px solid ${!docUrl.trim() ? '#fca5a5' : '#d1d5db'}`, borderRadius: '4px', fontSize: '14px'\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') handleSave();\n }}\n autoFocus\n />\n <label style={{ display: 'block', marginBottom: '8px', fontSize: '13px', fontWeight: 600, color: '#374151' }}>\n Target Page <span style={{ color: '#9ca3af', fontWeight: 400, fontSize: '12px' }}>(optional — defaults to page 1)</span>\n </label>\n <input \n type=\"number\" \n value={docPage}\n min=\"1\"\n onChange={(e) => setDocPage(e.target.value)}\n placeholder=\"1\"\n style={{\n width: '100%', padding: '10px', boxSizing: 'border-box',\n border: '1px solid #d1d5db', borderRadius: '4px', fontSize: '14px'\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') handleSave();\n }}\n />\n </div>\n )}\n\n {/* Text to Display (optional, below inputs) */}\n {showTextInput && (\n <div>\n <label style={{ display: 'block', marginBottom: '8px', fontSize: '13px', fontWeight: 600, color: '#374151' }}>\n Text to Display <span style={{ color: '#9ca3af', fontWeight: 400, fontSize: '12px' }}>(optional — defaults to target)</span>\n </label>\n <input \n type=\"text\" \n value={text}\n onChange={(e) => setText(e.target.value)}\n placeholder={getPlaceholderText()}\n style={{\n width: '100%', padding: '10px', boxSizing: 'border-box',\n border: '1px solid #d1d5db', borderRadius: '4px', fontSize: '14px'\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') handleSave();\n }}\n />\n </div>\n )}\n </div>\n \n {/* Footer */}\n <div style={{ padding: '16px', borderTop: '1px solid #e5e7eb', display: 'flex', justifyContent: 'flex-end', backgroundColor: '#f9fafb' }}>\n <button \n onClick={handleSave}\n disabled={isSaveDisabled}\n style={{ \n backgroundColor: isSaveDisabled ? '#93c5fd' : '#2b76b9', color: '#fff', border: 'none', borderRadius: '4px',\n padding: '8px 24px', fontSize: '14px', fontWeight: 500, cursor: isSaveDisabled ? 'not-allowed' : 'pointer'\n }}\n >\n Link\n </button>\n </div>\n </div>\n </div>\n );\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\nimport { useState, useEffect, useCallback } from 'react';\n\nexport type ActionType =\n | 'ROTATE_CW'\n | 'ROTATE_CCW'\n | 'UNDO'\n | 'REDO'\n | 'DELETE'\n | 'COPY'\n | 'PASTE'\n | 'FILE_PICKER'\n | 'SEARCH';\n\nexport interface Shortcut {\n action: ActionType;\n description: string;\n defaultCommand: string;\n command: string;\n}\n\nexport const DEFAULT_SHORTCUTS: Shortcut[] = [\n { action: 'ROTATE_CW', description: 'Rotate the document clockwise', defaultCommand: 'Meta+Shift+=', command: 'Meta+Shift+=' },\n { action: 'ROTATE_CCW', description: 'Rotate the document counterclockwise', defaultCommand: 'Meta+Shift+-', command: 'Meta+Shift+-' },\n { action: 'COPY', description: 'Copy selected text or annotations', defaultCommand: 'Meta+C', command: 'Meta+C' },\n { action: 'PASTE', description: 'Paste text or annotations', defaultCommand: 'Meta+V', command: 'Meta+V' },\n { action: 'UNDO', description: 'Undo an annotation change', defaultCommand: 'Meta+Z', command: 'Meta+Z' },\n { action: 'REDO', description: 'Redo an annotation change', defaultCommand: 'Meta+Shift+Z', command: 'Meta+Shift+Z' },\n { action: 'FILE_PICKER', description: 'Open the file picker', defaultCommand: 'Meta+O', command: 'Meta+O' },\n { action: 'SEARCH', description: 'Open the search overlay', defaultCommand: 'Meta+F', command: 'Meta+F' },\n { action: 'DELETE', description: 'Delete selected annotation', defaultCommand: 'Delete', command: 'Delete' },\n];\n\nconst STORAGE_KEY = 'pdfviewer_shortcuts';\nconst CHANGE_EVENT = 'pdfviewer-shortcuts-changed';\n\nlet cachedShortcuts: Shortcut[] | null = null;\nconst listeners = new Set<() => void>();\n\nexport function loadStoredShortcuts(): Shortcut[] {\n if (typeof window === 'undefined' || !window.localStorage) return DEFAULT_SHORTCUTS;\n try {\n const saved = window.localStorage.getItem(STORAGE_KEY);\n if (saved) {\n const parsed = JSON.parse(saved);\n if (Array.isArray(parsed)) {\n return DEFAULT_SHORTCUTS.map(def => {\n const found = parsed.find((p: Shortcut) => p && p.action === def.action);\n return found && typeof found.command === 'string' ? { ...def, command: found.command } : def;\n });\n }\n }\n } catch {\n // ignore parse errors\n }\n return DEFAULT_SHORTCUTS;\n}\n\nfunction notifySubscribers() {\n listeners.forEach(fn => fn());\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent(CHANGE_EVENT));\n }\n}\n\nexport function useShortcuts() {\n const [shortcuts, setShortcuts] = useState<Shortcut[]>(() => {\n if (!cachedShortcuts) cachedShortcuts = loadStoredShortcuts();\n return cachedShortcuts;\n });\n\n useEffect(() => {\n const sync = () => {\n cachedShortcuts = loadStoredShortcuts();\n setShortcuts(cachedShortcuts);\n };\n\n listeners.add(sync);\n if (typeof window !== 'undefined') {\n window.addEventListener('storage', sync);\n window.addEventListener(CHANGE_EVENT, sync);\n }\n\n return () => {\n listeners.delete(sync);\n if (typeof window !== 'undefined') {\n window.removeEventListener('storage', sync);\n window.removeEventListener(CHANGE_EVENT, sync);\n }\n };\n }, []);\n\n const updateShortcut = useCallback((action: ActionType, newCommand: string) => {\n const base = cachedShortcuts || loadStoredShortcuts();\n const updated = base.map(s => s.action === action ? { ...s, command: newCommand } : s);\n cachedShortcuts = updated;\n if (typeof window !== 'undefined' && window.localStorage) {\n window.localStorage.setItem(STORAGE_KEY, JSON.stringify(updated));\n }\n setShortcuts(updated);\n notifySubscribers();\n }, []);\n\n const resetShortcuts = useCallback(() => {\n cachedShortcuts = DEFAULT_SHORTCUTS;\n if (typeof window !== 'undefined' && window.localStorage) {\n window.localStorage.removeItem(STORAGE_KEY);\n }\n setShortcuts(DEFAULT_SHORTCUTS);\n notifySubscribers();\n }, []);\n\n const getCommand = useCallback((action: ActionType): string => {\n const list = cachedShortcuts || shortcuts;\n const s = list.find(item => item.action === action);\n return s ? s.command : '';\n }, [shortcuts]);\n\n return { shortcuts, updateShortcut, resetShortcuts, getCommand };\n}\n\nexport interface ParsedCommand {\n meta: boolean;\n shift: boolean;\n alt: boolean;\n key: string;\n}\n\nexport function parseCommandString(commandString: string): ParsedCommand {\n if (!commandString) return { meta: false, shift: false, alt: false, key: '' };\n\n const rawTokens = commandString.split('+');\n let meta = false;\n let shift = false;\n let alt = false;\n const keyTokens: string[] = [];\n\n for (let i = 0; i < rawTokens.length; i++) {\n const raw = rawTokens[i].trim();\n const lower = raw.toLowerCase();\n\n if (lower === 'meta' || lower === 'cmd' || lower === 'ctrl' || lower === 'command' || lower === 'control') {\n meta = true;\n } else if (lower === 'shift') {\n shift = true;\n } else if (lower === 'alt' || lower === 'option') {\n alt = true;\n } else if (raw === '' && i > 0 && rawTokens[i - 1] === '') {\n // Handles '+' key when split by '+' e.g. \"Meta++\" or \"Meta+Shift++\"\n keyTokens.push('+');\n } else if (raw !== '') {\n keyTokens.push(raw);\n }\n }\n\n if (commandString.endsWith('+') && keyTokens.length === 0) {\n keyTokens.push('+');\n }\n\n return { meta, shift, alt, key: keyTokens.join('+').toLowerCase() };\n}\n\n// Utility to match KeyboardEvent against a command string\nexport function matchShortcut(e: KeyboardEvent, commandString: string): boolean {\n if (!commandString) return false;\n const parsed = parseCommandString(commandString);\n\n const isMetaPressed = Boolean(e.metaKey || e.ctrlKey);\n if (parsed.meta !== isMetaPressed) return false;\n if (parsed.alt !== Boolean(e.altKey)) return false;\n\n const eventKey = (e.key || '').toLowerCase();\n const targetKey = parsed.key.toLowerCase();\n\n // Delete & Backspace mapping (interchangeable for DELETE action)\n if (targetKey === 'delete' || targetKey === 'backspace') {\n if (parsed.shift !== Boolean(e.shiftKey)) return false;\n return eventKey === 'delete' || eventKey === 'backspace';\n }\n\n // Plus & Equals: on US layout '+' is Shift+'='\n if (targetKey === '=' || targetKey === '+') {\n const isKeyEqualOrPlus = eventKey === '=' || eventKey === '+' || e.code === 'Equal' || e.code === 'NumpadAdd';\n if (!isKeyEqualOrPlus) return false;\n if (parsed.shift && !e.shiftKey) return false;\n if (!parsed.shift && targetKey === '=' && e.shiftKey) return false;\n return true;\n }\n\n // Minus & Underscore: on US layout '_' is Shift+'-'\n if (targetKey === '-' || targetKey === '_') {\n const isKeyMinus = eventKey === '-' || eventKey === '_' || e.code === 'Minus' || e.code === 'NumpadSubtract';\n if (!isKeyMinus) return false;\n if (parsed.shift && !e.shiftKey) return false;\n if (!parsed.shift && targetKey === '-' && e.shiftKey) return false;\n return true;\n }\n\n // Check shift requirement\n if (parsed.shift !== Boolean(e.shiftKey)) return false;\n\n // Direct key or code match\n if (eventKey === targetKey) return true;\n if (e.code && e.code.toLowerCase() === `key${targetKey}`) return true;\n if (e.code && e.code.toLowerCase() === `digit${targetKey}`) return true;\n\n return false;\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * Shared page text builder and coordinate interpolator for PDF search and redaction.\n */\nimport type { SearchBounds } from '../core/types';\n\nexport interface PageText {\n fullText: string;\n itemIndices: number[];\n charIndices: number[];\n normText: string;\n normToRaw: number[];\n}\n\n/**\n * Collapses any consecutive whitespace runs to a single space and trims edges.\n */\nexport function collapseWhitespace(s: string): string {\n return s.replace(/\\s+/g, ' ').trim();\n}\n\n/**\n * Builds raw page text with item/char index source-mapping, followed by a second pass\n * creating normalized text (collapsing any maximal whitespace run to a single space)\n * and a 1-to-1 index map back to raw string indices.\n */\nexport function buildPageText(items: any[]): PageText {\n let fullText = '';\n const itemIndices: number[] = [];\n const charIndices: number[] = [];\n\n // Pass 1: Build raw fullText with item and char index sentinels\n items.forEach((item, index) => {\n const str = item.str ?? '';\n for (let i = 0; i < str.length; i++) {\n itemIndices.push(index);\n charIndices.push(i);\n }\n fullText += str;\n\n if (item.hasEOL) {\n fullText += '\\n';\n itemIndices.push(-1);\n charIndices.push(-1);\n } else {\n fullText += ' ';\n itemIndices.push(-1);\n charIndices.push(-1);\n }\n });\n\n // Pass 2: Collapse maximal runs of /\\s/ into a single ' ' pointing to the run's first raw index\n let normText = '';\n const normToRaw: number[] = [];\n\n let i = 0;\n while (i < fullText.length) {\n const char = fullText[i];\n if (/\\s/.test(char)) {\n const runStart = i;\n while (i < fullText.length && /\\s/.test(fullText[i])) {\n i++;\n }\n normText += ' ';\n normToRaw.push(runStart);\n } else {\n normText += char;\n normToRaw.push(i);\n i++;\n }\n }\n\n return {\n fullText,\n itemIndices,\n charIndices,\n normText,\n normToRaw,\n };\n}\n\n/**\n * Computes bounding boxes in PDF coordinate points for a matched range [rawStart, rawEndExcl) in fullText.\n * Separator sentinels (-1) are skipped, and character positions are interpolated across each TextItem.\n */\nexport function boundsForRawRange(\n items: any[],\n pageText: Pick<PageText, 'itemIndices' | 'charIndices'>,\n rawStart: number,\n rawEndExcl: number\n): SearchBounds[] {\n const { itemIndices, charIndices } = pageText;\n const itemMatches = new Map<number, { min: number; max: number }>();\n\n for (let i = rawStart; i < rawEndExcl; i++) {\n const itemIdx = itemIndices[i];\n const charIdx = charIndices[i];\n if (itemIdx !== undefined && itemIdx !== -1) {\n const existing = itemMatches.get(itemIdx);\n if (existing) {\n existing.min = Math.min(existing.min, charIdx);\n existing.max = Math.max(existing.max, charIdx);\n } else {\n itemMatches.set(itemIdx, { min: charIdx, max: charIdx });\n }\n }\n }\n\n const bounds: SearchBounds[] = [];\n\n itemMatches.forEach((match, itemIndex) => {\n const item = items[itemIndex];\n if (!item || !item.transform) return;\n\n const x = item.transform[4];\n const y = item.transform[5];\n const width = item.width;\n const height = item.height || Math.abs(item.transform[3]);\n const strLen = (item.str ?? '').length;\n\n if (strLen > 0) {\n const charWidth = width / strLen;\n const startX = x + match.min * charWidth;\n const matchWidth = (match.max - match.min + 1) * charWidth;\n bounds.push({ x: startX, y, width: matchWidth, height });\n } else {\n bounds.push({ x, y, width, height });\n }\n });\n\n return bounds;\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\nimport { useState, useCallback } from 'react';\nimport type * as pdfjsLib from 'pdfjs-dist';\nimport type { Redaction, SearchBounds } from '../core/types';\n\nimport { buildPageText, collapseWhitespace, boundsForRawRange } from '../utils/pageText';\n\nexport type { SearchBounds };\n\nexport interface SearchResult {\n id: string;\n pageIndex: number;\n snippet: string;\n matchStartIndex: number;\n matchLength: number;\n bounds: SearchBounds[];\n}\n\n/**\n * Standalone asynchronous text search across all pages (or specified pages) of a PDFDocumentProxy.\n * Sanitizes redacted regions and returns matching snippets and bounding boxes.\n */\nexport async function searchPdfText(\n pdfDoc: pdfjsLib.PDFDocumentProxy,\n query: string,\n redactions: Redaction[] = [],\n onProgress?: (progress: number) => void,\n pages?: number[]\n): Promise<SearchResult[]> {\n if (!pdfDoc || !query.trim()) return [];\n\n const results: SearchResult[] = [];\n const qn = collapseWhitespace(query).toLowerCase();\n if (!qn) return [];\n\n const numPages = pdfDoc.numPages;\n let targetPages: number[];\n if (pages !== undefined) {\n const deduped = Array.from(new Set(pages));\n targetPages = deduped\n .filter(p => Number.isInteger(p) && p >= 1 && p <= numPages)\n .sort((a, b) => a - b);\n if (targetPages.length === 0) {\n onProgress?.(100);\n return [];\n }\n } else {\n targetPages = Array.from({ length: numPages }, (_, i) => i + 1);\n }\n\n const batchSize = 10;\n\n for (let batchStart = 0; batchStart < targetPages.length; batchStart += batchSize) {\n const batchPages = targetPages.slice(batchStart, batchStart + batchSize);\n const batchPromises = batchPages.map(pageNum =>\n (async () => {\n const page = await pdfDoc.getPage(pageNum);\n const textContent = await page.getTextContent();\n\n // --- Text Layer Sanitization ---\n let items = textContent.items as any[];\n if (redactions && redactions.length > 0) {\n const pageRedactions = redactions.filter(r => r.pageIndex === pageNum);\n if (pageRedactions.length > 0) {\n const vp = page.getViewport({ scale: 1 });\n items = items.filter((item: any) => {\n if (!item.str || item.str.trim() === '') return true;\n\n const itemX = item.transform[4];\n const itemY = item.transform[5];\n const itemW = item.width;\n const itemH = item.height || Math.abs(item.transform[3]);\n const itemTopY = vp.height - itemY - itemH;\n\n for (const red of pageRedactions) {\n const intersectX = Math.max(itemX, red.x) < Math.min(itemX + itemW, red.x + red.width);\n const intersectY = Math.max(itemTopY, red.y) < Math.min(itemTopY + itemH, red.y + red.height);\n\n if (intersectX && intersectY) {\n return false; // Intersects redacted region, exclude from search results!\n }\n }\n return true;\n });\n }\n }\n\n const pageText = buildPageText(items);\n const { fullText, normText, normToRaw } = pageText;\n const lowerNormText = normText.toLowerCase();\n let n = 0;\n const pageResults: SearchResult[] = [];\n\n while ((n = lowerNormText.indexOf(qn, n)) !== -1) {\n const rawStart = normToRaw[n];\n const rawEndExcl = normToRaw[n + qn.length - 1] + 1;\n const snippetStart = Math.max(0, rawStart - 30);\n const snippetEnd = Math.min(fullText.length, rawEndExcl + 30);\n const snippet = fullText.substring(snippetStart, snippetEnd).replace(/\\n/g, ' ');\n\n const bounds = boundsForRawRange(items, pageText, rawStart, rawEndExcl);\n\n pageResults.push({\n id: `p${pageNum}-idx${rawStart}`,\n pageIndex: pageNum,\n snippet,\n matchStartIndex: rawStart - snippetStart,\n matchLength: rawEndExcl - rawStart,\n bounds,\n });\n\n n += qn.length;\n }\n\n page.cleanup?.();\n return pageResults;\n })()\n );\n\n const batchResultsArray = await Promise.all(batchPromises);\n batchResultsArray.forEach(pageResults => results.push(...pageResults));\n\n onProgress?.(Math.round(((batchStart + batchPages.length) / targetPages.length) * 100));\n // Yield to main thread to allow UI to render progress bar\n await new Promise(resolve => setTimeout(resolve, 10));\n }\n\n // Stable sort by pageIndex maintains sequential page order and ascending intra-page order\n results.sort((a, b) => a.pageIndex - b.pageIndex);\n\n return results;\n}\n\nexport function usePdfSearch(pdfDoc: pdfjsLib.PDFDocumentProxy | null, redactions: Redaction[] = []) {\n const [isSearching, setIsSearching] = useState(false);\n const [searchResults, setSearchResults] = useState<SearchResult[]>([]);\n const [searchProgress, setSearchProgress] = useState(0);\n\n const search = useCallback(\n async (query: string) => {\n if (!pdfDoc || !query.trim()) {\n setSearchResults([]);\n return;\n }\n\n setIsSearching(true);\n setSearchProgress(0);\n\n try {\n const results = await searchPdfText(pdfDoc, query, redactions, p => setSearchProgress(p));\n setSearchResults(results);\n } catch (error) {\n console.error('Search error:', error);\n } finally {\n setIsSearching(false);\n setSearchProgress(100);\n }\n },\n [pdfDoc, redactions]\n );\n\n return { search, searchResults, isSearching, searchProgress, clearSearch: () => setSearchResults([]) };\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\nimport React, { useState, useEffect, useRef } from 'react';\nimport { Trash2, MessageSquare, MessageCircle, Type, Search, X, Link as LinkIcon } from 'lucide-react';\nimport { type SearchResult } from '../hooks/usePdfSearch';\nimport { useBusEvent } from '../hooks/useViewerBus';\nimport { sanitizeLinkUrl } from '../utils/linkUtils';\n\ninterface SidebarProps {\n isOpen: boolean;\n annotations: any[];\n setAnnotations: (anns: any[]) => void;\n selectedAnnotationId: string | null;\n setSelectedAnnotationId: (id: string | null) => void;\n // Search Props\n onSearch: (query: string) => void;\n searchResults: SearchResult[];\n isSearching: boolean;\n searchProgress: number;\n onResultClick: (result: SearchResult) => void;\n activeTab: 'Comments' | 'Search';\n setActiveTab: (tab: 'Comments' | 'Search') => void;\n onLinkClick?: (url: string, annotation?: any, e?: React.MouseEvent) => void;\n}\n\nexport default function Sidebar({ \n isOpen, annotations, setAnnotations, selectedAnnotationId, setSelectedAnnotationId,\n onSearch, searchResults, isSearching, searchProgress, onResultClick,\n activeTab, setActiveTab, onLinkClick\n}: SidebarProps) {\n const [searchQuery, setSearchQuery] = useState('');\n const [sidebarWidth, setSidebarWidth] = useState(320);\n const [isResizing, setIsResizing] = useState(false);\n const searchInputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n const handleMouseMove = (e: MouseEvent) => {\n if (!isResizing) return;\n const newWidth = Math.min(Math.max(e.clientX, 200), 600);\n setSidebarWidth(newWidth);\n };\n const handleMouseUp = () => setIsResizing(false);\n \n if (isResizing) {\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n } else {\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n }\n return () => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n }, [isResizing]);\n\n useEffect(() => {\n const handler = setTimeout(() => {\n onSearch(searchQuery);\n }, 500);\n return () => clearTimeout(handler);\n }, [searchQuery, onSearch]);\n\n useEffect(() => {\n if (isOpen && activeTab === 'Search') {\n const timer = setTimeout(() => {\n searchInputRef.current?.focus();\n searchInputRef.current?.select();\n }, 50);\n return () => clearTimeout(timer);\n }\n }, [isOpen, activeTab]);\n\n useBusEvent('action-focus-search', () => {\n if (searchInputRef.current) {\n searchInputRef.current.focus();\n searchInputRef.current.select();\n }\n });\n\n const comments = annotations.filter(a => ['note', 'callout', 'text', 'link'].includes(a.type));\n\n const handleDelete = (id: string) => {\n setAnnotations(annotations.filter(a => a.id !== id));\n if (selectedAnnotationId === id) setSelectedAnnotationId(null);\n };\n\n return (\n <div style={{\n width: isOpen ? `${sidebarWidth}px` : '0px',\n height: '100%',\n backgroundColor: '#f9fafb',\n display: 'flex',\n flexShrink: 0,\n zIndex: 10,\n transition: isResizing ? 'none' : 'width 0.3s cubic-bezier(0.4, 0, 0.2, 1)',\n position: 'relative'\n }}>\n {/* Inner container to clip content smoothly */}\n <div style={{\n width: `${sidebarWidth}px`,\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden'\n }}>\n <div style={{\n padding: '16px',\n borderBottom: '1px solid var(--border-color)',\n backgroundColor: '#fff',\n display: 'flex',\n flexDirection: 'column',\n gap: '12px',\n flexShrink: 0\n }}>\n <div style={{ display: 'flex', gap: '16px' }}>\n <button \n onClick={() => setActiveTab('Search')}\n style={{ \n background: 'none', border: 'none', padding: '4px 0', cursor: 'pointer', fontSize: '14px',\n fontWeight: activeTab === 'Search' ? 600 : 400, color: activeTab === 'Search' ? 'var(--primary)' : 'var(--text-muted)',\n borderBottom: activeTab === 'Search' ? '2px solid var(--primary)' : '2px solid transparent'\n }}\n >\n Search\n </button>\n <button \n onClick={() => setActiveTab('Comments')}\n style={{ \n background: 'none', border: 'none', padding: '4px 0', cursor: 'pointer', fontSize: '14px',\n fontWeight: activeTab === 'Comments' ? 600 : 400, color: activeTab === 'Comments' ? 'var(--primary)' : 'var(--text-muted)',\n borderBottom: activeTab === 'Comments' ? '2px solid var(--primary)' : '2px solid transparent'\n }}\n >\n Comments\n </button>\n </div>\n\n {activeTab === 'Search' && (\n <div style={{ position: 'relative', marginBottom: '16px' }}>\n <Search size={16} color=\"#64748b\" style={{ position: 'absolute', left: '12px', top: '10px' }} />\n <input \n ref={searchInputRef}\n type=\"text\" \n placeholder=\"Search...\" \n value={searchQuery}\n onChange={e => setSearchQuery(e.target.value)}\n onKeyDown={e => {\n if (e.key === 'Enter') {\n e.preventDefault();\n onSearch(searchQuery);\n }\n }}\n style={{\n width: '100%',\n padding: '8px 32px 8px 36px',\n border: '1px solid var(--border-color)',\n borderRadius: '4px',\n fontSize: '13px',\n outline: 'none',\n boxSizing: 'border-box'\n }}\n />\n {searchQuery && (\n <button \n onClick={() => {\n setSearchQuery('');\n onSearch('');\n }}\n style={{\n position: 'absolute',\n right: '10px',\n top: '50%',\n transform: 'translateY(-50%)',\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n padding: 0,\n color: 'var(--text-muted)'\n }}\n title=\"Clear search\"\n >\n <X size={14} />\n </button>\n )}\n </div>\n )}\n </div>\n\n <div style={{ flex: 1, overflowY: 'auto', padding: '12px', display: 'flex', flexDirection: 'column', gap: '8px' }}>\n \n {activeTab === 'Comments' && (\n <>\n {comments.length === 0 && (\n <div style={{ color: 'var(--text-muted)', fontSize: '13px', textAlign: 'center', marginTop: '24px' }}>\n No comments on this document.\n </div>\n )}\n {comments.map(comment => (\n <div \n key={comment.id}\n onClick={() => setSelectedAnnotationId(comment.id)}\n style={{\n padding: '12px',\n backgroundColor: '#fff',\n border: selectedAnnotationId === comment.id ? '2px solid var(--primary)' : '1px solid var(--border-color)',\n borderRadius: '6px',\n cursor: 'pointer',\n boxShadow: '0 1px 2px rgba(0,0,0,0.05)'\n }}\n >\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: '8px' }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px', color: 'var(--text-muted)' }}>\n {comment.type === 'note' && <MessageSquare size={14} />}\n {comment.type === 'callout' && <MessageCircle size={14} />}\n {comment.type === 'text' && <Type size={14} />}\n {comment.type === 'link' && <LinkIcon size={14} />}\n <span style={{ fontSize: '12px', textTransform: 'capitalize' }}>{comment.type}</span>\n {comment.author && <span style={{ fontSize: '11px', color: 'var(--text-muted)' }}>· {comment.author}</span>}\n </div>\n <button \n onClick={(e) => { e.stopPropagation(); handleDelete(comment.id); }}\n style={{ background: 'none', border: 'none', color: '#ef4444', cursor: 'pointer', padding: '4px' }}\n title=\"Delete Comment\"\n >\n <Trash2 size={14} />\n </button>\n </div>\n \n <div style={{ fontSize: '14px', color: 'var(--text-color)', whiteSpace: 'pre-wrap', wordBreak: 'break-word' }}>\n {comment.type === 'link' ? (\n <a\n href={sanitizeLinkUrl(comment.linkUrl)}\n onClick={(e) => {\n if (onLinkClick && comment.linkUrl) {\n e.preventDefault();\n onLinkClick(comment.linkUrl, comment, e);\n }\n }}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{ color: 'var(--primary)', textDecoration: 'none', cursor: 'pointer' }}\n >\n {comment.linkUrl || <span style={{ fontStyle: 'italic', color: 'var(--text-muted)' }}>Empty link</span>}\n </a>\n ) : (\n comment.text || <span style={{ fontStyle: 'italic', color: 'var(--text-muted)' }}>Empty comment</span>\n )}\n </div>\n </div>\n ))}\n </>\n )}\n\n {activeTab === 'Search' && (\n <>\n {isSearching && (\n <div style={{ fontSize: '13px', color: 'var(--text-muted)', textAlign: 'center', marginTop: '16px' }}>\n Searching... {searchProgress}%\n </div>\n )}\n {!isSearching && searchQuery && searchResults.length === 0 && (\n <div style={{ fontSize: '13px', color: 'var(--text-muted)', textAlign: 'center', marginTop: '16px' }}>\n No results found.\n </div>\n )}\n {!isSearching && searchResults.length > 0 && (\n <div style={{ fontSize: '12px', color: 'var(--text-muted)', marginBottom: '8px' }}>\n {searchResults.length} results found\n </div>\n )}\n \n {/* Group results by page */}\n {!isSearching && Array.from(new Set(searchResults.map(r => r.pageIndex))).map(pageNum => {\n const pageResults = searchResults.filter(r => r.pageIndex === pageNum);\n return (\n <div key={`page-${pageNum}`} style={{ marginBottom: '16px' }}>\n <div style={{ fontSize: '12px', color: 'var(--text-muted)', marginBottom: '4px' }}>Page {pageNum}</div>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '4px' }}>\n {pageResults.map(result => (\n <div \n key={result.id} \n onClick={() => onResultClick(result)}\n style={{\n padding: '8px',\n backgroundColor: '#fff',\n border: '1px solid var(--border-color)',\n borderRadius: '4px',\n cursor: 'pointer',\n fontSize: '13px',\n color: 'var(--text-color)'\n }}\n >\n {result.snippet.substring(0, result.matchStartIndex)}\n <span style={{ fontWeight: 700, color: 'var(--primary)' }}>\n {result.snippet.substring(result.matchStartIndex, result.matchStartIndex + result.matchLength)}\n </span>\n {result.snippet.substring(result.matchStartIndex + result.matchLength)}\n </div>\n ))}\n </div>\n </div>\n );\n })}\n </>\n )}\n \n </div>\n \n </div>\n\n {/* Resizer Handle */}\n {isOpen && (\n <div \n onMouseDown={() => setIsResizing(true)}\n style={{\n position: 'absolute',\n top: 0,\n right: 0,\n width: '6px',\n height: '100%',\n cursor: 'col-resize',\n zIndex: 20,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: 'transparent'\n }}\n >\n {/* Vertical Pill */}\n <div style={{\n width: '6px',\n height: '40px',\n backgroundColor: '#fff',\n border: '1px solid #d1d5db',\n borderRadius: '4px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '1px',\n boxShadow: '0 1px 3px rgba(0,0,0,0.1)'\n }}>\n <div style={{ width: '1px', height: '16px', backgroundColor: '#9ca3af' }} />\n <div style={{ width: '1px', height: '16px', backgroundColor: '#9ca3af' }} />\n </div>\n <div style={{ position: 'absolute', top: 0, right: 0, width: '1px', height: '100%', backgroundColor: 'var(--border-color)', zIndex: -1 }} />\n </div>\n )}\n </div>\n );\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\nimport React, { useState, useEffect, useRef } from 'react';\nimport * as pdfjsLib from 'pdfjs-dist';\nimport { Copy, List, Bookmark, MoreHorizontal, CheckSquare, Minus, Plus } from 'lucide-react';\n\ninterface ThumbnailProps {\n pdfDoc: pdfjsLib.PDFDocumentProxy;\n pageIndex: number;\n isActive: boolean;\n onClick: () => void;\n scale: number;\n}\n\nconst Thumbnail = ({ pdfDoc, pageIndex, isActive, onClick, scale }: ThumbnailProps) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const [isVisible, setIsVisible] = useState(false);\n const [aspectRatio, setAspectRatio] = useState<number>(0.77); // Default to roughly 8.5x11\n\n // Use IntersectionObserver to only render thumbnails that are near the viewport\n useEffect(() => {\n const observer = new IntersectionObserver((entries) => {\n if (entries[0].isIntersecting) {\n setIsVisible(true);\n } else {\n setIsVisible(false);\n }\n }, { rootMargin: '500px' });\n \n if (containerRef.current) observer.observe(containerRef.current);\n return () => observer.disconnect();\n }, []);\n\n useEffect(() => {\n if (!isVisible) return;\n\n let renderTask: any = null;\n let isCancelled = false;\n\n const renderPage = async () => {\n try {\n const page = await pdfDoc.getPage(pageIndex);\n if (isCancelled) return;\n \n // Update aspect ratio based on actual page size\n const vp = page.getViewport({ scale: 1 });\n setAspectRatio(vp.width / vp.height);\n\n const viewport = page.getViewport({ scale });\n const canvas = canvasRef.current;\n if (!canvas) return;\n \n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n \n const outputScale = Math.min(window.devicePixelRatio || 1, 2);\n canvas.width = Math.floor(viewport.width * outputScale);\n canvas.height = Math.floor(viewport.height * outputScale);\n canvas.style.width = `${viewport.width}px`;\n canvas.style.height = `${viewport.height}px`;\n\n renderTask = page.render({\n canvasContext: ctx,\n canvas: canvas,\n transform: [outputScale, 0, 0, outputScale, 0, 0],\n viewport: viewport\n });\n await renderTask.promise;\n } catch (e: any) {\n if (e.name !== 'RenderingCancelledException') {\n console.error(\"Thumbnail render error\", e);\n }\n }\n };\n \n renderPage();\n \n return () => {\n isCancelled = true;\n if (renderTask) {\n renderTask.cancel();\n }\n };\n }, [pdfDoc, pageIndex, scale, isVisible]);\n\n // Base width is usually around 800 at scale 1. So we calculate a dummy width based on scale.\n const estimatedWidth = 800 * scale;\n const estimatedHeight = estimatedWidth / aspectRatio;\n\n return (\n <div \n ref={containerRef}\n onClick={onClick}\n style={{\n display: 'flex', flexDirection: 'column', alignItems: 'center', cursor: 'pointer',\n padding: '8px', boxSizing: 'border-box',\n minHeight: `${estimatedHeight + 30}px` // +30 for the text label\n }}\n >\n {isVisible ? (\n <div style={{\n border: isActive ? '2px solid var(--primary)' : '1px solid #ccc',\n padding: '2px', backgroundColor: '#fff',\n boxShadow: '0 2px 4px rgba(0,0,0,0.1)'\n }}>\n <canvas ref={canvasRef} style={{ display: 'block', backgroundColor: '#fff' }} />\n </div>\n ) : (\n <div style={{\n width: `${estimatedWidth}px`, height: `${estimatedHeight}px`,\n backgroundColor: '#eaeaea', border: '1px solid #ccc'\n }} />\n )}\n <span style={{ marginTop: '8px', fontSize: '12px', color: isActive ? 'var(--primary)' : '#555', fontWeight: isActive ? 'bold' : 'normal' }}>\n {pageIndex}\n </span>\n </div>\n );\n};\n\ninterface LeftSidebarProps {\n isOpen: boolean;\n pdfDoc: pdfjsLib.PDFDocumentProxy | null;\n pageNum: number;\n setPageNum: (p: number) => void;\n}\n\nexport default function LeftSidebar({ isOpen, pdfDoc, pageNum, setPageNum }: LeftSidebarProps) {\n const [activeTab, setActiveTab] = useState<'Thumbnails' | 'Outline' | 'Bookmarks'>('Thumbnails');\n const [sidebarWidth, setSidebarWidth] = useState(250);\n const [isResizing, setIsResizing] = useState(false);\n \n // Slider goes from 0 (small) to 100 (large)\n const [zoomPercent, setZoomPercent] = useState(30); \n \n // Convert 0-100 to a pdfjs scale (e.g. 0.1 to 0.4)\n const thumbScale = 0.1 + (zoomPercent / 100) * 0.3;\n\n useEffect(() => {\n const handleMouseMove = (e: MouseEvent) => {\n if (!isResizing) return;\n const newWidth = Math.min(Math.max(e.clientX, 150), 500);\n setSidebarWidth(newWidth);\n };\n const handleMouseUp = () => setIsResizing(false);\n \n if (isResizing) {\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n } else {\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n }\n return () => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n }, [isResizing]);\n\n const numPages = pdfDoc ? pdfDoc.numPages : 0;\n \n // Generate array [1, 2, ..., numPages]\n const pagesArray = Array.from({ length: numPages }, (_, i) => i + 1);\n\n return (\n <div style={{\n width: isOpen ? `${sidebarWidth}px` : '0px',\n height: '100%',\n backgroundColor: '#f9fafb',\n display: 'flex',\n flexShrink: 0,\n zIndex: 10,\n transition: isResizing ? 'none' : 'width 0.3s cubic-bezier(0.4, 0, 0.2, 1)',\n position: 'relative',\n borderRight: isOpen ? '1px solid var(--border-color)' : 'none'\n }}>\n <div style={{\n width: `${sidebarWidth}px`,\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden'\n }}>\n {/* Top Tabs */}\n <div style={{\n display: 'flex', borderBottom: '1px solid var(--border-color)', backgroundColor: '#fff', padding: '4px'\n }}>\n <button \n onClick={() => setActiveTab('Thumbnails')}\n style={{ flex: 1, padding: '8px', background: activeTab === 'Thumbnails' ? 'var(--primary)' : 'none', color: activeTab === 'Thumbnails' ? '#fff' : 'var(--text-muted)', border: 'none', borderRadius: '4px', cursor: 'pointer', display: 'flex', justifyContent: 'center' }}\n title=\"Page Thumbnails\"\n >\n <Copy size={16} />\n </button>\n <button \n onClick={() => setActiveTab('Outline')}\n style={{ flex: 1, padding: '8px', background: activeTab === 'Outline' ? 'var(--primary)' : 'none', color: activeTab === 'Outline' ? '#fff' : 'var(--text-muted)', border: 'none', borderRadius: '4px', cursor: 'pointer', display: 'flex', justifyContent: 'center' }}\n title=\"Document Outline\"\n >\n <List size={16} />\n </button>\n <button \n onClick={() => setActiveTab('Bookmarks')}\n style={{ flex: 1, padding: '8px', background: activeTab === 'Bookmarks' ? 'var(--primary)' : 'none', color: activeTab === 'Bookmarks' ? '#fff' : 'var(--text-muted)', border: 'none', borderRadius: '4px', cursor: 'pointer', display: 'flex', justifyContent: 'center' }}\n title=\"Bookmarks\"\n >\n <Bookmark size={16} />\n </button>\n <button \n style={{ flex: 1, padding: '8px', background: 'none', color: 'var(--text-muted)', border: 'none', borderRadius: '4px', cursor: 'pointer', display: 'flex', justifyContent: 'center' }}\n title=\"More Options\"\n >\n <MoreHorizontal size={16} />\n </button>\n </div>\n\n {activeTab === 'Thumbnails' && (\n <>\n {/* Zoom Slider */}\n <div style={{ display: 'flex', alignItems: 'center', padding: '12px 16px', gap: '8px', borderBottom: '1px solid var(--border-color)', backgroundColor: '#fff' }}>\n <Minus size={14} color=\"var(--text-muted)\" style={{ cursor: 'pointer' }} onClick={() => setZoomPercent(Math.max(0, zoomPercent - 10))} />\n <input \n type=\"range\" \n min=\"0\" max=\"100\" \n value={zoomPercent} \n onChange={(e) => setZoomPercent(parseInt(e.target.value))}\n style={{ flex: 1, height: '4px', accentColor: 'var(--primary)' }}\n />\n <Plus size={14} color=\"var(--text-muted)\" style={{ cursor: 'pointer' }} onClick={() => setZoomPercent(Math.min(100, zoomPercent + 10))} />\n </div>\n\n {/* Thumbnails List */}\n <div style={{ flex: 1, overflowY: 'auto', padding: '8px 0', backgroundColor: '#f1f1f1' }}>\n {pdfDoc && pagesArray.map(p => (\n <Thumbnail \n key={p} \n pdfDoc={pdfDoc} \n pageIndex={p} \n isActive={p === pageNum} \n onClick={() => setPageNum(p)}\n scale={thumbScale}\n />\n ))}\n {!pdfDoc && (\n <div style={{ padding: '20px', textAlign: 'center', color: '#888', fontSize: '13px' }}>\n No document loaded\n </div>\n )}\n </div>\n\n {/* Multi-Select Footer */}\n <div style={{ borderTop: '1px solid var(--border-color)', padding: '16px', backgroundColor: '#fff' }}>\n <div style={{ fontSize: '12px', color: 'var(--text-color)', marginBottom: '8px' }}>\n Multi-Select Pages - e.g. 1, 3, 5-10\n </div>\n <div style={{ display: 'flex', gap: '8px' }}>\n <input \n type=\"text\"\n placeholder=\"e.g. 1, 3, 5-10\"\n style={{ flex: 1, padding: '6px 8px', fontSize: '13px', border: '1px solid #ccc', borderRadius: '4px', outline: 'none' }}\n />\n <button style={{ padding: '6px 8px', background: '#fff', border: '1px solid #ccc', borderRadius: '4px', cursor: 'pointer', display: 'flex', alignItems: 'center' }}>\n <CheckSquare size={16} color=\"var(--text-color)\" />\n </button>\n </div>\n </div>\n </>\n )}\n \n {activeTab !== 'Thumbnails' && (\n <div style={{ padding: '20px', textAlign: 'center', color: '#888', fontSize: '13px' }}>\n No content available for {activeTab}.\n </div>\n )}\n </div>\n\n {/* Resize Handle */}\n <div \n onMouseDown={() => setIsResizing(true)}\n style={{\n width: '6px',\n height: '100%',\n position: 'absolute',\n right: '-3px',\n cursor: 'col-resize',\n zIndex: 20\n }}\n />\n </div>\n );\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\n\n/**\n * Converts screen/canvas coordinates in rotated page space to canonical unrotated page space.\n */\nexport function convertToUnrotated(rawX: number, rawY: number, rotation: number, unW: number, unH: number) {\n const normRot = ((rotation % 360) + 360) % 360;\n if (normRot === 90) {\n return { x: rawY, y: unH - rawX };\n }\n if (normRot === 180) {\n return { x: unW - rawX, y: unH - rawY };\n }\n if (normRot === 270) {\n return { x: unW - rawY, y: rawX };\n }\n return { x: rawX, y: rawY };\n}\n\n/**\n * Converts canonical unrotated page coordinates to rotated page space.\n */\nexport function convertToRotated(unX: number, unY: number, rotation: number, unW: number, unH: number) {\n const normRot = ((rotation % 360) + 360) % 360;\n if (normRot === 90) {\n return { x: unH - unY, y: unX };\n }\n if (normRot === 180) {\n return { x: unW - unX, y: unH - unY };\n }\n if (normRot === 270) {\n return { x: unY, y: unW - unX };\n }\n return { x: unX, y: unY };\n}\n\n/**\n * Converts a rectangle from unrotated page space to rotated page space.\n */\nexport function convertToRotatedRect(x: number, y: number, width: number, height: number, rotation: number, unW: number, unH: number) {\n const normRot = ((rotation % 360) + 360) % 360;\n if (normRot === 90) {\n return { x: unH - (y + height), y: x, width: height, height: width };\n }\n if (normRot === 180) {\n return { x: unW - (x + width), y: unH - (y + height), width, height };\n }\n if (normRot === 270) {\n return { x: y, y: unW - (x + width), width: height, height: width };\n }\n return { x, y, width, height };\n}\n\n/**\n * Returns SVG transform string for SVG groups to match page rotation.\n */\nexport function getRotationTransform(rotation: number, unW: number, unH: number): string | undefined {\n const normRot = ((rotation % 360) + 360) % 360;\n if (normRot === 90) return `translate(${unH}, 0) rotate(90)`;\n if (normRot === 180) return `translate(${unW}, ${unH}) rotate(180)`;\n if (normRot === 270) return `translate(0, ${unW}) rotate(270)`;\n return undefined;\n}\n\n/** Normalizes any degree value into [0, 360). */\nexport function normalizeRotation(rotation: number): number {\n return ((rotation % 360) + 360) % 360;\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * FormManager — central state manager for PDF forms builder schema and form filler data.\n */\n\nimport type {\n FormField,\n FormDataRecord,\n FormValidationResult,\n FormRole,\n FormFeatureOptions,\n} from './types';\nimport type { ViewerUser } from '../core/types';\n\nexport const DEFAULT_FORM_OPTIONS: FormFeatureOptions = {\n canCreateForms: true,\n canFillForms: true,\n allowRoleSwitching: true,\n showRoleSelector: true,\n showSignatureFlags: true,\n showFlowNavigation: true,\n showValidation: true,\n showReset: true,\n showExport: true,\n otherRoleFieldsMode: 'locked',\n hideToolbar: false,\n};\n\nexport const DEFAULT_ROLES: FormRole[] = [\n { id: 'user_a', name: 'User A', color: '#2563eb' },\n { id: 'user_b', name: 'User B', color: '#9333ea' },\n { id: 'user_c', name: 'User C', color: '#059669' },\n];\n\nexport interface FormFieldsChangeEvent {\n fields: FormField[];\n action: 'add' | 'update' | 'delete' | 'set' | 'clear';\n}\n\nexport type FormFieldsChangeListener = (event: FormFieldsChangeEvent) => void;\nexport type FormDataChangeListener = (data: FormDataRecord) => void;\n\ninterface HistorySnapshot {\n fields: FormField[];\n}\n\nconst MAX_HISTORY = 100;\n\nexport class FormManager {\n private fields: FormField[] = [];\n private values: FormDataRecord = {};\n private roles: FormRole[] = [...DEFAULT_ROLES];\n private currentRoleId: string | null = null;\n private currentUser: ViewerUser | null = null;\n private activeFieldId: string | null = null;\n private options: FormFeatureOptions = { ...DEFAULT_FORM_OPTIONS };\n private past: HistorySnapshot[] = [];\n private future: HistorySnapshot[] = [];\n private fieldsListeners = new Set<FormFieldsChangeListener>();\n private dataListeners = new Set<FormDataChangeListener>();\n private rolesListeners = new Set<(roles: FormRole[]) => void>();\n private activeRoleListeners = new Set<(roleId: string | null) => void>();\n private activeFieldListeners = new Set<(fieldId: string | null) => void>();\n private optionsListeners = new Set<(options: FormFeatureOptions) => void>();\n private userListeners = new Set<(user: ViewerUser | null) => void>();\n private readOnly = false;\n\n constructor(\n initialFields: FormField[] = [],\n initialValues: FormDataRecord = {},\n initialRoles: FormRole[] = DEFAULT_ROLES,\n initialOptions: Partial<FormFeatureOptions> = {},\n initialUser: ViewerUser | null = null\n ) {\n this.fields = [...initialFields];\n this.values = { ...initialValues };\n this.roles = initialRoles && initialRoles.length > 0 ? [...initialRoles] : [...DEFAULT_ROLES];\n this.options = { ...DEFAULT_FORM_OPTIONS, ...initialOptions };\n if (initialUser) {\n this.setCurrentUser(initialUser);\n }\n if (this.options.currentRole) {\n this.setCurrentRole(this.options.currentRole);\n }\n }\n\n // ---- Subscriptions -----------------------------------------------------------------------\n\n onFieldsChange(listener: FormFieldsChangeListener): () => void {\n this.fieldsListeners.add(listener);\n return () => this.fieldsListeners.delete(listener);\n }\n\n onDataChange(listener: FormDataChangeListener): () => void {\n this.dataListeners.add(listener);\n return () => this.dataListeners.delete(listener);\n }\n\n private notifyFieldsChange(action: FormFieldsChangeEvent['action']): void {\n const event: FormFieldsChangeEvent = {\n fields: this.getFields(),\n action,\n };\n for (const listener of this.fieldsListeners) {\n try {\n listener(event);\n } catch (err) {\n console.error('Error in FormManager fields listener:', err);\n }\n }\n }\n\n private notifyDataChange(): void {\n const data = this.getValues();\n for (const listener of this.dataListeners) {\n try {\n listener(data);\n } catch (err) {\n console.error('Error in FormManager data listener:', err);\n }\n }\n }\n\n // ---- Undo / Redo for Builder -------------------------------------------------------------\n\n private pushHistory(): void {\n this.past.push({ fields: JSON.parse(JSON.stringify(this.fields)) });\n if (this.past.length > MAX_HISTORY) {\n this.past.shift();\n }\n this.future = [];\n }\n\n get canUndo(): boolean {\n return this.past.length > 0;\n }\n\n get canRedo(): boolean {\n return this.future.length > 0;\n }\n\n undo(): boolean {\n if (!this.canUndo) return false;\n const prev = this.past.pop()!;\n this.future.push({ fields: JSON.parse(JSON.stringify(this.fields)) });\n this.fields = prev.fields;\n this.notifyFieldsChange('set');\n return true;\n }\n\n redo(): boolean {\n if (!this.canRedo) return false;\n const next = this.future.pop()!;\n this.past.push({ fields: JSON.parse(JSON.stringify(this.fields)) });\n this.fields = next.fields;\n this.notifyFieldsChange('set');\n return true;\n }\n\n // ---- Field Schema Management ------------------------------------------------------------\n\n getFields(): FormField[] {\n return [...this.fields];\n }\n\n getFieldsForPage(pageIndex: number): FormField[] {\n return this.fields.filter((f) => f.pageIndex === pageIndex);\n }\n\n getField(id: string): FormField | undefined {\n return this.fields.find((f) => f.id === id);\n }\n\n getFieldByName(name: string): FormField | undefined {\n return this.fields.find((f) => f.name === name);\n }\n\n setFields(fields: FormField[]): void {\n this.pushHistory();\n this.fields = [...fields];\n // Sync default values\n for (const field of this.fields) {\n if (this.values[field.name] === undefined && field.defaultValue !== undefined) {\n this.values[field.name] = field.defaultValue;\n }\n }\n this.notifyFieldsChange('set');\n this.notifyDataChange();\n }\n\n addField(field: FormField): void {\n this.pushHistory();\n // Ensure unique ID\n const exists = this.fields.some((f) => f.id === field.id);\n const newField: FormField = exists\n ? { ...field, id: `field_${Date.now()}_${Math.random().toString(36).slice(2, 7)}` }\n : { ...field };\n\n if (!newField.flowOrder) {\n const pageFields = this.getFieldsForPage(newField.pageIndex);\n newField.flowOrder = pageFields.length + 1;\n }\n\n this.fields.push(newField);\n if (newField.defaultValue !== undefined && this.values[newField.name] === undefined) {\n this.values[newField.name] = newField.defaultValue;\n this.notifyDataChange();\n }\n this.notifyFieldsChange('add');\n }\n\n updateField(id: string, updates: Partial<Omit<FormField, 'id'>>, recordHistory = true): boolean {\n const idx = this.fields.findIndex((f) => f.id === id);\n if (idx === -1) return false;\n\n if (recordHistory) {\n this.pushHistory();\n }\n const oldField = this.fields[idx];\n const updatedField = { ...oldField, ...updates };\n\n // If name changed, migrate value\n if (updates.name && updates.name !== oldField.name) {\n if (this.values[oldField.name] !== undefined) {\n this.values[updates.name] = this.values[oldField.name];\n delete this.values[oldField.name];\n this.notifyDataChange();\n }\n }\n\n this.fields[idx] = updatedField;\n this.notifyFieldsChange('update');\n return true;\n }\n\n deleteField(id: string): boolean {\n const idx = this.fields.findIndex((f) => f.id === id);\n if (idx === -1) return false;\n\n this.pushHistory();\n const [removed] = this.fields.splice(idx, 1);\n if (removed && this.values[removed.name] !== undefined) {\n delete this.values[removed.name];\n this.notifyDataChange();\n }\n if (this.activeFieldId === id) {\n this.setActiveFieldId(null);\n }\n this.notifyFieldsChange('delete');\n return true;\n }\n\n clearFields(): void {\n this.pushHistory();\n this.fields = [];\n this.values = {};\n this.setActiveFieldId(null);\n this.notifyFieldsChange('clear');\n this.notifyDataChange();\n }\n\n // ---- Form Values / Data Management ------------------------------------------------------\n\n getValues(): FormDataRecord {\n return { ...this.values };\n }\n\n getValue(name: string): any {\n return this.values[name];\n }\n\n setValue(name: string, value: any): void {\n this.values = {\n ...this.values,\n [name]: value,\n };\n this.notifyDataChange();\n }\n\n setValues(newValues: FormDataRecord): void {\n this.values = { ...newValues };\n this.notifyDataChange();\n }\n\n clearValues(): void {\n const defaults: FormDataRecord = {};\n for (const field of this.fields) {\n if (field.defaultValue !== undefined) {\n defaults[field.name] = field.defaultValue;\n }\n }\n this.values = defaults;\n this.notifyDataChange();\n }\n\n setReadOnly(readOnly: boolean): void {\n this.readOnly = readOnly;\n }\n\n isReadOnly(): boolean {\n return this.readOnly;\n }\n\n // ---- Roles (Document Template Role Slots) ------------------------------------------------\n\n getRoles(): FormRole[] {\n return [...this.roles];\n }\n\n setRoles(roles: FormRole[]): void {\n this.roles = [...roles];\n for (const l of this.rolesListeners) l(this.getRoles());\n }\n\n addRole(role: FormRole): void {\n if (this.roles.some((r) => r.id === role.id)) return;\n this.roles.push(role);\n for (const l of this.rolesListeners) l(this.getRoles());\n }\n\n updateRole(id: string, updates: Partial<Omit<FormRole, 'id'>>): void {\n const idx = this.roles.findIndex((r) => r.id === id);\n if (idx === -1) return;\n this.roles[idx] = { ...this.roles[idx], ...updates };\n for (const l of this.rolesListeners) l(this.getRoles());\n }\n\n removeRole(id: string): void {\n this.roles = this.roles.filter((r) => r.id !== id);\n let fieldsChanged = false;\n this.fields = this.fields.map((f) => {\n if (f.roleId === id) {\n fieldsChanged = true;\n return { ...f, roleId: undefined };\n }\n return f;\n });\n\n if (this.currentRoleId === id) {\n this.currentRoleId = null;\n for (const l of this.activeRoleListeners) l(null);\n }\n\n for (const l of this.rolesListeners) l(this.getRoles());\n if (fieldsChanged) {\n for (const l of this.fieldsListeners) {\n l({\n fields: this.getFields(),\n action: 'update',\n });\n }\n }\n }\n\n getRole(id?: string): FormRole | undefined {\n if (!id) return undefined;\n return this.roles.find((r) => r.id === id);\n }\n\n onRolesChange(listener: (roles: FormRole[]) => void): () => void {\n this.rolesListeners.add(listener);\n return () => this.rolesListeners.delete(listener);\n }\n\n getCurrentRole(): string | null {\n return this.currentRoleId;\n }\n\n setCurrentRole(roleId: string | null): void {\n this.currentRoleId = roleId;\n for (const l of this.activeRoleListeners) l(roleId);\n }\n\n onCurrentRoleChange(listener: (roleId: string | null) => void): () => void {\n this.activeRoleListeners.add(listener);\n return () => this.activeRoleListeners.delete(listener);\n }\n\n // ---- Current User (Host Application User Details) ----------------------------------------\n\n /** Returns the current logged-in user details passed by the host application. */\n getCurrentUser(): ViewerUser | null {\n return this.currentUser ? { ...this.currentUser } : null;\n }\n\n /**\n * Sets the current logged-in user details passed by the host application.\n * If the user object specifies a `role`, automatically sets that role as the active role.\n */\n setCurrentUser(user: ViewerUser | null): void {\n this.currentUser = user ? { ...user } : null;\n if (user?.role) {\n this.setCurrentRole(user.role);\n }\n for (const listener of this.userListeners) {\n try {\n listener(this.getCurrentUser());\n } catch (err) {\n console.error('Error in FormManager currentUser listener:', err);\n }\n }\n }\n\n /** Subscribes to changes in the current logged-in user details. */\n onCurrentUserChange(listener: (user: ViewerUser | null) => void): () => void {\n this.userListeners.add(listener);\n return () => this.userListeners.delete(listener);\n }\n\n /**\n * Returns the effective signer name:\n * Prioritizes the actual user's real name (from host application),\n * falling back to the active role name or an empty string.\n */\n getEffectiveSignerName(): string {\n if (this.currentUser?.name) {\n return this.currentUser.name;\n }\n const role = this.getRole(this.currentRoleId || undefined);\n return role?.name || '';\n }\n\n // ---- Form Feature Visibility & Permissions ----------------------------------------------\n\n /** Returns the current form feature configuration options. */\n getOptions(): FormFeatureOptions {\n return { ...this.options };\n }\n\n /**\n * Updates form feature options and notifies active listeners.\n */\n setOptions(opts: Partial<FormFeatureOptions>): void {\n this.options = { ...this.options, ...opts };\n for (const listener of this.optionsListeners) {\n try {\n listener(this.getOptions());\n } catch (err) {\n console.error('Error in FormManager options listener:', err);\n }\n }\n }\n\n /** Subscribes to changes in form feature options. */\n onOptionsChange(listener: (options: FormFeatureOptions) => void): () => void {\n this.optionsListeners.add(listener);\n return () => this.optionsListeners.delete(listener);\n }\n\n // ---- Active Field & Form Flow -----------------------------------------------------------\n\n getActiveFieldId(): string | null {\n return this.activeFieldId;\n }\n\n setActiveFieldId(fieldId: string | null): void {\n this.activeFieldId = fieldId;\n for (const l of this.activeFieldListeners) l(fieldId);\n }\n\n onActiveFieldChange(listener: (fieldId: string | null) => void): () => void {\n this.activeFieldListeners.add(listener);\n return () => this.activeFieldListeners.delete(listener);\n }\n\n /**\n * Returns form fields sorted according to flow order.\n * If roleId is provided, filters to fields assigned to that role.\n */\n getFlowFields(roleId?: string | null): FormField[] {\n const targetRole = roleId !== undefined ? roleId : this.currentRoleId;\n let list = [...this.fields];\n\n if (targetRole) {\n list = list.filter((f) => f.roleId === targetRole);\n }\n\n return list.sort((a, b) => {\n if (a.flowOrder !== undefined && b.flowOrder !== undefined) {\n return a.flowOrder - b.flowOrder;\n }\n if (a.flowOrder !== undefined) return -1;\n if (b.flowOrder !== undefined) return 1;\n if (a.pageIndex !== b.pageIndex) return a.pageIndex - b.pageIndex;\n if (Math.abs(a.y - b.y) > 10) return a.y - b.y;\n return a.x - b.x;\n });\n }\n\n getNextField(currentFieldId?: string | null, roleId?: string | null): FormField | null {\n const flow = this.getFlowFields(roleId);\n if (flow.length === 0) return null;\n const curId = currentFieldId ?? this.activeFieldId;\n if (!curId) return flow[0];\n const idx = flow.findIndex((f) => f.id === curId);\n if (idx === -1) return flow[0];\n if (idx + 1 < flow.length) return flow[idx + 1];\n return flow[0]; // loop around\n }\n\n getPreviousField(currentFieldId?: string | null, roleId?: string | null): FormField | null {\n const flow = this.getFlowFields(roleId);\n if (flow.length === 0) return null;\n const curId = currentFieldId ?? this.activeFieldId;\n if (!curId) return flow[flow.length - 1];\n const idx = flow.findIndex((f) => f.id === curId);\n if (idx === -1) return flow[flow.length - 1];\n if (idx - 1 >= 0) return flow[idx - 1];\n return flow[flow.length - 1]; // loop around\n }\n\n goToNextField(roleId?: string | null): FormField | null {\n const next = this.getNextField(this.activeFieldId, roleId);\n if (next) {\n this.setActiveFieldId(next.id);\n }\n return next;\n }\n\n goToPreviousField(roleId?: string | null): FormField | null {\n const prev = this.getPreviousField(this.activeFieldId, roleId);\n if (prev) {\n this.setActiveFieldId(prev.id);\n }\n return prev;\n }\n\n // ---- Validation --------------------------------------------------------------------------\n\n validate(roleId?: string | null): FormValidationResult {\n const targetRole = roleId !== undefined ? roleId : this.currentRoleId;\n const errors: Record<string, string> = {};\n\n for (const field of this.fields) {\n if (!field.required) continue;\n if (targetRole && field.roleId && field.roleId !== targetRole) continue;\n\n const val = this.values[field.name];\n const displayName = field.label || field.name;\n\n if (val === undefined || val === null || val === '') {\n errors[field.name] = `${displayName} is required`;\n } else if (field.type === 'checklist' && Array.isArray(val) && val.length === 0) {\n errors[field.name] = `${displayName} requires at least one selection`;\n } else if ((field.type === 'signature' || field.type === 'digital_signature') && typeof val === 'object') {\n const hasSig = Boolean(val.dataUrl || val.signerName || val.imageUrl);\n if (!hasSig) {\n errors[field.name] = `${displayName} signature is required`;\n }\n }\n }\n\n return {\n valid: Object.keys(errors).length === 0,\n errors,\n };\n }\n\n // ---- Serialization & Import/Export -------------------------------------------------------\n\n exportFieldsJson(): string {\n return JSON.stringify(\n {\n version: '1.9.0',\n fields: this.fields,\n roles: this.roles,\n },\n null,\n 2\n );\n }\n\n importFieldsJson(json: string): boolean {\n try {\n const parsed = JSON.parse(json);\n if (Array.isArray(parsed)) {\n this.setFields(parsed);\n return true;\n }\n if (typeof parsed === 'object' && parsed !== null && Array.isArray(parsed.fields)) {\n this.setFields(parsed.fields);\n const rolesList = Array.isArray(parsed.roles) ? parsed.roles : null;\n if (rolesList && rolesList.length > 0) {\n this.setRoles(rolesList);\n }\n return true;\n }\n return false;\n } catch {\n return false;\n }\n }\n\n exportDataJson(): string {\n return JSON.stringify(this.values, null, 2);\n }\n\n importDataJson(json: string): boolean {\n try {\n const parsed = JSON.parse(json);\n if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {\n this.setValues(parsed);\n return true;\n }\n return false;\n } catch {\n return false;\n }\n }\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * FormFieldEditorModal — configuration dialog for form field properties, styling, assignments, and flow.\n */\n\nimport React, { useState } from 'react';\nimport { X, Plus, Trash2, ArrowUp, ArrowDown, User, Palette, Sliders, Type, AlignLeft, AlignCenter, AlignRight, Bold, Italic, PenTool, ShieldCheck } from 'lucide-react';\nimport type { FormField, DateTimeFormat, FormRole, SignatureType } from '../forms/types';\nimport { DEFAULT_ROLES } from '../forms/FormManager';\n\ninterface FormFieldEditorModalProps {\n field: FormField;\n roles?: FormRole[];\n onAddRole?: (role: FormRole) => void;\n onSave: (updated: Partial<FormField>) => void;\n onClose: () => void;\n}\n\nconst PRESET_COLORS = [\n '#0f172a', // Slate 900\n '#2563eb', // Blue\n '#7c3aed', // Purple\n '#059669', // Emerald\n '#dc2626', // Red\n '#d97706', // Amber\n '#475569', // Slate 600\n '#ffffff', // White\n];\n\nconst PRESET_BG_COLORS = [\n '#ffffff',\n '#f8fafc',\n '#eff6ff',\n '#faf5ff',\n '#f0fdf4',\n '#fffbeb',\n '#fef2f2',\n 'transparent',\n];\n\nexport const FormFieldEditorModal: React.FC<FormFieldEditorModalProps> = ({\n field,\n roles = DEFAULT_ROLES,\n onAddRole,\n onSave,\n onClose,\n}) => {\n const [activeTab, setActiveTab] = useState<'general' | 'style'>('general');\n const [localRoles, setLocalRoles] = useState<FormRole[]>(roles);\n const [isAddingRole, setIsAddingRole] = useState(false);\n const [newRoleName, setNewRoleName] = useState('');\n const [newRoleColor, setNewRoleColor] = useState('#2563eb');\n\n React.useEffect(() => {\n setLocalRoles(roles);\n }, [roles]);\n\n // General state\n const [name, setName] = useState(field.name || '');\n const [label, setLabel] = useState(field.label || '');\n const [placeholder, setPlaceholder] = useState(field.placeholder || '');\n const [required, setRequired] = useState(field.required || false);\n const [defaultValue, setDefaultValue] = useState(field.defaultValue !== undefined ? String(field.defaultValue) : '');\n const [dateFormat, setDateFormat] = useState<DateTimeFormat>(field.dateFormat || 'datetime');\n const [options, setOptions] = useState<string[]>(field.options ? [...field.options] : ['Option 1', 'Option 2']);\n const [newOptionText, setNewOptionText] = useState('');\n\n // Multi-user & Flow state\n const [roleId, setRoleId] = useState(field.roleId || '');\n const [flowOrder, setFlowOrder] = useState<string>(field.flowOrder !== undefined ? String(field.flowOrder) : '');\n\n // Signature state\n const isSignatureField = field.type === 'signature' || field.type === 'digital_signature';\n const [signatureType, setSignatureType] = useState<SignatureType>(\n field.signatureType || (field.type === 'digital_signature' ? 'digital' : 'electronic')\n );\n const [signTagText, setSignTagText] = useState(\n field.signTagText || (field.type === 'digital_signature' ? 'DIGITAL SIGN' : 'SIGN HERE')\n );\n\n // Styling state\n const [textColor, setTextColor] = useState(field.textColor || '#0f172a');\n const [backgroundColor, setBackgroundColor] = useState(field.backgroundColor || '#ffffff');\n const [borderColor, setBorderColor] = useState(field.borderColor || '#94a3b8');\n const [borderWidth, setBorderWidth] = useState<number>(field.borderWidth || 1);\n const [borderRadius, setBorderRadius] = useState<number>(field.borderRadius || 3);\n const [fontFamily, setFontFamily] = useState(field.fontFamily || 'inherit');\n const [fontSize, setFontSize] = useState<number>(field.fontSize || 13);\n const [fontWeight, setFontWeight] = useState<'normal' | 'bold'>(field.fontWeight || 'normal');\n const [fontStyle, setFontStyle] = useState<'normal' | 'italic'>(field.fontStyle || 'normal');\n const [textAlign, setTextAlign] = useState<'left' | 'center' | 'right'>(field.textAlign || 'left');\n\n const hasOptions = ['checklist', 'dropdown', 'radio'].includes(field.type);\n\n const handleAddOption = () => {\n const trimmed = newOptionText.trim();\n if (!trimmed) return;\n setOptions([...options, trimmed]);\n setNewOptionText('');\n };\n\n const handleRemoveOption = (index: number) => {\n setOptions(options.filter((_, idx) => idx !== index));\n };\n\n const handleMoveOption = (index: number, direction: 'up' | 'down') => {\n const targetIdx = direction === 'up' ? index - 1 : index + 1;\n if (targetIdx < 0 || targetIdx >= options.length) return;\n const copy = [...options];\n const item = copy[index];\n copy[index] = copy[targetIdx];\n copy[targetIdx] = item;\n setOptions(copy);\n };\n\n const handleQuickAddRole = () => {\n const trimmed = newRoleName.trim();\n if (!trimmed) return;\n const id = `role_${Date.now()}_${Math.random().toString(36).slice(2, 6)}`;\n const newRole: FormRole = {\n id,\n name: trimmed,\n color: newRoleColor,\n };\n onAddRole?.(newRole);\n setLocalRoles((prev) => [...prev, newRole]);\n setRoleId(id);\n setBorderColor(newRoleColor);\n setNewRoleName('');\n setIsAddingRole(false);\n };\n\n const handleSave = () => {\n const sanitizedName = (name.trim() || field.name).replace(/\\s+/g, '_');\n const parsedFlowOrder = flowOrder.trim() !== '' ? parseInt(flowOrder.trim(), 10) : undefined;\n\n onSave({\n name: sanitizedName,\n label: label.trim() || undefined,\n placeholder: placeholder.trim() || undefined,\n required,\n defaultValue: defaultValue !== '' ? defaultValue : undefined,\n dateFormat: field.type === 'datetime' ? dateFormat : undefined,\n options: hasOptions ? options : undefined,\n roleId: roleId || undefined,\n flowOrder: Number.isFinite(parsedFlowOrder) ? parsedFlowOrder : undefined,\n type: isSignatureField ? (signatureType === 'digital' ? 'digital_signature' : 'signature') : field.type,\n signatureType: isSignatureField ? signatureType : undefined,\n signTagText: isSignatureField ? (signTagText.trim() || undefined) : undefined,\n textColor,\n backgroundColor,\n borderColor,\n borderWidth,\n borderRadius,\n fontFamily: fontFamily !== 'inherit' ? fontFamily : undefined,\n fontSize,\n fontWeight,\n fontStyle,\n textAlign,\n });\n onClose();\n };\n\n return (\n <div\n style={{\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: 'rgba(0, 0, 0, 0.45)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 9999,\n pointerEvents: 'auto',\n }}\n onClick={onClose}\n >\n <div\n style={{\n backgroundColor: '#ffffff',\n borderRadius: '8px',\n width: '500px',\n maxWidth: '92vw',\n maxHeight: '88vh',\n display: 'flex',\n flexDirection: 'column',\n boxShadow: '0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)',\n overflow: 'hidden',\n fontFamily: 'system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n }}\n onClick={(e) => e.stopPropagation()}\n >\n {/* Header */}\n <div\n style={{\n padding: '14px 20px',\n borderBottom: '1px solid #e5e7eb',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n backgroundColor: '#f9fafb',\n }}\n >\n <div>\n <h3 style={{ margin: 0, fontSize: '16px', fontWeight: 600, color: '#111827' }}>\n Field Properties\n </h3>\n <span style={{ fontSize: '12px', color: '#6b7280', textTransform: 'capitalize' }}>\n Type: {field.type === 'checklist' ? 'Check List' : field.type === 'datetime' ? 'Date & Time' : field.type}\n </span>\n </div>\n <button\n onClick={onClose}\n style={{\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n color: '#6b7280',\n padding: '4px',\n borderRadius: '4px',\n }}\n >\n <X size={18} />\n </button>\n </div>\n\n {/* Modal Tabs */}\n <div\n style={{\n display: 'flex',\n borderBottom: '1px solid #e5e7eb',\n backgroundColor: '#f8fafc',\n padding: '0 16px',\n gap: '8px',\n }}\n >\n <button\n type=\"button\"\n onClick={() => setActiveTab('general')}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n padding: '10px 14px',\n fontSize: '13px',\n fontWeight: 500,\n border: 'none',\n borderBottom: activeTab === 'general' ? '2px solid #0284c7' : '2px solid transparent',\n backgroundColor: 'transparent',\n color: activeTab === 'general' ? '#0284c7' : '#64748b',\n cursor: 'pointer',\n }}\n >\n <Sliders size={14} /> General & Assignment\n </button>\n <button\n type=\"button\"\n onClick={() => setActiveTab('style')}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n padding: '10px 14px',\n fontSize: '13px',\n fontWeight: 500,\n border: 'none',\n borderBottom: activeTab === 'style' ? '2px solid #0284c7' : '2px solid transparent',\n backgroundColor: 'transparent',\n color: activeTab === 'style' ? '#0284c7' : '#64748b',\n cursor: 'pointer',\n }}\n >\n <Palette size={14} /> Style & Appearance\n </button>\n </div>\n\n {/* Content Body */}\n <div style={{ padding: '18px 20px', overflowY: 'auto', display: 'flex', flexDirection: 'column', gap: '16px', flex: 1 }}>\n {activeTab === 'general' ? (\n <>\n {/* Field Key Name */}\n <div>\n <label style={{ display: 'block', fontSize: '13px', fontWeight: 500, color: '#374151', marginBottom: '4px' }}>\n Field Key Name <span style={{ color: '#ef4444' }}>*</span>\n </label>\n <input\n type=\"text\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"e.g. applicant_name\"\n style={{\n width: '100%',\n padding: '8px 12px',\n borderRadius: '6px',\n border: '1px solid #d1d5db',\n fontSize: '13px',\n boxSizing: 'border-box',\n }}\n />\n <span style={{ fontSize: '11px', color: '#9ca3af' }}>Unique key identifier used when extracting form values</span>\n </div>\n\n {/* Display Label */}\n <div>\n <label style={{ display: 'block', fontSize: '13px', fontWeight: 500, color: '#374151', marginBottom: '4px' }}>\n Display Label\n </label>\n <input\n type=\"text\"\n value={label}\n onChange={(e) => setLabel(e.target.value)}\n placeholder=\"e.g. Full Legal Name\"\n style={{\n width: '100%',\n padding: '8px 12px',\n borderRadius: '6px',\n border: '1px solid #d1d5db',\n fontSize: '13px',\n boxSizing: 'border-box',\n }}\n />\n </div>\n\n {/* Signature Field Settings & 'Sign Here' Tag */}\n {isSignatureField && (\n <div\n style={{\n backgroundColor: '#f0f9ff',\n border: '1px solid #bae6fd',\n borderRadius: '8px',\n padding: '12px 14px',\n display: 'flex',\n flexDirection: 'column',\n gap: '12px',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px' }}>\n <PenTool size={15} color=\"#0284c7\" />\n <span style={{ fontSize: '13px', fontWeight: 600, color: '#0369a1' }}>\n Signature & \"Sign Here\" Tag Configuration\n </span>\n </div>\n\n {/* Signature Type Switch */}\n <div>\n <label style={{ display: 'block', fontSize: '12px', fontWeight: 500, color: '#334155', marginBottom: '4px' }}>\n Signature Mode\n </label>\n <div style={{ display: 'flex', gap: '8px' }}>\n <button\n type=\"button\"\n onClick={() => {\n setSignatureType('electronic');\n if (signTagText === 'DIGITAL SIGN') setSignTagText('SIGN HERE');\n }}\n style={{\n flex: 1,\n padding: '6px 10px',\n borderRadius: '5px',\n border: '1px solid',\n borderColor: signatureType === 'electronic' ? '#0284c7' : '#cbd5e1',\n backgroundColor: signatureType === 'electronic' ? '#ffffff' : '#f8fafc',\n color: signatureType === 'electronic' ? '#0284c7' : '#64748b',\n fontWeight: signatureType === 'electronic' ? 600 : 400,\n fontSize: '12px',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '5px',\n }}\n >\n <PenTool size={13} /> Electronic Signature\n </button>\n <button\n type=\"button\"\n onClick={() => {\n setSignatureType('digital');\n if (signTagText === 'SIGN HERE') setSignTagText('DIGITAL SIGN');\n }}\n style={{\n flex: 1,\n padding: '6px 10px',\n borderRadius: '5px',\n border: '1px solid',\n borderColor: signatureType === 'digital' ? '#0284c7' : '#cbd5e1',\n backgroundColor: signatureType === 'digital' ? '#ffffff' : '#f8fafc',\n color: signatureType === 'digital' ? '#0284c7' : '#64748b',\n fontWeight: signatureType === 'digital' ? 600 : 400,\n fontSize: '12px',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '5px',\n }}\n >\n <ShieldCheck size={13} /> Digital Certificate\n </button>\n </div>\n </div>\n\n {/* \"Sign Here\" Tag Text */}\n <div>\n <label style={{ display: 'block', fontSize: '12px', fontWeight: 500, color: '#334155', marginBottom: '4px' }}>\n \"Sign Here\" Flag Tag Text\n </label>\n <input\n type=\"text\"\n value={signTagText}\n onChange={(e) => setSignTagText(e.target.value)}\n placeholder=\"e.g. SIGN HERE, INITIALS, WITNESS...\"\n style={{\n width: '100%',\n padding: '6px 10px',\n borderRadius: '5px',\n border: '1px solid #cbd5e1',\n fontSize: '12.5px',\n boxSizing: 'border-box',\n backgroundColor: '#ffffff',\n }}\n />\n <span style={{ fontSize: '11px', color: '#64748b', marginTop: '3px', display: 'block' }}>\n Prominent visual arrow flag displayed on the signature box to guide respondents where to sign.\n </span>\n </div>\n </div>\n )}\n\n {/* Role Selection */}\n <div>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', marginBottom: '4px' }}>\n <label style={{ display: 'flex', alignItems: 'center', gap: '6px', fontSize: '13px', fontWeight: 500, color: '#374151', margin: 0 }}>\n <User size={14} color=\"#0284c7\" /> Assign To Role\n </label>\n <button\n type=\"button\"\n onClick={() => setIsAddingRole(!isAddingRole)}\n style={{\n background: 'none',\n border: 'none',\n color: '#0284c7',\n fontSize: '12px',\n cursor: 'pointer',\n fontWeight: 500,\n padding: 0,\n }}\n >\n {isAddingRole ? 'Cancel' : '+ New Role'}\n </button>\n </div>\n\n {isAddingRole && (\n <div\n style={{\n backgroundColor: '#f8fafc',\n border: '1px solid #e2e8f0',\n borderRadius: '6px',\n padding: '8px 10px',\n marginBottom: '8px',\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n }}\n >\n <input\n type=\"color\"\n value={newRoleColor}\n onChange={(e) => setNewRoleColor(e.target.value)}\n style={{\n width: '24px',\n height: '24px',\n padding: 0,\n border: 'none',\n borderRadius: '4px',\n cursor: 'pointer',\n }}\n title=\"Choose role color\"\n />\n <input\n type=\"text\"\n value={newRoleName}\n onChange={(e) => setNewRoleName(e.target.value)}\n placeholder=\"e.g. Tenant, Inspector...\"\n style={{\n flex: 1,\n padding: '4px 8px',\n borderRadius: '4px',\n border: '1px solid #cbd5e1',\n fontSize: '12px',\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleQuickAddRole();\n }\n }}\n />\n <button\n type=\"button\"\n onClick={handleQuickAddRole}\n style={{\n padding: '4px 10px',\n backgroundColor: '#0284c7',\n color: '#ffffff',\n border: 'none',\n borderRadius: '4px',\n fontSize: '12px',\n fontWeight: 500,\n cursor: 'pointer',\n whiteSpace: 'nowrap',\n }}\n >\n Add Role\n </button>\n </div>\n )}\n\n <select\n value={roleId}\n onChange={(e) => {\n const val = e.target.value;\n setRoleId(val);\n const selected = localRoles.find((r) => r.id === val);\n if (selected) {\n setBorderColor(selected.color);\n } else {\n setBorderColor('#94a3b8');\n }\n }}\n style={{\n width: '100%',\n padding: '8px 12px',\n borderRadius: '6px',\n border: '1px solid #d1d5db',\n fontSize: '13px',\n boxSizing: 'border-box',\n backgroundColor: '#ffffff',\n }}\n >\n <option value=\"\">-- Anyone / Unassigned --</option>\n {localRoles.map((r) => (\n <option key={r.id} value={r.id}>\n {r.name} ({r.color})\n </option>\n ))}\n </select>\n <span style={{ fontSize: '11px', color: '#64748b', marginTop: '2px', display: 'block' }}>\n Restricts filling of this field in View mode to the assigned role with color-coded badges.\n </span>\n </div>\n\n {/* Flow Order (Step in Form Filling Flow) */}\n <div>\n <label style={{ display: 'block', fontSize: '13px', fontWeight: 500, color: '#374151', marginBottom: '4px' }}>\n Flow Order (Step in Form Filling Sequence)\n </label>\n <input\n type=\"number\"\n min=\"1\"\n step=\"1\"\n value={flowOrder}\n onChange={(e) => setFlowOrder(e.target.value)}\n placeholder=\"e.g. 1, 2, 3 (Leave empty for default page position)\"\n style={{\n width: '100%',\n padding: '8px 12px',\n borderRadius: '6px',\n border: '1px solid #d1d5db',\n fontSize: '13px',\n boxSizing: 'border-box',\n }}\n />\n <span style={{ fontSize: '11px', color: '#64748b' }}>\n Defines the sequence order when a user navigates using \"Next Field\" or the Tab key.\n </span>\n </div>\n\n {/* Placeholder (for text, textbox, textarea) */}\n {['text', 'textbox', 'textarea', 'datetime'].includes(field.type) && (\n <div>\n <label style={{ display: 'block', fontSize: '13px', fontWeight: 500, color: '#374151', marginBottom: '4px' }}>\n Placeholder\n </label>\n <input\n type=\"text\"\n value={placeholder}\n onChange={(e) => setPlaceholder(e.target.value)}\n placeholder=\"e.g. Enter name as shown on ID\"\n style={{\n width: '100%',\n padding: '8px 12px',\n borderRadius: '6px',\n border: '1px solid #d1d5db',\n fontSize: '13px',\n boxSizing: 'border-box',\n }}\n />\n </div>\n )}\n\n {/* Date Format (if datetime) */}\n {field.type === 'datetime' && (\n <div>\n <label style={{ display: 'block', fontSize: '13px', fontWeight: 500, color: '#374151', marginBottom: '4px' }}>\n Picker Mode\n </label>\n <select\n value={dateFormat}\n onChange={(e) => setDateFormat(e.target.value as DateTimeFormat)}\n style={{\n width: '100%',\n padding: '8px 12px',\n borderRadius: '6px',\n border: '1px solid #d1d5db',\n fontSize: '13px',\n boxSizing: 'border-box',\n backgroundColor: '#ffffff',\n }}\n >\n <option value=\"datetime\">Date & Time (YYYY-MM-DDTHH:MM)</option>\n <option value=\"date\">Date Only (YYYY-MM-DD)</option>\n <option value=\"time\">Time Only (HH:MM)</option>\n </select>\n </div>\n )}\n\n {/* Options Management (checklist, dropdown, radio) */}\n {hasOptions && (\n <div>\n <label style={{ display: 'block', fontSize: '13px', fontWeight: 500, color: '#374151', marginBottom: '6px' }}>\n {field.type === 'checklist' ? 'Checklist Items' : 'Choices / Options'}\n </label>\n <div style={{ display: 'flex', gap: '8px', marginBottom: '8px' }}>\n <input\n type=\"text\"\n value={newOptionText}\n onChange={(e) => setNewOptionText(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleAddOption();\n }\n }}\n placeholder=\"New item / option text\"\n style={{\n flex: 1,\n padding: '6px 10px',\n borderRadius: '6px',\n border: '1px solid #d1d5db',\n fontSize: '13px',\n }}\n />\n <button\n type=\"button\"\n onClick={handleAddOption}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n padding: '6px 12px',\n backgroundColor: '#f3f4f6',\n border: '1px solid #d1d5db',\n borderRadius: '6px',\n fontSize: '12px',\n fontWeight: 500,\n cursor: 'pointer',\n }}\n >\n <Plus size={14} /> Add\n </button>\n </div>\n\n <div\n style={{\n maxHeight: '130px',\n overflowY: 'auto',\n border: '1px solid #e5e7eb',\n borderRadius: '6px',\n padding: '4px',\n display: 'flex',\n flexDirection: 'column',\n gap: '4px',\n backgroundColor: '#fafafa',\n }}\n >\n {options.length === 0 ? (\n <span style={{ fontSize: '12px', color: '#9ca3af', padding: '8px', textAlign: 'center' }}>\n No options added yet.\n </span>\n ) : (\n options.map((opt, idx) => (\n <div\n key={idx}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '4px 8px',\n backgroundColor: '#ffffff',\n borderRadius: '4px',\n border: '1px solid #e5e7eb',\n fontSize: '12px',\n }}\n >\n <span style={{ overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{opt}</span>\n <div style={{ display: 'flex', alignItems: 'center', gap: '2px' }}>\n <button\n type=\"button\"\n onClick={() => handleMoveOption(idx, 'up')}\n disabled={idx === 0}\n style={{\n background: 'none',\n border: 'none',\n cursor: idx === 0 ? 'default' : 'pointer',\n padding: '2px',\n color: idx === 0 ? '#d1d5db' : '#6b7280',\n }}\n >\n <ArrowUp size={12} />\n </button>\n <button\n type=\"button\"\n onClick={() => handleMoveOption(idx, 'down')}\n disabled={idx === options.length - 1}\n style={{\n background: 'none',\n border: 'none',\n cursor: idx === options.length - 1 ? 'default' : 'pointer',\n padding: '2px',\n color: idx === options.length - 1 ? '#d1d5db' : '#6b7280',\n }}\n >\n <ArrowDown size={12} />\n </button>\n <button\n type=\"button\"\n onClick={() => handleRemoveOption(idx)}\n style={{\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n padding: '2px',\n color: '#ef4444',\n }}\n >\n <Trash2 size={12} />\n </button>\n </div>\n </div>\n ))\n )}\n </div>\n </div>\n )}\n\n {/* Required toggle */}\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n <input\n type=\"checkbox\"\n id=\"field-required\"\n checked={required}\n onChange={(e) => setRequired(e.target.checked)}\n style={{ width: '16px', height: '16px', cursor: 'pointer' }}\n />\n <label htmlFor=\"field-required\" style={{ fontSize: '13px', fontWeight: 500, color: '#374151', cursor: 'pointer' }}>\n Required field (mandatory)\n </label>\n </div>\n </>\n ) : (\n <>\n {/* Typography */}\n <div>\n <label style={{ display: 'flex', alignItems: 'center', gap: '6px', fontSize: '13px', fontWeight: 500, color: '#374151', marginBottom: '6px' }}>\n <Type size={14} color=\"#0284c7\" /> Font & Typography\n </label>\n <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: '10px' }}>\n <div>\n <span style={{ fontSize: '11px', color: '#64748b' }}>Font Family</span>\n <select\n value={fontFamily}\n onChange={(e) => setFontFamily(e.target.value)}\n style={{\n width: '100%',\n padding: '6px 8px',\n borderRadius: '6px',\n border: '1px solid #d1d5db',\n fontSize: '12px',\n backgroundColor: '#ffffff',\n marginTop: '2px',\n }}\n >\n <option value=\"inherit\">Default / Sans-Serif</option>\n <option value=\"Arial, sans-serif\">Arial</option>\n <option value=\"'Times New Roman', serif\">Times New Roman (Serif)</option>\n <option value=\"'Courier New', monospace\">Courier (Monospace)</option>\n <option value=\"'Dancing Script', cursive\">Dancing Script (Cursive)</option>\n </select>\n </div>\n <div>\n <span style={{ fontSize: '11px', color: '#64748b' }}>Font Size</span>\n <select\n value={fontSize}\n onChange={(e) => setFontSize(parseInt(e.target.value, 10))}\n style={{\n width: '100%',\n padding: '6px 8px',\n borderRadius: '6px',\n border: '1px solid #d1d5db',\n fontSize: '12px',\n backgroundColor: '#ffffff',\n marginTop: '2px',\n }}\n >\n <option value={10}>10 pt (Small)</option>\n <option value={12}>12 pt (Standard)</option>\n <option value={14}>14 pt (Medium)</option>\n <option value={16}>16 pt (Large)</option>\n <option value={18}>18 pt (X-Large)</option>\n <option value={22}>22 pt (Heading)</option>\n </select>\n </div>\n </div>\n\n {/* Bold, Italic & Alignment Buttons */}\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px', marginTop: '10px' }}>\n <button\n type=\"button\"\n onClick={() => setFontWeight(fontWeight === 'bold' ? 'normal' : 'bold')}\n style={{\n padding: '6px 10px',\n borderRadius: '6px',\n border: '1px solid #d1d5db',\n backgroundColor: fontWeight === 'bold' ? '#e0f2fe' : '#ffffff',\n color: fontWeight === 'bold' ? '#0369a1' : '#374151',\n cursor: 'pointer',\n fontSize: '12px',\n fontWeight: 700,\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n }}\n >\n <Bold size={13} /> Bold\n </button>\n <button\n type=\"button\"\n onClick={() => setFontStyle(fontStyle === 'italic' ? 'normal' : 'italic')}\n style={{\n padding: '6px 10px',\n borderRadius: '6px',\n border: '1px solid #d1d5db',\n backgroundColor: fontStyle === 'italic' ? '#e0f2fe' : '#ffffff',\n color: fontStyle === 'italic' ? '#0369a1' : '#374151',\n cursor: 'pointer',\n fontSize: '12px',\n fontStyle: 'italic',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n }}\n >\n <Italic size={13} /> Italic\n </button>\n\n <div style={{ width: '1px', height: '18px', backgroundColor: '#e2e8f0', margin: '0 4px' }} />\n\n {(['left', 'center', 'right'] as const).map((align) => (\n <button\n key={align}\n type=\"button\"\n onClick={() => setTextAlign(align)}\n style={{\n padding: '6px 8px',\n borderRadius: '6px',\n border: '1px solid #d1d5db',\n backgroundColor: textAlign === align ? '#e0f2fe' : '#ffffff',\n color: textAlign === align ? '#0369a1' : '#64748b',\n cursor: 'pointer',\n }}\n title={`Align ${align}`}\n >\n {align === 'left' && <AlignLeft size={13} />}\n {align === 'center' && <AlignCenter size={13} />}\n {align === 'right' && <AlignRight size={13} />}\n </button>\n ))}\n </div>\n </div>\n\n {/* Text Color */}\n <div>\n <label style={{ display: 'block', fontSize: '13px', fontWeight: 500, color: '#374151', marginBottom: '6px' }}>\n Text Color\n </label>\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n <div style={{ display: 'flex', gap: '4px', flexWrap: 'wrap' }}>\n {PRESET_COLORS.map((c) => (\n <button\n key={c}\n type=\"button\"\n onClick={() => setTextColor(c)}\n style={{\n width: '22px',\n height: '22px',\n borderRadius: '50%',\n backgroundColor: c,\n border: textColor === c ? '2px solid #0284c7' : '1px solid #cbd5e1',\n cursor: 'pointer',\n boxShadow: textColor === c ? '0 0 0 1px #0284c7' : 'none',\n }}\n />\n ))}\n </div>\n <input\n type=\"color\"\n value={textColor.startsWith('#') ? textColor : '#0f172a'}\n onChange={(e) => setTextColor(e.target.value)}\n style={{ width: '28px', height: '28px', padding: 0, border: 'none', borderRadius: '4px', cursor: 'pointer' }}\n />\n </div>\n </div>\n\n {/* Background / Fill Color */}\n <div>\n <label style={{ display: 'block', fontSize: '13px', fontWeight: 500, color: '#374151', marginBottom: '6px' }}>\n Background Fill Color\n </label>\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n <div style={{ display: 'flex', gap: '4px', flexWrap: 'wrap' }}>\n {PRESET_BG_COLORS.map((c) => (\n <button\n key={c}\n type=\"button\"\n onClick={() => setBackgroundColor(c)}\n style={{\n width: '22px',\n height: '22px',\n borderRadius: '4px',\n backgroundColor: c === 'transparent' ? '#ffffff' : c,\n border: backgroundColor === c ? '2px solid #0284c7' : '1px solid #cbd5e1',\n cursor: 'pointer',\n position: 'relative',\n overflow: 'hidden',\n }}\n title={c}\n >\n {c === 'transparent' && (\n <div style={{ position: 'absolute', top: '50%', left: 0, right: 0, height: '1.5px', backgroundColor: '#ef4444', transform: 'rotate(45deg)' }} />\n )}\n </button>\n ))}\n </div>\n <input\n type=\"color\"\n value={backgroundColor.startsWith('#') ? backgroundColor : '#ffffff'}\n onChange={(e) => setBackgroundColor(e.target.value)}\n style={{ width: '28px', height: '28px', padding: 0, border: 'none', borderRadius: '4px', cursor: 'pointer' }}\n />\n <button\n type=\"button\"\n onClick={() => setBackgroundColor('transparent')}\n style={{\n padding: '4px 8px',\n fontSize: '11px',\n backgroundColor: backgroundColor === 'transparent' ? '#e0f2fe' : '#f1f5f9',\n color: backgroundColor === 'transparent' ? '#0369a1' : '#475569',\n border: '1px solid #cbd5e1',\n borderRadius: '4px',\n cursor: 'pointer',\n }}\n >\n Transparent\n </button>\n </div>\n </div>\n\n {/* Borders */}\n <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: '10px' }}>\n <div>\n <span style={{ fontSize: '11px', color: '#64748b' }}>Border Color</span>\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px', marginTop: '2px' }}>\n <input\n type=\"color\"\n value={borderColor.startsWith('#') ? borderColor : '#94a3b8'}\n onChange={(e) => setBorderColor(e.target.value)}\n style={{ width: '26px', height: '26px', padding: 0, border: 'none', borderRadius: '4px', cursor: 'pointer' }}\n />\n <input\n type=\"text\"\n value={borderColor}\n onChange={(e) => setBorderColor(e.target.value)}\n style={{ flex: 1, padding: '4px 6px', fontSize: '12px', border: '1px solid #d1d5db', borderRadius: '4px' }}\n />\n </div>\n </div>\n\n <div>\n <span style={{ fontSize: '11px', color: '#64748b' }}>Border Width & Radius</span>\n <div style={{ display: 'flex', gap: '6px', marginTop: '2px' }}>\n <select\n value={borderWidth}\n onChange={(e) => setBorderWidth(parseInt(e.target.value, 10))}\n style={{ flex: 1, padding: '4px 6px', fontSize: '12px', border: '1px solid #d1d5db', borderRadius: '4px', backgroundColor: '#ffffff' }}\n >\n <option value={1}>1px</option>\n <option value={2}>2px</option>\n <option value={3}>3px</option>\n </select>\n <select\n value={borderRadius}\n onChange={(e) => setBorderRadius(parseInt(e.target.value, 10))}\n style={{ flex: 1, padding: '4px 6px', fontSize: '12px', border: '1px solid #d1d5db', borderRadius: '4px', backgroundColor: '#ffffff' }}\n >\n <option value={0}>Square</option>\n <option value={4}>4px</option>\n <option value={8}>8px</option>\n <option value={16}>Pill</option>\n </select>\n </div>\n </div>\n </div>\n\n {/* Live Preview Box */}\n <div>\n <span style={{ fontSize: '11px', color: '#64748b', display: 'block', marginBottom: '4px' }}>Style Live Preview</span>\n <div\n style={{\n padding: '8px 12px',\n fontFamily,\n fontSize: `${fontSize}px`,\n fontWeight,\n fontStyle,\n textAlign,\n color: textColor,\n backgroundColor: backgroundColor === 'transparent' ? '#ffffff' : backgroundColor,\n border: `${borderWidth}px solid ${borderColor}`,\n borderRadius: `${borderRadius}px`,\n boxShadow: '0 1px 2px rgba(0, 0, 0, 0.05)',\n }}\n >\n {placeholder || label || 'Sample Form Input Text'}\n </div>\n </div>\n </>\n )}\n </div>\n\n {/* Footer */}\n <div\n style={{\n padding: '12px 20px',\n borderTop: '1px solid #e5e7eb',\n backgroundColor: '#f9fafb',\n display: 'flex',\n justifyContent: 'flex-end',\n gap: '8px',\n }}\n >\n <button\n type=\"button\"\n onClick={onClose}\n style={{\n padding: '8px 16px',\n borderRadius: '6px',\n border: '1px solid #d1d5db',\n backgroundColor: '#ffffff',\n fontSize: '13px',\n fontWeight: 500,\n color: '#374151',\n cursor: 'pointer',\n }}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={handleSave}\n style={{\n padding: '8px 16px',\n borderRadius: '6px',\n border: 'none',\n backgroundColor: 'var(--primary, #0284c7)',\n fontSize: '13px',\n fontWeight: 500,\n color: '#ffffff',\n cursor: 'pointer',\n }}\n >\n Save Changes\n </button>\n </div>\n </div>\n </div>\n );\n};\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * FormSignatureModal — signing dialog supporting Electronic (Draw, Type, Upload)\n * and Digital (Cryptographic Certificate & Audit Seal) signatures.\n */\n\nimport React, { useState, useRef, useEffect, useCallback } from 'react';\nimport { X, PenTool, Type, Upload, ShieldCheck, RefreshCw, Check } from 'lucide-react';\nimport type { FormField, FormSignatureValue, SignatureType, FormRole } from '../forms/types';\nimport type { ViewerUser } from '../core/types';\n\ninterface FormSignatureModalProps {\n field: FormField;\n role?: FormRole;\n currentUser?: ViewerUser | null;\n currentValue?: FormSignatureValue | any;\n defaultSignerName?: string;\n onSave: (value: FormSignatureValue) => void;\n onClear?: () => void;\n onClose: () => void;\n}\n\nexport const FormSignatureModal: React.FC<FormSignatureModalProps> = ({\n field,\n role,\n currentUser,\n currentValue,\n defaultSignerName = '',\n onSave,\n onClear,\n onClose,\n}) => {\n const isDigital = field.type === 'digital_signature' || field.signatureType === 'digital';\n const [signatureType, setSignatureType] = useState<SignatureType>(isDigital ? 'digital' : 'electronic');\n const [electronicTab, setElectronicTab] = useState<'draw' | 'type' | 'upload'>('draw');\n\n // Signer Name\n const initialSignerName =\n (typeof currentValue === 'object' && currentValue?.signerName) ||\n currentUser?.name ||\n defaultSignerName ||\n role?.name ||\n '';\n const [signerName, setSignerName] = useState<string>(initialSignerName);\n\n // Digital Signature Reason\n const initialReason =\n (typeof currentValue === 'object' && currentValue?.reason) || 'Document Approval';\n const [signingReason, setSigningReason] = useState<string>(initialReason);\n\n // Typed cursive signature font choice\n const [typedFontIndex, setTypedFontIndex] = useState<number>(0);\n const cursiveFonts = [\n { name: 'Dancing Script', style: 'italic', family: '\"Dancing Script\", \"Brush Script MT\", cursive' },\n { name: 'Casual Script', style: 'normal', family: '\"Caveat\", \"Segoe Script\", cursive' },\n { name: 'Calligraphy', style: 'italic', family: '\"Great Vibes\", \"Lucida Handwriting\", cursive' },\n ];\n\n // Uploaded signature image\n const [uploadedDataUrl, setUploadedDataUrl] = useState<string | null>(\n typeof currentValue === 'object' && currentValue?.dataUrl ? currentValue.dataUrl : null\n );\n\n // Canvas drawing state\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const isDrawingRef = useRef(false);\n const strokesRef = useRef<Array<{ points: { x: number; y: number }[]; color: string; width: number }>>([]);\n const [hasDrawn, setHasDrawn] = useState(false);\n const [penColor, setPenColor] = useState('#0f172a');\n const penColorRef = useRef(penColor);\n penColorRef.current = penColor;\n\n // Generate SHA-256 style fingerprint for digital signature preview\n const [certFingerprint] = useState(() => {\n if (typeof currentValue === 'object' && currentValue?.certificateHash) {\n return currentValue.certificateHash;\n }\n const bytes = new Uint8Array(32); // 32 bytes => 64 hex chars\n window.crypto.getRandomValues(bytes);\n return Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('');\n });\n\n // Redraw all stored strokes cleanly on high-DPI canvas\n const redrawCanvas = useCallback(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n const dpr = window.devicePixelRatio || 1;\n const rect = canvas.getBoundingClientRect();\n const w = rect.width > 0 ? rect.width : (canvas.clientWidth || 480);\n const h = rect.height > 0 ? rect.height : (canvas.clientHeight || 150);\n\n const targetWidth = Math.round(w * dpr);\n const targetHeight = Math.round(h * dpr);\n\n if (canvas.width !== targetWidth || canvas.height !== targetHeight) {\n canvas.width = targetWidth;\n canvas.height = targetHeight;\n }\n\n ctx.resetTransform?.();\n ctx.scale(dpr, dpr);\n ctx.lineCap = 'round';\n ctx.lineJoin = 'round';\n\n ctx.clearRect(0, 0, w, h);\n\n for (const stroke of strokesRef.current) {\n if (stroke.points.length === 0) continue;\n ctx.beginPath();\n ctx.strokeStyle = stroke.color;\n ctx.lineWidth = stroke.width || 2.5;\n ctx.moveTo(stroke.points[0].x, stroke.points[0].y);\n for (let i = 1; i < stroke.points.length; i++) {\n ctx.lineTo(stroke.points[i].x, stroke.points[i].y);\n }\n if (stroke.points.length === 1) {\n ctx.lineTo(stroke.points[0].x + 0.1, stroke.points[0].y + 0.1);\n }\n ctx.stroke();\n }\n }, []);\n\n // Setup canvas high-DPI on mount / tab switch (without resetting on penColor change)\n useEffect(() => {\n if (signatureType !== 'electronic' || electronicTab !== 'draw') return;\n const timer = setTimeout(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n redrawCanvas();\n\n // If existing signature dataUrl exists and no strokes yet, draw it\n if (typeof currentValue === 'object' && currentValue?.dataUrl && strokesRef.current.length === 0 && !hasDrawn) {\n const img = new Image();\n img.onload = () => {\n const rect = canvas.getBoundingClientRect();\n const w = rect.width > 0 ? rect.width : (canvas.clientWidth || 480);\n const h = rect.height > 0 ? rect.height : (canvas.clientHeight || 150);\n ctx.drawImage(img, 0, 0, w, h);\n setHasDrawn(true);\n };\n img.src = currentValue.dataUrl;\n }\n }, 20);\n\n return () => clearTimeout(timer);\n }, [signatureType, electronicTab, redrawCanvas]);\n\n // Window-level mouseup / touchend listeners so strokes end cleanly if pointer leaves canvas\n useEffect(() => {\n const handleGlobalEnd = () => {\n isDrawingRef.current = false;\n };\n window.addEventListener('mouseup', handleGlobalEnd);\n window.addEventListener('touchend', handleGlobalEnd);\n return () => {\n window.removeEventListener('mouseup', handleGlobalEnd);\n window.removeEventListener('touchend', handleGlobalEnd);\n };\n }, []);\n\n // Canvas drawing handlers\n const getCanvasPos = (e: React.MouseEvent<HTMLCanvasElement> | React.TouchEvent<HTMLCanvasElement>) => {\n const canvas = canvasRef.current;\n if (!canvas) return { x: 0, y: 0 };\n const rect = canvas.getBoundingClientRect();\n if ('touches' in e) {\n const touch = e.touches[0];\n return { x: touch.clientX - rect.left, y: touch.clientY - rect.top };\n }\n return { x: e.clientX - rect.left, y: e.clientY - rect.top };\n };\n\n const handleStartDraw = (e: React.MouseEvent<HTMLCanvasElement> | React.TouchEvent<HTMLCanvasElement>) => {\n if ('touches' in e && e.touches.length === 1 && e.cancelable) {\n e.preventDefault();\n }\n const canvas = canvasRef.current;\n if (!canvas) return;\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n isDrawingRef.current = true;\n setHasDrawn(true);\n\n const pos = getCanvasPos(e);\n strokesRef.current.push({\n points: [pos],\n color: penColorRef.current,\n width: 2.5,\n });\n\n ctx.beginPath();\n ctx.strokeStyle = penColorRef.current;\n ctx.lineWidth = 2.5;\n ctx.lineCap = 'round';\n ctx.lineJoin = 'round';\n ctx.moveTo(pos.x, pos.y);\n ctx.lineTo(pos.x + 0.1, pos.y + 0.1);\n ctx.stroke();\n };\n\n const handleDraw = (e: React.MouseEvent<HTMLCanvasElement> | React.TouchEvent<HTMLCanvasElement>) => {\n if (!isDrawingRef.current) return;\n if ('touches' in e && e.cancelable) {\n e.preventDefault();\n }\n const canvas = canvasRef.current;\n if (!canvas) return;\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n const pos = getCanvasPos(e);\n const activeStroke = strokesRef.current[strokesRef.current.length - 1];\n if (activeStroke) {\n activeStroke.points.push(pos);\n }\n\n ctx.lineTo(pos.x, pos.y);\n ctx.stroke();\n };\n\n const handleEndDraw = () => {\n isDrawingRef.current = false;\n };\n\n const handleClearCanvas = () => {\n strokesRef.current = [];\n const canvas = canvasRef.current;\n if (!canvas) return;\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n const dpr = window.devicePixelRatio || 1;\n ctx.clearRect(0, 0, canvas.width / dpr, canvas.height / dpr);\n setHasDrawn(false);\n };\n\n // Convert typed cursive text to PNG dataUrl using offscreen canvas (with SVG fallback)\n const renderTypedToDataUrl = useCallback((nameText: string, fontObj: typeof cursiveFonts[0]): string => {\n try {\n const offscreen = document.createElement('canvas');\n offscreen.width = 600;\n offscreen.height = 180;\n const ctx = offscreen.getContext('2d');\n if (ctx) {\n ctx.fillStyle = penColor;\n ctx.font = `${fontObj.style} 52px ${fontObj.family}`;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText(nameText || 'Signature', 300, 90);\n const data = offscreen.toDataURL('image/png');\n if (data && data.length > 30 && data !== 'data:,') {\n return data;\n }\n }\n } catch {\n // Fallback to SVG below\n }\n\n // High quality vector SVG data URL fallback (SEC: XML entities escaped to prevent SVG XSS injection)\n const escapeXml = (s: string) =>\n s\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;');\n\n const safeName = escapeXml(nameText || 'Signature');\n const safeFamily = escapeXml(fontObj.name || 'cursive');\n const safeStyle = escapeXml(fontObj.style || 'normal');\n const safeColor = escapeXml(penColor || '#000000');\n const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"600\" height=\"180\"><text x=\"300\" y=\"90\" font-family=\"${safeFamily}, cursive\" font-size=\"52\" font-style=\"${safeStyle}\" fill=\"${safeColor}\" text-anchor=\"middle\" dominant-baseline=\"middle\">${safeName}</text></svg>`;\n \n try {\n const base64Svg = typeof btoa !== 'undefined' ? btoa(unescape(encodeURIComponent(svg))) : encodeURIComponent(svg);\n return `data:image/svg+xml;base64,${base64Svg}`;\n } catch {\n return `data:image/svg+xml;utf8,${encodeURIComponent(svg)}`;\n }\n }, [penColor]);\n\n // Allowed image MIME types for uploaded signatures (SEC: prevent SVG/HTML script injection)\n const ALLOWED_SIGNATURE_MIME_TYPES = new Set(['image/png', 'image/jpeg', 'image/jpg', 'image/webp']);\n\n // Handle uploaded image file\n const handleFileUpload = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n if (!ALLOWED_SIGNATURE_MIME_TYPES.has(file.type.toLowerCase())) {\n alert('Please upload a valid PNG, JPEG, or WebP image file.');\n return;\n }\n const reader = new FileReader();\n reader.onload = (ev) => {\n const result = ev.target?.result as string;\n if (result) {\n setUploadedDataUrl(result);\n }\n };\n reader.readAsDataURL(file);\n };\n\n // Commit signature\n const handleAdoptAndSign = () => {\n if (signatureType === 'digital') {\n const finalName = signerName.trim() || currentUser?.name || 'Authorized Signer';\n const sigVal: FormSignatureValue = {\n type: 'digital',\n signerName: finalName,\n signerEmail: currentUser?.email,\n signerRole: role?.name || field.roleId,\n timestamp: Date.now(),\n reason: signingReason,\n certificateHash: certFingerprint,\n };\n onSave(sigVal);\n onClose();\n return;\n }\n\n // Electronic Signature\n let finalDataUrl = '';\n const finalSignerName = signerName.trim() || currentUser?.name || 'Signer';\n\n if (electronicTab === 'draw') {\n const canvas = canvasRef.current;\n if (canvas && hasDrawn) {\n finalDataUrl = canvas.toDataURL('image/png');\n }\n if (!finalDataUrl || !hasDrawn) {\n alert('Please draw your signature before adopting.');\n return;\n }\n } else if (electronicTab === 'type') {\n finalDataUrl = renderTypedToDataUrl(signerName.trim() || currentUser?.name || 'Signature', cursiveFonts[typedFontIndex]);\n if (!finalDataUrl) {\n alert('Please enter your name for the signature.');\n return;\n }\n } else if (electronicTab === 'upload') {\n finalDataUrl = uploadedDataUrl || '';\n if (!finalDataUrl) {\n alert('Please upload a signature image before adopting.');\n return;\n }\n }\n\n const sigVal: FormSignatureValue = {\n type: 'electronic',\n dataUrl: finalDataUrl,\n signerName: finalSignerName,\n signerEmail: currentUser?.email,\n signerRole: role?.name || field.roleId,\n timestamp: Date.now(),\n };\n onSave(sigVal);\n onClose();\n };\n\n const accentColor = role?.color || '#0284c7';\n\n return (\n <div\n style={{\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: 'rgba(15, 23, 42, 0.65)',\n backdropFilter: 'blur(3px)',\n zIndex: 9999,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '16px',\n animation: 'fadeIn 0.15s ease-out',\n pointerEvents: 'auto',\n }}\n onClick={(e) => {\n if (e.target === e.currentTarget) onClose();\n }}\n >\n <div\n style={{\n backgroundColor: '#ffffff',\n borderRadius: '12px',\n boxShadow: '0 20px 25px -5px rgba(0, 0, 0, 0.2), 0 10px 10px -5px rgba(0, 0, 0, 0.08)',\n width: '100%',\n maxWidth: '560px',\n overflow: 'hidden',\n display: 'flex',\n flexDirection: 'column',\n maxHeight: '90vh',\n pointerEvents: 'auto',\n }}\n >\n {/* Header */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '14px 20px',\n borderBottom: '1px solid #e2e8f0',\n backgroundColor: '#f8fafc',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n <div\n style={{\n width: '32px',\n height: '32px',\n borderRadius: '8px',\n backgroundColor: `${accentColor}15`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: accentColor,\n }}\n >\n {signatureType === 'digital' ? <ShieldCheck size={18} /> : <PenTool size={18} />}\n </div>\n <div>\n <h2 style={{ margin: 0, fontSize: '15px', fontWeight: 600, color: '#0f172a' }}>\n {signatureType === 'digital' ? 'Apply Digital Signature' : 'Adopt Electronic Signature'}\n </h2>\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px', fontSize: '12px', color: '#64748b', marginTop: '2px', flexWrap: 'wrap' }}>\n {field.label && <span>{field.label} · </span>}\n {role && (\n <span\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n backgroundColor: `${accentColor}15`,\n color: accentColor,\n padding: '1px 6px',\n borderRadius: '4px',\n fontWeight: 600,\n fontSize: '11px',\n }}\n >\n Role: {role.name}\n </span>\n )}\n {currentUser?.name ? (\n <span style={{ color: '#334155' }}>\n Signer: <strong>{currentUser.name}</strong>\n {currentUser.email ? ` (${currentUser.email})` : ''}\n </span>\n ) : !role ? (\n <span>Document Signature</span>\n ) : null}\n </div>\n </div>\n </div>\n\n <button\n type=\"button\"\n onClick={onClose}\n aria-label=\"Close\"\n style={{\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n color: '#64748b',\n padding: '6px',\n borderRadius: '6px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <X size={18} />\n </button>\n </div>\n\n {/* Signature Type Switcher (if field allows both, or author didn't enforce strictly) */}\n <div\n style={{\n display: 'flex',\n padding: '10px 20px 0 20px',\n backgroundColor: '#ffffff',\n gap: '8px',\n }}\n >\n <button\n type=\"button\"\n onClick={() => setSignatureType('electronic')}\n style={{\n flex: 1,\n padding: '7px 12px',\n borderRadius: '6px',\n border: '1px solid',\n borderColor: signatureType === 'electronic' ? accentColor : '#e2e8f0',\n backgroundColor: signatureType === 'electronic' ? `${accentColor}10` : '#ffffff',\n color: signatureType === 'electronic' ? accentColor : '#64748b',\n fontWeight: signatureType === 'electronic' ? 600 : 400,\n fontSize: '12.5px',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '6px',\n transition: 'all 0.15s ease',\n }}\n >\n <PenTool size={14} />\n <span>Electronic Signature</span>\n </button>\n\n <button\n type=\"button\"\n onClick={() => setSignatureType('digital')}\n style={{\n flex: 1,\n padding: '7px 12px',\n borderRadius: '6px',\n border: '1px solid',\n borderColor: signatureType === 'digital' ? '#0284c7' : '#e2e8f0',\n backgroundColor: signatureType === 'digital' ? '#0284c710' : '#ffffff',\n color: signatureType === 'digital' ? '#0284c7' : '#64748b',\n fontWeight: signatureType === 'digital' ? 600 : 400,\n fontSize: '12.5px',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '6px',\n transition: 'all 0.15s ease',\n }}\n >\n <ShieldCheck size={14} />\n <span>Digital Certificate</span>\n </button>\n </div>\n\n {/* Content Body */}\n <div style={{ padding: '16px 20px', overflowY: 'auto', flex: 1 }}>\n {/* Signer Name Input (Used in both modes) */}\n <div style={{ marginBottom: '14px' }}>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', marginBottom: '4px' }}>\n <label style={{ fontSize: '12px', fontWeight: 600, color: '#334155' }}>\n Signer Full Name\n </label>\n {currentUser?.name && (\n <span style={{ fontSize: '11px', color: '#0284c7', fontWeight: 500 }}>\n User session: {currentUser.name}\n </span>\n )}\n </div>\n <input\n type=\"text\"\n value={signerName}\n placeholder=\"e.g. Jane Doe\"\n onChange={(e) => setSignerName(e.target.value)}\n style={{\n width: '100%',\n padding: '8px 12px',\n borderRadius: '6px',\n border: '1px solid #cbd5e1',\n fontSize: '13px',\n outline: 'none',\n boxSizing: 'border-box',\n }}\n />\n </div>\n\n {/* ELECTRONIC SIGNATURE PANEL */}\n {signatureType === 'electronic' && (\n <div>\n {/* Method Sub-tabs: Draw, Type, Upload */}\n <div\n style={{\n display: 'flex',\n borderBottom: '1px solid #e2e8f0',\n marginBottom: '12px',\n gap: '4px',\n }}\n >\n <button\n type=\"button\"\n onClick={() => setElectronicTab('draw')}\n style={{\n padding: '6px 12px',\n border: 'none',\n borderBottom: electronicTab === 'draw' ? `2px solid ${accentColor}` : '2px solid transparent',\n backgroundColor: 'transparent',\n color: electronicTab === 'draw' ? accentColor : '#64748b',\n fontWeight: electronicTab === 'draw' ? 600 : 400,\n fontSize: '12px',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n gap: '5px',\n }}\n >\n <PenTool size={13} /> Draw\n </button>\n\n <button\n type=\"button\"\n onClick={() => setElectronicTab('type')}\n style={{\n padding: '6px 12px',\n border: 'none',\n borderBottom: electronicTab === 'type' ? `2px solid ${accentColor}` : '2px solid transparent',\n backgroundColor: 'transparent',\n color: electronicTab === 'type' ? accentColor : '#64748b',\n fontWeight: electronicTab === 'type' ? 600 : 400,\n fontSize: '12px',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n gap: '5px',\n }}\n >\n <Type size={13} /> Type\n </button>\n\n <button\n type=\"button\"\n onClick={() => setElectronicTab('upload')}\n style={{\n padding: '6px 12px',\n border: 'none',\n borderBottom: electronicTab === 'upload' ? `2px solid ${accentColor}` : '2px solid transparent',\n backgroundColor: 'transparent',\n color: electronicTab === 'upload' ? accentColor : '#64748b',\n fontWeight: electronicTab === 'upload' ? 600 : 400,\n fontSize: '12px',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n gap: '5px',\n }}\n >\n <Upload size={13} /> Upload Image\n </button>\n </div>\n\n {/* DRAW TAB */}\n {electronicTab === 'draw' && (\n <div>\n <div\n style={{\n position: 'relative',\n border: '1px dashed #cbd5e1',\n borderRadius: '8px',\n backgroundColor: '#fbfcfd',\n overflow: 'hidden',\n touchAction: 'none',\n }}\n >\n <canvas\n ref={canvasRef}\n style={{ width: '100%', height: '150px', display: 'block', cursor: 'crosshair' }}\n onMouseDown={handleStartDraw}\n onMouseMove={handleDraw}\n onMouseUp={handleEndDraw}\n onMouseLeave={handleEndDraw}\n onTouchStart={handleStartDraw}\n onTouchMove={handleDraw}\n onTouchEnd={handleEndDraw}\n />\n\n {/* Baseline indicator */}\n <div\n style={{\n position: 'absolute',\n left: '20px',\n right: '20px',\n bottom: '30px',\n borderBottom: '1px dashed #cbd5e1',\n pointerEvents: 'none',\n }}\n >\n <span\n style={{\n position: 'absolute',\n left: '0',\n bottom: '2px',\n fontSize: '14px',\n color: '#94a3b8',\n fontWeight: 'bold',\n }}\n >\n ✕\n </span>\n </div>\n\n {!hasDrawn && (\n <div\n style={{\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n color: '#94a3b8',\n fontSize: '12px',\n pointerEvents: 'none',\n textAlign: 'center',\n }}\n >\n Draw your signature above the line\n </div>\n )}\n </div>\n\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginTop: '8px' }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px' }}>\n <span style={{ fontSize: '11px', color: '#64748b' }}>Ink:</span>\n {['#0f172a', '#1e40af', '#047857'].map((c) => (\n <button\n key={c}\n type=\"button\"\n onClick={() => setPenColor(c)}\n style={{\n width: '18px',\n height: '18px',\n borderRadius: '50%',\n backgroundColor: c,\n border: penColor === c ? '2px solid #38bdf8' : '1px solid #cbd5e1',\n cursor: 'pointer',\n padding: 0,\n }}\n />\n ))}\n </div>\n\n <button\n type=\"button\"\n onClick={handleClearCanvas}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n padding: '4px 8px',\n backgroundColor: 'transparent',\n border: '1px solid #e2e8f0',\n borderRadius: '4px',\n fontSize: '11px',\n color: '#64748b',\n cursor: 'pointer',\n }}\n >\n <RefreshCw size={12} /> Clear\n </button>\n </div>\n </div>\n )}\n\n {/* TYPE TAB */}\n {electronicTab === 'type' && (\n <div>\n <p style={{ fontSize: '11px', color: '#64748b', margin: '0 0 8px 0' }}>\n Select a handwriting style:\n </p>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>\n {cursiveFonts.map((font, idx) => (\n <div\n key={idx}\n onClick={() => setTypedFontIndex(idx)}\n style={{\n padding: '12px 16px',\n borderRadius: '8px',\n border: typedFontIndex === idx ? `2px solid ${accentColor}` : '1px solid #e2e8f0',\n backgroundColor: typedFontIndex === idx ? `${accentColor}08` : '#ffffff',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n transition: 'all 0.15s ease',\n }}\n >\n <span\n style={{\n fontSize: '26px',\n fontFamily: font.family,\n fontStyle: font.style,\n color: penColor,\n letterSpacing: '1px',\n }}\n >\n {signerName.trim() || 'Jane Doe'}\n </span>\n {typedFontIndex === idx && <Check size={16} color={accentColor} />}\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* UPLOAD TAB */}\n {electronicTab === 'upload' && (\n <div>\n <div\n style={{\n border: '1px dashed #cbd5e1',\n borderRadius: '8px',\n padding: '24px 16px',\n textAlign: 'center',\n backgroundColor: '#f8fafc',\n }}\n >\n {uploadedDataUrl ? (\n <div>\n <img\n src={uploadedDataUrl}\n alt=\"Signature Preview\"\n style={{ maxHeight: '100px', maxWidth: '80%', objectFit: 'contain', margin: '0 auto 12px auto' }}\n />\n <div>\n <label\n style={{\n display: 'inline-block',\n padding: '5px 12px',\n backgroundColor: '#ffffff',\n border: '1px solid #cbd5e1',\n borderRadius: '4px',\n fontSize: '12px',\n color: '#334155',\n cursor: 'pointer',\n }}\n >\n Replace Image\n <input\n type=\"file\"\n accept=\"image/png, image/jpeg, image/webp\"\n style={{ display: 'none' }}\n onChange={handleFileUpload}\n />\n </label>\n </div>\n </div>\n ) : (\n <div>\n <Upload size={28} color=\"#94a3b8\" style={{ margin: '0 auto 8px auto' }} />\n <p style={{ margin: '0 0 6px 0', fontSize: '13px', color: '#334155', fontWeight: 500 }}>\n Upload an image of your signature\n </p>\n <p style={{ margin: '0 0 12px 0', fontSize: '11px', color: '#64748b' }}>\n PNG or JPG format with transparent or white background\n </p>\n <label\n style={{\n display: 'inline-block',\n padding: '6px 14px',\n backgroundColor: accentColor,\n color: '#ffffff',\n borderRadius: '5px',\n fontSize: '12px',\n fontWeight: 500,\n cursor: 'pointer',\n }}\n >\n Browse File\n <input\n type=\"file\"\n accept=\"image/png, image/jpeg, image/webp\"\n style={{ display: 'none' }}\n onChange={handleFileUpload}\n />\n </label>\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n )}\n\n {/* DIGITAL SIGNATURE PANEL */}\n {signatureType === 'digital' && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '14px' }}>\n <div>\n <label style={{ display: 'block', fontSize: '12px', fontWeight: 600, color: '#334155', marginBottom: '4px' }}>\n Reason for Signing\n </label>\n <select\n value={signingReason}\n onChange={(e) => setSigningReason(e.target.value)}\n style={{\n width: '100%',\n padding: '8px 12px',\n borderRadius: '6px',\n border: '1px solid #cbd5e1',\n fontSize: '13px',\n backgroundColor: '#ffffff',\n outline: 'none',\n boxSizing: 'border-box',\n cursor: 'pointer',\n }}\n >\n <option value=\"Document Approval\">I approve this document</option>\n <option value=\"Consent and Agreement\">I agree to the terms herein</option>\n <option value=\"Witness Verification\">I witness this signature</option>\n <option value=\"Authorship\">I am the author of this document</option>\n </select>\n </div>\n\n {/* Digital Certificate Preview Card */}\n <div\n style={{\n border: '1px solid #bae6fd',\n borderRadius: '8px',\n backgroundColor: '#f0f9ff',\n padding: '14px 16px',\n display: 'flex',\n gap: '12px',\n alignItems: 'flex-start',\n }}\n >\n <div\n style={{\n width: '36px',\n height: '36px',\n borderRadius: '50%',\n backgroundColor: '#0284c7',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: '#ffffff',\n flexShrink: 0,\n }}\n >\n <ShieldCheck size={20} />\n </div>\n\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ fontSize: '13px', fontWeight: 600, color: '#0f172a', marginBottom: '2px' }}>\n Digitally signed by {signerName.trim() || currentUser?.name || 'Signer'}\n </div>\n {currentUser?.email && (\n <div style={{ fontSize: '11px', color: '#475569', marginBottom: '2px' }}>\n Email: {currentUser.email}\n </div>\n )}\n {role?.name && (\n <div style={{ fontSize: '11px', color: '#475569', marginBottom: '2px' }}>\n Role: {role.name}\n </div>\n )}\n <div style={{ fontSize: '11px', color: '#475569', marginBottom: '2px' }}>\n Date: {new Date().toLocaleString('en-GB')}\n </div>\n <div style={{ fontSize: '11px', color: '#475569', marginBottom: '6px' }}>\n Reason: {signingReason}\n </div>\n <div\n style={{\n fontSize: '9.5px',\n color: '#0369a1',\n fontFamily: 'monospace',\n wordBreak: 'break-all',\n backgroundColor: '#e0f2fe',\n padding: '4px 6px',\n borderRadius: '4px',\n }}\n >\n SHA-256: {certFingerprint.slice(0, 32)}...\n </div>\n </div>\n </div>\n\n <p style={{ margin: 0, fontSize: '11px', color: '#64748b', lineHeight: 1.4 }}>\n This creates a verifiable digital signature record that locks your identity, signing reason, and exact timestamp into the PDF audit trail.\n </p>\n </div>\n )}\n </div>\n\n {/* Footer Actions */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '12px 20px',\n borderTop: '1px solid #e2e8f0',\n backgroundColor: '#f8fafc',\n }}\n >\n {onClear && currentValue ? (\n <button\n type=\"button\"\n onClick={() => {\n onClear();\n onClose();\n }}\n style={{\n padding: '6px 12px',\n backgroundColor: 'transparent',\n border: '1px solid #fca5a5',\n borderRadius: '6px',\n color: '#dc2626',\n fontSize: '12px',\n cursor: 'pointer',\n }}\n >\n Remove Signature\n </button>\n ) : (\n <div />\n )}\n\n <div style={{ display: 'flex', gap: '8px' }}>\n <button\n type=\"button\"\n onClick={onClose}\n style={{\n padding: '7px 14px',\n backgroundColor: '#ffffff',\n border: '1px solid #cbd5e1',\n borderRadius: '6px',\n color: '#334155',\n fontSize: '12.5px',\n cursor: 'pointer',\n }}\n >\n Cancel\n </button>\n\n <button\n type=\"button\"\n onClick={handleAdoptAndSign}\n style={{\n padding: '7px 18px',\n backgroundColor: accentColor,\n border: 'none',\n borderRadius: '6px',\n color: '#ffffff',\n fontSize: '12.5px',\n fontWeight: 600,\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n boxShadow: '0 1px 2px rgba(0, 0, 0, 0.1)',\n }}\n >\n <Check size={14} />\n <span>{signatureType === 'digital' ? 'Digitally Sign' : 'Adopt & Sign'}</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n );\n};\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * FormFieldLayer — renders form builder controls (Builder mode) or interactive HTML inputs (Filler mode).\n */\n\nimport React, { useState, useRef, useEffect, useCallback } from 'react';\nimport { Settings, Trash2, Copy, Lock, PenTool, ShieldCheck, Check, User } from 'lucide-react';\nimport type { FormField, FormToolType, FormDataRecord, FormRole, FormSignatureValue, FormFeatureOptions } from '../forms/types';\nimport type { FormManager } from '../forms/FormManager';\nimport { FormFieldEditorModal } from './FormFieldEditorModal';\nimport { FormSignatureModal } from './FormSignatureModal';\nimport { convertToRotatedRect, convertToUnrotated } from '../utils/rotationUtils';\n\ninterface FormFieldLayerProps {\n pageNum: number;\n scale: number;\n rotation: number;\n basePageWidth: number;\n basePageHeight: number;\n activeTab: string;\n activeTool: FormToolType;\n setActiveTool: (tool: FormToolType) => void;\n formManager: FormManager;\n canFillForms?: boolean;\n showFlowOrder?: boolean;\n selectedRoleFilter?: string | null;\n}\n\nconst newId = (): string =>\n typeof crypto !== 'undefined' && 'randomUUID' in crypto\n ? crypto.randomUUID()\n : `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n\nexport const FormFieldLayer: React.FC<FormFieldLayerProps> = ({\n pageNum,\n scale,\n rotation,\n basePageWidth,\n basePageHeight,\n activeTab,\n activeTool,\n setActiveTool,\n formManager,\n canFillForms = true,\n showFlowOrder = true,\n selectedRoleFilter = null,\n}) => {\n const [fields, setFields] = useState<FormField[]>(() => formManager.getFieldsForPage(pageNum));\n const [values, setValues] = useState<FormDataRecord>(() => formManager.getValues());\n const [roles, setRoles] = useState<FormRole[]>(() => formManager.getRoles());\n const [currentRoleId, setCurrentRoleId] = useState<string | null>(() => formManager.getCurrentRole());\n const [activeFieldId, setActiveFieldId] = useState<string | null>(() => formManager.getActiveFieldId());\n const [options, setOptions] = useState<FormFeatureOptions>(() => formManager.getOptions());\n const [selectedFieldId, setSelectedFieldId] = useState<string | null>(null);\n const [editingField, setEditingField] = useState<FormField | null>(null);\n const [signingField, setSigningField] = useState<FormField | null>(null);\n\n // Drag creation state\n const [creationRect, setCreationRect] = useState<{ startX: number; startY: number; curX: number; curY: number } | null>(null);\n\n // Resize / Move drag state\n const dragRef = useRef<{\n type: 'move' | 'resize';\n handle?: string;\n fieldId: string;\n startX: number;\n startY: number;\n initialField: FormField;\n } | null>(null);\n\n const containerRef = useRef<HTMLDivElement>(null);\n\n const unW = rotation % 180 === 0 ? basePageWidth : basePageHeight;\n const unH = rotation % 180 === 0 ? basePageHeight : basePageWidth;\n\n // Sync fields, values, roles and flow state from FormManager\n useEffect(() => {\n const unsubFields = formManager.onFieldsChange(() => {\n setFields(formManager.getFieldsForPage(pageNum));\n });\n const unsubData = formManager.onDataChange((newValues) => {\n // PERF: Only trigger re-render on this page if a field on this page actually changed value\n setValues((prevValues) => {\n const pageFields = formManager.getFieldsForPage(pageNum);\n const hasRelevantChange = pageFields.some((f) => prevValues[f.name] !== newValues[f.name]);\n return hasRelevantChange ? newValues : prevValues;\n });\n });\n const unsubRoles = formManager.onRolesChange((newRoles) => {\n setRoles(newRoles);\n });\n const unsubCurrent = formManager.onCurrentRoleChange((curr) => {\n setCurrentRoleId(curr);\n });\n const unsubActive = formManager.onActiveFieldChange((actId) => {\n setActiveFieldId(actId);\n });\n const unsubOptions = formManager.onOptionsChange((opts) => {\n setOptions(opts);\n });\n return () => {\n unsubFields();\n unsubData();\n unsubRoles();\n unsubCurrent();\n unsubActive();\n unsubOptions();\n };\n }, [formManager, pageNum]);\n\n // Auto-focus active field when navigated in Filler mode\n useEffect(() => {\n if (activeFieldId && activeTab === 'View') {\n const el = document.getElementById(`tspdf-field-${activeFieldId}`);\n if (el && document.activeElement !== el) {\n el.focus();\n }\n }\n }, [activeFieldId, activeTab]);\n\n // Keyboard deletion of selected field in builder\n useEffect(() => {\n if (activeTab !== 'Forms' || !selectedFieldId) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (editingField) return; // Don't delete if modal is open\n if ((e.key === 'Delete' || e.key === 'Backspace') && !['INPUT', 'TEXTAREA'].includes((e.target as HTMLElement)?.tagName)) {\n e.preventDefault();\n formManager.deleteField(selectedFieldId);\n setSelectedFieldId(null);\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [activeTab, selectedFieldId, formManager, editingField]);\n\n // Convert mouse event coordinates to unrotated PDF points\n const getPdfCoordinates = useCallback((e: React.MouseEvent | MouseEvent) => {\n if (!containerRef.current) return { x: 0, y: 0 };\n const rect = containerRef.current.getBoundingClientRect();\n const rawX = (e.clientX - rect.left) / scale;\n const rawY = (e.clientY - rect.top) / scale;\n return convertToUnrotated(rawX, rawY, rotation, unW, unH);\n }, [scale, rotation, unW, unH]);\n\n // ---- Drag to Create Field ----------------------------------------------------------------\n const isCreating = activeTab === 'Forms' && activeTool && activeTool !== 'select';\n\n const handleMouseDown = (e: React.MouseEvent) => {\n if (!isCreating) {\n if (activeTab === 'Forms' && e.target === containerRef.current) {\n setSelectedFieldId(null);\n }\n return;\n }\n e.preventDefault();\n e.stopPropagation();\n const pt = getPdfCoordinates(e);\n setCreationRect({ startX: pt.x, startY: pt.y, curX: pt.x, curY: pt.y });\n };\n\n const handleMouseMove = useCallback((e: MouseEvent) => {\n if (dragRef.current) {\n e.preventDefault();\n const pt = getPdfCoordinates(e);\n const { type, handle, fieldId, startX, startY, initialField } = dragRef.current;\n const dx = pt.x - startX;\n const dy = pt.y - startY;\n\n if (type === 'move') {\n const newX = Math.max(0, Math.min(basePageWidth - initialField.width, initialField.x + dx));\n const newY = Math.max(0, Math.min(basePageHeight - initialField.height, initialField.y + dy));\n formManager.updateField(fieldId, { x: Math.round(newX), y: Math.round(newY) }, false);\n } else if (type === 'resize' && handle) {\n let { x, y, width, height } = initialField;\n if (handle.includes('e')) width = Math.max(30, initialField.width + dx);\n if (handle.includes('s')) height = Math.max(20, initialField.height + dy);\n if (handle.includes('w')) {\n const proposedW = initialField.width - dx;\n if (proposedW >= 30) {\n width = proposedW;\n x = initialField.x + dx;\n }\n }\n if (handle.includes('n')) {\n const proposedH = initialField.height - dy;\n if (proposedH >= 20) {\n height = proposedH;\n y = initialField.y + dy;\n }\n }\n formManager.updateField(fieldId, {\n x: Math.round(x),\n y: Math.round(y),\n width: Math.round(width),\n height: Math.round(height),\n }, false);\n }\n return;\n }\n\n if (creationRect) {\n const pt = getPdfCoordinates(e);\n setCreationRect(prev => prev ? { ...prev, curX: pt.x, curY: pt.y } : null);\n }\n }, [creationRect, getPdfCoordinates, basePageWidth, basePageHeight, formManager]);\n\n const handleMouseUp = useCallback(() => {\n if (dragRef.current) {\n dragRef.current = null;\n }\n\n if (creationRect) {\n const minX = Math.min(creationRect.startX, creationRect.curX);\n const minY = Math.min(creationRect.startY, creationRect.curY);\n const w = Math.abs(creationRect.curX - creationRect.startX);\n const h = Math.abs(creationRect.curY - creationRect.startY);\n\n // Only create if rectangle has reasonable dimensions and active creation tool\n if (activeTool && activeTool !== 'select' && w >= 20 && h >= 15) {\n const defaultLabels: Record<string, string> = {\n textbox: 'Text Field',\n textarea: 'Text Area',\n datetime: 'Date/Time',\n checklist: 'Checklist',\n dropdown: 'Dropdown',\n radio: 'Radio Group',\n signature: 'E-Signature',\n digital_signature: 'Digital Signature',\n };\n\n const existingCount = formManager.getFields().length;\n const targetRoleId = selectedRoleFilter || undefined;\n const isSig = activeTool === 'signature';\n const isDigitalSig = activeTool === 'digital_signature';\n\n const newField: FormField = {\n id: newId(),\n name: `${activeTool}_${existingCount + 1}`,\n label: defaultLabels[activeTool] || 'Field',\n type: activeTool === 'textbox' ? 'text' : (activeTool as any),\n pageIndex: pageNum,\n x: Math.round(minX),\n y: Math.round(minY),\n width: Math.round(w),\n height: Math.round(h),\n required: false,\n roleId: targetRoleId,\n flowOrder: existingCount + 1,\n fontSize: 13,\n textColor: '#0f172a',\n backgroundColor: '#ffffff',\n borderRadius: 3,\n borderWidth: 1,\n options: ['checklist', 'dropdown', 'radio'].includes(activeTool)\n ? ['Option 1', 'Option 2', 'Option 3']\n : undefined,\n dateFormat: activeTool === 'datetime' ? 'datetime' : undefined,\n signatureType: isDigitalSig ? 'digital' : isSig ? 'electronic' : undefined,\n signTagText: isDigitalSig ? 'DIGITAL SIGN' : isSig ? 'SIGN HERE' : undefined,\n };\n\n formManager.addField(newField);\n setSelectedFieldId(newField.id);\n setActiveTool('select');\n }\n\n setCreationRect(null);\n }\n }, [creationRect, activeTool, pageNum, formManager, setActiveTool, selectedRoleFilter]);\n\n useEffect(() => {\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n return () => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n }, [handleMouseMove, handleMouseUp]);\n\n const handleStartMove = (field: FormField, e: React.MouseEvent) => {\n if (activeTab !== 'Forms' || activeTool !== 'select') return;\n e.stopPropagation();\n setSelectedFieldId(field.id);\n const pt = getPdfCoordinates(e);\n dragRef.current = {\n type: 'move',\n fieldId: field.id,\n startX: pt.x,\n startY: pt.y,\n initialField: { ...field },\n };\n };\n\n const handleStartResize = (field: FormField, handle: string, e: React.MouseEvent) => {\n e.stopPropagation();\n const pt = getPdfCoordinates(e);\n dragRef.current = {\n type: 'resize',\n handle,\n fieldId: field.id,\n startX: pt.x,\n startY: pt.y,\n initialField: { ...field },\n };\n };\n\n const handleDuplicateField = (field: FormField, e: React.MouseEvent) => {\n e.stopPropagation();\n const dup: FormField = {\n ...field,\n id: newId(),\n name: `${field.name}_copy`,\n x: Math.min(basePageWidth - field.width, field.x + 20),\n y: Math.min(basePageHeight - field.height, field.y + 20),\n flowOrder: field.flowOrder !== undefined ? field.flowOrder + 1 : undefined,\n };\n formManager.addField(dup);\n setSelectedFieldId(dup.id);\n };\n\n const handleDeleteField = (id: string, e: React.MouseEvent) => {\n e.stopPropagation();\n formManager.deleteField(id);\n if (selectedFieldId === id) setSelectedFieldId(null);\n };\n\n // Keyboard navigation helper for filler inputs\n const handleInputKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Tab') {\n e.preventDefault();\n if (e.shiftKey) {\n formManager.goToPreviousField();\n } else {\n formManager.goToNextField();\n }\n }\n };\n\n // Render Creation Preview Box\n let creationBox = null;\n if (creationRect) {\n const minX = Math.min(creationRect.startX, creationRect.curX);\n const minY = Math.min(creationRect.startY, creationRect.curY);\n const w = Math.abs(creationRect.curX - creationRect.startX);\n const h = Math.abs(creationRect.curY - creationRect.startY);\n const rot = convertToRotatedRect(minX, minY, w, h, rotation, unW, unH);\n\n creationBox = (\n <div\n style={{\n position: 'absolute',\n left: `${rot.x * scale}px`,\n top: `${rot.y * scale}px`,\n width: `${rot.width * scale}px`,\n height: `${rot.height * scale}px`,\n border: '1.5px dashed #0284c7',\n backgroundColor: 'rgba(2, 132, 199, 0.15)',\n pointerEvents: 'none',\n zIndex: 30,\n }}\n />\n );\n }\n\n return (\n <div\n ref={containerRef}\n className=\"tspdf-form-field-layer\"\n onMouseDown={handleMouseDown}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n pointerEvents: activeTab === 'Forms' ? 'auto' : 'none',\n cursor: isCreating ? 'crosshair' : 'default',\n zIndex: 15,\n }}\n >\n {creationBox}\n\n {/* Render All Form Fields for this page */}\n {fields.map((field) => {\n const rot = convertToRotatedRect(field.x, field.y, field.width, field.height, rotation, unW, unH);\n const isSelected = activeTab === 'Forms' && selectedFieldId === field.id;\n const fieldValue = values[field.name] !== undefined ? values[field.name] : (field.defaultValue ?? '');\n\n const role = roles.find((r) => r.id === field.roleId);\n const fieldColor = role?.color || '#64748b';\n const isFilteredOut = Boolean(selectedRoleFilter && field.roleId !== selectedRoleFilter);\n\n // --------------------------------------------------------------------------------------\n // BUILDER MODE PRESENTATION\n // --------------------------------------------------------------------------------------\n if (activeTab === 'Forms') {\n return (\n <div\n key={field.id}\n className=\"tspdf-form-field-builder\"\n onClick={(e) => {\n e.stopPropagation();\n setSelectedFieldId(field.id);\n }}\n onDoubleClick={(e) => {\n e.stopPropagation();\n setEditingField(field);\n }}\n onMouseDown={(e) => handleStartMove(field, e)}\n style={{\n position: 'absolute',\n left: `${rot.x * scale}px`,\n top: `${rot.y * scale}px`,\n width: `${rot.width * scale}px`,\n height: `${rot.height * scale}px`,\n backgroundColor: isSelected ? `${fieldColor}26` : `${fieldColor}12`,\n border: isSelected ? `2px solid ${fieldColor}` : `1.5px dashed ${fieldColor}`,\n borderRadius: `${field.borderRadius ?? 4}px`,\n cursor: 'move',\n zIndex: isSelected ? 25 : 20,\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n padding: '4px 6px',\n boxSizing: 'border-box',\n boxShadow: isSelected ? `0 0 0 2px ${fieldColor}4d` : 'none',\n opacity: isFilteredOut ? 0.35 : 1,\n transition: 'opacity 0.15s ease',\n }}\n >\n {/* Field Label, Flow Order & Role Badge */}\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: '4px', overflow: 'hidden' }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '4px', minWidth: 0, overflow: 'hidden' }}>\n {showFlowOrder && field.flowOrder !== undefined && (\n <span\n style={{\n fontSize: `${Math.max(9, 10 * scale)}px`,\n fontWeight: 700,\n backgroundColor: fieldColor,\n color: '#ffffff',\n padding: '1px 5px',\n borderRadius: '10px',\n flexShrink: 0,\n lineHeight: 1.2,\n }}\n title={`Flow step ${field.flowOrder}`}\n >\n #{field.flowOrder}\n </span>\n )}\n <span\n style={{\n fontSize: `${Math.max(10, 11 * scale)}px`,\n fontWeight: 600,\n color: fieldColor,\n whiteSpace: 'nowrap',\n textOverflow: 'ellipsis',\n overflow: 'hidden',\n }}\n >\n {field.label || field.name}\n {field.required && <span style={{ color: '#ef4444' }}> *</span>}\n </span>\n </div>\n\n <div style={{ display: 'flex', alignItems: 'center', gap: '4px', flexShrink: 0 }}>\n {role ? (\n <span\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '3px',\n fontSize: `${Math.max(8, 9 * scale)}px`,\n backgroundColor: `${fieldColor}22`,\n color: fieldColor,\n border: `1px solid ${fieldColor}44`,\n padding: '1px 5px',\n borderRadius: '10px',\n fontWeight: 600,\n whiteSpace: 'nowrap',\n maxWidth: `${140 * scale}px`,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n title={`Role: ${role.name}`}\n >\n <span style={{ width: '5px', height: '5px', borderRadius: '50%', backgroundColor: fieldColor, flexShrink: 0 }} />\n <span style={{ overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{role.name}</span>\n </span>\n ) : (\n <span\n style={{\n fontSize: `${Math.max(8, 9 * scale)}px`,\n backgroundColor: '#f1f5f9',\n color: '#64748b',\n padding: '1px 5px',\n borderRadius: '3px',\n fontWeight: 500,\n }}\n title=\"Open for anyone to fill\"\n >\n Anyone\n </span>\n )}\n\n <span\n style={{\n fontSize: `${Math.max(8, 9 * scale)}px`,\n backgroundColor: '#e0f2fe',\n color: '#0284c7',\n padding: '1px 4px',\n borderRadius: '3px',\n textTransform: 'uppercase',\n fontWeight: 700,\n }}\n >\n {field.type}\n </span>\n </div>\n </div>\n\n {/* 'Sign Here' Arrow Flag Tag on Signature Placeholders (Builder Mode) */}\n {(field.type === 'signature' || field.type === 'digital_signature') && (\n <div\n style={{\n position: 'absolute',\n top: '-20px',\n left: '0px',\n display: 'flex',\n alignItems: 'center',\n zIndex: 32,\n userSelect: 'none',\n pointerEvents: 'none',\n filter: 'drop-shadow(0 1px 2px rgba(0,0,0,0.15))',\n }}\n >\n <div\n style={{\n backgroundColor: fieldColor,\n color: '#ffffff',\n fontSize: `${Math.max(9, 9.5 * scale)}px`,\n fontWeight: 700,\n padding: '2px 7px',\n borderRadius: '3px 0 0 0',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n letterSpacing: '0.3px',\n lineHeight: 1.2,\n }}\n >\n <span>\n ✍️ {field.signTagText || (field.type === 'digital_signature' ? 'DIGITAL SIGN' : 'SIGN HERE')}\n {role ? ` (${role.name})` : ''}\n </span>\n </div>\n {/* Arrow pointing into the signature box */}\n <div\n style={{\n width: 0,\n height: 0,\n borderTop: '9px solid transparent',\n borderBottom: '9px solid transparent',\n borderLeft: `7px solid ${fieldColor}`,\n }}\n />\n </div>\n )}\n\n {/* Signature Baseline inside Builder Box */}\n {(field.type === 'signature' || field.type === 'digital_signature') && (\n <div\n style={{\n flex: 1,\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'flex-end',\n padding: '2px 4px 4px 4px',\n }}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n borderBottom: `1.5px dashed ${fieldColor}88`,\n paddingBottom: '2px',\n }}\n >\n <span style={{ fontSize: '13px', fontWeight: 'bold', color: fieldColor }}>✕</span>\n <span style={{ fontSize: `${Math.max(9, 10 * scale)}px`, color: '#64748b' }}>\n {field.type === 'digital_signature' ? 'Digital Signature Placeholder' : 'E-Signature Placeholder'}\n </span>\n </div>\n </div>\n )}\n\n {/* Quick floating action bar when selected */}\n {isSelected && (\n <div\n style={{\n position: 'absolute',\n top: '-32px',\n right: 0,\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n backgroundColor: '#ffffff',\n padding: '2px 4px',\n borderRadius: '4px',\n boxShadow: '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)',\n border: '1px solid #e5e7eb',\n zIndex: 35,\n }}\n onMouseDown={(e) => e.stopPropagation()}\n >\n {/* Quick Role Assignment Dropdown */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '3px',\n paddingRight: '6px',\n borderRight: '1px solid #e5e7eb',\n }}\n >\n <User size={13} color={fieldColor} />\n <select\n value={field.roleId || ''}\n onChange={(e) => {\n e.stopPropagation();\n const nextId = e.target.value || undefined;\n const nextRole = roles.find((r) => r.id === nextId);\n formManager.updateField(field.id, {\n roleId: nextId,\n borderColor: nextRole ? nextRole.color : undefined,\n });\n }}\n style={{\n fontSize: '11px',\n fontWeight: 600,\n padding: '1px 4px',\n borderRadius: '3px',\n border: `1px solid ${fieldColor}66`,\n backgroundColor: '#f8fafc',\n color: fieldColor,\n cursor: 'pointer',\n outline: 'none',\n height: '22px',\n }}\n title=\"Assign this field to a role\"\n >\n <option value=\"\">Anyone</option>\n {roles.map((r) => (\n <option key={r.id} value={r.id}>\n {r.name}\n </option>\n ))}\n </select>\n </div>\n\n <button\n type=\"button\"\n title=\"Edit Field Properties\"\n onClick={(e) => {\n e.stopPropagation();\n setEditingField(field);\n }}\n style={{\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n padding: '4px',\n color: fieldColor,\n }}\n >\n <Settings size={14} />\n </button>\n <button\n type=\"button\"\n title=\"Duplicate Field\"\n onClick={(e) => handleDuplicateField(field, e)}\n style={{\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n padding: '4px',\n color: '#4b5563',\n }}\n >\n <Copy size={14} />\n </button>\n <button\n type=\"button\"\n title=\"Delete Field (Del / Backspace)\"\n onClick={(e) => handleDeleteField(field.id, e)}\n style={{\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n padding: '4px',\n color: '#ef4444',\n }}\n >\n <Trash2 size={14} />\n </button>\n </div>\n )}\n\n {/* 8 Resize Handles */}\n {isSelected && (\n <>\n {['nw', 'n', 'ne', 'e', 'se', 's', 'sw', 'w'].map((handle) => {\n const handleStyle: React.CSSProperties = {\n position: 'absolute',\n width: '7px',\n height: '7px',\n backgroundColor: '#ffffff',\n border: `1.5px solid ${fieldColor}`,\n borderRadius: '1px',\n zIndex: 30,\n };\n if (handle.includes('n')) handleStyle.top = '-4px';\n if (handle.includes('s')) handleStyle.bottom = '-4px';\n if (handle.includes('w')) handleStyle.left = '-4px';\n if (handle.includes('e')) handleStyle.right = '-4px';\n if (handle === 'n' || handle === 's') handleStyle.left = 'calc(50% - 3.5px)';\n if (handle === 'w' || handle === 'e') handleStyle.top = 'calc(50% - 3.5px)';\n\n const cursors: Record<string, string> = {\n nw: 'nwse-resize',\n n: 'ns-resize',\n ne: 'nesw-resize',\n e: 'ew-resize',\n se: 'nwse-resize',\n s: 'ns-resize',\n sw: 'nesw-resize',\n w: 'ew-resize',\n };\n handleStyle.cursor = cursors[handle];\n\n return (\n <div\n key={handle}\n style={handleStyle}\n onMouseDown={(e) => handleStartResize(field, handle, e)}\n />\n );\n })}\n </>\n )}\n </div>\n );\n }\n\n // --------------------------------------------------------------------------------------\n // FILLER MODE PRESENTATION (View Tab)\n // --------------------------------------------------------------------------------------\n const isAssignedToOther = currentRoleId !== null && !!field.roleId && field.roleId !== currentRoleId;\n // If otherRoleFieldsMode is 'hidden', do not render other roles' fields\n if (isAssignedToOther && options.otherRoleFieldsMode === 'hidden') {\n return null;\n }\n\n const effectiveCanFill = canFillForms && options.canFillForms !== false;\n const isReadOnly = !effectiveCanFill || field.readOnly || isAssignedToOther;\n const isActive = activeFieldId === field.id;\n\n // Custom styled dimensions and appearance\n const effectiveFontSizePx = Math.max(10, (field.fontSize || 13) * scale);\n const effectiveFontFamily = field.fontFamily || 'inherit';\n const effectiveFontWeight = field.fontWeight || 'normal';\n const effectiveFontStyle = field.fontStyle || 'normal';\n const effectiveTextAlign = field.textAlign || 'left';\n\n const effectiveTextColor = isAssignedToOther\n ? '#94a3b8'\n : field.textColor || '#0f172a';\n\n const effectiveBgColor = isAssignedToOther\n ? 'rgba(241, 245, 249, 0.8)'\n : field.backgroundColor === 'transparent'\n ? 'transparent'\n : field.backgroundColor || '#ffffff';\n\n const effectiveBorderColor = isAssignedToOther\n ? '#cbd5e1'\n : role\n ? (field.borderColor || role.color)\n : (field.borderColor && !roles.some((r) => r.color === field.borderColor) ? field.borderColor : '#94a3b8');\n\n const effectiveBorderWidth = field.borderWidth ?? 1.5;\n const effectiveBorderRadius = field.borderRadius ?? 3;\n\n const isSignature = field.type === 'signature' || field.type === 'digital_signature';\n const sigVal: FormSignatureValue | null =\n typeof fieldValue === 'object' && fieldValue !== null\n ? fieldValue\n : fieldValue\n ? {\n type: field.type === 'digital_signature' ? 'digital' : 'electronic',\n dataUrl: typeof fieldValue === 'string' && fieldValue.startsWith('data:') ? fieldValue : undefined,\n signerName: typeof fieldValue === 'string' ? fieldValue : undefined,\n }\n : null;\n const isSigned = Boolean(sigVal && (sigVal.dataUrl || sigVal.signerName || (sigVal as any).imageUrl));\n\n const baseInputStyle: React.CSSProperties = {\n width: '100%',\n height: '100%',\n fontSize: `${effectiveFontSizePx}px`,\n fontFamily: effectiveFontFamily,\n fontWeight: effectiveFontWeight,\n fontStyle: effectiveFontStyle,\n textAlign: effectiveTextAlign,\n color: effectiveTextColor,\n backgroundColor: effectiveBgColor,\n border: `${effectiveBorderWidth}px solid ${effectiveBorderColor}`,\n borderRadius: `${effectiveBorderRadius}px`,\n boxSizing: 'border-box',\n outline: 'none',\n boxShadow: isActive\n ? `0 0 0 2.5px ${fieldColor}80`\n : isAssignedToOther\n ? 'none'\n : '0 1px 2px rgba(0, 0, 0, 0.05)',\n cursor: isReadOnly ? 'not-allowed' : 'text',\n transition: 'box-shadow 0.15s ease, border-color 0.15s ease',\n };\n\n const handleFocus = () => {\n formManager.setActiveFieldId(field.id);\n };\n\n return (\n <div\n key={field.id}\n style={{\n position: 'absolute',\n left: `${rot.x * scale}px`,\n top: `${rot.y * scale}px`,\n width: `${rot.width * scale}px`,\n height: `${rot.height * scale}px`,\n zIndex: isActive ? 22 : 16,\n boxSizing: 'border-box',\n pointerEvents: 'auto',\n }}\n >\n {/* Field Header Badge for View (Filler) Mode */}\n {!isSignature ? (\n <div\n style={{\n position: 'absolute',\n top: rot.y * scale < 22 ? `${rot.height * scale + 2}px` : '-19px',\n left: '0px',\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n backgroundColor: '#ffffff',\n color: isAssignedToOther ? '#64748b' : fieldColor,\n border: `1px solid ${isAssignedToOther ? '#cbd5e1' : `${fieldColor}99`}`,\n fontSize: `${Math.max(8.5, 9.5 * scale)}px`,\n padding: '1px 6px',\n borderRadius: '3px',\n pointerEvents: 'none',\n zIndex: 25,\n boxShadow: '0 1px 2px rgba(0,0,0,0.08)',\n lineHeight: 1.3,\n whiteSpace: 'nowrap',\n maxWidth: `${Math.max(220, rot.width * scale * 1.5)}px`,\n }}\n >\n {isAssignedToOther && options.otherRoleFieldsMode !== 'view-only' && (\n <Lock size={10} style={{ flexShrink: 0, color: '#64748b' }} />\n )}\n\n {showFlowOrder && field.flowOrder !== undefined && (\n <span\n style={{\n backgroundColor: isAssignedToOther ? '#94a3b8' : fieldColor,\n color: '#ffffff',\n fontSize: `${Math.max(7.5, 8.5 * scale)}px`,\n fontWeight: 700,\n padding: '0 4px',\n borderRadius: '8px',\n lineHeight: 1.2,\n flexShrink: 0,\n }}\n title={`Step #${field.flowOrder}`}\n >\n #{field.flowOrder}\n </span>\n )}\n\n {/* Field Label / Name */}\n <span\n style={{\n fontWeight: 700,\n color: isAssignedToOther ? '#64748b' : '#0f172a',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n title={field.label || field.name}\n >\n {field.label || field.name}\n {field.required && <span style={{ color: '#ef4444' }}> *</span>}\n </span>\n\n {/* Role Badge */}\n {role ? (\n <span\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '3px',\n backgroundColor: `${fieldColor}18`,\n color: fieldColor,\n fontSize: `${Math.max(7.5, 8.5 * scale)}px`,\n fontWeight: 600,\n padding: '0 4px',\n borderRadius: '10px',\n flexShrink: 0,\n marginLeft: '2px',\n }}\n title={`Role: ${role.name}`}\n >\n <span style={{ width: '4px', height: '4px', borderRadius: '50%', backgroundColor: fieldColor }} />\n {role.name}\n </span>\n ) : (\n <span\n style={{\n backgroundColor: '#f1f5f9',\n color: '#64748b',\n fontSize: `${Math.max(7.5, 8.5 * scale)}px`,\n fontWeight: 500,\n padding: '0 3px',\n borderRadius: '3px',\n flexShrink: 0,\n marginLeft: '2px',\n }}\n title=\"Anyone can fill this field\"\n >\n Anyone\n </span>\n )}\n </div>\n ) : (\n /* Signature Flag Tag with arrow pointing directly into signature box */\n <div\n style={{\n position: 'absolute',\n top: rot.y * scale < 22 ? `${rot.height * scale + 2}px` : '-20px',\n left: '0px',\n display: 'inline-flex',\n alignItems: 'center',\n zIndex: 26,\n userSelect: 'none',\n pointerEvents: 'none',\n filter: 'drop-shadow(0 1px 2px rgba(0,0,0,0.15))',\n }}\n >\n <div\n style={{\n backgroundColor: isSigned ? '#16a34a' : isAssignedToOther ? '#64748b' : fieldColor,\n color: '#ffffff',\n fontSize: `${Math.max(9, 9.5 * scale)}px`,\n fontWeight: 700,\n padding: '2px 7px',\n borderRadius: '3px 0 0 0',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n letterSpacing: '0.3px',\n lineHeight: 1.2,\n maxWidth: `${Math.max(220, rot.width * scale * 1.5)}px`,\n }}\n >\n {isAssignedToOther && options.otherRoleFieldsMode !== 'view-only' && <Lock size={10} style={{ flexShrink: 0 }} />}\n {showFlowOrder && field.flowOrder !== undefined && (\n <span\n style={{\n backgroundColor: 'rgba(255, 255, 255, 0.25)',\n color: '#ffffff',\n fontSize: `${Math.max(7.5, 8.5 * scale)}px`,\n fontWeight: 800,\n padding: '0 4px',\n borderRadius: '6px',\n lineHeight: 1.2,\n marginRight: '2px',\n flexShrink: 0,\n }}\n title={`Step #${field.flowOrder}`}\n >\n #{field.flowOrder}\n </span>\n )}\n {isSigned ? (\n <>\n <Check size={11} strokeWidth={3} style={{ flexShrink: 0 }} />\n <span style={{ overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>\n SIGNED{field.label ? `: ${field.label}` : ''}\n </span>\n </>\n ) : (\n <span style={{ overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>\n ✍️ {field.signTagText || (field.type === 'digital_signature' ? 'DIGITAL SIGN' : 'SIGN HERE')}\n {field.label && field.label !== field.signTagText ? ` · ${field.label}` : ''}\n {role ? ` (${role.name})` : ''}\n {field.required && <span style={{ color: '#fca5a5' }}> *</span>}\n </span>\n )}\n </div>\n {/* Arrow pointing into the signature box */}\n <div\n style={{\n width: 0,\n height: 0,\n borderTop: '9px solid transparent',\n borderBottom: '9px solid transparent',\n borderLeft: `7px solid ${isSigned ? '#16a34a' : isAssignedToOther ? '#64748b' : fieldColor}`,\n }}\n />\n </div>\n )}\n\n {/* Page Margin Sticky / Index Flag for Signature — only for current role's fields */}\n {isSignature && activeTab === 'View' && options.showSignatureFlags !== false && (!currentRoleId || !field.roleId || field.roleId === currentRoleId) && (\n <div\n className=\"tspdf-page-sticky-flag\"\n onClick={(e) => {\n e.stopPropagation();\n if (!isReadOnly) {\n setSigningField(field);\n }\n }}\n style={{\n position: 'absolute',\n right: '-8px',\n top: '50%',\n transform: 'translateY(-50%) translateX(100%)',\n zIndex: 26,\n cursor: isReadOnly ? 'default' : 'pointer',\n userSelect: 'none',\n }}\n title={\n isSigned\n ? `Signed: ${field.label || 'Signature'}`\n : `Click to sign: ${field.label || 'Signature'}`\n }\n >\n <div\n style={{\n backgroundColor: isSigned ? '#16a34a' : fieldColor,\n color: '#ffffff',\n padding: '4px 10px',\n borderRadius: '14px',\n fontSize: `${Math.max(9, 10 * scale)}px`,\n fontWeight: 600,\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n whiteSpace: 'nowrap',\n boxShadow: '0 1px 4px rgba(0,0,0,0.15)',\n }}\n >\n {isSigned ? (\n <>\n <Check size={11} strokeWidth={3} />\n <span>Signed</span>\n </>\n ) : (\n <>\n <PenTool size={10} />\n <span>Sign</span>\n </>\n )}\n </div>\n </div>\n )}\n\n {/* Textbox Input */}\n {(field.type === 'text' || (field.type as string) === 'textbox') && (\n <input\n id={`tspdf-field-${field.id}`}\n type=\"text\"\n disabled={isReadOnly}\n value={fieldValue}\n placeholder={field.placeholder || field.label || ''}\n title={isAssignedToOther ? `Locked: Belongs to ${role?.name || 'another role'}` : role ? `Role: ${role.name}` : undefined}\n onChange={(e) => formManager.setValue(field.name, e.target.value)}\n onFocus={handleFocus}\n onKeyDown={handleInputKeyDown}\n style={{\n ...baseInputStyle,\n padding: `${2 * scale}px ${6 * scale}px`,\n }}\n />\n )}\n\n {/* Text Area Input */}\n {field.type === 'textarea' && (\n <textarea\n id={`tspdf-field-${field.id}`}\n disabled={isReadOnly}\n value={fieldValue}\n placeholder={field.placeholder || field.label || ''}\n title={isAssignedToOther ? `Locked: Belongs to ${role?.name || 'another role'}` : role ? `Role: ${role.name}` : undefined}\n onChange={(e) => formManager.setValue(field.name, e.target.value)}\n onFocus={handleFocus}\n onKeyDown={handleInputKeyDown}\n style={{\n ...baseInputStyle,\n resize: 'none',\n padding: `${4 * scale}px ${6 * scale}px`,\n }}\n />\n )}\n\n {/* Date and Time Picker */}\n {field.type === 'datetime' && (\n <input\n id={`tspdf-field-${field.id}`}\n type={field.dateFormat === 'date' ? 'date' : field.dateFormat === 'time' ? 'time' : 'datetime-local'}\n disabled={isReadOnly}\n value={fieldValue}\n title={isAssignedToOther ? `Locked: Belongs to ${role?.name || 'another role'}` : role ? `Role: ${role.name}` : undefined}\n onChange={(e) => formManager.setValue(field.name, e.target.value)}\n onFocus={handleFocus}\n onKeyDown={handleInputKeyDown}\n style={{\n ...baseInputStyle,\n padding: `${2 * scale}px ${6 * scale}px`,\n }}\n />\n )}\n\n {/* Check List (Multi-item list with checkboxes) */}\n {field.type === 'checklist' && (\n <div\n id={`tspdf-field-${field.id}`}\n tabIndex={isReadOnly ? -1 : 0}\n onFocus={handleFocus}\n onKeyDown={handleInputKeyDown}\n title={isAssignedToOther ? `Locked: Belongs to ${role?.name || 'another role'}` : role ? `Role: ${role.name}` : undefined}\n style={{\n ...baseInputStyle,\n padding: `${4 * scale}px ${6 * scale}px`,\n overflowY: 'auto',\n display: 'flex',\n flexDirection: 'column',\n gap: `${2 * scale}px`,\n cursor: isReadOnly ? 'not-allowed' : 'default',\n }}\n >\n {(field.options && field.options.length > 0 ? field.options : ['Check item']).map((opt, oIdx) => {\n const currentCheckedList: string[] = Array.isArray(fieldValue) ? fieldValue : [];\n const isChecked = currentCheckedList.includes(opt);\n\n return (\n <label\n key={oIdx}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: `${4 * scale}px`,\n fontSize: `${effectiveFontSizePx}px`,\n fontFamily: effectiveFontFamily,\n color: effectiveTextColor,\n cursor: isReadOnly ? 'not-allowed' : 'pointer',\n userSelect: 'none',\n }}\n >\n <input\n type=\"checkbox\"\n disabled={isReadOnly}\n checked={isChecked}\n onChange={(e) => {\n if (e.target.checked) {\n formManager.setValue(field.name, [...currentCheckedList, opt]);\n } else {\n formManager.setValue(field.name, currentCheckedList.filter((item) => item !== opt));\n }\n }}\n style={{\n cursor: isReadOnly ? 'not-allowed' : 'pointer',\n accentColor: fieldColor,\n }}\n />\n <span>{opt}</span>\n </label>\n );\n })}\n </div>\n )}\n\n {/* Single Checkbox */}\n {field.type === 'checkbox' && (\n <div\n id={`tspdf-field-${field.id}`}\n tabIndex={isReadOnly ? -1 : 0}\n onFocus={handleFocus}\n onKeyDown={handleInputKeyDown}\n title={isAssignedToOther ? `Locked: Belongs to ${role?.name || 'another role'}` : role ? `Role: ${role.name}` : undefined}\n style={{\n ...baseInputStyle,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n cursor: isReadOnly ? 'not-allowed' : 'pointer',\n }}\n onClick={() => {\n if (!isReadOnly) {\n formManager.setValue(field.name, !fieldValue);\n }\n }}\n >\n <input\n type=\"checkbox\"\n disabled={isReadOnly}\n checked={Boolean(fieldValue)}\n onChange={(e) => formManager.setValue(field.name, e.target.checked)}\n style={{\n width: '75%',\n height: '75%',\n cursor: isReadOnly ? 'not-allowed' : 'pointer',\n accentColor: fieldColor,\n }}\n />\n </div>\n )}\n\n {/* Dropdown Select */}\n {field.type === 'dropdown' && (\n <select\n id={`tspdf-field-${field.id}`}\n disabled={isReadOnly}\n value={fieldValue}\n title={isAssignedToOther ? `Locked: Belongs to ${role?.name || 'another role'}` : role ? `Role: ${role.name}` : undefined}\n onChange={(e) => formManager.setValue(field.name, e.target.value)}\n onFocus={handleFocus}\n onKeyDown={handleInputKeyDown}\n style={{\n ...baseInputStyle,\n padding: `${2 * scale}px ${4 * scale}px`,\n cursor: isReadOnly ? 'not-allowed' : 'pointer',\n }}\n >\n <option value=\"\">{field.placeholder || (field.label ? `-- Select ${field.label} --` : '-- Select --')}</option>\n {(field.options || []).map((opt, oIdx) => (\n <option key={oIdx} value={opt}>\n {opt}\n </option>\n ))}\n </select>\n )}\n\n {/* Radio Group */}\n {field.type === 'radio' && (\n <div\n id={`tspdf-field-${field.id}`}\n tabIndex={isReadOnly ? -1 : 0}\n onFocus={handleFocus}\n onKeyDown={handleInputKeyDown}\n style={{\n ...baseInputStyle,\n padding: `${4 * scale}px ${6 * scale}px`,\n overflowY: 'auto',\n display: 'flex',\n flexDirection: 'column',\n gap: `${2 * scale}px`,\n cursor: isReadOnly ? 'not-allowed' : 'default',\n }}\n >\n {(field.options || []).map((opt, oIdx) => (\n <label\n key={oIdx}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: `${4 * scale}px`,\n fontSize: `${effectiveFontSizePx}px`,\n fontFamily: effectiveFontFamily,\n color: effectiveTextColor,\n cursor: isReadOnly ? 'not-allowed' : 'pointer',\n userSelect: 'none',\n }}\n >\n <input\n type=\"radio\"\n name={`radio-${field.name}`}\n disabled={isReadOnly}\n checked={fieldValue === opt}\n onChange={() => formManager.setValue(field.name, opt)}\n style={{\n cursor: isReadOnly ? 'not-allowed' : 'pointer',\n accentColor: fieldColor,\n }}\n />\n <span>{opt}</span>\n </label>\n ))}\n </div>\n )}\n\n {/* Signature & Digital Signature Interactive Field */}\n {isSignature && (\n <div\n id={`tspdf-field-${field.id}`}\n tabIndex={isReadOnly ? -1 : 0}\n onFocus={handleFocus}\n onKeyDown={(e) => {\n handleInputKeyDown(e);\n if (!isReadOnly && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault();\n setSigningField(field);\n }\n }}\n onClick={() => {\n if (!isReadOnly) {\n setSigningField(field);\n }\n }}\n style={{\n ...baseInputStyle,\n cursor: isReadOnly ? 'not-allowed' : 'pointer',\n border: isSigned\n ? `1.5px solid ${isActive ? fieldColor : '#cbd5e1'}`\n : `1.5px dashed ${isActive ? fieldColor : fieldColor}`,\n backgroundColor: isSigned\n ? (effectiveBgColor || '#ffffff')\n : isAssignedToOther\n ? 'rgba(241, 245, 249, 0.8)'\n : 'rgba(240, 249, 255, 0.5)',\n padding: `${2 * scale}px ${4 * scale}px`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n position: 'relative',\n overflow: 'hidden',\n userSelect: 'none',\n }}\n title={isReadOnly ? 'Field is locked' : isSigned ? 'Click to view or change signature' : 'Click to sign'}\n >\n {isSigned && sigVal ? (\n /* SIGNED STATE */\n sigVal.type === 'digital' || field.type === 'digital_signature' ? (\n /* Digital Certificate Seal */\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: `${6 * scale}px`,\n width: '100%',\n height: '100%',\n padding: '1px 2px',\n boxSizing: 'border-box',\n }}\n >\n <div\n style={{\n width: `${26 * scale}px`,\n height: `${26 * scale}px`,\n borderRadius: '50%',\n backgroundColor: '#0284c7',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: '#ffffff',\n flexShrink: 0,\n }}\n >\n <ShieldCheck size={Math.max(13, 15 * scale)} />\n </div>\n <div style={{ flex: 1, minWidth: 0, overflow: 'hidden', lineHeight: 1.25 }}>\n <div\n style={{\n fontSize: `${Math.max(9.5, 11 * scale)}px`,\n fontWeight: 700,\n color: '#0f172a',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n >\n {field.label ? `${field.label}: ` : ''}Digitally signed by {sigVal.signerName || 'Authorized Signer'}\n </div>\n <div\n style={{\n fontSize: `${Math.max(8, 9 * scale)}px`,\n color: '#475569',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n >\n {sigVal.timestamp ? new Date(sigVal.timestamp).toLocaleString('en-GB') : 'Verified'}{' '}\n {sigVal.reason ? `· ${sigVal.reason}` : ''}\n </div>\n {sigVal.certificateHash && (\n <div\n style={{\n fontSize: `${Math.max(7, 8 * scale)}px`,\n color: '#0369a1',\n fontFamily: 'monospace',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n >\n SHA-256: {sigVal.certificateHash.slice(0, 16)}...\n </div>\n )}\n </div>\n </div>\n ) : (\n /* Electronic Signature Image */\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n }}\n >\n {sigVal.dataUrl || (sigVal as any).imageUrl ? (\n <img\n src={sigVal.dataUrl || (sigVal as any).imageUrl}\n alt=\"Signature\"\n style={{\n maxHeight: '75%',\n maxWidth: '92%',\n objectFit: 'contain',\n display: 'block',\n }}\n />\n ) : (\n <span style={{ fontSize: `${Math.max(12, 15 * scale)}px`, fontFamily: 'cursive', color: effectiveTextColor }}>\n {sigVal.signerName || 'Signed'}\n </span>\n )}\n {sigVal.signerName && (\n <span\n style={{\n fontSize: `${Math.max(7.5, 8.5 * scale)}px`,\n color: '#64748b',\n lineHeight: 1,\n whiteSpace: 'nowrap',\n marginTop: '2px',\n }}\n >\n Digitally signed by {sigVal.signerName}{field.label ? ` · ${field.label}` : ''}\n </span>\n )}\n </div>\n )\n ) : (\n /* UNSIGNED PLACEHOLDER STATE */\n <div\n style={{\n width: '100%',\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n position: 'relative',\n }}\n >\n {/* Baseline indicator */}\n <div\n style={{\n position: 'absolute',\n left: '6px',\n right: '6px',\n bottom: `${5 * scale}px`,\n borderBottom: `1.5px dashed ${fieldColor}66`,\n display: 'flex',\n alignItems: 'center',\n }}\n >\n <span style={{ fontSize: `${Math.max(9, 11 * scale)}px`, color: fieldColor, fontWeight: 'bold' }}>✕</span>\n </div>\n\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: `${5 * scale}px`,\n color: isAssignedToOther ? '#94a3b8' : fieldColor,\n fontSize: `${Math.max(9.5, 11 * scale)}px`,\n fontWeight: 600,\n zIndex: 2,\n }}\n >\n {field.type === 'digital_signature' ? (\n <ShieldCheck size={Math.max(12, 14 * scale)} />\n ) : (\n <PenTool size={Math.max(12, 14 * scale)} />\n )}\n <span>\n {isAssignedToOther\n ? `Assigned to ${role ? role.name : 'other role'}`\n : `Click to sign ${field.type === 'digital_signature' ? 'digitally' : 'electronically'}`}\n {field.label && <span style={{ opacity: 0.85, fontWeight: 500 }}> ({field.label})</span>}\n </span>\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n );\n })}\n\n {/* Field Properties Configuration Modal */}\n {editingField && (\n <div style={{ pointerEvents: 'auto' }}>\n <FormFieldEditorModal\n field={editingField}\n roles={roles}\n onAddRole={(newRole) => formManager.addRole(newRole)}\n onSave={(updates) => {\n formManager.updateField(editingField.id, updates);\n setEditingField(null);\n }}\n onClose={() => setEditingField(null)}\n />\n </div>\n )}\n\n {/* Signature Capture Modal */}\n {signingField && (\n <div style={{ pointerEvents: 'auto' }}>\n <FormSignatureModal\n field={signingField}\n role={roles.find((r) => r.id === signingField.roleId)}\n currentUser={formManager.getCurrentUser()}\n currentValue={values[signingField.name]}\n defaultSignerName={formManager.getEffectiveSignerName() || ''}\n onSave={(val) => {\n formManager.setValue(signingField.name, val);\n setSigningField(null);\n }}\n onClear={() => {\n formManager.setValue(signingField.name, null);\n setSigningField(null);\n }}\n onClose={() => setSigningField(null)}\n />\n </div>\n )}\n </div>\n );\n};\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\nimport React, { useEffect, useRef, useState } from 'react';\nimport * as pdfjsLib from 'pdfjs-dist';\nimport { type SearchResult } from '../hooks/usePdfSearch';\nimport type { Redaction, WatermarkOptions, TransientHighlight } from '../core/types';\nimport type { Annotation } from '../annotations/types';\nimport { getRotationTransform, convertToRotatedRect, normalizeRotation } from '../utils/rotationUtils';\nimport { calculateSafeRenderScale } from '../utils/zoomUtils';\nimport { FormFieldLayer } from './FormFieldLayer';\nimport type { FormManager } from '../forms/FormManager';\nimport type { FormToolType } from '../forms/types';\n\nexport type { Annotation };\n\ninterface PageRendererProps {\n pageNum: number;\n pdfDoc: pdfjsLib.PDFDocumentProxy;\n scale: number;\n rotation: number;\n containerWidth: number;\n containerHeight: number;\n scrollTop: number;\n scrollLeft: number;\n pageTop: number;\n pageLeft?: number;\n basePageWidth: number;\n basePageHeight: number;\n \n // App state\n activeTab: string;\n activeTool: string | null;\n annotations: Annotation[];\n selectedAnnotationId: string | null;\n activeSearchResult: SearchResult | null;\n transientHighlights?: TransientHighlight[];\n\n // Handlers\n onMouseDown: (e: React.MouseEvent<Element>, pageNum: number) => void;\n onMouseMove: (e: React.MouseEvent<Element>, pageNum: number) => void;\n onMouseUp: (e: React.MouseEvent<Element>, pageNum: number) => void;\n onAnnotationClick: (id: string, e: React.MouseEvent) => void;\n onAnnotationDoubleClick?: (id: string, e: React.MouseEvent) => void;\n onStartResize?: (id: string, handle: string, e: React.MouseEvent, pageNum: number) => void;\n onStartMove?: (id: string, e: React.MouseEvent, pageNum: number) => void;\n onAnnotationMouseEnter: (id: string) => void;\n onClearSelection: () => void;\n watermark?: WatermarkOptions;\n watermarkText?: string;\n redactions?: Redaction[];\n onDiscardRedaction?: (redaction: Redaction) => void;\n /** Called after the page canvas has been painted (used for first-page-rendered telemetry). */\n onRendered?: (pageNum: number) => void;\n /** Whether to hide annotations and transient highlights until the page canvas has finished rendering. Default: true. */\n hideAnnotationsUntilPageRendered?: boolean;\n onLinkClick?: (url: string, annotation?: Annotation, e?: React.MouseEvent) => void;\n formManager?: FormManager;\n activeFormTool?: FormToolType;\n setActiveFormTool?: (tool: FormToolType) => void;\n canFillForms?: boolean;\n showFlowOrder?: boolean;\n selectedRoleFilter?: string | null;\n}\n\nfunction PageRendererComponent({\n pageNum, pdfDoc, scale, rotation, containerWidth: _containerWidth, containerHeight: _containerHeight,\n scrollTop: _scrollTop, scrollLeft: _scrollLeft, pageTop, pageLeft = 0, basePageWidth, basePageHeight,\n activeTab, activeTool, annotations, selectedAnnotationId, activeSearchResult, transientHighlights,\n onMouseDown, onMouseMove, onMouseUp, onAnnotationClick, onAnnotationDoubleClick, onStartResize, onStartMove,\n onAnnotationMouseEnter, onClearSelection,\n watermark, watermarkText, redactions, onDiscardRedaction, onRendered,\n hideAnnotationsUntilPageRendered = true, onLinkClick,\n formManager, activeFormTool = 'select', setActiveFormTool, canFillForms = true,\n showFlowOrder = true, selectedRoleFilter = null\n}: PageRendererProps) {\n const onRenderedRef = useRef(onRendered);\n useEffect(() => {\n onRenderedRef.current = onRendered;\n }, [onRendered]);\n const pageContainerRef = useRef<HTMLDivElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const textLayerRef = useRef<HTMLDivElement>(null);\n const renderTaskRef = useRef<any>(null);\n const pageProxyRef = useRef<pdfjsLib.PDFPageProxy | null>(null);\n const hasRenderedOnceRef = useRef(false);\n const [isCanvasRendered, setIsCanvasRendered] = useState(false);\n const [textContent, setTextContent] = useState<any>(null);\n\n // Virtualization: only allocate heavy GPU canvas memory when page is in or near viewport (800px buffer)\n const [isInViewport, setIsInViewport] = useState<boolean>(() => {\n return typeof IntersectionObserver === 'undefined' || pageNum === 1;\n });\n\n useEffect(() => {\n if (typeof IntersectionObserver === 'undefined') {\n setIsInViewport(true);\n return;\n }\n const el = pageContainerRef.current;\n if (!el) return;\n\n const observer = new IntersectionObserver(\n (entries) => {\n const entry = entries[0];\n if (entry) {\n setIsInViewport(entry.isIntersecting);\n }\n },\n {\n rootMargin: '800px 0px 800px 0px',\n threshold: 0,\n }\n );\n\n observer.observe(el);\n return () => {\n observer.disconnect();\n };\n }, [pageNum]);\n\n // When scrolling far out of viewport, free GPU canvas backbuffer textures and text layer nodes\n useEffect(() => {\n if (!isInViewport) {\n if (renderTaskRef.current) {\n try { renderTaskRef.current.cancel(); } catch {}\n renderTaskRef.current = null;\n }\n const canvas = canvasRef.current;\n if (canvas && hasRenderedOnceRef.current) {\n canvas.width = 0;\n canvas.height = 0;\n hasRenderedOnceRef.current = false;\n setIsCanvasRendered(false);\n }\n if (textLayerRef.current) {\n textLayerRef.current.innerHTML = '';\n }\n }\n }, [isInViewport]);\n\n const scaledWidth = basePageWidth * scale;\n const scaledHeight = basePageHeight * scale;\n\n const [prevDocAndPage, setPrevDocAndPage] = useState({ pdfDoc, pageNum, rotation });\n if (prevDocAndPage.pdfDoc !== pdfDoc || prevDocAndPage.pageNum !== pageNum || prevDocAndPage.rotation !== rotation) {\n setPrevDocAndPage({ pdfDoc, pageNum, rotation });\n setIsCanvasRendered(false);\n }\n\n useEffect(() => {\n hasRenderedOnceRef.current = false;\n }, [pdfDoc, pageNum, rotation]);\n\n // Intersection logic for canvas rendering (tile rendering to save memory)\n useEffect(() => {\n let isCancelled = false;\n let timer: any = null;\n\n const renderCanvas = async () => {\n if (!canvasRef.current || !pdfDoc || !isInViewport) return;\n if (renderTaskRef.current) {\n try { renderTaskRef.current.cancel(); } catch {}\n renderTaskRef.current = null;\n }\n\n let currentPage: pdfjsLib.PDFPageProxy | null = null;\n try {\n const page = await pdfDoc.getPage(pageNum);\n if (isCancelled) {\n try { page.cleanup?.(); } catch {}\n return;\n }\n currentPage = page;\n pageProxyRef.current = page;\n\n const outputScale = Math.min(window.devicePixelRatio || 1, 2);\n const normalizedRot = normalizeRotation(page.rotate + rotation);\n const unscaledViewport = page.getViewport({ scale: 1.0, rotation: normalizedRot });\n\n let renderScale = calculateSafeRenderScale(\n scale,\n outputScale,\n unscaledViewport.width,\n unscaledViewport.height\n );\n\n let viewport = page.getViewport({ scale: renderScale, rotation: normalizedRot });\n\n const tempCanvas = document.createElement('canvas');\n tempCanvas.width = Math.floor(viewport.width);\n tempCanvas.height = Math.floor(viewport.height);\n let ctx = tempCanvas.getContext('2d');\n if (!ctx) {\n // If GPU canvas memory allocation fails, fall back to safe half scale\n renderScale = renderScale * 0.5;\n viewport = page.getViewport({ scale: renderScale, rotation: normalizedRot });\n tempCanvas.width = Math.floor(viewport.width);\n tempCanvas.height = Math.floor(viewport.height);\n ctx = tempCanvas.getContext('2d');\n }\n if (!ctx || isCancelled) {\n tempCanvas.width = 0;\n tempCanvas.height = 0;\n return;\n }\n\n const renderTask = page.render({\n canvasContext: ctx,\n canvas: tempCanvas,\n viewport: viewport\n });\n renderTaskRef.current = renderTask;\n await renderTask.promise;\n renderTaskRef.current = null;\n \n // --- Pixel Masking (Redactions) ---\n if (redactions && redactions.length > 0) {\n ctx.save();\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n const unW = rotation % 180 === 0 ? basePageWidth : basePageHeight;\n const unH = rotation % 180 === 0 ? basePageHeight : basePageWidth;\n \n for (const redaction of redactions) {\n if (redaction.pageIndex === pageNum) {\n const rotRect = convertToRotatedRect(redaction.x, redaction.y, redaction.width, redaction.height, rotation, unW, unH);\n const vX = rotRect.x * renderScale;\n const vY = rotRect.y * renderScale;\n const vW = rotRect.width * renderScale;\n const vH = rotRect.height * renderScale;\n \n if (redaction.status === 'applied' || redaction.status === undefined) {\n ctx.fillStyle = '#000000';\n ctx.fillRect(Math.floor(vX), Math.floor(vY), Math.ceil(vW), Math.ceil(vH));\n } else {\n ctx.fillStyle = 'rgba(0, 0, 0, 0.45)';\n ctx.fillRect(Math.floor(vX), Math.floor(vY), Math.ceil(vW), Math.ceil(vH));\n ctx.lineWidth = Math.max(1, 2 * (renderScale / (scale || 1)));\n ctx.strokeStyle = '#dc2626';\n ctx.strokeRect(Math.floor(vX), Math.floor(vY), Math.ceil(vW), Math.ceil(vH));\n }\n }\n }\n ctx.restore();\n }\n\n // --- Forensic Watermark Rendering ---\n const wm = watermark || (watermarkText ? { text: watermarkText, opacity: 0.15, size: 24, mode: 'tiled', color: '#000000' } : undefined);\n if (wm && wm.text) {\n ctx.save();\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n \n const opacity = wm.opacity ?? 0.15;\n const mode = wm.mode ?? 'tiled';\n const defaultSize = mode === 'single' ? 48 : 18;\n const size = (wm.size ?? defaultSize) * renderScale;\n const text = wm.text;\n \n ctx.fillStyle = wm.color ?? '#000000';\n ctx.globalAlpha = opacity;\n ctx.font = `600 ${size}px sans-serif`;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n \n const canvasW = tempCanvas.width;\n const canvasH = tempCanvas.height;\n \n if (mode === 'single') {\n ctx.translate(canvasW / 2, canvasH / 2);\n ctx.rotate(-Math.PI / 4);\n ctx.fillText(text, 0, 0);\n } else {\n const stepX = size * text.length * 0.8 + 100 * renderScale;\n const stepY = 180 * renderScale;\n const diag = Math.sqrt(canvasW * canvasW + canvasH * canvasH);\n \n ctx.translate(canvasW / 2, canvasH / 2);\n ctx.rotate(-Math.PI / 4);\n \n for (let y = -diag; y < diag; y += stepY) {\n const rowOffset = (Math.abs(y / stepY) % 2) * (stepX / 2);\n for (let x = -diag; x < diag; x += stepX) {\n ctx.fillText(text, x + rowOffset, y);\n }\n }\n }\n ctx.restore();\n }\n\n // Transfer rendered contents to displayed canvas element\n const destCanvas = canvasRef.current;\n if (destCanvas && !isCancelled) {\n destCanvas.width = tempCanvas.width;\n destCanvas.height = tempCanvas.height;\n const destCtx = destCanvas.getContext('2d');\n if (destCtx) {\n destCtx.drawImage(tempCanvas, 0, 0);\n }\n hasRenderedOnceRef.current = true;\n setIsCanvasRendered(true);\n onRenderedRef.current?.(pageNum);\n }\n // Immediately release offscreen canvas GPU texture memory\n tempCanvas.width = 0;\n tempCanvas.height = 0;\n } catch (err: any) {\n if (err?.name !== 'RenderingCancelledException') {\n console.error(`Page ${pageNum} render failed:`, err);\n }\n } finally {\n if (currentPage) {\n try { currentPage.cleanup?.(); } catch {}\n }\n if (pageProxyRef.current === currentPage) {\n pageProxyRef.current = null;\n }\n }\n };\n\n // 0ms on first render, 150ms debounce on subsequent scale changes to allow\n // rapid zoom clicks to scale smoothly at 60 FPS via GPU CSS transforms\n // while PDF.js vector rendering fires once the zoom motion settles.\n const delay = hasRenderedOnceRef.current ? 150 : 0;\n timer = setTimeout(renderCanvas, delay);\n\n return () => {\n isCancelled = true;\n if (timer) clearTimeout(timer);\n if (renderTaskRef.current) {\n try { renderTaskRef.current.cancel(); } catch {}\n renderTaskRef.current = null;\n }\n if (pageProxyRef.current) {\n try { pageProxyRef.current.cleanup?.(); } catch {}\n pageProxyRef.current = null;\n }\n };\n }, [pageNum, pdfDoc, scale, rotation, basePageWidth, basePageHeight, watermark, watermarkText, redactions, isInViewport]);\n\n // Load TextContent independently\n useEffect(() => {\n let isCancelled = false;\n const fetchText = async () => {\n try {\n const page = await pdfDoc.getPage(pageNum);\n const text = await page.getTextContent();\n \n // --- Text Layer Sanitization (Anti-Copy/Paste) ---\n if (redactions && redactions.length > 0) {\n const pageRedactions = redactions.filter(r => r.pageIndex === pageNum);\n if (pageRedactions.length > 0) {\n // Filter out text items that intersect with redactions\n text.items = text.items.filter((item: any) => {\n if (item.str.trim() === '') return true; // Keep whitespace items for layout\n\n // item.transform: [scaleX, skewY, skewX, scaleY, tx, ty]\n // tx, ty are PDF coordinates (bottom-left origin)\n const itemX = item.transform[4];\n const itemY = item.transform[5];\n const itemW = item.width;\n const itemH = item.height; // Approximate height\n\n for (const red of pageRedactions) {\n // Check AABB intersection\n const intersectX = Math.max(itemX, red.x) < Math.min(itemX + itemW, red.x + red.width);\n const intersectY = Math.max(itemY, red.y) < Math.min(itemY + itemH, red.y + red.height);\n \n if (intersectX && intersectY) {\n return false; // Intersects, permanently remove from DOM\n }\n }\n return true;\n });\n }\n }\n \n if (!isCancelled) setTextContent(text);\n } catch {}\n };\n fetchText();\n return () => { isCancelled = true; };\n }, [pdfDoc, pageNum, redactions]);\n\n // Render TextLayer\n useEffect(() => {\n const container = textLayerRef.current;\n if (!textContent || !container || !isInViewport) return;\n let isCancelled = false;\n\n const renderText = async () => {\n try {\n const page = await pdfDoc.getPage(pageNum);\n if (isCancelled) return;\n const viewport = page.getViewport({ scale: 1, rotation: normalizeRotation(page.rotate + rotation) });\n\n let sanitizedTextContent = textContent;\n if (redactions && redactions.length > 0) {\n const pageRedactions = redactions.filter(r => r.pageIndex === pageNum);\n if (pageRedactions.length > 0) {\n const filteredItems = textContent.items.filter((item: any) => {\n if (!item.str || item.str.trim() === '') return true;\n const itemX = item.transform[4];\n const itemY = item.transform[5];\n const itemW = item.width;\n const itemH = item.height || Math.abs(item.transform[3]);\n const itemTopY = viewport.height - itemY - itemH;\n\n for (const red of pageRedactions) {\n const intersectX = Math.max(itemX, red.x) < Math.min(itemX + itemW, red.x + red.width);\n const intersectY = Math.max(itemTopY, red.y) < Math.min(itemTopY + itemH, red.y + red.height);\n if (intersectX && intersectY) {\n return false;\n }\n }\n return true;\n });\n sanitizedTextContent = { ...textContent, items: filteredItems };\n }\n }\n\n if (isCancelled) return;\n container.innerHTML = '';\n const textLayer = new pdfjsLib.TextLayer({\n textContentSource: sanitizedTextContent,\n container: container,\n viewport: viewport\n });\n await textLayer.render();\n } catch (e) {\n if (!isCancelled) {\n console.error(\"TextLayer render failed:\", e);\n }\n }\n };\n renderText();\n return () => {\n isCancelled = true;\n };\n }, [textContent, pdfDoc, pageNum, rotation, redactions, isInViewport]);\n\n // Load Native PDF Link Annotations\n const [nativeLinks, setNativeLinks] = useState<Array<{ id: string; rect: number[]; url: string }>>([]);\n useEffect(() => {\n let isCancelled = false;\n const fetchNativeLinks = async () => {\n try {\n const page = await pdfDoc.getPage(pageNum);\n const annotations = await page.getAnnotations({ intent: 'display' });\n if (isCancelled) return;\n const links: Array<{ id: string; rect: number[]; url: string }> = [];\n for (let i = 0; i < annotations.length; i++) {\n const a = annotations[i];\n if (a.subtype === 'Link' && Array.isArray(a.rect) && a.rect.length === 4) {\n let targetUrl = a.url;\n if (!targetUrl && a.dest) {\n targetUrl = typeof a.dest === 'string' ? `#${a.dest}` : Array.isArray(a.dest) && typeof a.dest[0] === 'number' ? `#page=${a.dest[0] + 1}` : undefined;\n }\n if (targetUrl) {\n links.push({\n id: a.id || `native-link-${pageNum}-${i}`,\n rect: a.rect,\n url: targetUrl\n });\n }\n }\n }\n if (!isCancelled) setNativeLinks(links);\n } catch {\n // Ignore native annotation retrieval failures\n }\n };\n fetchNativeLinks();\n return () => {\n isCancelled = true;\n };\n }, [pdfDoc, pageNum]);\n\n const pageAnnotations = annotations.filter(a => a.pageIndex === pageNum);\n const isOverlayVisible = !hideAnnotationsUntilPageRendered || isCanvasRendered;\n\n return (\n <div \n ref={pageContainerRef}\n id={`pdf-page-${pageNum}`}\n className=\"pdf-page-container\"\n onClick={() => { if (activeTool === null || activeTool === 'select') onClearSelection(); }}\n style={{\n position: 'absolute',\n top: `${pageTop}px`,\n left: pageLeft !== undefined ? `${pageLeft}px` : '0px',\n width: `${scaledWidth}px`,\n height: `${scaledHeight}px`,\n backgroundColor: '#fff',\n boxShadow: '0 2px 10px rgba(0,0,0,0.1)',\n marginBottom: '16px'\n }}\n >\n <canvas ref={canvasRef} style={{ position: 'absolute', width: '100%', height: '100%', left: 0, top: 0 }} />\n \n <div \n ref={textLayerRef}\n className=\"textLayer\"\n style={{\n position: 'absolute',\n top: 0, left: 0,\n transform: `scale(${scale})`,\n transformOrigin: 'top left',\n pointerEvents: (isOverlayVisible && activeTool !== 'pan') ? 'auto' : 'none',\n opacity: isOverlayVisible ? 1 : 0,\n visibility: isOverlayVisible ? 'visible' : 'hidden',\n width: `${basePageWidth}px`,\n height: `${basePageHeight}px`,\n zIndex: 2\n }}\n />\n\n {/* Transient Citation / Search Highlights Layer */}\n {((activeSearchResult && activeSearchResult.pageIndex === pageNum) || (transientHighlights && transientHighlights.length > 0)) && (() => {\n const unW = rotation % 180 === 0 ? basePageWidth : basePageHeight;\n const unH = rotation % 180 === 0 ? basePageHeight : basePageWidth;\n\n return (\n <div style={{\n position: 'absolute', top: 0, left: 0, width: '100%', height: '100%',\n pointerEvents: 'none', zIndex: 6,\n visibility: isOverlayVisible ? 'visible' : 'hidden',\n opacity: isOverlayVisible ? 1 : 0\n }}>\n <style>{`\n @keyframes tspdf-transient-pulse {\n 0% {\n box-shadow: 0 0 0 0 rgba(234, 179, 8, 0.75), 0 0 8px rgba(234, 179, 8, 0.4);\n }\n 50% {\n box-shadow: 0 0 0 6px rgba(234, 179, 8, 0.25), 0 0 18px rgba(234, 179, 8, 0.7);\n }\n 100% {\n box-shadow: 0 0 0 0 rgba(234, 179, 8, 0.75), 0 0 8px rgba(234, 179, 8, 0.4);\n }\n }\n `}</style>\n {/* Active search result */}\n {activeSearchResult && activeSearchResult.pageIndex === pageNum && activeSearchResult.bounds.map((b, idx) => {\n const rot = convertToRotatedRect(b.x, unH - b.y - b.height, b.width, b.height, rotation, unW, unH);\n return (\n <div key={`search-${idx}`} style={{\n position: 'absolute',\n left: `${rot.x * scale}px`,\n top: `${rot.y * scale}px`,\n width: `${rot.width * scale}px`,\n height: `${rot.height * scale}px`,\n backgroundColor: 'rgba(255, 255, 0, 0.4)',\n border: '1px solid rgba(255, 255, 0, 0.8)',\n borderRadius: '2px',\n boxShadow: '0 0 4px rgba(255, 255, 0, 0.5)'\n }} />\n );\n })}\n\n {/* Transient Highlights (Citations, external highlights) */}\n {transientHighlights && transientHighlights.filter(th => th.pageIndex === pageNum).map((th, thIdx) => (\n <React.Fragment key={th.id || `th-${thIdx}`}>\n {th.bounds.map((b, bIdx) => {\n const rot = convertToRotatedRect(b.x, unH - b.y - b.height, b.width, b.height, rotation, unW, unH);\n const bg = th.color || 'rgba(250, 204, 21, 0.45)';\n const border = th.borderColor || 'rgba(234, 179, 8, 0.85)';\n return (\n <div\n key={`th-box-${bIdx}`}\n style={{\n position: 'absolute',\n left: `${rot.x * scale}px`,\n top: `${rot.y * scale}px`,\n width: `${rot.width * scale}px`,\n height: `${rot.height * scale}px`,\n backgroundColor: bg,\n border: `1.5px solid ${border}`,\n borderRadius: '3px',\n animation: th.pulse !== false ? 'tspdf-transient-pulse 2s infinite ease-in-out' : 'none',\n boxShadow: '0 0 6px rgba(234, 179, 8, 0.4)',\n zIndex: 7\n }}\n >\n {th.tooltip && bIdx === 0 && (\n <div style={{\n position: 'absolute',\n bottom: '100%',\n left: '50%',\n transform: 'translateX(-50%)',\n marginBottom: '4px',\n backgroundColor: '#0f172a',\n color: '#ffffff',\n fontSize: '11px',\n fontWeight: 600,\n padding: '3px 8px',\n borderRadius: '4px',\n whiteSpace: 'nowrap',\n boxShadow: '0 2px 8px rgba(0,0,0,0.25)',\n zIndex: 10,\n pointerEvents: 'none'\n }}>\n {th.tooltip.length > 60 ? `${th.tooltip.slice(0, 60)}...` : th.tooltip}\n </div>\n )}\n </div>\n );\n })}\n </React.Fragment>\n ))}\n </div>\n );\n })()}\n \n {/* SVG Annotation Overlay */}\n {(() => {\n const unW = rotation % 180 === 0 ? basePageWidth : basePageHeight;\n const unH = rotation % 180 === 0 ? basePageHeight : basePageWidth;\n const rotTransform = getRotationTransform(rotation, unW, unH);\n return (\n <svg \n style={{ \n position: 'absolute', top: 0, left: 0, width: '100%', height: '100%', \n cursor: ['Annotate', 'Shapes'].includes(activeTab) && activeTool ? (activeTool === 'eraser' ? 'cell' : 'crosshair') : 'default', \n pointerEvents: (activeTool === null || activeTool === 'pan' || activeTool === 'select' || !isOverlayVisible) ? 'none' : 'auto',\n zIndex: 10,\n visibility: isOverlayVisible ? 'visible' : 'hidden',\n opacity: isOverlayVisible ? 1 : 0\n }}\n viewBox={`0 0 ${basePageWidth} ${basePageHeight}`}\n onMouseDown={(e) => onMouseDown(e, pageNum)}\n onMouseMove={(e) => onMouseMove(e, pageNum)}\n onMouseUp={(e) => onMouseUp(e, pageNum)}\n onMouseLeave={(e) => onMouseUp(e, pageNum)}\n >\n <g transform={rotTransform}>\n {/* Native PDF links */}\n {nativeLinks.map((nl) => {\n const x = nl.rect[0];\n const y = basePageHeight - nl.rect[3];\n const w = Math.max(0, nl.rect[2] - nl.rect[0]);\n const h = Math.max(0, nl.rect[3] - nl.rect[1]);\n return (\n <rect\n key={nl.id}\n x={x}\n y={y}\n width={w}\n height={h}\n fill=\"transparent\"\n style={{ pointerEvents: 'all', cursor: 'pointer' }}\n onClick={(e) => {\n if (activeTab === 'View') {\n e.stopPropagation();\n onLinkClick?.(nl.url, undefined, e);\n }\n }}\n >\n <title>{nl.url}</title>\n </rect>\n );\n })}\n <React.Fragment>\n {pageAnnotations.map(ann => {\n const fillColor = (ann.type === 'text' || ann.type === 'callout') ? 'transparent' : `${ann.color}${Math.floor(ann.opacity * 255).toString(16).padStart(2, '0')}`;\n const strokeColor = ann.color;\n const isSelected = selectedAnnotationId === ann.id;\n const blendMode = (ann.type === 'highlight' || ann.opacity < 1) && !['text', 'note', 'callout', 'signature'].includes(ann.type) ? 'multiply' : 'normal';\n\n const interactionProps = {\n onMouseEnter: () => onAnnotationMouseEnter(ann.id),\n onClick: (e: React.MouseEvent) => {\n onAnnotationClick(ann.id, e);\n },\n onDoubleClick: (e: React.MouseEvent) => {\n onAnnotationDoubleClick?.(ann.id, e);\n },\n onMouseDown: (e: React.MouseEvent) => {\n if (isSelected && onStartMove) {\n e.stopPropagation();\n onStartMove(ann.id, e, pageNum);\n }\n },\n style: { \n pointerEvents: 'all' as any,\n cursor: activeTool === 'eraser' ? 'pointer' : (isSelected ? 'move' : 'pointer')\n }\n };\n\n let shape = null;\n\n if (ann.type === 'rectangle') {\n shape = <rect x={ann.x} y={ann.y} width={ann.width} height={ann.height} fill={fillColor} stroke={strokeColor} strokeWidth={ann.strokeWidth} style={{ mixBlendMode: blendMode }} />;\n } else if (ann.type === 'text' && ann.text) {\n const boxW = ann.width && ann.width > 0 ? ann.width : 180;\n const boxH = ann.height && ann.height > 0 ? ann.height : 40;\n shape = (\n <g>\n <rect x={ann.x} y={ann.y} width={boxW} height={boxH} fill=\"transparent\" style={{ pointerEvents: 'all' }} />\n <foreignObject x={ann.x} y={ann.y} width={boxW} height={boxH} style={{ overflow: 'visible', pointerEvents: 'none' }}>\n <div\n style={{\n width: `${boxW}px`,\n minHeight: `${boxH}px`,\n wordBreak: 'break-word',\n overflowWrap: 'break-word',\n whiteSpace: 'pre-wrap',\n color: strokeColor,\n fontSize: '16px',\n fontFamily: 'sans-serif',\n lineHeight: '1.25',\n userSelect: 'none',\n boxSizing: 'border-box',\n padding: '2px 4px'\n }}\n >\n {ann.text}\n </div>\n </foreignObject>\n </g>\n );\n } else if (ann.type === 'ellipse') {\n shape = <ellipse cx={ann.x + ann.width/2} cy={ann.y + ann.height/2} rx={ann.width/2} ry={ann.height/2} fill={fillColor} stroke={strokeColor} strokeWidth={ann.strokeWidth} style={{ mixBlendMode: blendMode }} />;\n } else if (ann.type === 'line' && ann.points) {\n shape = (\n <g style={{ mixBlendMode: blendMode }}>\n <line x1={ann.points[0].x} y1={ann.points[0].y} x2={ann.points[1].x} y2={ann.points[1].y} stroke=\"transparent\" strokeWidth={Math.max(10, ann.strokeWidth * 3)} />\n <line x1={ann.points[0].x} y1={ann.points[0].y} x2={ann.points[1].x} y2={ann.points[1].y} stroke={strokeColor} strokeWidth={ann.strokeWidth} />\n </g>\n );\n } else if (ann.type === 'arrow' && ann.points) {\n const [p1, p2] = ann.points;\n const angle = Math.atan2(p2.y - p1.y, p2.x - p1.x);\n const headLen = 15 + ann.strokeWidth;\n const h1 = { x: p2.x - headLen * Math.cos(angle - Math.PI / 6), y: p2.y - headLen * Math.sin(angle - Math.PI / 6) };\n const h2 = { x: p2.x - headLen * Math.cos(angle + Math.PI / 6), y: p2.y - headLen * Math.sin(angle + Math.PI / 6) };\n shape = (\n <g style={{ mixBlendMode: blendMode }}>\n <line x1={p1.x} y1={p1.y} x2={p2.x} y2={p2.y} stroke=\"transparent\" strokeWidth={Math.max(10, ann.strokeWidth * 3)} />\n <line x1={p1.x} y1={p1.y} x2={p2.x} y2={p2.y} stroke={strokeColor} strokeWidth={ann.strokeWidth} />\n <path d={`M ${h1.x} ${h1.y} L ${p2.x} ${p2.y} L ${h2.x} ${h2.y}`} fill=\"none\" stroke={strokeColor} strokeWidth={ann.strokeWidth} strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </g>\n );\n } else if (ann.type === 'highlight' && ann.width !== undefined && ann.height !== undefined) {\n const hlRects = ann.rects && ann.rects.length > 0 ? ann.rects : [{ x: ann.x, y: ann.y, width: ann.width, height: ann.height }];\n shape = (\n <g style={{ mixBlendMode: 'multiply' }}>\n {hlRects.map((r, i) => (\n <rect key={i} x={r.x} y={r.y} width={r.width} height={r.height} fill={strokeColor} opacity={ann.opacity} />\n ))}\n </g>\n );\n } else if (ann.type === 'underline') {\n const ulRects = ann.rects && ann.rects.length > 0 ? ann.rects : [{ x: ann.x, y: ann.y, width: ann.width, height: ann.height }];\n const th = ann.strokeWidth || 2;\n shape = (\n <g>\n {ulRects.map((r, i) => (\n <React.Fragment key={i}>\n <rect x={r.x} y={r.y} width={r.width} height={r.height} fill=\"transparent\" />\n <line\n x1={r.x}\n y1={r.y + r.height - th / 2}\n x2={r.x + r.width}\n y2={r.y + r.height - th / 2}\n stroke={strokeColor}\n strokeWidth={th}\n strokeLinecap=\"round\"\n />\n </React.Fragment>\n ))}\n </g>\n );\n } else if (ann.type === 'strikeout') {\n const soRects = ann.rects && ann.rects.length > 0 ? ann.rects : [{ x: ann.x, y: ann.y, width: ann.width, height: ann.height }];\n const th = ann.strokeWidth || 2;\n shape = (\n <g>\n {soRects.map((r, i) => (\n <React.Fragment key={i}>\n <rect x={r.x} y={r.y} width={r.width} height={r.height} fill=\"transparent\" />\n <line\n x1={r.x}\n y1={r.y + r.height / 2}\n x2={r.x + r.width}\n y2={r.y + r.height / 2}\n stroke={strokeColor}\n strokeWidth={th}\n strokeLinecap=\"round\"\n />\n </React.Fragment>\n ))}\n </g>\n );\n } else if (ann.type === 'squiggly') {\n const sqRects = ann.rects && ann.rects.length > 0 ? ann.rects : [{ x: ann.x, y: ann.y, width: ann.width, height: ann.height }];\n const th = ann.strokeWidth || 1.5;\n const generateSquigglyD = (x: number, y: number, width: number) => {\n let d = `M ${x} ${y}`;\n const step = 4;\n let up = true;\n for (let cx = x; cx < x + width; cx += step) {\n const nextX = Math.min(cx + step, x + width);\n const midX = cx + (nextX - cx) / 2;\n const dy = up ? -2.5 : 2.5;\n d += ` Q ${midX} ${y + dy}, ${nextX} ${y}`;\n up = !up;\n }\n return d;\n };\n shape = (\n <g>\n {sqRects.map((r, i) => (\n <React.Fragment key={i}>\n <rect x={r.x} y={r.y} width={r.width} height={r.height} fill=\"transparent\" />\n <path\n d={generateSquigglyD(r.x, r.y + r.height - 2, r.width)}\n fill=\"none\"\n stroke={strokeColor}\n strokeWidth={th}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </React.Fragment>\n ))}\n </g>\n );\n } else if (ann.type === 'opaque') {\n // Imported annotation this viewer cannot edit/render natively: outline + kind label.\n shape = (\n <g>\n <rect x={ann.x} y={ann.y} width={ann.width} height={ann.height} fill=\"none\" stroke={strokeColor} strokeWidth=\"1\" strokeDasharray=\"3,2\" opacity={0.8} />\n {ann.opaqueKind && ann.width > 40 && (\n <text x={ann.x + 2} y={ann.y - 2} fill={strokeColor} fontSize=\"8px\" fontFamily=\"sans-serif\" opacity={0.8}>{ann.opaqueKind}</text>\n )}\n </g>\n );\n } else if (ann.type === 'link' && ann.width !== undefined && ann.height !== undefined) {\n if (ann.text) {\n const linkColor = ann.color && ann.color !== 'transparent' ? strokeColor : '#007bff';\n shape = (\n <text x={ann.x} y={ann.y + 16} fill={linkColor} fontSize=\"16px\" fontFamily=\"sans-serif\" textDecoration=\"underline\" style={{ cursor: 'pointer' }}>\n {ann.text}\n </text>\n );\n } else {\n const borderColor = ann.color && ann.color !== 'transparent' ? strokeColor : '#007bff';\n shape = <rect x={ann.x} y={ann.y} width={ann.width} height={ann.height} fill=\"transparent\" stroke={isSelected ? borderColor : `${borderColor}80`} strokeWidth={isSelected ? \"2\" : \"1\"} strokeDasharray={isSelected ? \"none\" : \"4\"} />;\n }\n } else if (ann.type === 'freehand' && (ann.strokes?.length || ann.points)) {\n const strokes = ann.strokes && ann.strokes.length > 0 ? ann.strokes : [ann.points ?? []];\n shape = (\n <g style={{ mixBlendMode: blendMode }}>\n {strokes.filter(st => st.length > 0).map((st, i) => {\n const d = `M ${st.map(p => `${p.x},${p.y}`).join(' L ')}`;\n return (\n <React.Fragment key={i}>\n <path d={d} fill=\"none\" stroke=\"transparent\" strokeWidth={Math.max(10, ann.strokeWidth * 3)} strokeLinejoin=\"round\" strokeLinecap=\"round\" />\n <path d={d} fill=\"none\" stroke={strokeColor} strokeWidth={ann.strokeWidth} strokeLinejoin=\"round\" strokeLinecap=\"round\" />\n </React.Fragment>\n );\n })}\n </g>\n );\n } else if (ann.type === 'note') {\n shape = (\n <g transform={`translate(${ann.x}, ${ann.y})`}>\n <rect width=\"24\" height=\"24\" rx=\"4\" fill={fillColor} stroke={strokeColor} strokeWidth={ann.strokeWidth} />\n <path d=\"M6 12h12M6 8h12M6 16h8\" stroke=\"#fff\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </g>\n );\n } else if (ann.type === 'callout' && ann.points) {\n shape = (\n <g>\n <line x1={ann.points[0].x} y1={ann.points[0].y} x2={ann.points[1].x} y2={ann.points[1].y} stroke={strokeColor} strokeWidth={ann.strokeWidth} strokeDasharray=\"4\" />\n <rect x={ann.points[1].x} y={ann.points[1].y} width={ann.text ? ann.text.length * 8 + 20 : 100} height=\"24\" fill=\"#fff\" stroke={strokeColor} strokeWidth={ann.strokeWidth} />\n <text x={ann.points[1].x + 10} y={ann.points[1].y + 16} fill={strokeColor} fontSize=\"14px\" fontFamily=\"sans-serif\">{ann.text}</text>\n </g>\n );\n } else if (ann.type === 'signature' && ann.imageUrl) {\n const dateStr = ann.timestamp ? new Date(ann.timestamp).toLocaleDateString('en-GB', { day: 'numeric', month: 'short', year: 'numeric' }) : '';\n const signerText = ann.signer ? `Digitally signed by ${ann.signer} · ${dateStr}` : '';\n \n shape = (\n <g>\n <image href={ann.imageUrl} x={ann.x} y={ann.y} width={ann.width} height={ann.height} preserveAspectRatio=\"xMidYMid meet\" />\n {signerText && (\n <text \n x={(ann.x || 0) + (ann.width || 200) / 2} \n y={(ann.y || 0) + (ann.height || 60) + 16} \n fill=\"#666\" \n fontSize=\"11px\" \n fontFamily=\"sans-serif\" \n textAnchor=\"middle\"\n >\n {signerText}\n </text>\n )}\n </g>\n );\n } else if (ann.type === 'digital_signature_placeholder') {\n const dateStr = ann.timestamp ? new Date(ann.timestamp).toLocaleString('en-GB') : '';\n const ax = ann.x || 0;\n const ay = ann.y || 0;\n const aw = ann.width || 350;\n const ah = ann.height || 70;\n const iconW = aw * 0.15;\n \n shape = (\n <g>\n <rect x={ax} y={ay} width={aw} height={ah} fill=\"rgba(255, 255, 255, 0.9)\" stroke=\"#94a3b8\" strokeWidth=\"1\" />\n <line x1={ax + iconW} y1={ay} x2={ax + iconW} y2={ay + ah} stroke=\"#e2e8f0\" strokeWidth=\"1\" />\n \n {/* Shield Icon Approximation */}\n <g transform={`translate(${ax + iconW/2 - 12}, ${ay + ah/2 - 14})`}>\n <path d=\"M22 6 L22 14 Q22 20 12 24 Q2 20 2 14 L2 6 L12 2 Z\" fill=\"none\" stroke=\"#0284c7\" strokeWidth=\"2\" strokeLinejoin=\"round\" />\n <path d=\"M7 13 L10 16 L17 8\" fill=\"none\" stroke=\"#0284c7\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </g>\n \n <text x={ax + iconW + 10} y={ay + 25} fill=\"#0f172a\" fontSize=\"11.5px\" fontWeight=\"bold\" fontFamily=\"sans-serif\">\n Digitally signed by {ann.signer || 'sanjiv@costacloud.com'}\n </text>\n <text x={ax + iconW + 10} y={ay + 42} fill=\"#334155\" fontSize=\"10px\" fontFamily=\"sans-serif\">\n Date: {dateStr}\n </text>\n <text x={ax + iconW + 10} y={ay + 57} fill=\"#334155\" fontSize=\"10px\" fontFamily=\"sans-serif\">\n Reason: Document Approval\n </text>\n </g>\n );\n }\n\n return (\n <g key={ann.id} {...interactionProps}>\n {shape}\n {isSelected && (() => {\n const w = ann.width && ann.width > 0 ? ann.width : 32;\n const h = ann.height && ann.height > 0 ? ann.height : 32;\n const isResizable = ['text', 'rectangle', 'ellipse', 'highlight', 'underline', 'strikeout', 'squiggly'].includes(ann.type);\n const handleCoords: Record<string, { x: number; y: number; cursor: string }> = {\n nw: { x: ann.x, y: ann.y, cursor: 'nwse-resize' },\n n: { x: ann.x + w / 2, y: ann.y, cursor: 'ns-resize' },\n ne: { x: ann.x + w, y: ann.y, cursor: 'nesw-resize' },\n e: { x: ann.x + w, y: ann.y + h / 2, cursor: 'ew-resize' },\n se: { x: ann.x + w, y: ann.y + h, cursor: 'nwse-resize' },\n s: { x: ann.x + w / 2, y: ann.y + h, cursor: 'ns-resize' },\n sw: { x: ann.x, y: ann.y + h, cursor: 'nesw-resize' },\n w: { x: ann.x, y: ann.y + h / 2, cursor: 'ew-resize' },\n };\n\n return (\n <g className=\"tspdf-annotation-selection\">\n <rect \n x={ann.x - 4} y={ann.y - 4} \n width={w + 8} \n height={h + 8} \n fill=\"none\" stroke=\"var(--primary)\" strokeWidth=\"1.5\" strokeDasharray=\"4\" \n style={{ pointerEvents: 'none' }}\n />\n {!ann.readOnly && isResizable && onStartResize && Object.entries(handleCoords).map(([handleKey, hInfo]) => (\n <rect\n key={handleKey}\n x={hInfo.x - 4}\n y={hInfo.y - 4}\n width={8}\n height={8}\n fill=\"#ffffff\"\n stroke=\"var(--primary)\"\n strokeWidth=\"1.5\"\n rx={1}\n style={{ cursor: hInfo.cursor, pointerEvents: 'all' }}\n onMouseDown={(e) => {\n e.stopPropagation();\n onStartResize(ann.id, handleKey, e, pageNum);\n }}\n />\n ))}\n </g>\n );\n })()}\n </g>\n );\n })}\n\n {redactions && redactions.filter(r => r.pageIndex === pageNum && r.status === 'pending').map((r, idx) => (\n <g \n key={r.id || `pending-${idx}`} \n style={{ cursor: 'pointer' }}\n onClick={(e) => {\n e.stopPropagation();\n onDiscardRedaction?.(r);\n }}\n >\n <title>Click to discard this redaction</title>\n <rect \n x={r.x} \n y={r.y} \n width={r.width} \n height={r.height} \n fill=\"rgba(0, 0, 0, 0.45)\" \n stroke=\"#dc2626\" \n strokeWidth={2} \n strokeDasharray=\"4\"\n />\n <text \n x={r.x + 4} \n y={r.y + Math.min(r.height - 2, 14)} \n fill=\"#ef4444\" \n fontSize=\"10px\" \n fontWeight=\"bold\"\n letterSpacing=\"0.5px\"\n >\n PENDING REDACTION\n </text>\n {/* Top-right Discard X Badge */}\n {r.width > 24 && r.height > 16 && (\n <g transform={`translate(${r.x + r.width - 18}, ${r.y + 2})`}>\n <rect width=\"16\" height=\"16\" rx=\"4\" fill=\"#dc2626\" />\n <path d=\"M4.5 4.5 L11.5 11.5 M11.5 4.5 L4.5 11.5\" stroke=\"#ffffff\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </g>\n )}\n </g>\n ))}\n </React.Fragment>\n </g>\n </svg>\n );\n })()}\n\n {/* Form Fields Layer (Builder & Filler Modes) */}\n {formManager && (\n <FormFieldLayer\n pageNum={pageNum}\n scale={scale}\n rotation={rotation}\n basePageWidth={basePageWidth}\n basePageHeight={basePageHeight}\n activeTab={activeTab}\n activeTool={activeFormTool || 'select'}\n setActiveTool={setActiveFormTool || (() => {})}\n formManager={formManager}\n canFillForms={canFillForms}\n showFlowOrder={showFlowOrder}\n selectedRoleFilter={selectedRoleFilter}\n />\n )}\n </div>\n );\n}\n\nconst PageRenderer = React.memo(PageRendererComponent, (prevProps, nextProps) => {\n return prevProps.pageNum === nextProps.pageNum &&\n prevProps.pdfDoc === nextProps.pdfDoc &&\n prevProps.scale === nextProps.scale &&\n prevProps.rotation === nextProps.rotation &&\n prevProps.basePageWidth === nextProps.basePageWidth &&\n prevProps.basePageHeight === nextProps.basePageHeight &&\n prevProps.pageTop === nextProps.pageTop &&\n prevProps.pageLeft === nextProps.pageLeft &&\n prevProps.activeTab === nextProps.activeTab &&\n prevProps.activeTool === nextProps.activeTool &&\n prevProps.activeFormTool === nextProps.activeFormTool &&\n prevProps.showFlowOrder === nextProps.showFlowOrder &&\n prevProps.selectedRoleFilter === nextProps.selectedRoleFilter &&\n prevProps.formManager === nextProps.formManager &&\n prevProps.canFillForms === nextProps.canFillForms &&\n prevProps.selectedAnnotationId === nextProps.selectedAnnotationId &&\n prevProps.activeSearchResult === nextProps.activeSearchResult &&\n prevProps.watermark === nextProps.watermark &&\n prevProps.watermarkText === nextProps.watermarkText &&\n prevProps.redactions === nextProps.redactions &&\n prevProps.annotations === nextProps.annotations &&\n prevProps.transientHighlights === nextProps.transientHighlights &&\n prevProps.hideAnnotationsUntilPageRendered === nextProps.hideAnnotationsUntilPageRendered;\n});\n\nexport default PageRenderer;\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * Stable, collision-free annotation ids. They double as the XFDF `name` attribute, which hosts use\n * to match persisted rows to live annotations, so they must never be timestamps.\n */\nexport function newAnnotationId(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n // Fallback for very old runtimes: 128 bits from Math.random, formatted like a UUID v4.\n const hex = Array.from({ length: 32 }, () => Math.floor(Math.random() * 16).toString(16)).join('');\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-4${hex.slice(13, 16)}-a${hex.slice(17, 20)}-${hex.slice(20, 32)}`;\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * Cross-environment clipboard utility with secure and fallback execCommand copying.\n */\n\nexport async function copyTextToClipboard(text: string): Promise<boolean> {\n if (!text) return false;\n\n // Modern asynchronous Clipboard API (supported in secure HTTPS / localhost contexts)\n if (typeof navigator !== 'undefined' && navigator.clipboard && typeof navigator.clipboard.writeText === 'function') {\n try {\n await navigator.clipboard.writeText(text);\n return true;\n } catch {\n // Fallback below if permission was denied or running in an iframe / non-secure context\n }\n }\n\n // Fallback using textarea + document.execCommand('copy')\n if (typeof document !== 'undefined') {\n try {\n const textArea = document.createElement('textarea');\n textArea.value = text;\n textArea.setAttribute('readonly', '');\n textArea.style.contain = 'strict';\n textArea.style.position = 'fixed';\n textArea.style.left = '-9999px';\n textArea.style.top = '-9999px';\n textArea.style.opacity = '0';\n document.body.appendChild(textArea);\n textArea.select();\n textArea.setSelectionRange(0, text.length);\n const successful = document.execCommand('copy');\n document.body.removeChild(textArea);\n return successful;\n } catch (err) {\n console.error('Failed to copy text to clipboard fallback:', err);\n return false;\n }\n }\n\n return false;\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * Floating quick-action copy pill rendered directly above active text selections.\n */\nimport React, { useEffect, useState, useCallback, useRef } from 'react';\nimport { Copy, Check, Highlighter, Underline, Strikethrough } from 'lucide-react';\nimport { copyTextToClipboard } from '../utils/clipboardUtils';\n\ninterface TextSelectionTooltipProps {\n containerRef: React.RefObject<HTMLDivElement | null>;\n onCopy?: (text: string) => void;\n onAnnotateSelection?: (type: 'highlight' | 'underline' | 'strikeout' | 'squiggly') => void;\n}\n\nexport const TextSelectionTooltip: React.FC<TextSelectionTooltipProps> = ({ containerRef, onCopy, onAnnotateSelection }) => {\n const [selectedText, setSelectedText] = useState<string>('');\n const [position, setPosition] = useState<{ top: number; left: number } | null>(null);\n const [copied, setCopied] = useState<boolean>(false);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const updatePosition = useCallback(() => {\n if (typeof window === 'undefined') return;\n const selection = window.getSelection();\n\n if (!selection || selection.isCollapsed || !selection.rangeCount || !containerRef.current) {\n setPosition(null);\n setSelectedText('');\n return;\n }\n\n const range = selection.getRangeAt(0);\n const commonAncestor = range.commonAncestorContainer;\n\n // Verify the selection is inside our viewer container\n if (!containerRef.current.contains(commonAncestor)) {\n setPosition(null);\n setSelectedText('');\n return;\n }\n\n const text = selection.toString().trim();\n if (!text) {\n setPosition(null);\n setSelectedText('');\n return;\n }\n\n const rangeRect = range.getBoundingClientRect();\n if (rangeRect.width === 0 && rangeRect.height === 0) {\n setPosition(null);\n setSelectedText('');\n return;\n }\n\n const containerRect = containerRef.current.getBoundingClientRect();\n const centerX = rangeRect.left + rangeRect.width / 2;\n const relLeft = centerX - containerRect.left + containerRef.current.scrollLeft;\n \n // Position 38px above selection by default; flip below if too close to container top\n let relTop = rangeRect.top - containerRect.top + containerRef.current.scrollTop - 38;\n if (relTop < containerRef.current.scrollTop + 8) {\n relTop = rangeRect.bottom - containerRect.top + containerRef.current.scrollTop + 8;\n }\n\n setSelectedText(text);\n setPosition({ top: relTop, left: relLeft });\n }, [containerRef]);\n\n useEffect(() => {\n const handleSelectionChange = () => {\n // Debounce slightly to let mouse-up complete selection bounding box\n requestAnimationFrame(updatePosition);\n };\n\n document.addEventListener('selectionchange', handleSelectionChange);\n const container = containerRef.current;\n if (container) {\n container.addEventListener('scroll', updatePosition, { passive: true });\n }\n\n return () => {\n document.removeEventListener('selectionchange', handleSelectionChange);\n if (container) {\n container.removeEventListener('scroll', updatePosition);\n }\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, [containerRef, updatePosition]);\n\n const handleCopy = async (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n if (!selectedText) return;\n\n const success = await copyTextToClipboard(selectedText);\n if (success) {\n setCopied(true);\n onCopy?.(selectedText);\n\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n timeoutRef.current = setTimeout(() => {\n setCopied(false);\n }, 1500);\n }\n };\n\n if (!position || !selectedText) {\n return null;\n }\n\n return (\n <div\n role=\"toolbar\"\n aria-label=\"Selection actions\"\n style={{\n position: 'absolute',\n top: `${position.top}px`,\n left: `${position.left}px`,\n transform: 'translateX(-50%)',\n zIndex: 50,\n display: 'flex',\n alignItems: 'center',\n backgroundColor: '#0f172a',\n borderRadius: '6px',\n padding: '3px 6px',\n boxShadow: '0 4px 14px rgba(0, 0, 0, 0.25), 0 0 0 1px rgba(255, 255, 255, 0.1)',\n pointerEvents: 'auto',\n userSelect: 'none',\n whiteSpace: 'nowrap',\n animation: 'tspdf-fade-in 0.15s ease-out'\n }}\n onMouseDown={(e) => {\n // Prevent clicking the tooltip from clearing the active DOM text selection\n e.preventDefault();\n e.stopPropagation();\n }}\n >\n <style>{`\n @keyframes tspdf-fade-in {\n from { opacity: 0; transform: translate(-50%, 4px); }\n to { opacity: 1; transform: translate(-50%, 0); }\n }\n `}</style>\n <button\n onClick={handleCopy}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '5px',\n background: 'transparent',\n border: 'none',\n color: copied ? '#4ade80' : '#f8fafc',\n cursor: 'pointer',\n fontSize: '12px',\n fontWeight: 500,\n padding: '3px 6px',\n borderRadius: '4px',\n transition: 'background-color 0.15s, color 0.15s'\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = 'rgba(255, 255, 255, 0.12)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n }}\n title=\"Copy selected text\"\n >\n {copied ? <Check size={13} color=\"#4ade80\" /> : <Copy size={13} color=\"#f8fafc\" />}\n <span>{copied ? 'Copied!' : 'Copy'}</span>\n </button>\n\n {onAnnotateSelection && (\n <>\n <div style={{ width: '1px', height: '16px', backgroundColor: 'rgba(255, 255, 255, 0.2)', margin: '0 4px' }} />\n <button\n onClick={(e) => { e.preventDefault(); e.stopPropagation(); onAnnotateSelection('highlight'); }}\n style={{\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n width: '24px', height: '24px', background: 'transparent', border: 'none',\n borderRadius: '4px', cursor: 'pointer', padding: 0\n }}\n onMouseEnter={(e) => { e.currentTarget.style.backgroundColor = 'rgba(255, 255, 255, 0.12)'; }}\n onMouseLeave={(e) => { e.currentTarget.style.backgroundColor = 'transparent'; }}\n title=\"Highlight selected text\"\n >\n <Highlighter size={13} color=\"#fbc02d\" />\n </button>\n <button\n onClick={(e) => { e.preventDefault(); e.stopPropagation(); onAnnotateSelection('underline'); }}\n style={{\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n width: '24px', height: '24px', background: 'transparent', border: 'none',\n borderRadius: '4px', cursor: 'pointer', padding: 0\n }}\n onMouseEnter={(e) => { e.currentTarget.style.backgroundColor = 'rgba(255, 255, 255, 0.12)'; }}\n onMouseLeave={(e) => { e.currentTarget.style.backgroundColor = 'transparent'; }}\n title=\"Underline selected text\"\n >\n <Underline size={13} color=\"#f8fafc\" />\n </button>\n <button\n onClick={(e) => { e.preventDefault(); e.stopPropagation(); onAnnotateSelection('strikeout'); }}\n style={{\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n width: '24px', height: '24px', background: 'transparent', border: 'none',\n borderRadius: '4px', cursor: 'pointer', padding: 0\n }}\n onMouseEnter={(e) => { e.currentTarget.style.backgroundColor = 'rgba(255, 255, 255, 0.12)'; }}\n onMouseLeave={(e) => { e.currentTarget.style.backgroundColor = 'transparent'; }}\n title=\"Strikeout selected text\"\n >\n <Strikethrough size={13} color=\"#f8fafc\" />\n </button>\n <button\n onClick={(e) => { e.preventDefault(); e.stopPropagation(); onAnnotateSelection('squiggly'); }}\n style={{\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n width: '24px', height: '24px', background: 'transparent', border: 'none',\n borderRadius: '4px', cursor: 'pointer', padding: 0\n }}\n onMouseEnter={(e) => { e.currentTarget.style.backgroundColor = 'rgba(255, 255, 255, 0.12)'; }}\n onMouseLeave={(e) => { e.currentTarget.style.backgroundColor = 'transparent'; }}\n title=\"Squiggly underline selected text\"\n >\n <svg width={13} height={13} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#4ade80\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M4 18c1.5-2 2.5-2 4 0s2.5 2 4 0 2.5-2 4 0 2.5 2 4 0\" />\n </svg>\n </button>\n </>\n )}\n </div>\n );\n};\nexport default TextSelectionTooltip;\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\nimport * as pdfjsLib from 'pdfjs-dist';\nimport type { Redaction } from '../core/types';\nimport { buildPageText } from './pageText';\n\nexport async function findRegexRedactions(\n pdfDoc: pdfjsLib.PDFDocumentProxy,\n regexes: RegExp[]\n): Promise<Redaction[]> {\n const redactions: Redaction[] = [];\n if (!pdfDoc || !regexes || regexes.length === 0) return redactions;\n\n const numPages = pdfDoc.numPages;\n // Pre-compile global regex instances once outside the page loop\n const globalRegexes = regexes.map(r => new RegExp(r, r.flags.includes('g') ? r.flags : r.flags + 'g'));\n const disabledRegexes = new Set<RegExp>();\n\n for (let pageNum = 1; pageNum <= numPages; pageNum++) {\n try {\n const page = await pdfDoc.getPage(pageNum);\n const viewport = page.getViewport({ scale: 1 });\n const textContent = await page.getTextContent();\n const items = textContent.items as any[];\n \n const { fullText, itemIndices, charIndices } = buildPageText(items);\n\n // Find matches for each pre-compiled regex\n for (const globalRegex of globalRegexes) {\n if (disabledRegexes.has(globalRegex)) continue;\n\n globalRegex.lastIndex = 0; // Reset state for global regex reuse\n\n // SEC-04: Guard against ReDoS catastrophic backtracking by bounding execution duration\n const startTime = typeof performance !== 'undefined' ? performance.now() : Date.now();\n const matches = [...fullText.matchAll(globalRegex)];\n const elapsed = (typeof performance !== 'undefined' ? performance.now() : Date.now()) - startTime;\n\n if (elapsed > 250) {\n console.warn(\n `[teamsync-pdf-viewer] Regex evaluation took ${elapsed.toFixed(1)}ms on page ${pageNum}. Disabling pattern to prevent UI freeze:`,\n globalRegex.source\n );\n disabledRegexes.add(globalRegex);\n }\n\n for (const match of matches) {\n if (match.index === undefined) continue;\n \n const matchStart = match.index;\n const matchLength = match[0].length;\n \n // Track involved TextItems\n const itemMatches = new Map<number, { min: number; max: number }>();\n for (let i = matchStart; i < matchStart + matchLength; i++) {\n const itemIdx = itemIndices[i];\n const charIdx = charIndices[i];\n if (itemIdx !== undefined && itemIdx !== -1) {\n const existing = itemMatches.get(itemIdx);\n if (existing) {\n existing.min = Math.min(existing.min, charIdx);\n existing.max = Math.max(existing.max, charIdx);\n } else {\n itemMatches.set(itemIdx, { min: charIdx, max: charIdx });\n }\n }\n }\n \n // Calculate bounding boxes for each involved item\n itemMatches.forEach((matchInfo, itemIndex) => {\n const item = items[itemIndex];\n if (!item || !item.transform) return;\n \n // TextItem transforms: [scaleX, skewY, skewX, scaleY, tx, ty]\n // PDF origin is bottom-left\n const tx = item.transform[4];\n const ty = item.transform[5];\n const scaleY = Math.abs(item.transform[3]);\n \n const strLen = (item.str ?? '').length;\n const charWidth = strLen > 0 ? item.width / strLen : item.width;\n \n const startX = tx + (matchInfo.min * charWidth);\n const matchWidth = ((matchInfo.max - matchInfo.min) + 1) * charWidth;\n const matchHeight = item.height || scaleY;\n \n const padding = 2;\n const topY = viewport.height - ty - matchHeight;\n \n redactions.push({\n id: `regex-${pageNum}-${Math.random().toString(36).substr(2, 9)}`,\n pageIndex: pageNum,\n x: startX - padding,\n y: topY - padding,\n width: matchWidth + (padding * 2),\n height: matchHeight + (padding * 2),\n status: 'pending'\n });\n });\n }\n }\n \n // Memory Management: Clear parsed text structures for this page to prevent >1GB OOM crashes\n page.cleanup();\n \n // Thread Management: Yield to the main thread every 3 pages so the UI remains fluid\n if (pageNum % 3 === 0) {\n await new Promise(resolve => setTimeout(resolve, 0));\n }\n } catch (e) {\n console.error(`Failed to process page ${pageNum} for regex redaction`, e);\n }\n }\n\n return redactions;\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\n\nexport interface PageDimension {\n width: number;\n height: number;\n}\n\nexport interface RowLayout {\n heights: number[];\n tops: number[];\n total: number;\n}\n\n/** Standard US Letter dimensions in PDF points (72 points/inch: 8.5 x 11 inches). */\nexport const DEFAULT_FALLBACK_DIMS: PageDimension = { width: 612, height: 792 };\n\n/**\n * Pre-allocates an array of page dimensions for the entire document up front,\n * reserving estimated space based on a sample page (e.g. Page 1).\n */\nexport function estimatePageDimensions(\n numPages: number,\n sampleDim: PageDimension = DEFAULT_FALLBACK_DIMS\n): PageDimension[] {\n if (numPages <= 0) return [];\n const dim = { width: sampleDim.width, height: sampleDim.height };\n return Array.from({ length: numPages }, () => ({ ...dim }));\n}\n\n/**\n * Computes row heights, vertical tops, and total container scroll height\n * for given rows of pages and scale.\n */\nexport function computeRowLayout(\n rows: number[][],\n dimsFor: (page: number) => PageDimension,\n scale: number,\n gap = 16\n): RowLayout {\n const heights = rows.map((row) => {\n if (row.length === 0) return gap;\n const maxHeight = Math.max(...row.map((p) => dimsFor(p).height));\n return maxHeight * scale + gap;\n });\n\n const tops: number[] = [];\n let acc = 0;\n for (const h of heights) {\n tops.push(acc);\n acc += h;\n }\n\n return { heights, tops, total: acc };\n}\n\n/**\n * Checks if any page dimension in array A differs from array B beyond a tolerance.\n */\nexport function hasDimensionMismatch(\n dimsA: PageDimension[],\n dimsB: PageDimension[],\n tolerance = 0.5\n): boolean {\n if (dimsA.length !== dimsB.length) return true;\n for (let i = 0; i < dimsA.length; i++) {\n const a = dimsA[i];\n const b = dimsB[i];\n if (\n Math.abs(a.width - b.width) > tolerance ||\n Math.abs(a.height - b.height) > tolerance\n ) {\n return true;\n }\n }\n return false;\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * pdf.js asset configuration.\n *\n * The library never bundles or inlines the pdf.js worker (that produced a 5 MB bundle with a\n * `data:` URL worker, which strict Content-Security-Policies reject). Hosts serve the worker,\n * CMaps, standard fonts and wasm decoders from their own origin and tell us where they live.\n *\n * Next.js example (copy from node_modules/pdfjs-dist into public/pdfjs/):\n * configurePdfAssets({\n * workerSrc: '/pdfjs/pdf.worker.min.mjs',\n * cMapUrl: '/pdfjs/cmaps/',\n * standardFontDataUrl: '/pdfjs/standard_fonts/',\n * wasmUrl: '/pdfjs/wasm/',\n * });\n *\n * Vite example:\n * import workerSrc from 'pdfjs-dist/build/pdf.worker.min.mjs?url';\n * configurePdfAssets({ workerSrc });\n */\nimport * as pdfjsLib from 'pdfjs-dist';\nimport type { DocumentInitParameters } from 'pdfjs-dist/types/src/display/api';\n\nexport interface PdfAssetPaths {\n /** URL of `pdf.worker.min.mjs` matching the installed pdfjs-dist version. REQUIRED. */\n workerSrc?: string;\n /** Directory URL (trailing slash) of the packed CMaps — needed for CJK/Indic text. */\n cMapUrl?: string;\n /** Directory URL (trailing slash) of the standard 14 font substitutes. */\n standardFontDataUrl?: string;\n /** Directory URL (trailing slash) of the wasm decoders (JPX/OpenJPEG, qcms). */\n wasmUrl?: string;\n /** Directory URL (trailing slash) of ICC profiles. */\n iccUrl?: string;\n}\n\nlet configured: PdfAssetPaths = {};\n\nexport function configurePdfAssets(paths: PdfAssetPaths): void {\n configured = { ...configured, ...paths };\n if (paths.workerSrc) {\n pdfjsLib.GlobalWorkerOptions.workerSrc = paths.workerSrc;\n }\n}\n\nexport function getPdfAssetPaths(): Readonly<PdfAssetPaths> {\n return configured;\n}\n\n/** True once a worker URL has been configured (either via configurePdfAssets or directly on pdf.js). */\nexport function isWorkerConfigured(): boolean {\n return Boolean(configured.workerSrc || pdfjsLib.GlobalWorkerOptions.workerSrc);\n}\n\n/**\n * Throws a descriptive error when the worker has not been configured. Called lazily right before\n * the first `getDocument()` — never at module scope, so importing the package is side-effect free\n * and safe under SSR.\n */\nexport function assertWorkerConfigured(): void {\n if (isWorkerConfigured()) return;\n throw new Error(\n '[teamsync-pdf-viewer] pdf.js worker not configured. Call configurePdfAssets({ workerSrc }) ' +\n 'with the URL of pdf.worker.min.mjs (same pdfjs-dist version) before loading a document, or ' +\n 'pass `assets={{ workerSrc }}` to <TeamSyncViewer>.'\n );\n}\n\n/** Extra `getDocument()` parameters derived from the configured asset paths. */\nexport function getDocumentParams(): Partial<DocumentInitParameters> {\n const params: Partial<DocumentInitParameters> = {};\n if (configured.cMapUrl) {\n params.cMapUrl = configured.cMapUrl;\n params.cMapPacked = true;\n }\n if (configured.standardFontDataUrl) params.standardFontDataUrl = configured.standardFontDataUrl;\n if (configured.wasmUrl) params.wasmUrl = configured.wasmUrl;\n if (configured.iccUrl) params.iccUrl = configured.iccUrl;\n return params;\n}\n\n/** pdfjs-dist version this build was compiled against (useful for worker-version mismatch checks). */\nexport const pdfjsVersion: string = pdfjsLib.version;\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\n\nimport React, { useState } from 'react';\nimport type { DiffBoundingBox } from '../types/compare';\n\ninterface DiffHighlightOverlayProps {\n boxes: DiffBoundingBox[];\n scale: number;\n colorScheme?: 'deletions' | 'additions' | 'all';\n selectedDiffId?: string | null;\n onSelectDiff?: (id: string) => void;\n}\n\nexport default function DiffHighlightOverlay({\n boxes,\n scale,\n colorScheme = 'all',\n selectedDiffId,\n onSelectDiff\n}: DiffHighlightOverlayProps) {\n const [hoveredId, setHoveredId] = useState<string | null>(null);\n\n if (!boxes || boxes.length === 0) return null;\n\n const filteredBoxes = boxes.filter(b => {\n if (colorScheme === 'deletions') return b.type === 'deletion' || b.type === 'modification';\n if (colorScheme === 'additions') return b.type === 'addition' || b.type === 'modification';\n return true;\n });\n\n return (\n <div\n className=\"tspdf-diff-highlight-overlay\"\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n pointerEvents: 'none',\n zIndex: 15\n }}\n >\n <style>{`\n @keyframes tspdf-diff-pulse {\n 0% {\n box-shadow: 0 0 0 0 rgba(2, 132, 199, 0.8), 0 0 12px rgba(2, 132, 199, 0.5);\n }\n 50% {\n box-shadow: 0 0 0 6px rgba(2, 132, 199, 0.35), 0 0 24px rgba(2, 132, 199, 0.8);\n }\n 100% {\n box-shadow: 0 0 0 0 rgba(2, 132, 199, 0.8), 0 0 12px rgba(2, 132, 199, 0.5);\n }\n }\n `}</style>\n {filteredBoxes.map((box) => {\n const isSelected = selectedDiffId === box.id;\n const isHovered = hoveredId === box.id;\n\n let bg = 'rgba(245, 158, 11, 0.22)';\n let border = '1.5px solid #f59e0b';\n let labelColor = '#d97706';\n let labelPrefix = 'Changed';\n\n if (box.type === 'deletion') {\n bg = isSelected ? 'rgba(225, 29, 72, 0.35)' : 'rgba(225, 29, 72, 0.22)';\n border = isSelected ? '2px solid #e11d48' : '1.5px solid #e11d48';\n labelColor = '#e11d48';\n labelPrefix = 'Removed';\n } else if (box.type === 'addition') {\n bg = isSelected ? 'rgba(16, 185, 129, 0.35)' : 'rgba(16, 185, 129, 0.22)';\n border = isSelected ? '2px solid #10b981' : '1.5px solid #10b981';\n labelColor = '#059669';\n labelPrefix = 'Added';\n }\n\n const x = box.x * scale;\n const y = box.y * scale;\n const w = box.width * scale;\n const h = box.height * scale;\n\n return (\n <div\n key={box.id}\n id={`diff-highlight-${box.id}`}\n onClick={(e) => {\n e.stopPropagation();\n onSelectDiff?.(box.id);\n }}\n onMouseEnter={() => setHoveredId(box.id)}\n onMouseLeave={() => setHoveredId(null)}\n style={{\n position: 'absolute',\n left: `${x}px`,\n top: `${y}px`,\n width: `${w}px`,\n height: `${h}px`,\n backgroundColor: bg,\n border: border,\n borderRadius: '4px',\n cursor: 'pointer',\n pointerEvents: 'auto',\n animation: isSelected ? 'tspdf-diff-pulse 1.8s infinite ease-in-out' : 'none',\n boxShadow: isSelected\n ? '0 0 0 3px #0284c7, 0 4px 16px rgba(2, 132, 199, 0.5)'\n : isHovered\n ? '0 0 0 2px rgba(0,0,0,0.25)'\n : 'none',\n transition: 'all 0.15s ease-in-out',\n zIndex: isSelected ? 30 : isHovered ? 25 : 15\n }}\n title={`${labelPrefix}: ${box.text}`}\n >\n {(isHovered || isSelected) && (\n <div\n style={{\n position: 'absolute',\n bottom: '100%',\n left: '50%',\n transform: 'translateX(-50%)',\n marginBottom: '6px',\n backgroundColor: '#0f172a',\n color: '#ffffff',\n fontSize: '11px',\n fontWeight: 600,\n padding: '4px 10px',\n borderRadius: '6px',\n whiteSpace: 'nowrap',\n boxShadow: '0 4px 14px rgba(0,0,0,0.3)',\n zIndex: 40,\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n pointerEvents: 'none'\n }}\n >\n <span style={{ color: labelColor, fontWeight: 700, textTransform: 'uppercase', fontSize: '10px' }}>\n {labelPrefix}\n </span>\n <span style={{ maxWidth: '220px', overflow: 'hidden', textOverflow: 'ellipsis' }}>\n \"{box.text}\"\n </span>\n <div style={{\n position: 'absolute',\n top: '100%',\n left: '50%',\n transform: 'translateX(-50%)',\n width: 0,\n height: 0,\n borderLeft: '5px solid transparent',\n borderRight: '5px solid transparent',\n borderTop: '5px solid #0f172a'\n }} />\n </div>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\n\nimport React, { useRef, useEffect, useState, useCallback } from 'react';\nimport * as pdfjsLib from 'pdfjs-dist';\nimport { GripVertical } from 'lucide-react';\nimport PageRenderer from './PageRenderer';\nimport DiffHighlightOverlay from './DiffHighlightOverlay';\nimport type { SDKPermissions, WatermarkOptions, Redaction } from '../core/types';\nimport type { DiffBoundingBox } from '../types/compare';\nimport { clampScale } from '../utils/zoomUtils';\n\ninterface SideBySideViewerProps {\n pdfDocA: pdfjsLib.PDFDocumentProxy | null;\n pdfDocB: pdfjsLib.PDFDocumentProxy | null;\n pageNum: number;\n scale: number;\n rotation: number;\n basePageDims: { width: number; height: number };\n activeTab: string;\n activeTool: string | null;\n annotations: any[];\n permissions?: SDKPermissions;\n watermark?: WatermarkOptions;\n watermarkText?: string;\n redactions?: Redaction[];\n diffsA?: DiffBoundingBox[];\n diffsB?: DiffBoundingBox[];\n selectedDiffId?: string | null;\n onSelectDiff?: (id: string) => void;\n onScrollSync?: (scrollTop: number, scrollLeft: number) => void;\n hideAnnotationsUntilPageRendered?: boolean;\n is90Fit?: boolean;\n zoomMultiplier?: number;\n onZoomIn?: () => void;\n onZoomOut?: () => void;\n}\n\nexport default function SideBySideViewer({\n pdfDocA,\n pdfDocB,\n pageNum,\n scale,\n rotation,\n basePageDims,\n activeTab,\n activeTool,\n annotations,\n watermark,\n watermarkText,\n redactions,\n diffsA = [],\n diffsB = [],\n selectedDiffId,\n onSelectDiff,\n hideAnnotationsUntilPageRendered = true,\n is90Fit = true,\n zoomMultiplier = 1.0,\n onZoomIn,\n onZoomOut,\n}: SideBySideViewerProps) {\n const wrapperRef = useRef<HTMLDivElement>(null);\n const containerARef = useRef<HTMLDivElement>(null);\n const containerBRef = useRef<HTMLDivElement>(null);\n const isSyncingRef = useRef(false);\n\n // Separator drag state (defaults to 50% split)\n const [splitPercent, setSplitPercent] = useState<number>(50);\n const [isDraggingSeparator, setIsDraggingSeparator] = useState<boolean>(false);\n\n // Pan tool state\n const [isPanning, setIsPanning] = useState<boolean>(false);\n const panStartRef = useRef<{\n x: number;\n y: number;\n scrollLeftA: number;\n scrollTopA: number;\n scrollLeftB: number;\n scrollTopB: number;\n } | null>(null);\n\n // Respective panel window dimensions\n const [panelDimA, setPanelDimA] = useState<{ width: number; height: number }>({ width: 0, height: 0 });\n const [panelDimB, setPanelDimB] = useState<{ width: number; height: number }>({ width: 0, height: 0 });\n\n const updatePanelDimensions = useCallback(() => {\n if (containerARef.current) {\n setPanelDimA({\n width: containerARef.current.clientWidth,\n height: containerARef.current.clientHeight,\n });\n }\n if (containerBRef.current) {\n setPanelDimB({\n width: containerBRef.current.clientWidth,\n height: containerBRef.current.clientHeight,\n });\n }\n }, []);\n\n useEffect(() => {\n updatePanelDimensions();\n\n const roA = containerARef.current && typeof ResizeObserver !== 'undefined'\n ? new ResizeObserver(updatePanelDimensions)\n : null;\n const roB = containerBRef.current && typeof ResizeObserver !== 'undefined'\n ? new ResizeObserver(updatePanelDimensions)\n : null;\n\n if (roA && containerARef.current) roA.observe(containerARef.current);\n if (roB && containerBRef.current) roB.observe(containerBRef.current);\n\n window.addEventListener('resize', updatePanelDimensions);\n\n return () => {\n roA?.disconnect();\n roB?.disconnect();\n window.removeEventListener('resize', updatePanelDimensions);\n };\n }, [updatePanelDimensions, splitPercent]);\n\n // Synchronize scrolling between Panel A and Panel B\n useEffect(() => {\n const elA = containerARef.current;\n const elB = containerBRef.current;\n if (!elA || !elB) return;\n\n const syncAtoB = () => {\n if (isSyncingRef.current || isPanning) return;\n isSyncingRef.current = true;\n const maxScrollTopA = elA.scrollHeight - elA.clientHeight;\n const maxScrollTopB = elB.scrollHeight - elB.clientHeight;\n if (maxScrollTopA > 0 && maxScrollTopB > 0) {\n elB.scrollTop = (elA.scrollTop / maxScrollTopA) * maxScrollTopB;\n } else {\n elB.scrollTop = elA.scrollTop;\n }\n\n const maxScrollLeftA = elA.scrollWidth - elA.clientWidth;\n const maxScrollLeftB = elB.scrollWidth - elB.clientWidth;\n if (maxScrollLeftA > 0 && maxScrollLeftB > 0) {\n elB.scrollLeft = (elA.scrollLeft / maxScrollLeftA) * maxScrollLeftB;\n } else {\n elB.scrollLeft = elA.scrollLeft;\n }\n setTimeout(() => { isSyncingRef.current = false; }, 10);\n };\n\n const syncBtoA = () => {\n if (isSyncingRef.current || isPanning) return;\n isSyncingRef.current = true;\n const maxScrollTopA = elA.scrollHeight - elA.clientHeight;\n const maxScrollTopB = elB.scrollHeight - elB.clientHeight;\n if (maxScrollTopA > 0 && maxScrollTopB > 0) {\n elA.scrollTop = (elB.scrollTop / maxScrollTopB) * maxScrollTopA;\n } else {\n elA.scrollTop = elB.scrollTop;\n }\n\n const maxScrollLeftA = elA.scrollWidth - elA.clientWidth;\n const maxScrollLeftB = elB.scrollWidth - elB.clientWidth;\n if (maxScrollLeftA > 0 && maxScrollLeftB > 0) {\n elA.scrollLeft = (elB.scrollLeft / maxScrollLeftB) * maxScrollLeftA;\n } else {\n elA.scrollLeft = elB.scrollLeft;\n }\n setTimeout(() => { isSyncingRef.current = false; }, 10);\n };\n\n elA.addEventListener('scroll', syncAtoB);\n elB.addEventListener('scroll', syncBtoA);\n\n return () => {\n elA.removeEventListener('scroll', syncAtoB);\n elB.removeEventListener('scroll', syncBtoA);\n };\n }, [isPanning]);\n\n // Separator drag handling\n const handleSeparatorMouseDown = (e: React.MouseEvent) => {\n e.preventDefault();\n setIsDraggingSeparator(true);\n };\n\n const handleSeparatorTouchStart = (_e: React.TouchEvent) => {\n setIsDraggingSeparator(true);\n };\n\n const handleSeparatorDoubleClick = () => {\n setSplitPercent(50);\n };\n\n useEffect(() => {\n if (!isDraggingSeparator) return;\n\n const onMouseMove = (e: MouseEvent) => {\n if (!wrapperRef.current) return;\n const rect = wrapperRef.current.getBoundingClientRect();\n if (rect.width <= 0) return;\n const offsetX = e.clientX - rect.left;\n const pct = (offsetX / rect.width) * 100;\n setSplitPercent(Math.max(15, Math.min(85, pct)));\n };\n\n const onTouchMove = (e: TouchEvent) => {\n if (!wrapperRef.current || !e.touches[0]) return;\n const rect = wrapperRef.current.getBoundingClientRect();\n if (rect.width <= 0) return;\n const offsetX = e.touches[0].clientX - rect.left;\n const pct = (offsetX / rect.width) * 100;\n setSplitPercent(Math.max(15, Math.min(85, pct)));\n };\n\n const onDragEnd = () => {\n setIsDraggingSeparator(false);\n };\n\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', onDragEnd);\n window.addEventListener('touchmove', onTouchMove);\n window.addEventListener('touchend', onDragEnd);\n\n document.body.style.userSelect = 'none';\n document.body.style.cursor = 'col-resize';\n\n return () => {\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('mouseup', onDragEnd);\n window.removeEventListener('touchmove', onTouchMove);\n window.removeEventListener('touchend', onDragEnd);\n document.body.style.userSelect = '';\n document.body.style.cursor = '';\n };\n }, [isDraggingSeparator]);\n\n // Synchronized Pan tool handling\n const handlePanelMouseDown = (e: React.MouseEvent) => {\n if (activeTool === 'pan' && e.button === 0) {\n e.preventDefault();\n setIsPanning(true);\n panStartRef.current = {\n x: e.clientX,\n y: e.clientY,\n scrollLeftA: containerARef.current?.scrollLeft || 0,\n scrollTopA: containerARef.current?.scrollTop || 0,\n scrollLeftB: containerBRef.current?.scrollLeft || 0,\n scrollTopB: containerBRef.current?.scrollTop || 0,\n };\n }\n };\n\n useEffect(() => {\n if (!isPanning) return;\n\n const onMouseMove = (e: MouseEvent) => {\n if (!panStartRef.current) return;\n const dx = e.clientX - panStartRef.current.x;\n const dy = e.clientY - panStartRef.current.y;\n\n if (containerARef.current) {\n containerARef.current.scrollLeft = panStartRef.current.scrollLeftA - dx;\n containerARef.current.scrollTop = panStartRef.current.scrollTopA - dy;\n }\n if (containerBRef.current) {\n containerBRef.current.scrollLeft = panStartRef.current.scrollLeftB - dx;\n containerBRef.current.scrollTop = panStartRef.current.scrollTopB - dy;\n }\n };\n\n const onMouseUp = () => {\n setIsPanning(false);\n panStartRef.current = null;\n };\n\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', onMouseUp);\n document.body.style.userSelect = 'none';\n document.body.style.cursor = 'grabbing';\n\n return () => {\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('mouseup', onMouseUp);\n document.body.style.userSelect = '';\n document.body.style.cursor = '';\n };\n }, [isPanning]);\n\n // Ctrl / Cmd + Wheel zooming support\n useEffect(() => {\n const el = wrapperRef.current;\n if (!el) return;\n const handleWheel = (e: WheelEvent) => {\n if (e.ctrlKey || e.metaKey) {\n e.preventDefault();\n if (e.deltaY < 0) {\n onZoomIn?.();\n } else {\n onZoomOut?.();\n }\n }\n };\n el.addEventListener('wheel', handleWheel, { passive: false });\n return () => {\n el.removeEventListener('wheel', handleWheel);\n };\n }, [onZoomIn, onZoomOut]);\n\n // Page dimensions\n const [dimsA, setDimsA] = useState<{ width: number; height: number }>(basePageDims);\n const [dimsB, setDimsB] = useState<{ width: number; height: number }>(basePageDims);\n\n useEffect(() => {\n if (pdfDocA) {\n pdfDocA.getPage(pageNum).then(page => {\n const vp = page.getViewport({ scale: 1, rotation: (page.rotate + rotation) % 360 });\n setDimsA({ width: vp.width, height: vp.height });\n }).catch(() => {});\n }\n }, [pdfDocA, pageNum, rotation]);\n\n useEffect(() => {\n if (pdfDocB) {\n pdfDocB.getPage(pageNum).then(page => {\n const vp = page.getViewport({ scale: 1, rotation: (page.rotate + rotation) % 360 });\n setDimsB({ width: vp.width, height: vp.height });\n }).catch(() => {});\n }\n }, [pdfDocB, pageNum, rotation]);\n\n // 90% window fit calculation for each respective panel:\n // Scales the document to occupy 90% of the available width and height of its panel\n const panelW_A = panelDimA.width || (wrapperRef.current?.clientWidth ? wrapperRef.current.clientWidth * (splitPercent / 100) : 600);\n const panelH_A = panelDimA.height || (wrapperRef.current?.clientHeight || 800);\n const availableWidthA = panelW_A * 0.90;\n const availableHeightA = Math.max(100, panelH_A - 50) * 0.90;\n const fitScaleA = Math.min(\n availableWidthA / (dimsA.width || 600),\n availableHeightA / (dimsA.height || 800)\n );\n\n const panelW_B = panelDimB.width || (wrapperRef.current?.clientWidth ? wrapperRef.current.clientWidth * ((100 - splitPercent) / 100) : 600);\n const panelH_B = panelDimB.height || (wrapperRef.current?.clientHeight || 800);\n const availableWidthB = panelW_B * 0.90;\n const availableHeightB = Math.max(100, panelH_B - 50) * 0.90;\n const fitScaleB = Math.min(\n availableWidthB / (dimsB.width || 600),\n availableHeightB / (dimsB.height || 800)\n );\n\n // If in 90% fit mode, scale to 90% of respective panel window; otherwise apply manual zoom\n const effectiveScaleA = clampScale(is90Fit ? fitScaleA * zoomMultiplier : scale * zoomMultiplier);\n const effectiveScaleB = clampScale(is90Fit ? fitScaleB * zoomMultiplier : scale * zoomMultiplier);\n\n const scaledWidthA = (dimsA.width || 600) * effectiveScaleA;\n const scaledHeightA = (dimsA.height || 800) * effectiveScaleA;\n\n const scaledWidthB = (dimsB.width || 600) * effectiveScaleB;\n const scaledHeightB = (dimsB.height || 800) * effectiveScaleB;\n\n // Smooth scroll to selected diff box\n useEffect(() => {\n if (!selectedDiffId) return;\n const allDiffs = [...(diffsA || []), ...(diffsB || [])];\n const targetBox = allDiffs.find(d => d.id === selectedDiffId);\n if (targetBox && containerARef.current) {\n const viewH = containerARef.current.clientHeight || 600;\n const targetY = targetBox.y * effectiveScaleA;\n const scrollToY = Math.max(0, targetY - viewH / 3);\n containerARef.current.scrollTo({\n top: scrollToY,\n behavior: 'smooth'\n });\n }\n }, [selectedDiffId, diffsA, diffsB, effectiveScaleA]);\n\n return (\n <div\n ref={wrapperRef}\n style={{\n flex: 1,\n display: 'flex',\n flexDirection: 'row',\n minHeight: 0,\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n position: 'relative',\n }}\n >\n {/* Panel A - Document A (Base) */}\n <div\n ref={containerARef}\n onMouseDown={handlePanelMouseDown}\n style={{\n width: `${splitPercent}%`,\n flexShrink: 0,\n flexGrow: 0,\n height: '100%',\n overflow: 'auto',\n backgroundColor: '#f1f5f9',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n padding: '16px',\n boxSizing: 'border-box',\n cursor: isPanning ? 'grabbing' : activeTool === 'pan' ? 'grab' : 'default',\n }}\n >\n <div style={{\n marginBottom: '8px', padding: '4px 12px', borderRadius: '4px',\n backgroundColor: '#e11d48', color: '#ffffff', fontSize: '11px', fontWeight: 600,\n userSelect: 'none',\n }}>\n Document A (Base) - Page {pageNum}\n </div>\n <div style={{\n position: 'relative',\n width: `${scaledWidthA}px`,\n height: `${scaledHeightA}px`,\n boxShadow: '0 4px 16px rgba(0,0,0,0.18)',\n backgroundColor: '#ffffff',\n transition: isDraggingSeparator ? 'none' : 'width 0.1s ease, height 0.1s ease',\n }}>\n {pdfDocA && (\n <PageRenderer\n pageNum={pageNum}\n pdfDoc={pdfDocA}\n scale={effectiveScaleA}\n rotation={rotation}\n scrollTop={0}\n scrollLeft={0}\n pageTop={0}\n basePageWidth={dimsA.width}\n basePageHeight={dimsA.height}\n containerWidth={scaledWidthA}\n containerHeight={scaledHeightA}\n activeTab={activeTab}\n activeTool={activeTool}\n annotations={annotations}\n selectedAnnotationId={null}\n activeSearchResult={null}\n onMouseDown={() => {}}\n onMouseMove={() => {}}\n onMouseUp={() => {}}\n onAnnotationMouseEnter={() => {}}\n onAnnotationClick={() => {}}\n onClearSelection={() => {}}\n watermark={watermark}\n watermarkText={watermarkText}\n redactions={redactions}\n hideAnnotationsUntilPageRendered={hideAnnotationsUntilPageRendered}\n />\n )}\n <DiffHighlightOverlay\n boxes={diffsA}\n scale={effectiveScaleA}\n colorScheme=\"deletions\"\n selectedDiffId={selectedDiffId}\n onSelectDiff={onSelectDiff}\n />\n </div>\n </div>\n\n {/* Movable Draggable Separator */}\n <div\n onMouseDown={handleSeparatorMouseDown}\n onTouchStart={handleSeparatorTouchStart}\n onDoubleClick={handleSeparatorDoubleClick}\n style={{\n width: '12px',\n margin: '0 -6px',\n zIndex: 40,\n cursor: 'col-resize',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n position: 'relative',\n userSelect: 'none',\n }}\n title=\"Drag to resize panels • Double-click to reset (50/50)\"\n >\n {/* Vertical divider line */}\n <div\n style={{\n width: '2px',\n height: '100%',\n backgroundColor: isDraggingSeparator ? '#0284c7' : '#cbd5e1',\n boxShadow: isDraggingSeparator ? '0 0 6px rgba(2, 132, 199, 0.6)' : 'none',\n transition: 'background-color 0.15s, box-shadow 0.15s',\n }}\n />\n\n {/* Center Grab Handle Pill */}\n <div\n style={{\n position: 'absolute',\n top: '50%',\n transform: 'translateY(-50%)',\n width: '20px',\n height: '36px',\n borderRadius: '10px',\n backgroundColor: isDraggingSeparator ? '#0284c7' : '#ffffff',\n border: `1px solid ${isDraggingSeparator ? '#0284c7' : '#94a3b8'}`,\n boxShadow: '0 2px 8px rgba(0,0,0,0.15)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: isDraggingSeparator ? '#ffffff' : '#64748b',\n transition: 'all 0.15s ease',\n }}\n >\n <GripVertical size={14} />\n </div>\n </div>\n\n {/* Panel B - Document B (Comparison) */}\n <div\n ref={containerBRef}\n onMouseDown={handlePanelMouseDown}\n style={{\n flex: 1,\n height: '100%',\n overflow: 'auto',\n backgroundColor: '#f1f5f9',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n padding: '16px',\n boxSizing: 'border-box',\n cursor: isPanning ? 'grabbing' : activeTool === 'pan' ? 'grab' : 'default',\n }}\n >\n <div style={{\n marginBottom: '8px', padding: '4px 12px', borderRadius: '4px',\n backgroundColor: '#0284c7', color: '#ffffff', fontSize: '11px', fontWeight: 600,\n userSelect: 'none',\n }}>\n Document B (Comparison) - Page {pageNum}\n </div>\n <div style={{\n position: 'relative',\n width: `${scaledWidthB}px`,\n height: `${scaledHeightB}px`,\n boxShadow: '0 4px 16px rgba(0,0,0,0.18)',\n backgroundColor: '#ffffff',\n transition: isDraggingSeparator ? 'none' : 'width 0.1s ease, height 0.1s ease',\n }}>\n {pdfDocB && (\n <PageRenderer\n pageNum={pageNum}\n pdfDoc={pdfDocB}\n scale={effectiveScaleB}\n rotation={rotation}\n scrollTop={0}\n scrollLeft={0}\n pageTop={0}\n basePageWidth={dimsB.width}\n basePageHeight={dimsB.height}\n containerWidth={scaledWidthB}\n containerHeight={scaledHeightB}\n activeTab={activeTab}\n activeTool={activeTool}\n annotations={annotations}\n selectedAnnotationId={null}\n activeSearchResult={null}\n onMouseDown={() => {}}\n onMouseMove={() => {}}\n onMouseUp={() => {}}\n onAnnotationMouseEnter={() => {}}\n onAnnotationClick={() => {}}\n onClearSelection={() => {}}\n watermark={watermark}\n watermarkText={watermarkText}\n redactions={redactions}\n hideAnnotationsUntilPageRendered={hideAnnotationsUntilPageRendered}\n />\n )}\n <DiffHighlightOverlay\n boxes={diffsB}\n scale={effectiveScaleB}\n colorScheme=\"additions\"\n selectedDiffId={selectedDiffId}\n onSelectDiff={onSelectDiff}\n />\n </div>\n </div>\n </div>\n );\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\n\nimport React from 'react';\nimport { Layers, Columns, FileText, SlidersHorizontal, ChevronLeft, ChevronRight, X, MinusCircle, PlusCircle, Maximize2, Hand, MousePointer } from 'lucide-react';\nimport type { CompareMode, CompareState } from '../types/compare';\n\ninterface CompareToolbarProps {\n compareState: CompareState;\n onSetMode: (mode: CompareMode) => void;\n onSetColors: (colorA: string, colorB: string) => void;\n onToggleCurtain: () => void;\n onPrevDiff: () => void;\n onNextDiff: () => void;\n onExit: () => void;\n is90Fit?: boolean;\n zoomMultiplier?: number;\n onZoomIn?: () => void;\n onZoomOut?: () => void;\n onFit90?: () => void;\n activeTool?: string | null;\n onSetTool?: (tool: string | null) => void;\n}\n\nexport default function CompareToolbar({\n compareState,\n onSetMode,\n onSetColors,\n onToggleCurtain,\n onPrevDiff,\n onNextDiff,\n onExit,\n is90Fit = true,\n zoomMultiplier = 1.0,\n onZoomIn,\n onZoomOut,\n onFit90,\n activeTool,\n onSetTool\n}: CompareToolbarProps) {\n const { mode, colorA, colorB, showCurtain, diffItems, currentDiffIndex } = compareState;\n\n return (\n <div style={{\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n padding: '6px 16px',\n backgroundColor: '#1e293b',\n color: '#f8fafc',\n borderBottom: '1px solid #334155',\n height: '42px',\n fontSize: '13px',\n zIndex: 100,\n overflowX: 'auto',\n whiteSpace: 'nowrap',\n flexShrink: 0\n }}>\n {/* Compare Status Badge */}\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px', fontWeight: 600, color: '#38bdf8' }}>\n <Layers size={16} />\n <span>Document Compare</span>\n </div>\n\n <div style={{ width: '1px', height: '20px', backgroundColor: '#475569' }} />\n\n {/* Mode Switcher */}\n <div style={{ display: 'flex', backgroundColor: '#0f172a', borderRadius: '6px', padding: '2px' }}>\n <button\n onClick={() => onSetMode('overlay')}\n style={{\n display: 'flex', alignItems: 'center', gap: '6px',\n padding: '4px 10px', borderRadius: '4px', border: 'none',\n backgroundColor: mode === 'overlay' ? '#0284c7' : 'transparent',\n color: mode === 'overlay' ? '#ffffff' : '#94a3b8',\n cursor: 'pointer', fontSize: '12px', fontWeight: 500\n }}\n title=\"Overlay Color Blend Diff\"\n >\n <Layers size={14} />\n <span>Overlay Diff</span>\n </button>\n\n <button\n onClick={() => onSetMode('side-by-side')}\n style={{\n display: 'flex', alignItems: 'center', gap: '6px',\n padding: '4px 10px', borderRadius: '4px', border: 'none',\n backgroundColor: mode === 'side-by-side' ? '#0284c7' : 'transparent',\n color: mode === 'side-by-side' ? '#ffffff' : '#94a3b8',\n cursor: 'pointer', fontSize: '12px', fontWeight: 500\n }}\n title=\"Side-by-Side Synchronized MultiViewer\"\n >\n <Columns size={14} />\n <span>Side-by-Side</span>\n </button>\n\n <button\n onClick={() => onSetMode('semantic')}\n style={{\n display: 'flex', alignItems: 'center', gap: '6px',\n padding: '4px 10px', borderRadius: '4px', border: 'none',\n backgroundColor: mode === 'semantic' ? '#0284c7' : 'transparent',\n color: mode === 'semantic' ? '#ffffff' : '#94a3b8',\n cursor: 'pointer', fontSize: '12px', fontWeight: 500\n }}\n title=\"Semantic Text & Structured Diff\"\n >\n <FileText size={14} />\n <span>Text Diff</span>\n </button>\n </div>\n\n {/* Mode Specific Controls */}\n {mode === 'overlay' && (\n <>\n <div style={{ width: '1px', height: '20px', backgroundColor: '#475569' }} />\n \n {/* Color Tint Selectors */}\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '4px' }}>\n <span style={{ fontSize: '11px', color: '#94a3b8' }}>Doc A:</span>\n <input\n type=\"color\"\n value={colorA}\n onChange={(e) => onSetColors(e.target.value, colorB)}\n style={{ width: '22px', height: '22px', border: 'none', borderRadius: '4px', cursor: 'pointer', backgroundColor: 'transparent' }}\n title=\"Document A Tint Color (Deletions)\"\n />\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: '4px' }}>\n <span style={{ fontSize: '11px', color: '#94a3b8' }}>Doc B:</span>\n <input\n type=\"color\"\n value={colorB}\n onChange={(e) => onSetColors(colorA, e.target.value)}\n style={{ width: '22px', height: '22px', border: 'none', borderRadius: '4px', cursor: 'pointer', backgroundColor: 'transparent' }}\n title=\"Document B Tint Color (Additions)\"\n />\n </div>\n </div>\n\n <button\n onClick={onToggleCurtain}\n style={{\n display: 'flex', alignItems: 'center', gap: '4px',\n padding: '4px 8px', borderRadius: '4px', border: '1px solid #475569',\n backgroundColor: showCurtain ? '#0369a1' : 'transparent',\n color: '#f8fafc', cursor: 'pointer', fontSize: '12px'\n }}\n title=\"Toggle Wipe Curtain Slider\"\n >\n <SlidersHorizontal size={14} />\n <span>Curtain Slider</span>\n </button>\n </>\n )}\n\n {/* Zoom & View Controls */}\n {onZoomIn && onZoomOut && (\n <>\n <div style={{ width: '1px', height: '20px', backgroundColor: '#475569' }} />\n <div style={{ display: 'flex', alignItems: 'center', gap: '4px', backgroundColor: '#0f172a', borderRadius: '6px', padding: '2px' }}>\n <button\n onClick={onZoomOut}\n style={{\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n width: '26px', height: '26px', borderRadius: '4px', border: 'none',\n backgroundColor: 'transparent', color: '#cbd5e1', cursor: 'pointer'\n }}\n title=\"Zoom Out (-)\"\n aria-label=\"Zoom Out\"\n >\n <MinusCircle size={15} />\n </button>\n\n <button\n onClick={onFit90}\n style={{\n display: 'flex', alignItems: 'center', gap: '4px',\n padding: '2px 8px', height: '26px', borderRadius: '4px', border: 'none',\n backgroundColor: (is90Fit && zoomMultiplier === 1.0) ? '#0284c7' : 'transparent',\n color: (is90Fit && zoomMultiplier === 1.0) ? '#ffffff' : '#cbd5e1',\n cursor: 'pointer', fontSize: '11px', fontWeight: 600\n }}\n title=\"Reset both documents to 90% window fit\"\n aria-label=\"Fit to 90% Window\"\n >\n <Maximize2 size={13} />\n <span>{is90Fit && zoomMultiplier === 1.0 ? '90% Fit' : `${Math.round(zoomMultiplier * 100)}%`}</span>\n </button>\n\n <button\n onClick={onZoomIn}\n style={{\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n width: '26px', height: '26px', borderRadius: '4px', border: 'none',\n backgroundColor: 'transparent', color: '#cbd5e1', cursor: 'pointer'\n }}\n title=\"Zoom In (+)\"\n aria-label=\"Zoom In\"\n >\n <PlusCircle size={15} />\n </button>\n </div>\n </>\n )}\n\n {/* Navigation & Pan Controls */}\n {onSetTool && (\n <>\n <div style={{ display: 'flex', alignItems: 'center', gap: '2px', backgroundColor: '#0f172a', borderRadius: '6px', padding: '2px' }}>\n <button\n onClick={() => onSetTool('select')}\n style={{\n display: 'flex', alignItems: 'center', gap: '4px',\n padding: '4px 8px', height: '26px', borderRadius: '4px', border: 'none',\n backgroundColor: activeTool !== 'pan' ? '#0284c7' : 'transparent',\n color: activeTool !== 'pan' ? '#ffffff' : '#94a3b8',\n cursor: 'pointer', fontSize: '11px', fontWeight: 500\n }}\n title=\"Select / Pointer Tool\"\n aria-label=\"Select Tool\"\n >\n <MousePointer size={13} />\n <span>Select</span>\n </button>\n\n <button\n onClick={() => onSetTool(activeTool === 'pan' ? 'select' : 'pan')}\n style={{\n display: 'flex', alignItems: 'center', gap: '4px',\n padding: '4px 8px', height: '26px', borderRadius: '4px', border: 'none',\n backgroundColor: activeTool === 'pan' ? '#0284c7' : 'transparent',\n color: activeTool === 'pan' ? '#ffffff' : '#94a3b8',\n cursor: 'pointer', fontSize: '11px', fontWeight: 500\n }}\n title=\"Pan Tool (Hand) — Click and drag to pan both documents\"\n aria-label=\"Pan Tool\"\n >\n <Hand size={13} />\n <span>Pan</span>\n </button>\n </div>\n </>\n )}\n\n {/* Diff Navigation Counter */}\n {diffItems.length > 0 && (\n <>\n <div style={{ width: '1px', height: '20px', backgroundColor: '#475569' }} />\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px' }}>\n <button\n onClick={onPrevDiff}\n style={{ padding: '2px 6px', borderRadius: '4px', border: 'none', backgroundColor: '#334155', color: '#f8fafc', cursor: 'pointer' }}\n title=\"Previous Difference\"\n >\n <ChevronLeft size={14} />\n </button>\n <span style={{ fontSize: '12px', color: '#cbd5e1', minWidth: '70px', textAlign: 'center' }}>\n {currentDiffIndex + 1} of {diffItems.length} diffs\n </span>\n <button\n onClick={onNextDiff}\n style={{ padding: '2px 6px', borderRadius: '4px', border: 'none', backgroundColor: '#334155', color: '#f8fafc', cursor: 'pointer' }}\n title=\"Next Difference\"\n >\n <ChevronRight size={14} />\n </button>\n </div>\n </>\n )}\n\n <div style={{ flex: 1 }} />\n\n {/* Exit Compare Button */}\n <button\n onClick={onExit}\n style={{\n display: 'flex', alignItems: 'center', gap: '4px',\n padding: '4px 10px', borderRadius: '4px', border: 'none',\n backgroundColor: '#dc2626', color: '#ffffff',\n cursor: 'pointer', fontSize: '12px', fontWeight: 600\n }}\n title=\"Exit Compare Mode\"\n >\n <X size={14} />\n <span>Exit Compare</span>\n </button>\n </div>\n );\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\n\nimport React from 'react';\nimport { Layers, FileText, CheckCircle2, MinusCircle, PlusCircle, AlertCircle } from 'lucide-react';\nimport type { DiffItem, TextDiffSegment } from '../types/compare';\n\ninterface DiffSummarySidebarProps {\n isOpen: boolean;\n onClose: () => void;\n diffItems: DiffItem[];\n textDiffs: TextDiffSegment[];\n currentDiffIndex: number;\n onSelectDiff: (index: number, item?: DiffItem) => void;\n onJumpToPage: (pageIndex: number) => void;\n}\n\nexport default function DiffSummarySidebar({\n isOpen,\n diffItems,\n textDiffs,\n currentDiffIndex,\n onSelectDiff,\n onJumpToPage\n}: DiffSummarySidebarProps) {\n if (!isOpen) return null;\n\n return (\n <div style={{\n width: '320px',\n height: '100%',\n backgroundColor: '#ffffff',\n borderLeft: '1px solid #e2e8f0',\n display: 'flex',\n flexDirection: 'column',\n flexShrink: 0,\n zIndex: 80\n }}>\n {/* Header */}\n <div style={{\n padding: '12px 16px',\n borderBottom: '1px solid #e2e8f0',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n backgroundColor: '#f8fafc'\n }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px', fontWeight: 600, fontSize: '14px', color: '#0f172a' }}>\n <Layers size={18} color=\"#0284c7\" />\n <span>Compare Summary</span>\n </div>\n <span style={{\n fontSize: '11px', padding: '2px 8px', borderRadius: '12px',\n backgroundColor: '#0284c7', color: '#ffffff', fontWeight: 600\n }}>\n {diffItems.length} Differences\n </span>\n </div>\n\n {/* List Content */}\n <div style={{ flex: 1, overflowY: 'auto', padding: '12px' }}>\n {diffItems.length > 0 && (\n <div>\n <div style={{ fontSize: '12px', fontWeight: 600, color: '#64748b', marginBottom: '8px', display: 'flex', alignItems: 'center', gap: '4px' }}>\n <Layers size={14} />\n <span>Differences on Page ({diffItems.length})</span>\n </div>\n\n {diffItems.map((item, idx) => {\n const isSelected = idx === currentDiffIndex;\n const isDel = item.type === 'deletion';\n const isAdd = item.type === 'addition';\n\n let badgeColor = isDel ? '#e11d48' : isAdd ? '#10b981' : '#f59e0b';\n let badgeBg = isDel ? '#ffe4e6' : isAdd ? '#dcfce7' : '#fef3c7';\n let badgeLabel = isDel ? 'Removed' : isAdd ? 'Added' : 'Changed';\n\n return (\n <div\n key={item.id}\n onClick={() => {\n onSelectDiff(idx, item);\n if (item.pageIndex) onJumpToPage(item.pageIndex);\n }}\n style={{\n padding: '10px 12px',\n borderRadius: '6px',\n backgroundColor: isSelected ? '#f0f9ff' : '#ffffff',\n border: isSelected ? '2px solid #0284c7' : '1px solid #e2e8f0',\n borderLeft: isSelected ? '4px solid #0284c7' : `3px solid ${badgeColor}`,\n marginBottom: '8px',\n cursor: 'pointer',\n fontSize: '12px',\n boxShadow: isSelected ? '0 2px 8px rgba(2, 132, 199, 0.18)' : '0 1px 3px rgba(0,0,0,0.03)',\n transition: 'all 0.15s ease'\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', marginBottom: '4px' }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px' }}>\n {isDel && <MinusCircle size={13} color=\"#e11d48\" />}\n {isAdd && <PlusCircle size={13} color=\"#10b981\" />}\n {!isDel && !isAdd && <AlertCircle size={13} color=\"#f59e0b\" />}\n <span style={{\n fontSize: '10px',\n fontWeight: 700,\n textTransform: 'uppercase',\n padding: '1px 6px',\n borderRadius: '4px',\n backgroundColor: badgeBg,\n color: badgeColor\n }}>\n {badgeLabel}\n </span>\n </div>\n <span style={{ fontSize: '11px', color: '#64748b', fontWeight: 600 }}>\n Page {item.pageIndex}\n </span>\n </div>\n <div style={{\n fontSize: '12px',\n color: isSelected ? '#0369a1' : '#334155',\n fontWeight: isSelected ? 600 : 400,\n lineHeight: '1.4',\n wordBreak: 'break-word'\n }}>\n {item.description}\n </div>\n </div>\n );\n })}\n </div>\n )}\n\n {textDiffs.length > 0 && diffItems.length === 0 && (\n <div style={{ marginBottom: '16px' }}>\n <div style={{ fontSize: '12px', fontWeight: 600, color: '#64748b', marginBottom: '8px', display: 'flex', alignItems: 'center', gap: '4px' }}>\n <FileText size={14} />\n <span>Text Differences</span>\n </div>\n\n {textDiffs.filter(t => t.type !== 'equal').map((seg, i) => (\n <div\n key={`text-diff-${i}`}\n onClick={() => onJumpToPage(seg.pageIndex)}\n style={{\n padding: '8px 12px',\n borderRadius: '6px',\n backgroundColor: seg.type === 'add' ? '#f0fdf4' : '#fef2f2',\n border: `1px solid ${seg.type === 'add' ? '#bbf7d0' : '#fecaca'}`,\n marginBottom: '8px',\n cursor: 'pointer',\n fontSize: '12px',\n lineHeight: '1.4'\n }}\n >\n <div style={{ display: 'flex', justifyContent: 'space-between', marginBottom: '4px', fontSize: '10px', color: '#64748b', fontWeight: 600 }}>\n <span>Page {seg.pageIndex}</span>\n <span style={{ color: seg.type === 'add' ? '#16a34a' : '#dc2626', textTransform: 'uppercase' }}>\n {seg.type === 'add' ? '+ Addition' : '- Deletion'}\n </span>\n </div>\n <div style={{\n color: seg.type === 'add' ? '#15803d' : '#b91c1c',\n textDecoration: seg.type === 'delete' ? 'line-through' : 'none',\n fontFamily: 'monospace',\n wordBreak: 'break-word'\n }}>\n {seg.text.length > 120 ? `${seg.text.substring(0, 120)}...` : seg.text}\n </div>\n </div>\n ))}\n </div>\n )}\n\n {diffItems.length === 0 && textDiffs.filter(t => t.type !== 'equal').length === 0 && (\n <div style={{ padding: '32px 16px', textAlign: 'center', color: '#64748b' }}>\n <CheckCircle2 size={32} color=\"#16a34a\" style={{ margin: '0 auto 8px auto' }} />\n <div style={{ fontWeight: 600, fontSize: '14px', color: '#0f172a' }}>Documents Match</div>\n <div style={{ fontSize: '12px', marginTop: '4px' }}>No visual or structural differences detected between the two PDF documents.</div>\n </div>\n )}\n </div>\n </div>\n );\n}\n\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\n\nimport React, { useRef, useState, useEffect } from 'react';\nimport { GripVertical } from 'lucide-react';\n\ninterface CompareCurtainSliderProps {\n positionPercent: number; // 0 to 100\n onChangePosition: (pos: number) => void;\n containerRef: React.RefObject<HTMLDivElement | null>;\n}\n\nexport default function CompareCurtainSlider({\n positionPercent,\n onChangePosition,\n containerRef\n}: CompareCurtainSliderProps) {\n const [isDragging, setIsDragging] = useState(false);\n const sliderRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handleMouseMove = (e: MouseEvent) => {\n if (!isDragging || !containerRef.current) return;\n const rect = containerRef.current.getBoundingClientRect();\n const relativeX = e.clientX - rect.left;\n const newPercent = Math.max(0, Math.min(100, (relativeX / rect.width) * 100));\n onChangePosition(newPercent);\n };\n\n const handleMouseUp = () => {\n if (isDragging) {\n setIsDragging(false);\n }\n };\n\n if (isDragging) {\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n }\n\n return () => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n }, [isDragging, containerRef, onChangePosition]);\n\n return (\n <div\n ref={sliderRef}\n style={{\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: `${positionPercent}%`,\n width: '4px',\n backgroundColor: '#0284c7',\n boxShadow: '0 0 8px rgba(2, 132, 199, 0.8)',\n zIndex: 90,\n cursor: 'ew-resize',\n transform: 'translateX(-50%)'\n }}\n onMouseDown={(e) => {\n e.preventDefault();\n setIsDragging(true);\n }}\n >\n {/* Center Handle Badge */}\n <div style={{\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n width: '28px',\n height: '40px',\n backgroundColor: '#0284c7',\n color: '#ffffff',\n borderRadius: '6px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n boxShadow: '0 2px 8px rgba(0,0,0,0.3)',\n cursor: 'ew-resize'\n }}>\n <GripVertical size={16} />\n </div>\n </div>\n );\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\n\nimport type * as pdfjsLib from 'pdfjs-dist';\nimport type { TextDiffSegment, DiffItem, DiffBoundingBox } from '../types/compare';\n\nexport interface PageDiffResult {\n diffsA: DiffBoundingBox[];\n diffsB: DiffBoundingBox[];\n summary: DiffItem[];\n}\n\nexport interface WordToken {\n text: string;\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n/**\n * Extracts individual words with precise unscaled viewport bounding boxes from a PDF.js page.\n */\nexport async function extractWordsFromPage(page: pdfjsLib.PDFPageProxy): Promise<WordToken[]> {\n const vp = page.getViewport({ scale: 1, rotation: page.rotate });\n const textContent = await page.getTextContent();\n const wordTokens: WordToken[] = [];\n\n for (const item of textContent.items as any[]) {\n if (!item.str || typeof item.str !== 'string') continue;\n const str = item.str;\n if (str.trim().length === 0) continue;\n\n const tx = item.transform[4];\n const ty = item.transform[5];\n const itemWidth = item.width || 0;\n const fontSize = Math.sqrt((item.transform[0] || 0) ** 2 + (item.transform[1] || 0) ** 2) || 12;\n const itemHeight = item.height || fontSize;\n\n const [vx1, vy1] = vp.convertToViewportPoint(tx, ty + itemHeight);\n const [vx2, vy2] = vp.convertToViewportPoint(tx + itemWidth, ty);\n\n const itemX = Math.min(vx1, vx2);\n const itemY = Math.min(vy1, vy2);\n const itemW = Math.max(Math.abs(vx2 - vx1), 4);\n const itemH = Math.max(Math.abs(vy2 - vy1), 8);\n\n const parts = str.split(/(\\s+)/);\n let offset = 0;\n const totalChars = str.length || 1;\n\n for (const p of parts) {\n const charRatio = p.length / totalChars;\n const wWidth = itemW * charRatio;\n const wX = itemX + (offset / totalChars) * itemW;\n offset += p.length;\n\n if (p.trim().length > 0) {\n wordTokens.push({\n text: p.trim(),\n x: wX,\n y: itemY,\n width: Math.max(wWidth, 6),\n height: itemH\n });\n }\n }\n }\n\n return wordTokens;\n}\n\n/**\n * Computes exact text difference bounding boxes on a page for both Document A and Document B.\n */\nexport async function computePageDiffBoxes(\n pdfDocA: pdfjsLib.PDFDocumentProxy,\n pdfDocB: pdfjsLib.PDFDocumentProxy,\n pageIndex: number\n): Promise<PageDiffResult> {\n let pageA: pdfjsLib.PDFPageProxy | null = null;\n let pageB: pdfjsLib.PDFPageProxy | null = null;\n let wordsA: WordToken[];\n let wordsB: WordToken[];\n\n try {\n [pageA, pageB] = await Promise.all([\n pdfDocA.getPage(pageIndex),\n pdfDocB.getPage(Math.min(pageIndex, pdfDocB.numPages))\n ]);\n\n [wordsA, wordsB] = await Promise.all([\n extractWordsFromPage(pageA),\n extractWordsFromPage(pageB)\n ]);\n } finally {\n try { pageA?.cleanup?.(); } catch {}\n try { pageB?.cleanup?.(); } catch {}\n }\n\n const textArrA = wordsA.map(w => w.text);\n const textArrB = wordsB.map(w => w.text);\n\n // Myers diff on word tokens\n const n = textArrA.length;\n const m = textArrB.length;\n // SEC-05: Bound edit distance to prevent memory exhaustion / UI freeze on massive or divergent pages\n const MAX_DIFF_EDITS = 2500;\n const max = Math.min(n + m, MAX_DIFF_EDITS);\n const v = new Int32Array(2 * max + 1);\n v[1] = 0;\n const trace: Int32Array[] = [];\n let reachedEnd = false;\n\n for (let d = 0; d <= max; d++) {\n trace.push(v.slice());\n for (let k = -d; k <= d; k += 2) {\n let x: number;\n if (k === -d || (k !== d && v[k - 1 + max] < v[k + 1 + max])) {\n x = v[k + 1 + max];\n } else {\n x = v[k - 1 + max] + 1;\n }\n let y = x - k;\n while (x < n && y < m && textArrA[x] === textArrB[y]) {\n x++;\n y++;\n }\n v[k + max] = x;\n if (x >= n && y >= m) {\n reachedEnd = true;\n break;\n }\n }\n if (reachedEnd || (v[n - m + max] >= n && (v[n - m + max] - (n - m)) >= m)) {\n reachedEnd = true;\n break;\n }\n }\n\n // Backtrack\n let x = n;\n let y = m;\n const delIndicesA: number[] = [];\n const addIndicesB: number[] = [];\n\n if (reachedEnd) {\n for (let d = trace.length - 1; d >= 0; d--) {\n const vArr = trace[d];\n const k = x - y;\n let prevK: number;\n if (k === -d || (k !== d && vArr[k - 1 + max] < vArr[k + 1 + max])) {\n prevK = k + 1;\n } else {\n prevK = k - 1;\n }\n const prevX = vArr[prevK + max];\n const prevY = prevX - prevK;\n\n while (x > prevX && y > prevY) {\n x--;\n y--;\n }\n\n if (d > 0) {\n if (x === prevX) {\n addIndicesB.push(y - 1);\n y--;\n } else if (y === prevY) {\n delIndicesA.push(x - 1);\n x--;\n }\n }\n }\n } else {\n // Exceeded MAX_DIFF_EDITS: mark remaining unverified tokens as differences\n for (let i = 0; i < n; i++) delIndicesA.push(i);\n for (let j = 0; j < m; j++) addIndicesB.push(j);\n }\n\n delIndicesA.reverse();\n addIndicesB.reverse();\n\n const diffsA = groupWordsIntoBoxes(delIndicesA.map(i => wordsA[i]), pageIndex, 'deletion');\n const diffsB = groupWordsIntoBoxes(addIndicesB.map(i => wordsB[i]), pageIndex, 'addition');\n\n const summary: DiffItem[] = [];\n for (const d of diffsA) {\n summary.push({\n id: d.id,\n pageIndex,\n type: 'deletion',\n description: `Removed \"${d.text.length > 40 ? d.text.slice(0, 40) + '...' : d.text}\"`,\n x: d.x,\n y: d.y,\n width: d.width,\n height: d.height\n });\n }\n for (const a of diffsB) {\n summary.push({\n id: a.id,\n pageIndex,\n type: 'addition',\n description: `Added \"${a.text.length > 40 ? a.text.slice(0, 40) + '...' : a.text}\"`,\n x: a.x,\n y: a.y,\n width: a.width,\n height: a.height\n });\n }\n\n return { diffsA, diffsB, summary };\n}\n\nfunction groupWordsIntoBoxes(words: WordToken[], pageIndex: number, type: 'addition' | 'deletion' | 'modification'): DiffBoundingBox[] {\n if (words.length === 0) return [];\n const boxes: DiffBoundingBox[] = [];\n\n let currentWords: WordToken[] = [words[0]];\n\n for (let i = 1; i < words.length; i++) {\n const prev = currentWords[currentWords.length - 1];\n const curr = words[i];\n\n const sameLine = Math.abs(curr.y - prev.y) < Math.max(prev.height, curr.height) * 0.6;\n const nearby = curr.x - (prev.x + prev.width) < 30;\n\n if (sameLine && nearby) {\n currentWords.push(curr);\n } else {\n boxes.push(createBoxFromTokens(currentWords, pageIndex, type, boxes.length + 1));\n currentWords = [curr];\n }\n }\n\n if (currentWords.length > 0) {\n boxes.push(createBoxFromTokens(currentWords, pageIndex, type, boxes.length + 1));\n }\n\n return boxes;\n}\n\nfunction createBoxFromTokens(tokens: WordToken[], pageIndex: number, type: 'addition' | 'deletion' | 'modification', seq: number): DiffBoundingBox {\n const minX = Math.min(...tokens.map(t => t.x));\n const minY = Math.min(...tokens.map(t => t.y));\n const maxX = Math.max(...tokens.map(t => t.x + t.width));\n const maxY = Math.max(...tokens.map(t => t.y + t.height));\n const text = tokens.map(t => t.text).join(' ');\n\n return {\n id: `diff-box-${pageIndex}-${type}-${seq}-${Math.round(minX)}-${Math.round(minY)}`,\n pageIndex,\n type,\n text,\n x: Math.max(0, minX - 2),\n y: Math.max(0, minY - 1),\n width: maxX - minX + 4,\n height: maxY - minY + 2\n };\n}\n\n/**\n * Lightweight client-side Myers Diff algorithm for raw text comparison.\n */\nexport function computeTextDiff(textA: string, textB: string, pageIndex: number): TextDiffSegment[] {\n const wordsA = textA.split(/(\\s+)/);\n const wordsB = textB.split(/(\\s+)/);\n\n const n = wordsA.length;\n const m = wordsB.length;\n const max = n + m;\n const v = new Int32Array(2 * max + 1);\n v[1] = 0;\n\n const trace: Int32Array[] = [];\n\n for (let d = 0; d <= max; d++) {\n trace.push(v.slice());\n for (let k = -d; k <= d; k += 2) {\n let x: number;\n if (k === -d || (k !== d && v[k - 1 + max] < v[k + 1 + max])) {\n x = v[k + 1 + max];\n } else {\n x = v[k - 1 + max] + 1;\n }\n let y = x - k;\n while (x < n && y < m && wordsA[x] === wordsB[y]) {\n x++;\n y++;\n }\n v[k + max] = x;\n if (x >= n && y >= m) {\n return buildDiffResult(trace, wordsA, wordsB, pageIndex);\n }\n }\n }\n\n return [\n { type: 'delete', text: textA, pageIndex },\n { type: 'add', text: textB, pageIndex }\n ];\n}\n\nfunction buildDiffResult(trace: Int32Array[], wordsA: string[], wordsB: string[], pageIndex: number): TextDiffSegment[] {\n let x = wordsA.length;\n let y = wordsB.length;\n const max = wordsA.length + wordsB.length;\n const rawResult: { type: 'equal' | 'add' | 'delete'; text: string }[] = [];\n\n for (let d = trace.length - 1; d >= 0; d--) {\n const v = trace[d];\n const k = x - y;\n\n let prevK: number;\n if (k === -d || (k !== d && v[k - 1 + max] < v[k + 1 + max])) {\n prevK = k + 1;\n } else {\n prevK = k - 1;\n }\n\n const prevX = v[prevK + max];\n const prevY = prevX - prevK;\n\n while (x > prevX && y > prevY) {\n rawResult.push({ type: 'equal', text: wordsA[x - 1] });\n x--;\n y--;\n }\n\n if (d > 0) {\n if (x === prevX) {\n rawResult.push({ type: 'add', text: wordsB[y - 1] });\n y--;\n } else if (y === prevY) {\n rawResult.push({ type: 'delete', text: wordsA[x - 1] });\n x--;\n }\n }\n }\n\n rawResult.reverse();\n\n const consolidated: TextDiffSegment[] = [];\n for (const item of rawResult) {\n if (consolidated.length > 0 && consolidated[consolidated.length - 1].type === item.type) {\n consolidated[consolidated.length - 1].text += item.text;\n } else {\n consolidated.push({ ...item, pageIndex });\n }\n }\n\n return consolidated;\n}\n\n/**\n * Colorizes a rendered page canvas with a custom hex tint.\n */\nexport function tintCanvas(ctx: CanvasRenderingContext2D, width: number, height: number, colorHex: string, opacity: number = 0.75) {\n ctx.save();\n ctx.globalCompositeOperation = 'source-atop';\n ctx.fillStyle = colorHex;\n ctx.globalAlpha = opacity;\n ctx.fillRect(0, 0, width, height);\n ctx.restore();\n}\n\n/**\n * Computes pixel-level difference bounding boxes between two rendered page canvases.\n */\nexport function computeCanvasPixelDiff(\n canvasA: HTMLCanvasElement,\n canvasB: HTMLCanvasElement,\n pageIndex: number,\n scale: number\n): DiffItem[] {\n const width = Math.min(canvasA.width, canvasB.width);\n const height = Math.min(canvasA.height, canvasB.height);\n if (width === 0 || height === 0) return [];\n\n const ctxA = canvasA.getContext('2d');\n const ctxB = canvasB.getContext('2d');\n if (!ctxA || !ctxB) return [];\n\n const imgDataA = ctxA.getImageData(0, 0, width, height);\n const imgDataB = ctxB.getImageData(0, 0, width, height);\n const dataA = imgDataA.data;\n const dataB = imgDataB.data;\n\n const diffItems: DiffItem[] = [];\n const GRID_SIZE = 32;\n const threshold = 30;\n\n for (let gy = 0; gy < height; gy += GRID_SIZE) {\n for (let gx = 0; gx < width; gx += GRID_SIZE) {\n let diffPixels = 0;\n const cellW = Math.min(GRID_SIZE, width - gx);\n const cellH = Math.min(GRID_SIZE, height - gy);\n\n for (let y = gy; y < gy + cellH; y += 4) {\n for (let x = gx; x < gx + cellW; x += 4) {\n const idx = (y * width + x) * 4;\n const dr = Math.abs(dataA[idx] - dataB[idx]);\n const dg = Math.abs(dataA[idx + 1] - dataB[idx + 1]);\n const db = Math.abs(dataA[idx + 2] - dataB[idx + 2]);\n\n if (dr + dg + db > threshold) {\n diffPixels++;\n }\n }\n }\n\n if (diffPixels > 3) {\n diffItems.push({\n id: `diff-${pageIndex}-${gx}-${gy}`,\n pageIndex,\n type: 'modification',\n description: `Visual difference detected at Page ${pageIndex} (${Math.round(gx / scale)}px, ${Math.round(gy / scale)}px)`,\n x: gx / scale,\n y: gy / scale,\n width: cellW / scale,\n height: cellH / scale\n });\n }\n }\n }\n\n return diffItems;\n}\n\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * FormUsersModal — dialog to add, edit, and manage form users/roles and their color coding.\n */\n\nimport React, { useState, useEffect } from 'react';\nimport { X, Users, Plus, Trash2, Check, Sparkles } from 'lucide-react';\nimport type { FormManager } from '../forms/FormManager';\nimport type { FormRole } from '../forms/types';\n\ninterface FormUsersModalProps {\n formManager: FormManager;\n onClose: () => void;\n onRoleAdded?: (role: FormRole) => void;\n onUserAdded?: (role: FormRole) => void;\n}\n\nconst PRESET_USER_COLORS = [\n '#2563eb', // Blue\n '#9333ea', // Purple\n '#059669', // Emerald\n '#e11d48', // Rose\n '#d97706', // Amber\n '#0891b2', // Cyan\n '#4f46e5', // Indigo\n '#c026d3', // Fuchsia\n '#0d9488', // Teal\n '#475569', // Slate\n];\n\nconst ROLE_TEMPLATES: Array<{ name: string; users: Array<{ name: string; color: string }> }> = [\n {\n name: '2-Party Agreement',\n users: [\n { name: 'First Party / Signer', color: '#2563eb' },\n { name: 'Second Party / Counter-signer', color: '#9333ea' },\n ],\n },\n {\n name: 'Approval Workflow',\n users: [\n { name: 'Applicant', color: '#2563eb' },\n { name: 'Reviewer / Manager', color: '#9333ea' },\n { name: 'Compliance Officer', color: '#059669' },\n ],\n },\n {\n name: 'Real Estate / Transaction',\n users: [\n { name: 'Buyer / Tenant', color: '#2563eb' },\n { name: 'Seller / Landlord', color: '#9333ea' },\n { name: 'Broker / Agent', color: '#d97706' },\n { name: 'Notary / Witness', color: '#059669' },\n ],\n },\n];\n\nexport const FormUsersModal: React.FC<FormUsersModalProps> = ({\n formManager,\n onClose,\n onRoleAdded,\n onUserAdded,\n}) => {\n const [roles, setRoles] = useState<FormRole[]>(() => formManager.getRoles());\n const [newUserName, setNewUserName] = useState('');\n const [newUserColor, setNewUserColor] = useState(PRESET_USER_COLORS[0]);\n const [errorMsg, setErrorMsg] = useState<string | null>(null);\n\n // Sync roles from FormManager\n useEffect(() => {\n const unsub = formManager.onRolesChange((updated) => setRoles(updated));\n return unsub;\n }, [formManager]);\n\n const fields = formManager.getFields();\n\n const handleAddUser = () => {\n const trimmed = newUserName.trim();\n if (!trimmed) {\n setErrorMsg('Please enter a role name.');\n return;\n }\n\n if (roles.some((r) => r.name.toLowerCase() === trimmed.toLowerCase())) {\n setErrorMsg(`A role with the name \"${trimmed}\" already exists.`);\n return;\n }\n\n const id = `role_${Date.now()}_${Math.random().toString(36).slice(2, 6)}`;\n const newRole: FormRole = {\n id,\n name: trimmed,\n color: newUserColor,\n };\n\n formManager.addRole(newRole);\n onRoleAdded?.(newRole);\n onUserAdded?.(newRole);\n\n setNewUserName('');\n // Advance to next preset color\n const nextColorIdx = (PRESET_USER_COLORS.indexOf(newUserColor) + 1) % PRESET_USER_COLORS.length;\n setNewUserColor(PRESET_USER_COLORS[nextColorIdx]);\n setErrorMsg(null);\n };\n\n const handleRemoveUser = (id: string, name: string) => {\n const assignedCount = fields.filter((f) => f.roleId === id).length;\n if (assignedCount > 0) {\n const confirmRemove = window.confirm(\n `\"${name}\" has ${assignedCount} field(s) assigned. Removing this role will set those fields to \"Anyone / Unassigned\". Continue?`\n );\n if (!confirmRemove) return;\n }\n formManager.removeRole(id);\n };\n\n const handleApplyTemplate = (template: typeof ROLE_TEMPLATES[0]) => {\n const currentCount = fields.length;\n if (\n currentCount > 0 &&\n !window.confirm(\n `Replace current roles with the \"${template.name}\" role template? Fields assigned to existing roles will become unassigned.`\n )\n ) {\n return;\n }\n\n const newRoles: FormRole[] = template.users.map((u, idx) => ({\n id: `role_${idx + 1}_${Math.random().toString(36).slice(2, 6)}`,\n name: u.name,\n color: u.color,\n }));\n\n formManager.setRoles(newRoles);\n };\n\n return (\n <div\n style={{\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: 'rgba(0, 0, 0, 0.45)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 9999,\n }}\n onClick={onClose}\n >\n <div\n style={{\n backgroundColor: '#ffffff',\n borderRadius: '10px',\n width: '520px',\n maxWidth: '92vw',\n maxHeight: '90vh',\n display: 'flex',\n flexDirection: 'column',\n boxShadow: '0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)',\n overflow: 'hidden',\n fontFamily: 'system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n }}\n onClick={(e) => e.stopPropagation()}\n >\n {/* Header */}\n <div\n style={{\n padding: '16px 20px',\n borderBottom: '1px solid #e5e7eb',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n backgroundColor: '#f8fafc',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n <div\n style={{\n width: '32px',\n height: '32px',\n borderRadius: '8px',\n backgroundColor: '#e0f2fe',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: '#0284c7',\n }}\n >\n <Users size={18} />\n </div>\n <div>\n <h3 style={{ margin: 0, fontSize: '15px', fontWeight: 600, color: '#0f172a' }}>\n Form Users & Roles\n </h3>\n <p style={{ margin: 0, fontSize: '12px', color: '#64748b' }}>\n Define who fills each form item with color-coded assignments\n </p>\n </div>\n </div>\n <button\n type=\"button\"\n onClick={onClose}\n style={{\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n color: '#94a3b8',\n padding: '4px',\n borderRadius: '4px',\n }}\n >\n <X size={18} />\n </button>\n </div>\n\n {/* Content Body */}\n <div style={{ padding: '20px', overflowY: 'auto', display: 'flex', flexDirection: 'column', gap: '20px' }}>\n {/* Add User Section */}\n <div\n style={{\n backgroundColor: '#f8fafc',\n border: '1px solid #e2e8f0',\n borderRadius: '8px',\n padding: '14px',\n display: 'flex',\n flexDirection: 'column',\n gap: '10px',\n }}\n >\n <span style={{ fontSize: '12px', fontWeight: 600, color: '#334155' }}>\n Add a New User or Role\n </span>\n\n <div style={{ display: 'flex', gap: '8px', alignItems: 'center' }}>\n <input\n type=\"text\"\n value={newUserName}\n onChange={(e) => {\n setNewUserName(e.target.value);\n if (errorMsg) setErrorMsg(null);\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleAddUser();\n }\n }}\n placeholder=\"e.g. Tenant, Inspector, Reviewer, Client...\"\n style={{\n flex: 1,\n padding: '7px 10px',\n borderRadius: '6px',\n border: '1px solid #cbd5e1',\n fontSize: '13px',\n outline: 'none',\n }}\n />\n\n <button\n type=\"button\"\n onClick={handleAddUser}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n padding: '7px 14px',\n backgroundColor: 'var(--primary, #0284c7)',\n color: '#ffffff',\n border: 'none',\n borderRadius: '6px',\n fontSize: '13px',\n fontWeight: 500,\n cursor: 'pointer',\n whiteSpace: 'nowrap',\n }}\n >\n <Plus size={15} /> Add User\n </button>\n </div>\n\n {/* Color Selection Palette */}\n <div>\n <span style={{ fontSize: '11px', color: '#64748b', display: 'block', marginBottom: '6px' }}>\n Identifying Color:\n </span>\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px', flexWrap: 'wrap' }}>\n {PRESET_USER_COLORS.map((c) => (\n <button\n key={c}\n type=\"button\"\n onClick={() => setNewUserColor(c)}\n style={{\n width: '24px',\n height: '24px',\n borderRadius: '50%',\n backgroundColor: c,\n border: newUserColor === c ? '2.5px solid #0f172a' : '1.5px solid #cbd5e1',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: 0,\n }}\n >\n {newUserColor === c && <Check size={12} color=\"#ffffff\" strokeWidth={3} />}\n </button>\n ))}\n <div style={{ display: 'flex', alignItems: 'center', gap: '4px', marginLeft: '4px' }}>\n <input\n type=\"color\"\n value={newUserColor}\n onChange={(e) => setNewUserColor(e.target.value)}\n style={{\n width: '24px',\n height: '24px',\n padding: 0,\n border: 'none',\n borderRadius: '4px',\n cursor: 'pointer',\n }}\n title=\"Choose custom color\"\n />\n <span style={{ fontSize: '11px', color: '#64748b' }}>Custom</span>\n </div>\n </div>\n </div>\n\n {errorMsg && (\n <span style={{ fontSize: '12px', color: '#ef4444', fontWeight: 500 }}>\n {errorMsg}\n </span>\n )}\n </div>\n\n {/* Current Roles List */}\n <div>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', marginBottom: '8px' }}>\n <span style={{ fontSize: '13px', fontWeight: 600, color: '#1e293b' }}>\n Current Roles ({roles.length})\n </span>\n <span style={{ fontSize: '11px', color: '#64748b' }}>\n Click name or color to edit\n </span>\n </div>\n\n {roles.length === 0 ? (\n <div\n style={{\n padding: '24px',\n textAlign: 'center',\n backgroundColor: '#f8fafc',\n border: '1px dashed #cbd5e1',\n borderRadius: '6px',\n color: '#64748b',\n fontSize: '13px',\n }}\n >\n No roles configured. Add a role above or pick a template below.\n </div>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', gap: '6px' }}>\n {roles.map((user) => {\n const assignedCount = fields.filter((f) => f.roleId === user.id).length;\n\n return (\n <div\n key={user.id}\n className=\"tspdf-user-row\"\n data-user-name={user.name}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '8px 12px',\n backgroundColor: '#ffffff',\n border: '1px solid #e2e8f0',\n borderRadius: '6px',\n gap: '10px',\n }}\n >\n {/* Left: Color dot & Editable Name */}\n <div style={{ display: 'flex', alignItems: 'center', gap: '10px', flex: 1 }}>\n <div style={{ position: 'relative' }}>\n <input\n type=\"color\"\n value={user.color}\n onChange={(e) => formManager.updateRole(user.id, { color: e.target.value })}\n style={{\n position: 'absolute',\n opacity: 0,\n width: '100%',\n height: '100%',\n cursor: 'pointer',\n }}\n title=\"Click to change color\"\n />\n <div\n style={{\n width: '18px',\n height: '18px',\n borderRadius: '50%',\n backgroundColor: user.color,\n border: '1px solid rgba(0,0,0,0.15)',\n cursor: 'pointer',\n }}\n />\n </div>\n\n <span style={{ fontSize: '13px', fontWeight: 500, color: '#1e293b' }}>\n {user.name}\n </span>\n </div>\n\n {/* Right: Field Count Badge & Delete */}\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n <span\n style={{\n fontSize: '11px',\n padding: '2px 8px',\n borderRadius: '10px',\n backgroundColor: `${user.color}1a`,\n color: user.color,\n fontWeight: 600,\n whiteSpace: 'nowrap',\n }}\n >\n {assignedCount} {assignedCount === 1 ? 'field' : 'fields'}\n </span>\n\n <button\n type=\"button\"\n onClick={() => handleRemoveUser(user.id, user.name)}\n title={`Delete ${user.name}`}\n style={{\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n color: '#94a3b8',\n padding: '4px',\n borderRadius: '4px',\n display: 'flex',\n alignItems: 'center',\n }}\n onMouseEnter={(e) => (e.currentTarget.style.color = '#ef4444')}\n onMouseLeave={(e) => (e.currentTarget.style.color = '#94a3b8')}\n >\n <Trash2 size={15} />\n </button>\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n\n {/* Quick Role Templates */}\n <div>\n <div style={{ display: 'flex', alignItems: 'center', gap: '4px', marginBottom: '8px' }}>\n <Sparkles size={13} color=\"#f59e0b\" />\n <span style={{ fontSize: '12px', fontWeight: 600, color: '#475569' }}>\n Quick Role Presets\n </span>\n </div>\n <div style={{ display: 'flex', gap: '6px', flexWrap: 'wrap' }}>\n {ROLE_TEMPLATES.map((tmpl) => (\n <button\n key={tmpl.name}\n type=\"button\"\n onClick={() => handleApplyTemplate(tmpl)}\n style={{\n fontSize: '11px',\n padding: '4px 10px',\n borderRadius: '4px',\n border: '1px solid #e2e8f0',\n backgroundColor: '#f8fafc',\n color: '#334155',\n cursor: 'pointer',\n fontWeight: 500,\n }}\n >\n + {tmpl.name}\n </button>\n ))}\n </div>\n </div>\n </div>\n\n {/* Footer */}\n <div\n style={{\n padding: '12px 20px',\n borderTop: '1px solid #e5e7eb',\n display: 'flex',\n justifyContent: 'flex-end',\n backgroundColor: '#f8fafc',\n }}\n >\n <button\n type=\"button\"\n onClick={onClose}\n style={{\n padding: '6px 16px',\n backgroundColor: '#ffffff',\n border: '1px solid #cbd5e1',\n borderRadius: '6px',\n fontSize: '13px',\n fontWeight: 500,\n color: '#334155',\n cursor: 'pointer',\n }}\n >\n Done\n </button>\n </div>\n </div>\n </div>\n );\n};\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * FormsToolbar — sub-toolbar rendered when the 'Forms' builder tab is active.\n */\n\nimport React, { useRef, useState, useEffect } from 'react';\nimport {\n Undo2,\n Redo2,\n MousePointer,\n Type,\n AlignLeft,\n Calendar,\n ListChecks,\n ChevronDownSquare,\n CircleDot,\n Trash2,\n Download,\n Upload,\n Eye,\n ListOrdered,\n Users,\n UserPlus,\n PenLine,\n ShieldCheck,\n} from 'lucide-react';\nimport type { FormToolType, FormRole } from '../forms/types';\nimport type { FormManager } from '../forms/FormManager';\nimport { FormUsersModal } from './FormUsersModal';\n\ninterface FormsToolbarProps {\n activeTool: FormToolType;\n setActiveTool: (tool: FormToolType) => void;\n formManager: FormManager;\n onSwitchToView?: () => void;\n showFlowOrder?: boolean;\n setShowFlowOrder?: (show: boolean) => void;\n selectedRoleFilter?: string | null;\n setSelectedRoleFilter?: (id: string | null) => void;\n}\n\nexport const FormsToolbar: React.FC<FormsToolbarProps> = ({\n activeTool,\n setActiveTool,\n formManager,\n onSwitchToView,\n showFlowOrder = true,\n setShowFlowOrder,\n selectedRoleFilter = null,\n setSelectedRoleFilter,\n}) => {\n const fileInputRef = useRef<HTMLInputElement>(null);\n const [isUsersModalOpen, setIsUsersModalOpen] = useState(false);\n const [roles, setRoles] = useState<FormRole[]>(() => formManager.getRoles());\n\n useEffect(() => {\n const unsub = formManager.onRolesChange((updated) => setRoles(updated));\n return unsub;\n }, [formManager]);\n\n const handleExportSchema = () => {\n const json = formManager.exportFieldsJson();\n const blob = new Blob([json], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = 'form-schema.json';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n };\n\n const handleImportSchema = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n const reader = new FileReader();\n reader.onload = (event) => {\n const content = event.target?.result as string;\n if (content) {\n formManager.importFieldsJson(content);\n }\n };\n reader.readAsText(file);\n if (fileInputRef.current) fileInputRef.current.value = '';\n };\n\n const handleClearAll = () => {\n if (formManager.getFields().length === 0) return;\n if (window.confirm('Are you sure you want to remove all form fields from this document?')) {\n formManager.clearFields();\n }\n };\n\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '0 12px',\n backgroundColor: '#ffffff',\n borderBottom: '1px solid var(--border-color, #e5e7eb)',\n height: '42px',\n userSelect: 'none',\n fontSize: '13px',\n }}\n >\n {/* Left section: History and Tools */}\n <div style={{ display: 'flex', alignItems: 'center', gap: '4px' }}>\n {/* Undo / Redo */}\n <ToolButton\n icon={<Undo2 size={16} />}\n label=\"Undo\"\n disabled={!formManager.canUndo}\n onClick={() => formManager.undo()}\n />\n <ToolButton\n icon={<Redo2 size={16} />}\n label=\"Redo\"\n disabled={!formManager.canRedo}\n onClick={() => formManager.redo()}\n />\n\n <div style={{ width: '1px', height: '20px', backgroundColor: '#e5e7eb', margin: '0 6px' }} />\n\n {/* Selection tool */}\n <ToolButton\n icon={<MousePointer size={16} />}\n label=\"Select & Move Field\"\n active={activeTool === 'select' || activeTool === null}\n onClick={() => setActiveTool('select')}\n />\n\n <div style={{ width: '1px', height: '20px', backgroundColor: '#e5e7eb', margin: '0 6px' }} />\n\n {/* Form Field Creation Tools */}\n <ToolButton\n icon={<Type size={16} />}\n label=\"Textbox\"\n active={activeTool === 'textbox'}\n onClick={() => setActiveTool('textbox')}\n />\n <ToolButton\n icon={<AlignLeft size={16} />}\n label=\"Text Area\"\n active={activeTool === 'textarea'}\n onClick={() => setActiveTool('textarea')}\n />\n <ToolButton\n icon={<Calendar size={16} />}\n label=\"Date & Time Picker\"\n active={activeTool === 'datetime'}\n onClick={() => setActiveTool('datetime')}\n />\n <ToolButton\n icon={<ListChecks size={16} />}\n label=\"Check List\"\n active={activeTool === 'checklist'}\n onClick={() => setActiveTool('checklist')}\n />\n <ToolButton\n icon={<ChevronDownSquare size={16} />}\n label=\"Dropdown\"\n active={activeTool === 'dropdown'}\n onClick={() => setActiveTool('dropdown')}\n />\n <ToolButton\n icon={<CircleDot size={16} />}\n label=\"Radio Group\"\n active={activeTool === 'radio'}\n onClick={() => setActiveTool('radio')}\n />\n <ToolButton\n icon={<PenLine size={16} />}\n label=\"E-Signature\"\n active={activeTool === 'signature'}\n onClick={() => setActiveTool('signature')}\n />\n <ToolButton\n icon={<ShieldCheck size={16} />}\n label=\"Digital Signature\"\n active={activeTool === 'digital_signature'}\n onClick={() => setActiveTool('digital_signature')}\n />\n\n <div style={{ width: '1px', height: '20px', backgroundColor: '#e5e7eb', margin: '0 6px' }} />\n\n {/* Show Flow Order Numbers Toggle */}\n {setShowFlowOrder && (\n <ToolButton\n icon={<ListOrdered size={16} />}\n label=\"Show Flow Order\"\n active={showFlowOrder}\n onClick={() => setShowFlowOrder(!showFlowOrder)}\n />\n )}\n\n {/* Manage / Add Form Users Button */}\n <button\n type=\"button\"\n onClick={() => setIsUsersModalOpen(true)}\n title=\"Add or manage form users and roles\"\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '5px',\n padding: '3px 8px',\n backgroundColor: isUsersModalOpen ? '#e0f2fe' : '#f8fafc',\n border: isUsersModalOpen ? '1px solid #7dd3fc' : '1px solid #cbd5e1',\n borderRadius: '4px',\n color: '#1e293b',\n cursor: 'pointer',\n fontSize: '12px',\n fontWeight: 500,\n transition: 'all 0.15s ease',\n }}\n >\n <UserPlus size={14} color=\"#0284c7\" />\n <span>Roles ({roles.length})</span>\n </button>\n\n {/* Role View Filter */}\n {setSelectedRoleFilter && (\n <div style={{ display: 'flex', alignItems: 'center', gap: '4px', marginLeft: '2px' }}>\n <Users size={14} color=\"#64748b\" />\n <select\n value={selectedRoleFilter || ''}\n onChange={(e) => setSelectedRoleFilter(e.target.value || null)}\n style={{\n fontSize: '12px',\n padding: '2px 6px',\n border: '1px solid #d1d5db',\n borderRadius: '4px',\n backgroundColor: '#ffffff',\n color: '#334155',\n cursor: 'pointer',\n }}\n title=\"Filter visible fields by role assignment\"\n >\n <option value=\"\">Filter: All Fields</option>\n {roles.map((r) => (\n <option key={r.id} value={r.id}>\n Filter: {r.name}\n </option>\n ))}\n </select>\n </div>\n )}\n </div>\n\n {/* Right section: Builder Utilities & Test Form */}\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px' }}>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".json\"\n style={{ display: 'none' }}\n onChange={handleImportSchema}\n />\n\n <button\n type=\"button\"\n onClick={() => fileInputRef.current?.click()}\n title=\"Import Form Schema (JSON)\"\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n padding: '4px 8px',\n backgroundColor: 'transparent',\n border: '1px solid #d1d5db',\n borderRadius: '4px',\n color: '#374151',\n cursor: 'pointer',\n fontSize: '12px',\n }}\n >\n <Upload size={14} /> Import\n </button>\n\n <button\n type=\"button\"\n onClick={handleExportSchema}\n title=\"Export Form Schema (JSON)\"\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n padding: '4px 8px',\n backgroundColor: 'transparent',\n border: '1px solid #d1d5db',\n borderRadius: '4px',\n color: '#374151',\n cursor: 'pointer',\n fontSize: '12px',\n }}\n >\n <Download size={14} /> Export\n </button>\n\n <button\n type=\"button\"\n onClick={handleClearAll}\n title=\"Clear all fields\"\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n padding: '4px 8px',\n backgroundColor: 'transparent',\n border: '1px solid #fca5a5',\n borderRadius: '4px',\n color: '#dc2626',\n cursor: 'pointer',\n fontSize: '12px',\n }}\n >\n <Trash2 size={14} /> Clear All\n </button>\n\n {onSwitchToView && (\n <button\n type=\"button\"\n onClick={onSwitchToView}\n title=\"Preview and fill this form in View mode\"\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n padding: '5px 12px',\n backgroundColor: '#e0f2fe',\n border: '1px solid #7dd3fc',\n borderRadius: '4px',\n color: '#0369a1',\n cursor: 'pointer',\n fontSize: '12px',\n fontWeight: 500,\n }}\n >\n <Eye size={14} /> Test Form\n </button>\n )}\n </div>\n\n {/* Form Users & Roles Management Modal */}\n {isUsersModalOpen && (\n <FormUsersModal\n formManager={formManager}\n onClose={() => setIsUsersModalOpen(false)}\n />\n )}\n </div>\n );\n};\n\ninterface ToolButtonProps {\n icon: React.ReactNode;\n label: string;\n active?: boolean;\n disabled?: boolean;\n onClick?: () => void;\n}\n\nconst ToolButton: React.FC<ToolButtonProps> = ({ icon, label, active = false, disabled = false, onClick }) => {\n return (\n <button\n type=\"button\"\n title={label}\n disabled={disabled}\n onClick={disabled ? undefined : onClick}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n padding: '5px 10px',\n backgroundColor: active ? '#e0f2fe' : 'transparent',\n border: active ? '1px solid var(--primary, #0284c7)' : '1px solid transparent',\n borderRadius: '4px',\n color: active ? 'var(--primary, #0284c7)' : disabled ? '#9ca3af' : '#374151',\n cursor: disabled ? 'not-allowed' : 'pointer',\n fontWeight: active ? 600 : 400,\n fontSize: '12px',\n transition: 'all 0.15s ease',\n }}\n >\n {icon}\n <span>{label}</span>\n </button>\n );\n};\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * FormFillerActions — utility bar displayed in View mode when the document has form fields.\n * Supports multi-user role selection, step-by-step form flow navigation, progress tracking, validation, and export.\n */\n\nimport React, { useState, useEffect } from 'react';\nimport {\n FileSpreadsheet,\n RotateCcw,\n Download,\n CheckCircle2,\n AlertCircle,\n Users,\n ChevronLeft,\n ChevronRight,\n} from 'lucide-react';\nimport type { FormManager } from '../forms/FormManager';\nimport type { FormField, FormDataRecord, FormRole, FormFeatureOptions } from '../forms/types';\nimport type { ViewerUser } from '../core/types';\n\ninterface FormFillerActionsProps {\n formManager: FormManager;\n onDownloadFilledPdf?: () => void;\n}\n\nexport const FormFillerActions: React.FC<FormFillerActionsProps> = ({\n formManager,\n onDownloadFilledPdf,\n}) => {\n const [fields, setFields] = useState<FormField[]>(() => formManager.getFields());\n const [values, setValues] = useState<FormDataRecord>(() => formManager.getValues());\n const [roles, setRoles] = useState<FormRole[]>(() => formManager.getRoles());\n const [currentRoleId, setCurrentRoleId] = useState<string | null>(() => formManager.getCurrentRole());\n const [activeFieldId, setActiveFieldId] = useState<string | null>(() => formManager.getActiveFieldId());\n const [options, setOptions] = useState<FormFeatureOptions>(() => formManager.getOptions());\n const [currentUser, setCurrentUser] = useState<ViewerUser | null>(() => formManager.getCurrentUser());\n const [validationMsg, setValidationMsg] = useState<{ type: 'success' | 'error'; text: string } | null>(null);\n\n useEffect(() => {\n const unsubFields = formManager.onFieldsChange(() => setFields(formManager.getFields()));\n const unsubData = formManager.onDataChange((newValues) => setValues(newValues));\n const unsubRoles = formManager.onRolesChange((newRoles) => setRoles(newRoles));\n const unsubCurrent = formManager.onCurrentRoleChange((curr) => setCurrentRoleId(curr));\n const unsubActive = formManager.onActiveFieldChange((act) => setActiveFieldId(act));\n const unsubOptions = formManager.onOptionsChange((opts) => setOptions(opts));\n const unsubUser = formManager.onCurrentUserChange((u) => setCurrentUser(u));\n\n return () => {\n unsubFields();\n unsubData();\n unsubRoles();\n unsubCurrent();\n unsubActive();\n unsubOptions();\n unsubUser();\n };\n }, [formManager]);\n\n if (options.hideToolbar || fields.length === 0) return null;\n\n const currentRole = roles.find((r) => r.id === currentRoleId);\n const flowFields = formManager.getFlowFields(currentRoleId);\n const currentFlowIndex = activeFieldId ? flowFields.findIndex((f) => f.id === activeFieldId) : -1;\n\n // Calculate completion progress for current role\n const targetFields = currentRoleId ? fields.filter((f) => f.roleId === currentRoleId) : fields;\n const targetRequiredCount = targetFields.filter((f) => f.required).length;\n const targetFilledCount = targetFields.filter((f) => {\n const val = values[f.name];\n if (val === undefined || val === null || val === '') return false;\n if (Array.isArray(val) && val.length === 0) return false;\n return true;\n }).length;\n\n const handleExportData = () => {\n const json = formManager.exportDataJson();\n const blob = new Blob([json], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = 'form-data.json';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n };\n\n const handleValidate = () => {\n const res = formManager.validate();\n if (res.valid) {\n const scopeLabel = currentRole ? `${currentRole.name}'s required fields` : 'All required fields';\n setValidationMsg({ type: 'success', text: `${scopeLabel} are valid!` });\n } else {\n const missingKeys = Object.keys(res.errors).join(', ');\n setValidationMsg({ type: 'error', text: `Missing required: ${missingKeys}` });\n }\n setTimeout(() => setValidationMsg(null), 4000);\n };\n\n const handleReset = () => {\n if (window.confirm('Clear all filled form entries?')) {\n formManager.clearValues();\n setValidationMsg(null);\n }\n };\n\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '6px 14px',\n backgroundColor: '#f8fafc',\n borderBottom: '1px solid #e2e8f0',\n fontSize: '12px',\n userSelect: 'none',\n flexWrap: 'wrap',\n gap: '8px',\n }}\n >\n {/* Left: Info, User Selector & Flow Navigation */}\n <div style={{ display: 'flex', alignItems: 'center', gap: '10px', flexWrap: 'wrap' }}>\n <span\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n backgroundColor: '#e0f2fe',\n color: '#0369a1',\n padding: '2px 8px',\n borderRadius: '12px',\n fontWeight: 600,\n fontSize: '11px',\n }}\n >\n <FileSpreadsheet size={13} /> Form Mode\n </span>\n\n {/* Role \"Filling as:\" selector */}\n {options.showRoleSelector !== false && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n backgroundColor: '#ffffff',\n border: '1px solid #cbd5e1',\n borderRadius: '5px',\n padding: '2px 8px',\n }}\n >\n <Users size={13} color={currentRole?.color || '#64748b'} />\n <span style={{ fontSize: '11px', color: '#64748b', fontWeight: 500 }}>Filling as:</span>\n\n {/* Current User Name (if passed by host application) */}\n {currentUser?.name && (\n <span\n style={{\n fontSize: '11px',\n fontWeight: 600,\n color: '#0f172a',\n }}\n title={currentUser.email ? `${currentUser.name} <${currentUser.email}>` : currentUser.name}\n >\n {currentUser.name}\n </span>\n )}\n\n {options.allowRoleSwitching === false ? (\n <span\n style={{\n fontSize: '11px',\n fontWeight: 600,\n color: currentRole?.color || '#334155',\n backgroundColor: currentRole?.color ? `${currentRole.color}15` : '#f1f5f9',\n padding: '1px 6px',\n borderRadius: '4px',\n }}\n title={\n currentUser?.name\n ? `Role locked to ${currentRole?.name || 'Role'} for ${currentUser.name}`\n : 'Assigned role is locked by host application'\n }\n >\n {currentUser?.name ? `(${currentRole?.name || 'Role'})` : (currentRole?.name || 'Current Role')}\n </span>\n ) : (\n <select\n value={currentRoleId || ''}\n onChange={(e) => formManager.setCurrentRole(e.target.value || null)}\n style={{\n fontSize: '11px',\n fontWeight: 600,\n border: 'none',\n backgroundColor: 'transparent',\n color: currentRole?.color || '#334155',\n cursor: 'pointer',\n outline: 'none',\n }}\n >\n <option value=\"\">All Roles / Anyone</option>\n {roles.map((r) => {\n const roleFieldCount = fields.filter((f) => f.roleId === r.id).length;\n return (\n <option key={r.id} value={r.id}>\n {r.name} ({roleFieldCount} {roleFieldCount === 1 ? 'field' : 'fields'})\n </option>\n );\n })}\n </select>\n )}\n </div>\n )}\n\n {/* Step-by-Step Flow Navigation Buttons */}\n {options.showFlowNavigation !== false && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '2px',\n backgroundColor: '#ffffff',\n border: '1px solid #cbd5e1',\n borderRadius: '5px',\n padding: '1px 4px',\n }}\n >\n <button\n type=\"button\"\n onClick={() => formManager.goToPreviousField()}\n disabled={flowFields.length === 0}\n title=\"Previous Field (Shift+Tab)\"\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n background: 'none',\n border: 'none',\n padding: '3px 4px',\n cursor: flowFields.length > 0 ? 'pointer' : 'not-allowed',\n color: flowFields.length > 0 ? '#334155' : '#94a3b8',\n borderRadius: '3px',\n }}\n >\n <ChevronLeft size={14} />\n </button>\n\n <span\n style={{\n fontSize: '11px',\n fontWeight: 600,\n color: currentRole?.color || '#334155',\n padding: '0 6px',\n minWidth: '70px',\n textAlign: 'center',\n }}\n >\n {currentFlowIndex >= 0 ? `Step ${currentFlowIndex + 1} of ${flowFields.length}` : `${flowFields.length} steps`}\n </span>\n\n <button\n type=\"button\"\n onClick={() => formManager.goToNextField()}\n disabled={flowFields.length === 0}\n title=\"Next Field (Tab)\"\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n background: 'none',\n border: 'none',\n padding: '3px 4px',\n cursor: flowFields.length > 0 ? 'pointer' : 'not-allowed',\n color: flowFields.length > 0 ? '#334155' : '#94a3b8',\n borderRadius: '3px',\n }}\n >\n <ChevronRight size={14} />\n </button>\n </div>\n )}\n\n {/* Progress summary */}\n <span style={{ color: '#64748b', fontSize: '11px' }}>\n {targetFilledCount}/{targetFields.length} completed\n {targetRequiredCount > 0 && ` (${targetRequiredCount} required)`}\n </span>\n\n {validationMsg && (\n <span\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n padding: '2px 8px',\n borderRadius: '4px',\n fontSize: '11px',\n fontWeight: 500,\n backgroundColor: validationMsg.type === 'success' ? '#dcfce7' : '#fee2e2',\n color: validationMsg.type === 'success' ? '#15803d' : '#b91c1c',\n }}\n >\n {validationMsg.type === 'success' ? <CheckCircle2 size={13} /> : <AlertCircle size={13} />}\n {validationMsg.text}\n </span>\n )}\n </div>\n\n {/* Right: Actions */}\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px' }}>\n {options.showValidation !== false && (\n <button\n type=\"button\"\n onClick={handleValidate}\n title=\"Validate form completion\"\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n padding: '4px 8px',\n backgroundColor: '#ffffff',\n border: '1px solid #cbd5e1',\n borderRadius: '4px',\n color: '#334155',\n cursor: 'pointer',\n fontSize: '11px',\n fontWeight: 500,\n }}\n >\n <CheckCircle2 size={13} color=\"#0284c7\" /> Validate\n </button>\n )}\n\n {options.showExport !== false && (\n <button\n type=\"button\"\n onClick={handleExportData}\n title=\"Export filled values as JSON\"\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n padding: '4px 8px',\n backgroundColor: '#ffffff',\n border: '1px solid #cbd5e1',\n borderRadius: '4px',\n color: '#334155',\n cursor: 'pointer',\n fontSize: '11px',\n fontWeight: 500,\n }}\n >\n <Download size={13} /> Export JSON\n </button>\n )}\n\n {options.showExport !== false && onDownloadFilledPdf && (\n <button\n type=\"button\"\n onClick={onDownloadFilledPdf}\n title=\"Download PDF with filled values\"\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n padding: '4px 10px',\n backgroundColor: 'var(--primary, #0284c7)',\n border: 'none',\n borderRadius: '4px',\n color: '#ffffff',\n cursor: 'pointer',\n fontSize: '11px',\n fontWeight: 500,\n }}\n >\n <Download size={13} /> Download PDF\n </button>\n )}\n\n {options.showReset !== false && (\n <button\n type=\"button\"\n onClick={handleReset}\n title=\"Reset form entries\"\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n padding: '4px 6px',\n backgroundColor: 'transparent',\n border: 'none',\n color: '#64748b',\n cursor: 'pointer',\n fontSize: '11px',\n }}\n >\n <RotateCcw size={13} /> Reset\n </button>\n )}\n </div>\n </div>\n );\n};\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * SignatureIndexFlags — Sticky / Index Flags docked to the right edge of the viewer.\n * Modeled after physical Post-it \"Sign Here\" arrow index flags, ensuring that even if a\n * signature field is located on Page 2 (or beyond), the user sees the sticky flag on the\n * side while viewing Page 1 and can jump & sign with a single click.\n */\n\nimport React, { useState, useEffect, useMemo, useCallback } from 'react';\nimport {\n PenTool,\n Check,\n ChevronRight,\n ChevronLeft,\n ShieldCheck,\n} from 'lucide-react';\nimport type { FormManager } from '../forms/FormManager';\nimport type { FormField, FormDataRecord, FormRole, FormSignatureValue, FormFeatureOptions } from '../forms/types';\nimport type { ViewerUser } from '../core/types';\n\ninterface SignatureIndexFlagsProps {\n formManager: FormManager;\n activeTab: string;\n onJumpToPage?: (page: number) => void;\n}\n\nexport const SignatureIndexFlags: React.FC<SignatureIndexFlagsProps> = ({\n formManager,\n activeTab,\n onJumpToPage,\n}) => {\n const [fields, setFields] = useState<FormField[]>(() => formManager.getFields());\n const [values, setValues] = useState<FormDataRecord>(() => formManager.getValues());\n const [roles, setRoles] = useState<FormRole[]>(() => formManager.getRoles());\n const [currentRoleId, setCurrentRoleId] = useState<string | null>(() =>\n formManager.getCurrentRole()\n );\n const [activeFieldId, setActiveFieldId] = useState<string | null>(() =>\n formManager.getActiveFieldId()\n );\n const [options, setOptions] = useState<FormFeatureOptions>(() => formManager.getOptions());\n const [currentUser, setCurrentUser] = useState<ViewerUser | null>(() => formManager.getCurrentUser());\n const [isCollapsed, setIsCollapsed] = useState<boolean>(false);\n const [hoveredFieldId, setHoveredFieldId] = useState<string | null>(null);\n\n useEffect(() => {\n const unsubFields = formManager.onFieldsChange(() => setFields(formManager.getFields()));\n const unsubData = formManager.onDataChange((newVals) => setValues(newVals));\n const unsubRoles = formManager.onRolesChange((newRoles) =>\n setRoles(newRoles)\n );\n const unsubCurrent = formManager.onCurrentRoleChange((curr) =>\n setCurrentRoleId(curr)\n );\n const unsubActive = formManager.onActiveFieldChange((act) => setActiveFieldId(act));\n const unsubOptions = formManager.onOptionsChange((opts) => setOptions(opts));\n const unsubUser = formManager.onCurrentUserChange((u) => setCurrentUser(u));\n\n return () => {\n unsubFields();\n unsubData();\n unsubRoles();\n unsubCurrent();\n unsubActive();\n unsubOptions();\n unsubUser();\n };\n }, [formManager]);\n\n // All signature fields in the document\n const signatureFields = useMemo(() => {\n return fields.filter(\n (f) => f.type === 'signature' || f.type === 'digital_signature'\n );\n }, [fields]);\n\n // Filter signatures based on the current role:\n // - If a role is selected (currentRoleId): ONLY show their signature flags (and unassigned ones)\n // - If \"All Roles / Anyone\" (currentRoleId is null): show all signature flags in the document\n const relevantSignatures = useMemo(() => {\n if (currentRoleId) {\n return signatureFields.filter(\n (f) => f.roleId === currentRoleId || !f.roleId\n );\n }\n return signatureFields;\n }, [signatureFields, currentRoleId]);\n\n const currentRole = useMemo(() => {\n if (!currentRoleId) return null;\n return roles.find((r) => r.id === currentRoleId) || null;\n }, [roles, currentRoleId]);\n\n const checkIsSigned = useCallback(\n (field: FormField): boolean => {\n const val = values[field.name];\n if (!val) return false;\n if (typeof val === 'string' && val.trim().length > 0) return true;\n if (typeof val === 'object' && val !== null) {\n const sig = val as FormSignatureValue;\n return Boolean(sig.dataUrl || sig.signerName || (sig as any).imageUrl);\n }\n return false;\n },\n [values]\n );\n\n const pendingSignatures = useMemo(() => {\n return relevantSignatures.filter((f) => !checkIsSigned(f));\n }, [relevantSignatures, checkIsSigned]);\n\n const totalPending = pendingSignatures.length;\n\n const handleJumpToSignature = useCallback(\n (field: FormField) => {\n formManager.setActiveFieldId(field.id);\n\n // Navigate to field's page first (crucial for page-by-page and virtualized continuous scroll modes)\n if (typeof field.pageIndex === 'number') {\n if (onJumpToPage) {\n onJumpToPage(field.pageIndex);\n } else if (typeof window !== 'undefined') {\n window.dispatchEvent(\n new CustomEvent('action-go-to-page', { detail: { page: field.pageIndex, smooth: true } })\n );\n }\n }\n\n // Function to scroll into view, focus, click, and trigger visual highlight on the field DOM element\n const tryFocusAndOpen = (retries = 10, delay = 120) => {\n const fieldEl = document.getElementById(`tspdf-field-${field.id}`);\n if (fieldEl) {\n try {\n fieldEl.scrollIntoView({ behavior: 'smooth', block: 'center' });\n } catch {}\n fieldEl.focus();\n fieldEl.click();\n\n // High-visibility glowing pulse animation\n fieldEl.style.transition = 'box-shadow 0.3s ease, border-color 0.3s ease';\n const originalBoxShadow = fieldEl.style.boxShadow;\n fieldEl.style.boxShadow = '0 0 0 4px #f59e0b, 0 0 25px rgba(245, 158, 11, 0.7)';\n setTimeout(() => {\n fieldEl.style.boxShadow = originalBoxShadow;\n }, 1500);\n } else if (retries > 0) {\n setTimeout(() => tryFocusAndOpen(retries - 1, delay), delay);\n }\n };\n\n tryFocusAndOpen();\n },\n [formManager, onJumpToPage]\n );\n\n // Only display in View or Forms modes\n if (activeTab !== 'View' && activeTab !== 'Forms') {\n return null;\n }\n\n // Respect programmatic option to hide signature flags\n if (options.showSignatureFlags === false) {\n return null;\n }\n\n // If there are no signature fields for this role/document, do not render\n if (relevantSignatures.length === 0) {\n return null;\n }\n\n // Collapsed State: A sleek, recognizable floating Post-it flag tab\n if (isCollapsed) {\n const accentColor = totalPending > 0 ? (currentRole?.color || '#f59e0b') : '#16a34a';\n return (\n <div\n className=\"tspdf-sticky-flags-collapsed\"\n style={{\n position: 'absolute',\n right: 0,\n top: '90px',\n zIndex: 45,\n pointerEvents: 'auto',\n userSelect: 'none',\n }}\n >\n <button\n onClick={() => setIsCollapsed(false)}\n title={`Expand Signature Flags (${totalPending} pending)`}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n backgroundColor: accentColor,\n color: '#ffffff',\n border: 'none',\n borderRadius: '8px 0 0 8px',\n padding: '8px 12px 8px 8px',\n cursor: 'pointer',\n boxShadow: '-3px 4px 14px rgba(0, 0, 0, 0.25)',\n fontSize: '12px',\n fontWeight: 700,\n letterSpacing: '0.3px',\n transition: 'transform 0.15s ease',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.transform = 'translateX(-4px)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.transform = 'translateX(0)';\n }}\n >\n <ChevronLeft size={16} />\n {totalPending > 0 ? (\n <>\n <span>✍️</span>\n <span>{totalPending} to sign</span>\n </>\n ) : (\n <>\n <Check size={15} strokeWidth={3} />\n <span>All Signed</span>\n </>\n )}\n </button>\n </div>\n );\n }\n\n return (\n <aside\n className=\"tspdf-signature-index-flags\"\n aria-label=\"Signature Sticky Flags\"\n style={{\n position: 'absolute',\n right: '0px',\n top: '80px',\n maxHeight: 'calc(100% - 100px)',\n zIndex: 45,\n pointerEvents: 'auto',\n userSelect: 'none',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-end',\n gap: '6px',\n }}\n >\n {/* Top Dock Header */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n backgroundColor: '#0f172a',\n color: '#f8fafc',\n padding: '6px 10px 6px 12px',\n borderRadius: '8px 0 0 8px',\n boxShadow: '-2px 3px 10px rgba(0,0,0,0.22)',\n fontSize: '11px',\n fontWeight: 700,\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px' }}>\n <PenTool size={13} style={{ color: currentRole?.color || '#f59e0b' }} />\n <span>\n {currentUser?.name\n ? `${currentUser.name}${currentRole ? ` (${currentRole.name})` : ''}`\n : currentRole\n ? `${currentRole.name}'s Signatures`\n : 'Signature Flags'}\n </span>\n <span\n style={{\n backgroundColor: totalPending > 0 ? '#ef4444' : '#16a34a',\n color: '#ffffff',\n fontSize: '10px',\n padding: '1px 6px',\n borderRadius: '10px',\n fontWeight: 800,\n }}\n >\n {totalPending > 0 ? `${totalPending} due` : '✓ All signed'}\n </span>\n </div>\n <button\n onClick={() => setIsCollapsed(true)}\n title=\"Minimize signature flags dock\"\n style={{\n background: 'none',\n border: 'none',\n color: '#94a3b8',\n cursor: 'pointer',\n padding: '2px',\n display: 'flex',\n alignItems: 'center',\n borderRadius: '4px',\n marginLeft: '2px',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.color = '#ffffff';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.color = '#94a3b8';\n }}\n >\n <ChevronRight size={14} />\n </button>\n </div>\n\n {/* List of Physical Post-it Style Arrow Flags */}\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-end',\n gap: '8px',\n overflowY: 'auto',\n maxHeight: 'calc(100vh - 220px)',\n paddingRight: '0px',\n paddingBottom: '8px',\n }}\n >\n {relevantSignatures.map((field) => {\n const isSigned = checkIsSigned(field);\n const role = roles.find((r) => r.id === field.roleId);\n // Color coding: green when signed; otherwise role's color or warm Post-it amber\n const flagColor = isSigned ? '#16a34a' : role?.color || '#f59e0b';\n const isHovered = hoveredFieldId === field.id;\n const isActive = activeFieldId === field.id;\n const fieldLabel = field.label || field.name || 'Signature';\n\n return (\n <div\n key={field.id}\n className=\"tspdf-sticky-index-tab\"\n onClick={() => handleJumpToSignature(field)}\n onMouseEnter={() => setHoveredFieldId(field.id)}\n onMouseLeave={() => setHoveredFieldId(null)}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n cursor: 'pointer',\n filter: isHovered || isActive\n ? 'drop-shadow(-4px 4px 12px rgba(0, 0, 0, 0.3))'\n : 'drop-shadow(-2px 3px 6px rgba(0, 0, 0, 0.18))',\n transform: isHovered || isActive ? 'translateX(-8px)' : 'translateX(0)',\n transition: 'transform 0.18s cubic-bezier(0.16, 1, 0.3, 1), filter 0.18s ease',\n }}\n title={`Page ${field.pageIndex}: ${fieldLabel} (${\n isSigned ? 'Signed' : 'Click to jump to page and sign'\n })`}\n >\n {/* Arrow chevron pointing left directly toward the PDF document canvas */}\n <div\n style={{\n width: 0,\n height: 0,\n borderTop: '16px solid transparent',\n borderBottom: '16px solid transparent',\n borderRight: `13px solid ${flagColor}`,\n flexShrink: 0,\n }}\n />\n\n {/* Sticky Flag Body */}\n <div\n style={{\n backgroundColor: flagColor,\n color: '#ffffff',\n padding: '6px 14px 6px 8px',\n borderRadius: '0 6px 6px 0',\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n fontSize: '11px',\n fontWeight: 700,\n letterSpacing: '0.3px',\n whiteSpace: 'nowrap',\n boxShadow: 'inset 2px 0 3px rgba(0,0,0,0.12)',\n minWidth: isHovered ? '170px' : '130px',\n maxWidth: '260px',\n justifyContent: 'space-between',\n transition: 'min-width 0.2s ease',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px', overflow: 'hidden' }}>\n {isSigned ? (\n <Check size={14} strokeWidth={3} style={{ flexShrink: 0 }} />\n ) : field.type === 'digital_signature' ? (\n <ShieldCheck size={14} style={{ flexShrink: 0 }} />\n ) : (\n <PenTool size={13} style={{ flexShrink: 0 }} />\n )}\n\n {/* Prominent Page Badge */}\n <span\n style={{\n backgroundColor: 'rgba(0,0,0,0.25)',\n padding: '1px 6px',\n borderRadius: '4px',\n fontSize: '10px',\n fontWeight: 800,\n flexShrink: 0,\n }}\n >\n P.{field.pageIndex}\n </span>\n\n {/* Flow order step if set */}\n {field.flowOrder !== undefined && (\n <span\n style={{\n backgroundColor: 'rgba(255,255,255,0.25)',\n padding: '1px 5px',\n borderRadius: '6px',\n fontSize: '9.5px',\n fontWeight: 800,\n flexShrink: 0,\n }}\n >\n #{field.flowOrder}\n </span>\n )}\n\n {/* Action & Label text */}\n <span\n style={{\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {isSigned ? 'SIGNED' : field.signTagText || fieldLabel || 'SIGN HERE'}\n </span>\n </div>\n\n {/* Role / Anyone pill */}\n <div style={{ flexShrink: 0, marginLeft: '6px' }}>\n {role ? (\n <span\n style={{\n backgroundColor: 'rgba(255,255,255,0.22)',\n padding: '2px 6px',\n borderRadius: '10px',\n fontSize: '9px',\n fontWeight: 700,\n }}\n >\n {role.name}\n </span>\n ) : (\n <span\n style={{\n backgroundColor: 'rgba(255,255,255,0.22)',\n padding: '2px 6px',\n borderRadius: '10px',\n fontSize: '9px',\n fontWeight: 600,\n }}\n >\n Anyone\n </span>\n )}\n </div>\n </div>\n </div>\n );\n })}\n </div>\n </aside>\n );\n};\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\nimport React, { useEffect, useRef, useState, useCallback, useMemo, useSyncExternalStore } from 'react';\nimport * as pdfjsLib from 'pdfjs-dist';\nimport 'pdfjs-dist/web/pdf_viewer.css';\nimport { Pen, Type, Minus, Eraser, Square, Circle as CircleIcon, Highlighter, ChevronLeft, ChevronRight, Brush, MessageSquareQuote, ArrowUpRight, ShieldCheck, Link as LinkIcon, EyeOff, Trash2, Undo2, Redo2, Underline, Strikethrough } from 'lucide-react';\nimport AnnotationContextMenu from './AnnotationContextMenu';\nimport InsertLinkModal from './InsertLinkModal';\nimport { matchShortcut, useShortcuts } from '../hooks/useShortcuts';\nimport Sidebar from './Sidebar';\nimport LeftSidebar from './LeftSidebar';\nimport { usePdfSearch, type SearchResult } from '../hooks/usePdfSearch';\nimport PageRenderer from './PageRenderer';\nimport type { Annotation } from '../annotations/types';\nimport { newAnnotationId } from '../annotations/ids';\nimport type { AnnotationManager } from '../annotations/AnnotationManager';\nimport type { Redaction, WatermarkOptions, SDKPermissions, PdfAssetPaths, TransientHighlight, ToolMode, InitialScale, LinkClickEvent, WebViewerInstance } from '../core/types';\nimport { parseLinkTarget } from '../utils/linkUtils';\nimport TextSelectionTooltip from './TextSelectionTooltip';\nimport { findRegexRedactions } from '../utils/findRegexRedactions';\nimport { convertToUnrotated, convertToRotated, normalizeRotation } from '../utils/rotationUtils';\nimport { clampScale, calculateFitWidthScale, calculateScrollCompensation } from '../utils/zoomUtils';\nimport { estimatePageDimensions, computeRowLayout, DEFAULT_FALLBACK_DIMS } from '../utils/layoutUtils';\nimport { useViewerBus, useBusEvent } from '../hooks/useViewerBus';\nimport { assertWorkerConfigured, configurePdfAssets, getDocumentParams } from '../core/pdfAssets';\nimport SideBySideViewer from './SideBySideViewer';\nimport CompareToolbar from './CompareToolbar';\nimport DiffSummarySidebar from './DiffSummarySidebar';\nimport CompareCurtainSlider from './CompareCurtainSlider';\nimport DiffHighlightOverlay from './DiffHighlightOverlay';\nimport type { CompareState, TextDiffSegment, DiffItem, DiffBoundingBox } from '../types/compare';\nimport { computeTextDiff, computePageDiffBoxes } from '../utils/pdfDiffEngine';\nimport { FormsToolbar } from './FormsToolbar';\nimport { FormFillerActions } from './FormFillerActions';\nimport { SignatureIndexFlags } from './SignatureIndexFlags';\nimport type { FormManager } from '../forms/FormManager';\nimport type { FormToolType } from '../forms/types';\n\nexport interface DocumentLoadErrorInfo {\n url: string;\n passwordRequired: boolean;\n}\n\ninterface DocumentViewerProps {\n leftSidebarOpen: boolean;\n rightSidebarOpen: boolean;\n activeTab: string;\n /** Canonical annotation list, history, permissions and XFDF (owned by the viewer instance). */\n annotationManager: AnnotationManager;\n initialDoc?: string;\n /** Bump to force a reload of the same URL (retry after a load error). */\n loadNonce?: number;\n /** Send cookies with the document request. */\n withCredentials?: boolean;\n /** Custom HTTP headers sent with every document request (e.g. Authorization: Bearer <token>). */\n httpHeaders?: Record<string, string>;\n /** Alias for `httpHeaders` providing an alternative headers option. */\n customHeaders?: Record<string, string>;\n /** Maximum number of bytes fetched per HTTP 206 range request. Default is 65536. */\n rangeChunkSize?: number;\n /** Disable chunked streaming of PDF file data. Default false. */\n disableStream?: boolean;\n /** Disable automatic background pre-fetching of remaining PDF file chunks. Default false. */\n disableAutoFetch?: boolean;\n /** Disable HTTP 206 range requests entirely, forcing full PDF download. Default false. */\n disableRange?: boolean;\n /** Password for password-protected PDFs. */\n password?: string;\n /** pdf.js asset locations, applied right before the document is opened. */\n assets?: PdfAssetPaths;\n /** Render the thumbnails (left) and comments/search (right) panels. Default true. */\n sidebars?: boolean;\n redactions?: Redaction[];\n regexRedactions?: RegExp[];\n scale: number;\n setScale: (scale: number | ((prev: number) => number)) => void;\n sidebarTab: 'Comments' | 'Search';\n setSidebarTab: (tab: 'Comments' | 'Search') => void;\n onAnnotationsChange?: (annotations: Annotation[]) => void;\n /** Reports the combined (prop + regex + manual) redaction list whenever it changes. */\n onRedactionsChange?: (redactions: Redaction[]) => void;\n /** Fires once per user click of Apply in the confirmation modal with all applied redactions. */\n onRedactionsApplied?: (redactions: Redaction[]) => void;\n onDocumentLoaded?: (doc: pdfjsLib.PDFDocumentProxy, url: string) => void;\n onLoadError?: (error: Error, info: DocumentLoadErrorInfo) => void;\n /** Fires once per loaded document, after the first page canvas has been painted. */\n onFirstPageRendered?: (pageNumber: number) => void;\n /** Fires whenever any page canvas has finished rendering. */\n onPageRendered?: (pageNumber: number) => void;\n onPageChange?: (pageNumber: number, numPages: number) => void;\n pageTransition: 'continuous' | 'page-by-page';\n pageLayout: 'single' | 'double' | 'cover-facing';\n rotation: number;\n setRotation: (r: number | ((prev: number) => number)) => void;\n watermark?: WatermarkOptions;\n watermarkText?: string;\n enableAnnotations?: boolean;\n initialPage?: number;\n page?: number;\n transientHighlights?: TransientHighlight[];\n permissions?: SDKPermissions;\n /** Whether to hide annotations and transient highlights until the page canvas has finished rendering. Default: true. */\n hideAnnotationsUntilPageRendered?: boolean;\n enableTextSelection?: boolean;\n defaultTool?: 'select' | 'pan';\n showSelectionTooltip?: boolean;\n initialScale?: InitialScale;\n initialWidthRatio?: number;\n responsive?: boolean;\n instance?: WebViewerInstance;\n targetViewer?:\n | WebViewerInstance\n | React.RefObject<WebViewerInstance | null>\n | (() => WebViewerInstance | null)\n | string;\n resolveLinkUrl?: (\n linkUrl: string,\n context: { sourceViewer: WebViewerInstance; annotation?: Annotation }\n ) => string | { url: string; page?: number } | Promise<string | { url: string; page?: number } | null> | null;\n onLinkClick?: (event: LinkClickEvent) => boolean | void | Promise<void>;\n formManager?: FormManager;\n setActiveTab?: (tab: string) => void;\n onDownloadFilledPdf?: () => void;\n}\n\nexport default function DocumentViewer({\n leftSidebarOpen, rightSidebarOpen, activeTab, annotationManager, initialDoc, loadNonce = 0,\n withCredentials = false, httpHeaders, customHeaders, rangeChunkSize, disableStream, disableAutoFetch, disableRange, password,\n assets, sidebars = true,\n redactions, regexRedactions, scale, setScale, sidebarTab, setSidebarTab, onAnnotationsChange, onRedactionsChange, onRedactionsApplied,\n onDocumentLoaded, onLoadError, onFirstPageRendered, onPageRendered, onPageChange,\n pageTransition, pageLayout, rotation, setRotation, watermark, watermarkText, enableAnnotations: _enableAnnotations, initialPage, page, transientHighlights, permissions,\n hideAnnotationsUntilPageRendered = true,\n enableTextSelection = true,\n defaultTool = 'select',\n showSelectionTooltip = true,\n initialScale,\n initialWidthRatio,\n responsive = true,\n instance,\n targetViewer,\n resolveLinkUrl,\n onLinkClick,\n formManager,\n setActiveTab,\n onDownloadFilledPdf,\n}: DocumentViewerProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const bus = useViewerBus();\n const [activeFormTool, setActiveFormTool] = useState<FormToolType>('select');\n const [showFlowOrder, setShowFlowOrder] = useState<boolean>(true);\n const [selectedRoleFilter, setSelectedRoleFilter] = useState<string | null>(null);\n const [pdfDoc, setPdfDoc] = useState<pdfjsLib.PDFDocumentProxy | null>(null);\n const [loadError, setLoadError] = useState<Error | null>(null);\n const [pageNum, setPageNum] = useState(1);\n const [manualRedactions, setManualRedactions] = useState<Redaction[]>([]);\n const { getCommand } = useShortcuts();\n\n // Compare Mode State\n const [pdfDocB, setPdfDocB] = useState<pdfjsLib.PDFDocumentProxy | null>(null);\n const [compareState, setCompareState] = useState<CompareState>({\n isActive: false,\n mode: 'side-by-side',\n colorA: '#e11d48',\n colorB: '#2563eb',\n opacityA: 0.8,\n opacityB: 0.8,\n blendMode: 'difference',\n showCurtain: false,\n curtainPosition: 50,\n diffItems: [],\n currentDiffIndex: 0\n });\n const [textDiffs, setTextDiffs] = useState<TextDiffSegment[]>([]);\n const [isDiffSidebarOpen, setIsDiffSidebarOpen] = useState(false);\n const [isCompare90Fit, setIsCompare90Fit] = useState<boolean>(true);\n const [compareZoomMultiplier, setCompareZoomMultiplier] = useState<number>(1.0);\n\n const handleCompareZoomIn = useCallback(() => {\n setCompareZoomMultiplier(prev => Math.min(Number((prev + 0.15).toFixed(2)), 3.0));\n }, []);\n\n const handleCompareZoomOut = useCallback(() => {\n setCompareZoomMultiplier(prev => Math.max(Number((prev - 0.15).toFixed(2)), 0.3));\n }, []);\n\n const handleCompareFit90 = useCallback(() => {\n setIsCompare90Fit(true);\n setCompareZoomMultiplier(1.0);\n }, []);\n\n // Latest-callback refs: parents may pass inline functions without re-triggering effects.\n const callbacksRef = useRef({ onRedactionsChange, onRedactionsApplied, onDocumentLoaded, onLoadError, onFirstPageRendered, onPageRendered, onPageChange });\n callbacksRef.current = { onRedactionsChange, onRedactionsApplied, onDocumentLoaded, onLoadError, onFirstPageRendered, onPageRendered, onPageChange };\n const assetsRef = useRef(assets);\n assetsRef.current = assets;\n\n const httpHeadersRef = useRef(httpHeaders);\n httpHeadersRef.current = httpHeaders;\n const customHeadersRef = useRef(customHeaders);\n customHeadersRef.current = customHeaders;\n const rangeChunkSizeRef = useRef(rangeChunkSize);\n rangeChunkSizeRef.current = rangeChunkSize;\n const disableStreamRef = useRef(disableStream);\n disableStreamRef.current = disableStream;\n const disableAutoFetchRef = useRef(disableAutoFetch);\n disableAutoFetchRef.current = disableAutoFetch;\n const disableRangeRef = useRef(disableRange);\n disableRangeRef.current = disableRange;\n const passwordRef = useRef(password);\n passwordRef.current = password;\n\n const resolveNetworkParams = useCallback(() => {\n const headers = { ...(customHeadersRef.current || {}), ...(httpHeadersRef.current || {}) };\n const params: Record<string, any> = {};\n if (Object.keys(headers).length > 0) {\n params.httpHeaders = headers;\n }\n if (typeof rangeChunkSizeRef.current === 'number' && rangeChunkSizeRef.current > 0) {\n params.rangeChunkSize = rangeChunkSizeRef.current;\n }\n if (typeof disableStreamRef.current === 'boolean') {\n params.disableStream = disableStreamRef.current;\n }\n if (typeof disableAutoFetchRef.current === 'boolean') {\n params.disableAutoFetch = disableAutoFetchRef.current;\n // Per PDF.js: disabling auto-fetch also requires disabling streaming\n if (params.disableStream === undefined && disableAutoFetchRef.current) {\n params.disableStream = true;\n }\n }\n if (typeof disableRangeRef.current === 'boolean') {\n params.disableRange = disableRangeRef.current;\n }\n if (passwordRef.current) {\n params.password = passwordRef.current;\n }\n return params;\n }, []);\n\n const loadDocA = useCallback(async (docSource: string | ArrayBuffer | Uint8Array) => {\n try {\n assertWorkerConfigured();\n if (assetsRef.current) configurePdfAssets(assetsRef.current);\n const params: any = typeof docSource === 'string' ? { url: docSource } : { data: docSource };\n if (withCredentials) params.withCredentials = true;\n Object.assign(params, resolveNetworkParams(), getDocumentParams());\n const loadingTask = pdfjsLib.getDocument(params);\n const loadedDocA = await loadingTask.promise;\n setPdfDoc(loadedDocA);\n callbacksRef.current.onDocumentLoaded?.(loadedDocA, typeof docSource === 'string' ? docSource : 'documentA.pdf');\n } catch (err: any) {\n console.error('Failed to load comparison document A:', err);\n }\n }, [withCredentials, resolveNetworkParams]);\n\n const loadCompareDoc = useCallback(async (docSource: string | ArrayBuffer | Uint8Array) => {\n try {\n assertWorkerConfigured();\n if (assetsRef.current) configurePdfAssets(assetsRef.current);\n const params: any = typeof docSource === 'string' ? { url: docSource } : { data: docSource };\n if (withCredentials) params.withCredentials = true;\n Object.assign(params, resolveNetworkParams(), getDocumentParams());\n const loadingTask = pdfjsLib.getDocument(params);\n const loadedDocB = await loadingTask.promise;\n setPdfDocB(loadedDocB);\n setCompareState(prev => ({\n ...prev,\n isActive: true,\n diffItems: [\n { id: 'diff-1', pageIndex: 1, type: 'modification', description: 'Page 1 Differences detected' }\n ]\n }));\n setIsDiffSidebarOpen(true);\n } catch (err: any) {\n console.error('Failed to load comparison document B:', err);\n }\n }, [withCredentials]);\n\n useEffect(() => {\n if (compareState.isActive && pdfDoc && pdfDocB) {\n let cancelled = false;\n const computeAllDiffs = async () => {\n try {\n const totalPages = Math.min(pdfDoc.numPages, pdfDocB.numPages);\n let allSummary: DiffItem[] = [];\n const mapA: Record<number, DiffBoundingBox[]> = {};\n const mapB: Record<number, DiffBoundingBox[]> = {};\n\n for (let p = 1; p <= totalPages; p++) {\n const { diffsA, diffsB, summary } = await computePageDiffBoxes(pdfDoc, pdfDocB, p);\n if (cancelled) return;\n mapA[p] = diffsA;\n mapB[p] = diffsB;\n allSummary = allSummary.concat(summary);\n }\n\n if (!cancelled) {\n setCompareState(prev => ({\n ...prev,\n diffItems: allSummary,\n pageDiffsA: mapA,\n pageDiffsB: mapB\n }));\n }\n\n const pA = await pdfDoc.getPage(pageNum);\n const pB = await pdfDocB.getPage(Math.min(pageNum, pdfDocB.numPages));\n const textContentA = await pA.getTextContent();\n const textContentB = await pB.getTextContent();\n\n const strA = textContentA.items.map((i: any) => i.str).join(' ');\n const strB = textContentB.items.map((i: any) => i.str).join(' ');\n\n const diffs = computeTextDiff(strA, strB, pageNum);\n if (!cancelled) setTextDiffs(diffs);\n } catch (e) {\n console.error('Error computing document diffs:', e);\n }\n };\n computeAllDiffs();\n return () => { cancelled = true; };\n }\n }, [compareState.isActive, pdfDoc, pdfDocB, pageNum]);\n\n // Public Event Listeners for Compare APIs\n useEffect(() => {\n const handleStartCompare = (data: any) => {\n const { docA, docB, options } = data || {};\n setIsCompare90Fit(true);\n setCompareZoomMultiplier(1.0);\n setCompareState(prev => ({\n ...prev,\n isActive: true,\n mode: options?.mode || 'side-by-side',\n colorA: options?.colorA || prev.colorA,\n colorB: options?.colorB || prev.colorB,\n opacityA: options?.opacityA || prev.opacityA,\n opacityB: options?.opacityB || prev.opacityB,\n blendMode: options?.blendMode || prev.blendMode\n }));\n if (docA) {\n loadDocA(docA);\n }\n if (docB) {\n loadCompareDoc(docB);\n }\n };\n\n const handleStopCompare = () => {\n setCompareState(prev => ({ ...prev, isActive: false }));\n setPdfDocB(null);\n setTextDiffs([]);\n setIsCompare90Fit(true);\n setCompareZoomMultiplier(1.0);\n };\n\n const handleSetCompareMode = (mode: string) => {\n if (mode) setCompareState(prev => ({ ...prev, mode: mode as any }));\n };\n\n const handleSetCompareColors = (colorA: string, colorB: string) => {\n if (colorA && colorB) setCompareState(prev => ({ ...prev, colorA, colorB }));\n };\n\n const offStart = bus.on('action-start-compare', handleStartCompare);\n const offStop = bus.on('action-stop-compare', handleStopCompare);\n const offMode = bus.on<{ mode: string }>('action-set-compare-mode', (d) => d && handleSetCompareMode(d.mode));\n const offColors = bus.on<{ colorA: string; colorB: string }>('action-set-compare-colors', (d) => d && handleSetCompareColors(d.colorA, d.colorB));\n\n const windowStart = (e: any) => handleStartCompare(e.detail);\n const windowStop = () => handleStopCompare();\n const windowMode = (e: any) => handleSetCompareMode(e.detail?.mode);\n const windowColors = (e: any) => handleSetCompareColors(e.detail?.colorA, e.detail?.colorB);\n\n window.addEventListener('action-start-compare', windowStart);\n window.addEventListener('action-stop-compare', windowStop);\n window.addEventListener('action-set-compare-mode', windowMode);\n window.addEventListener('action-set-compare-colors', windowColors);\n\n return () => {\n offStart(); offStop(); offMode(); offColors();\n window.removeEventListener('action-start-compare', windowStart);\n window.removeEventListener('action-stop-compare', windowStop);\n window.removeEventListener('action-set-compare-mode', windowMode);\n window.removeEventListener('action-set-compare-colors', windowColors);\n };\n }, [bus, loadDocA, loadCompareDoc]);\n\n // Provide combinedRedactions to usePdfSearch but wait, combinedRedactions is computed later in the file.\n // We can just move the combinedRedactions useMemo up before usePdfSearch, \n // or we can pass an empty array initially and it will update.\n // Let's just move usePdfSearch below combinedRedactions.\n const [activeSearchResult, setActiveSearchResult] = useState<SearchResult | null>(null);\n\n // Per-page base dimensions (scale 1, UI rotation composed with the page's /Rotate). Index =\n // pageNumber - 1. Populated progressively after load so mixed-size documents lay out correctly.\n const [pageDims, setPageDims] = useState<Array<{ width: number; height: number }>>([]);\n const fallbackDims = pageDims[0] ?? DEFAULT_FALLBACK_DIMS;\n const dimsFor = useCallback(\n (p: number) => pageDims[p - 1] ?? fallbackDims,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [pageDims, fallbackDims.width, fallbackDims.height]\n );\n const [scrollPos, setScrollPos] = useState({ top: 0, left: 0 });\n const [containerDimensions, setContainerDimensions] = useState<{ width: number; height: number }>({\n width: 0,\n height: 0,\n });\n\n useEffect(() => {\n if (containerRef.current) {\n const c = containerRef.current;\n setContainerDimensions({ width: c.clientWidth, height: c.clientHeight });\n }\n }, []);\n const [isPanning, setIsPanning] = useState(false);\n const panStartRef = useRef<{ x: number, y: number, scrollLeft: number, scrollTop: number } | null>(null);\n\n const GAP = 16;\n\n // Rows of pages (1 or 2 per row depending on layout)\n const rows = useMemo(() => {\n const r: number[][] = [];\n if (!pdfDoc) return r;\n if (pageLayout === 'single') {\n for (let i = 1; i <= pdfDoc.numPages; i++) r.push([i]);\n } else if (pageLayout === 'double') {\n for (let i = 1; i <= pdfDoc.numPages; i += 2) {\n r.push([i, i + 1].filter(p => p <= pdfDoc.numPages));\n }\n } else if (pageLayout === 'cover-facing') {\n r.push([1]);\n for (let i = 2; i <= pdfDoc.numPages; i += 2) {\n r.push([i, i + 1].filter(p => p <= pdfDoc.numPages));\n }\n }\n return r;\n }, [pdfDoc, pageLayout]);\n\n // Row geometry in scaled pixels: each row is as tall as its tallest page (+ gap).\n const rowLayout = useMemo(() => {\n return computeRowLayout(rows, dimsFor, scale, GAP);\n }, [rows, scale, dimsFor]);\n\n const rowsRef = useRef(rows);\n rowsRef.current = rows;\n const scaleRef = useRef(scale);\n scaleRef.current = scale;\n const rowLayoutRef = useRef(rowLayout);\n rowLayoutRef.current = rowLayout;\n const pageTransitionRef = useRef(pageTransition);\n pageTransitionRef.current = pageTransition;\n const visibleRowRef = useRef(0);\n\n const rowIndexOfPage = useCallback((p: number) => rows.findIndex(row => row.includes(p)), [rows]);\n\n const rowIndexAtOffset = useCallback((y: number) => {\n const tops = rowLayout.tops;\n if (tops.length === 0) return 0;\n let lo = 0, hi = tops.length - 1;\n while (lo < hi) {\n const mid = (lo + hi + 1) >> 1;\n if (tops[mid] <= y) lo = mid; else hi = mid - 1;\n }\n return lo;\n }, [rowLayout]);\n\n const scrollToPage = useCallback((p: number, options: { smooth?: boolean } = {}) => {\n const clampedPage = pdfDoc ? Math.max(1, Math.min(p, pdfDoc.numPages)) : Math.max(1, p);\n setPageNum(clampedPage);\n const i = rowIndexOfPage(clampedPage);\n if (i >= 0 && containerRef.current) {\n if (options.smooth) {\n containerRef.current.scrollTo({ top: rowLayout.tops[i], behavior: 'smooth' });\n } else {\n containerRef.current.scrollTop = rowLayout.tops[i];\n }\n }\n }, [pdfDoc, rowIndexOfPage, rowLayout]);\n\n useEffect(() => {\n const handleGoToPage = (detail?: { page: number; smooth?: boolean }) => {\n if (detail?.page) {\n scrollToPage(detail.page, { smooth: detail.smooth ?? true });\n }\n };\n const offGoToPage = bus.on<{ page: number; smooth?: boolean }>('action-go-to-page', (d) => handleGoToPage(d));\n const windowGoToPage = (e: any) => handleGoToPage(e.detail);\n window.addEventListener('action-go-to-page', windowGoToPage);\n\n return () => {\n offGoToPage();\n window.removeEventListener('action-go-to-page', windowGoToPage);\n };\n }, [bus, scrollToPage]);\n\n const handleSearchResultClick = (result: SearchResult) => {\n setPageNum(result.pageIndex);\n setActiveSearchResult(result);\n scrollToPage(result.pageIndex);\n };\n\n const handleSelectDiff = useCallback((idx: number, item?: DiffItem) => {\n const diffItem = item || compareState.diffItems[idx];\n setCompareState(prev => ({ ...prev, currentDiffIndex: idx }));\n\n if (!diffItem) return;\n\n if (diffItem.pageIndex && diffItem.pageIndex !== pageNum) {\n setPageNum(diffItem.pageIndex);\n }\n\n const targetY = (diffItem.y ?? 0) * scale;\n const targetX = (diffItem.x ?? 0) * scale;\n\n if (containerRef.current) {\n const p = diffItem.pageIndex || pageNum;\n const rIdx = rowIndexOfPage(p);\n const rowTop = pageTransition === 'continuous' && rIdx >= 0 ? (rowLayout.tops[rIdx] ?? 0) : 0;\n const viewHeight = containerRef.current.clientHeight || 600;\n const viewWidth = containerRef.current.clientWidth || 800;\n\n const scrollToY = Math.max(0, rowTop + targetY - viewHeight / 3);\n const scrollToX = Math.max(0, targetX - viewWidth / 4);\n\n containerRef.current.scrollTo({\n top: scrollToY,\n left: scrollToX,\n behavior: 'smooth'\n });\n }\n }, [compareState.diffItems, pageNum, scale, pageTransition, rowIndexOfPage, rowLayout.tops]);\n\n // Smooth scroll document to active form field during form flow navigation\n useEffect(() => {\n if (!formManager) return;\n const unsub = formManager.onActiveFieldChange((fieldId) => {\n if (!fieldId) return;\n const target = formManager.getFields().find((f) => f.id === fieldId);\n if (!target) return;\n\n if (pageTransition !== 'continuous' && target.pageIndex !== pageNum) {\n setPageNum(target.pageIndex);\n }\n\n if (containerRef.current) {\n const p = target.pageIndex;\n const rIdx = rowIndexOfPage(p);\n const rowTop = pageTransition === 'continuous' && rIdx >= 0 ? (rowLayout.tops[rIdx] ?? 0) : 0;\n const viewHeight = containerRef.current.clientHeight || 600;\n const viewWidth = containerRef.current.clientWidth || 800;\n\n const targetY = target.y * scale;\n const targetX = target.x * scale;\n\n const scrollToY = Math.max(0, rowTop + targetY - viewHeight / 3);\n const scrollToX = Math.max(0, targetX - viewWidth / 4);\n\n containerRef.current.scrollTo({\n top: scrollToY,\n left: scrollToX,\n behavior: 'smooth',\n });\n }\n });\n return unsub;\n }, [formManager, pageTransition, pageNum, rowIndexOfPage, rowLayout.tops, scale]);\n\n // The annotation list lives in the AnnotationManager (undo/redo, permissions, events, XFDF).\n const annotations = useSyncExternalStore(annotationManager.subscribe, annotationManager.getSnapshot, annotationManager.getSnapshot);\n const [activeTool, setActiveTool] = useState<ToolMode>(defaultTool);\n \n // Set default tools when switching tabs\n useEffect(() => {\n if (activeTab === 'Annotate') {\n setActiveTool('highlight');\n setCurrentColor('#fbc02d');\n setCurrentOpacity(0.5);\n setCurrentStrokeWidth(16);\n } else if (activeTab === 'Shapes') {\n setActiveTool('rectangle');\n setCurrentOpacity(1);\n setCurrentStrokeWidth(2);\n } else if (activeTab === 'Fill and Sign') {\n setActiveTool('signature');\n } else if (activeTab === 'View') {\n setActiveTool(defaultTool);\n }\n }, [activeTab, defaultTool]);\n\n useEffect(() => {\n bus.emit('action-tool-changed', { tool: activeTool });\n }, [activeTool, bus]);\n \n\n\n // Style State\n const [currentColor, setCurrentColor] = useState('#d32f2f');\n const [currentStrokeWidth, setCurrentStrokeWidth] = useState(2);\n const [currentOpacity, setCurrentOpacity] = useState(0.8);\n\n const [isDrawing, setIsDrawing] = useState(false);\n const [activeDrawingPageNum, setActiveDrawingPageNum] = useState<number | null>(null);\n const [startPos, setStartPos] = useState({ x: 0, y: 0 });\n const [currentPos, setCurrentPos] = useState({ x: 0, y: 0 });\n const [freehandPoints, setFreehandPoints] = useState<{ x: number, y: number }[]>([]);\n \n // Text Tool State\n const [activeTextEditor, setActiveTextEditor] = useState<{ x: number, y: number, type: 'text' | 'note' | 'callout' | 'link', annId?: string, points?: {x: number, y: number}[], pageIndex: number } | null>(null);\n const [currentText, setCurrentText] = useState('');\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n const [selectedAnnotationId, setSelectedAnnotationId] = useState<string | null>(null);\n const [contextMenuPos, setContextMenuPos] = useState<{ top: number; left: number } | null>(null);\n const [isLinkModalOpen, setIsLinkModalOpen] = useState(false);\n const justCreatedLinkRef = useRef(false);\n const clipboardAnnotationRef = useRef<Annotation | null>(null);\n\n\n useBusEvent<{ tool: ToolMode }>('action-set-tool', (d) => setActiveTool(d?.tool ?? null));\n\n useEffect(() => {\n const handleSelection = () => {\n const text = typeof window !== 'undefined' ? window.getSelection()?.toString() ?? '' : '';\n bus.emit('action-text-selected', { text });\n };\n document.addEventListener('selectionchange', handleSelection);\n return () => document.removeEventListener('selectionchange', handleSelection);\n }, [bus]);\n\n const zoomFocusRef = useRef<{vx: number | null, vy: number | null}>({ vx: null, vy: null });\n const prevScaleRef = useRef(scale);\n const isProgrammaticScaleRef = useRef(false);\n const initialFitDoneRef = useRef(false);\n\n type ActiveFitMode = { type: 'fit-width'; ratio: number } | { type: 'fit-page' } | null;\n\n const initialWidthRatioValue = typeof initialWidthRatio === 'number' && Number.isFinite(initialWidthRatio) && initialWidthRatio > 0\n ? initialWidthRatio\n : (typeof initialScale === 'object' && initialScale !== null && initialScale.type === 'fit-width' && typeof initialScale.ratio === 'number' && initialScale.ratio > 0\n ? initialScale.ratio\n : undefined);\n\n const activeFitModeRef = useRef<ActiveFitMode>(\n typeof initialWidthRatioValue === 'number'\n ? { type: 'fit-width', ratio: initialWidthRatioValue }\n : (initialScale === 'fit-width' || initialScale === undefined)\n ? { type: 'fit-width', ratio: 1.0 }\n : initialScale === 'fit-page'\n ? { type: 'fit-page' }\n : null\n );\n\n useEffect(() => {\n initialFitDoneRef.current = false;\n if (typeof initialWidthRatioValue === 'number') {\n activeFitModeRef.current = { type: 'fit-width', ratio: initialWidthRatioValue };\n } else if (initialScale === 'fit-width' || initialScale === undefined) {\n activeFitModeRef.current = { type: 'fit-width', ratio: 1.0 };\n } else if (initialScale === 'fit-page') {\n activeFitModeRef.current = { type: 'fit-page' };\n } else {\n activeFitModeRef.current = null;\n }\n }, [pdfDoc, initialScale, initialWidthRatioValue]);\n\n // Unified scroll offset maintenance for user-driven scale changes (wheel or toolbar)\n useEffect(() => {\n if (prevScaleRef.current !== scale) {\n const s = prevScaleRef.current;\n const newScale = scale;\n prevScaleRef.current = scale;\n \n const container = containerRef.current;\n if (!container) return;\n\n const isProgrammatic = isProgrammaticScaleRef.current || !initialFitDoneRef.current || initialScrollDoneRef.current !== pdfDoc;\n if (!isProgrammatic) {\n // User manually altered zoom (toolbar buttons, wheel, shortcuts) -> clear auto-fit\n activeFitModeRef.current = null;\n }\n initialFitDoneRef.current = true;\n isProgrammaticScaleRef.current = false;\n\n const newPos = calculateScrollCompensation({\n prevScale: s,\n newScale,\n containerWidth: container.clientWidth,\n containerHeight: container.clientHeight,\n currentScrollLeft: container.scrollLeft,\n currentScrollTop: container.scrollTop,\n basePageWidth: dimsFor(pageNum).width,\n focusPoint: zoomFocusRef.current,\n isProgrammatic,\n });\n\n zoomFocusRef.current = { vx: null, vy: null };\n\n if (isProgrammatic && pageNum > 1 && pageTransition === 'continuous') {\n const rIdx = rowIndexOfPage(pageNum);\n if (rIdx >= 0) {\n container.scrollTop = rowLayout.tops[rIdx] ?? 0;\n }\n container.scrollLeft = 0;\n } else {\n container.scrollLeft = newPos.scrollLeft;\n container.scrollTop = newPos.scrollTop;\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [scale]);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n const handleWheel = (e: WheelEvent) => {\n if (e.metaKey || e.ctrlKey) {\n e.preventDefault();\n \n const rect = container.getBoundingClientRect();\n const clientX = e.clientX;\n const clientY = e.clientY;\n \n const multiplier = Math.exp(-e.deltaY * 0.002);\n \n setScale(s => {\n const roundedScale = clampScale(s * multiplier);\n if (roundedScale !== s) {\n zoomFocusRef.current = { \n vx: clientX - rect.left, \n vy: clientY - rect.top \n };\n }\n return roundedScale;\n });\n }\n };\n\n container.addEventListener('wheel', handleWheel, { passive: false });\n return () => container.removeEventListener('wheel', handleWheel);\n }, [setScale]);\n\n // Commit a new list to the manager (diffed into add/modify/delete, permission-checked, undoable).\n const commitAnnotations = useCallback((newAnns: Annotation[]) => {\n annotationManager.commit(newAnns);\n }, [annotationManager]);\n\n useBusEvent<{ tempAnn: Annotation }>('action-commit-digital-signature-local', (d) => {\n if (d?.tempAnn) commitAnnotations([...annotations, d.tempAnn]);\n });\n\n const handleUndo = useCallback(() => { annotationManager.undo(); }, [annotationManager]);\n const handleRedo = useCallback(() => { annotationManager.redo(); }, [annotationManager]);\n\n // Live resizing & moving state for annotations\n const [liveResizingAnn, setLiveResizingAnn] = useState<Annotation | null>(null);\n const [liveMovingAnn, setLiveMovingAnn] = useState<Annotation | null>(null);\n const resizingRef = useRef<{\n annId: string;\n handle: string;\n startX: number;\n startY: number;\n initialAnn: Annotation;\n pageIndex: number;\n } | null>(null);\n const movingRef = useRef<{\n annId: string;\n startX: number;\n startY: number;\n initialAnn: Annotation;\n pageIndex: number;\n } | null>(null);\n\n const latestResizingAnnRef = useRef<Annotation | null>(null);\n latestResizingAnnRef.current = liveResizingAnn;\n const latestMovingAnnRef = useRef<Annotation | null>(null);\n latestMovingAnnRef.current = liveMovingAnn;\n\n const handleStartResize = useCallback((id: string, handle: string, e: React.MouseEvent, pageNum: number) => {\n const ann = annotations.find(a => a.id === id);\n if (!ann || permissions?.canEditAnnotations === false || !annotationManager.canEdit(ann)) return;\n const initialAnn = {\n ...ann,\n width: ann.width && ann.width > 0 ? ann.width : 180,\n height: ann.height && ann.height > 0 ? ann.height : 40\n };\n resizingRef.current = {\n annId: id,\n handle,\n startX: e.clientX,\n startY: e.clientY,\n initialAnn,\n pageIndex: pageNum\n };\n setLiveResizingAnn(initialAnn);\n }, [annotations, annotationManager, permissions]);\n\n const handleStartMove = useCallback((id: string, e: React.MouseEvent, pageNum: number) => {\n const ann = annotations.find(a => a.id === id);\n if (!ann || permissions?.canEditAnnotations === false || !annotationManager.canEdit(ann)) return;\n movingRef.current = {\n annId: id,\n startX: e.clientX,\n startY: e.clientY,\n initialAnn: { ...ann },\n pageIndex: pageNum\n };\n setLiveMovingAnn({ ...ann });\n }, [annotations, annotationManager, permissions]);\n\n const handleAnnotationDoubleClick = useCallback((id: string, e: React.MouseEvent) => {\n e.stopPropagation();\n const ann = annotations.find(a => a.id === id);\n if (ann && (ann.type === 'text' || ann.type === 'note' || ann.type === 'callout')) {\n if (permissions?.canEditAnnotations === false || !annotationManager.canEdit(ann)) {\n setSelectedAnnotationId(id);\n return;\n }\n setActiveTextEditor({\n x: ann.x,\n y: ann.y,\n type: ann.type as any,\n annId: ann.id,\n points: ann.points,\n pageIndex: ann.pageIndex\n });\n setCurrentText(ann.text || '');\n if (ann.color) setCurrentColor(ann.color);\n setSelectedAnnotationId(id);\n }\n }, [annotations, annotationManager, permissions]);\n\n useEffect(() => {\n const handleWindowMouseMove = (e: MouseEvent) => {\n if (resizingRef.current) {\n const { handle, startX, startY, initialAnn } = resizingRef.current;\n let dx = (e.clientX - startX) / scale;\n let dy = (e.clientY - startY) / scale;\n if (rotation === 90) {\n const tmp = dx; dx = dy; dy = -tmp;\n } else if (rotation === 180) {\n dx = -dx; dy = -dy;\n } else if (rotation === 270) {\n const tmp = dx; dx = -dy; dy = tmp;\n }\n\n let newW = initialAnn.width;\n let newH = initialAnn.height;\n let newX = initialAnn.x;\n let newY = initialAnn.y;\n\n if (handle.includes('e')) {\n newW = Math.max(30, initialAnn.width + dx);\n }\n if (handle.includes('s')) {\n newH = Math.max(16, initialAnn.height + dy);\n }\n if (handle.includes('w')) {\n newW = Math.max(30, initialAnn.width - dx);\n newX = initialAnn.x + (initialAnn.width - newW);\n }\n if (handle.includes('n')) {\n newH = Math.max(16, initialAnn.height - dy);\n newY = initialAnn.y + (initialAnn.height - newH);\n }\n\n setLiveResizingAnn({\n ...initialAnn,\n x: newX,\n y: newY,\n width: newW,\n height: newH\n });\n } else if (movingRef.current) {\n const { startX, startY, initialAnn } = movingRef.current;\n let dx = (e.clientX - startX) / scale;\n let dy = (e.clientY - startY) / scale;\n if (rotation === 90) {\n const tmp = dx; dx = dy; dy = -tmp;\n } else if (rotation === 180) {\n dx = -dx; dy = -dy;\n } else if (rotation === 270) {\n const tmp = dx; dx = -dy; dy = tmp;\n }\n\n setLiveMovingAnn({\n ...initialAnn,\n x: Math.max(0, initialAnn.x + dx),\n y: Math.max(0, initialAnn.y + dy)\n });\n }\n };\n\n const handleWindowMouseUp = () => {\n if (resizingRef.current) {\n if (latestResizingAnnRef.current) {\n const finalAnn = latestResizingAnnRef.current;\n commitAnnotations(annotations.map(a => a.id === finalAnn.id ? finalAnn : a));\n }\n resizingRef.current = null;\n setLiveResizingAnn(null);\n }\n if (movingRef.current) {\n if (latestMovingAnnRef.current) {\n const finalAnn = latestMovingAnnRef.current;\n commitAnnotations(annotations.map(a => a.id === finalAnn.id ? finalAnn : a));\n }\n movingRef.current = null;\n setLiveMovingAnn(null);\n }\n };\n\n window.addEventListener('mousemove', handleWindowMouseMove);\n window.addEventListener('mouseup', handleWindowMouseUp);\n return () => {\n window.removeEventListener('mousemove', handleWindowMouseMove);\n window.removeEventListener('mouseup', handleWindowMouseUp);\n };\n }, [scale, rotation, annotations, commitAnnotations]);\n\n const handleAnnotateSelection = useCallback((type: 'highlight' | 'underline' | 'strikeout' | 'squiggly') => {\n if (permissions?.canAddAnnotations === false) return;\n if (typeof window === 'undefined') return;\n const sel = window.getSelection();\n if (!sel || sel.isCollapsed || !sel.rangeCount) return;\n const range = sel.getRangeAt(0);\n const clientRects = Array.from(range.getClientRects());\n if (clientRects.length === 0) return;\n\n let node: Node | null = range.commonAncestorContainer;\n while (node && !(node instanceof HTMLElement && node.classList.contains('pdf-page-container'))) {\n node = node.parentNode;\n }\n if (!node || !(node instanceof HTMLElement)) return;\n\n const pageNumAttr = node.getAttribute('data-page-number') || node.id.replace('pdf-page-', '');\n const targetPage = parseInt(pageNumAttr, 10);\n if (!targetPage) return;\n\n const pageRect = node.getBoundingClientRect();\n const dims = dimsFor(targetPage);\n const unW = rotation % 180 === 0 ? dims.width : dims.height;\n const unH = rotation % 180 === 0 ? dims.height : dims.width;\n\n const rects = clientRects.map(r => {\n const rawX = (r.left - pageRect.left) / scale;\n const rawY = (r.top - pageRect.top) / scale;\n const rawW = r.width / scale;\n const rawH = r.height / scale;\n const p1 = convertToUnrotated(rawX, rawY, rotation, unW, unH);\n const p2 = convertToUnrotated(rawX + rawW, rawY + rawH, rotation, unW, unH);\n return {\n x: Math.min(p1.x, p2.x),\n y: Math.min(p1.y, p2.y),\n width: Math.abs(p2.x - p1.x),\n height: Math.abs(p2.y - p1.y)\n };\n }).filter(r => r.width > 2 && r.height > 2);\n\n if (rects.length === 0) return;\n\n const minX = Math.min(...rects.map(r => r.x));\n const minY = Math.min(...rects.map(r => r.y));\n const maxX = Math.max(...rects.map(r => r.x + r.width));\n const maxY = Math.max(...rects.map(r => r.y + r.height));\n\n const color = type === 'highlight' ? '#fbc02d' : type === 'squiggly' ? '#388e3c' : currentColor || '#d32f2f';\n const opacity = type === 'highlight' ? 0.5 : 1;\n const strokeWidth = type === 'squiggly' ? 1.5 : 2;\n\n const annId = newAnnotationId();\n commitAnnotations([...annotations, {\n id: annId,\n type,\n pageIndex: targetPage,\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY,\n rects: rects.length > 1 ? rects : undefined,\n color,\n strokeWidth,\n opacity\n }]);\n\n sel.removeAllRanges();\n }, [annotations, commitAnnotations, currentColor, dimsFor, permissions, rotation, scale]);\n\n // Keyboard shortcuts are delivered by <TeamSyncViewer> from its root element, so they only apply\n // to the viewer instance that currently has focus (several viewers can share a page).\n useBusEvent<KeyboardEvent>('viewer-keydown', (e) => {\n const isInput = document.activeElement?.tagName === 'TEXTAREA' || document.activeElement?.tagName === 'INPUT';\n\n if (matchShortcut(e, getCommand('ROTATE_CW'))) {\n e.preventDefault();\n setRotation(r => (r + 90) % 360);\n return;\n }\n if (matchShortcut(e, getCommand('ROTATE_CCW'))) {\n e.preventDefault();\n setRotation(r => (r - 90) % 360);\n return;\n }\n if (matchShortcut(e, getCommand('UNDO'))) {\n e.preventDefault();\n handleUndo();\n return;\n }\n if (matchShortcut(e, getCommand('REDO'))) {\n e.preventDefault();\n handleRedo();\n return;\n }\n if (matchShortcut(e, getCommand('SEARCH'))) {\n e.preventDefault();\n bus.emit('action-open-search');\n return;\n }\n if (matchShortcut(e, getCommand('FILE_PICKER'))) {\n e.preventDefault();\n bus.emit('action-open-file-picker');\n return;\n }\n\n // Annotation clipboard & manipulation (only when not typing in text fields)\n if (!isInput && !activeTextEditor) {\n if (matchShortcut(e, getCommand('COPY'))) {\n const selectedText = typeof window !== 'undefined' ? window.getSelection()?.toString() : '';\n if (selectedText && selectedText.length > 0) {\n bus.emit('action-text-copied', { text: selectedText });\n return;\n }\n if (selectedAnnotationId) {\n const annToCopy = annotations.find(a => a.id === selectedAnnotationId);\n if (annToCopy) {\n e.preventDefault();\n clipboardAnnotationRef.current = annToCopy;\n }\n return;\n }\n }\n if (matchShortcut(e, getCommand('PASTE')) && clipboardAnnotationRef.current) {\n e.preventDefault();\n const base = clipboardAnnotationRef.current;\n const newAnn: Annotation = {\n ...base,\n id: newAnnotationId(),\n pageIndex: pageNum,\n x: base.x + 20,\n y: base.y + 20,\n author: undefined,\n authorId: undefined,\n createdAt: undefined,\n modifiedAt: undefined,\n readOnly: undefined,\n xfdfExtras: undefined\n };\n commitAnnotations([...annotations, newAnn]);\n setSelectedAnnotationId(newAnn.id);\n return;\n }\n if (matchShortcut(e, getCommand('DELETE')) && selectedAnnotationId) {\n e.preventDefault();\n commitAnnotations(annotations.filter(a => a.id !== selectedAnnotationId));\n setSelectedAnnotationId(null);\n return;\n }\n if (e.key === 'Enter' && selectedAnnotationId && !activeTextEditor) {\n const ann = annotations.find(a => a.id === selectedAnnotationId);\n if (ann && (ann.type === 'text' || ann.type === 'note' || ann.type === 'callout')) {\n e.preventDefault();\n setActiveTextEditor({\n x: ann.x,\n y: ann.y,\n type: ann.type as any,\n annId: ann.id,\n points: ann.points,\n pageIndex: ann.pageIndex\n });\n setCurrentText(ann.text || '');\n if (ann.color) setCurrentColor(ann.color);\n return;\n }\n }\n }\n });\n\n useEffect(() => {\n if (activeTextEditor && textareaRef.current) {\n setTimeout(() => {\n textareaRef.current?.focus();\n }, 10);\n }\n }, [activeTextEditor]);\n\n useEffect(() => {\n if (onAnnotationsChange) {\n onAnnotationsChange(annotations);\n }\n }, [annotations, onAnnotationsChange]);\n\n // --- Dynamic Regex Redactions ---\n const [autoRedactions, setAutoRedactions] = useState<Redaction[]>([]);\n \n useEffect(() => {\n if (pdfDoc && regexRedactions && regexRedactions.length > 0) {\n let cancelled = false;\n findRegexRedactions(pdfDoc, regexRedactions).then(results => {\n if (!cancelled) setAutoRedactions(results);\n });\n return () => { cancelled = true; };\n } else {\n setAutoRedactions([]);\n }\n }, [pdfDoc, regexRedactions]);\n\n const [isCommitModalOpen, setIsCommitModalOpen] = useState(false);\n\n const combinedRedactions = useMemo(() => {\n return [...(redactions || []), ...autoRedactions, ...manualRedactions];\n }, [redactions, autoRedactions, manualRedactions]);\n\n // Share the live redaction list with the instance (export needs it) instead of window globals.\n useEffect(() => {\n callbacksRef.current.onRedactionsChange?.(combinedRedactions);\n }, [combinedRedactions]);\n\n const pendingRedactionsCount = useMemo(() => {\n return combinedRedactions.filter(r => r.status === 'pending').length;\n }, [combinedRedactions]);\n\n const handleDiscardAllRedactions = useCallback(() => {\n setManualRedactions(prev => prev.filter(r => r.status === 'applied'));\n setAutoRedactions(prev => prev.filter(r => r.status === 'applied'));\n }, []);\n\n const handleDiscardRedaction = useCallback((red: Redaction) => {\n setManualRedactions(prev => prev.filter(r => r !== red && r.id !== red.id));\n setAutoRedactions(prev => prev.filter(r => r !== red && r.id !== red.id));\n }, []);\n\n const { search, searchResults, isSearching, searchProgress } = usePdfSearch(pdfDoc, combinedRedactions);\n\n useEffect(() => {\n if (searchResults.length === 0) {\n setActiveSearchResult(null);\n }\n }, [searchResults]);\n\n // Load the document. Re-runs when the URL or the reload nonce changes; the previous loading task\n // (and its worker transport) is destroyed on cleanup so documents never leak across loads.\n const firstPageRenderedRef = useRef(false);\n useEffect(() => {\n setPdfDoc(null);\n setLoadError(null);\n setPageNum(1);\n setPageDims([]);\n firstPageRenderedRef.current = false;\n if (!initialDoc) return;\n\n const url = initialDoc;\n let cancelled = false;\n let loadingTask: pdfjsLib.PDFDocumentLoadingTask | null = null;\n\n const loadPdf = async () => {\n try {\n if (assetsRef.current) configurePdfAssets(assetsRef.current);\n assertWorkerConfigured();\n loadingTask = pdfjsLib.getDocument({\n url,\n withCredentials,\n ...resolveNetworkParams(),\n ...getDocumentParams(),\n });\n const doc = await loadingTask.promise;\n // If the effect was cleaned up meanwhile, the loading task (and its worker transport)\n // has already been destroyed by the cleanup function.\n if (cancelled) return;\n try {\n const p1 = await doc.getPage(1);\n if (!cancelled) {\n const vp1 = p1.getViewport({ scale: 1, rotation: normalizeRotation(p1.rotate + rotation) });\n setPageDims(estimatePageDimensions(doc.numPages, { width: vp1.width, height: vp1.height }));\n }\n } catch {}\n if (cancelled) return;\n setPdfDoc(doc);\n callbacksRef.current.onDocumentLoaded?.(doc, url);\n } catch (error: any) {\n if (cancelled) return;\n const err = error instanceof Error ? error : new Error(String(error?.message ?? error));\n const passwordRequired = error?.name === 'PasswordException';\n console.error('[teamsync-pdf-viewer] Error loading PDF:', err.message, err);\n setLoadError(err);\n callbacksRef.current.onLoadError?.(err, { url, passwordRequired });\n }\n };\n loadPdf();\n\n return () => {\n cancelled = true;\n if (loadingTask) {\n loadingTask.destroy().catch(() => {});\n }\n };\n }, [initialDoc, loadNonce, withCredentials, rotation]);\n\n const handlePageRendered = useCallback((renderedPage: number) => {\n callbacksRef.current.onPageRendered?.(renderedPage);\n if (firstPageRenderedRef.current) return;\n firstPageRenderedRef.current = true;\n callbacksRef.current.onFirstPageRendered?.(renderedPage);\n }, []);\n\n useEffect(() => {\n if (pdfDoc) callbacksRef.current.onPageChange?.(pageNum, pdfDoc.numPages);\n }, [pageNum, pdfDoc]);\n\n // Scroll to the target page (page ?? initialPage) as soon as row geometry is known,\n // and handle subsequent page/initialPage prop updates when citations are clicked.\n const initialScrollDoneRef = useRef<pdfjsLib.PDFDocumentProxy | null>(null);\n const lastTargetPageRef = useRef<number | undefined>(undefined);\n useEffect(() => {\n const target = page ?? initialPage;\n if (!pdfDoc || !target) return;\n if (initialScrollDoneRef.current === pdfDoc && lastTargetPageRef.current === target) return;\n if (pageDims.length < Math.min(target, pdfDoc.numPages)) return;\n\n const isInitial = initialScrollDoneRef.current !== pdfDoc;\n initialScrollDoneRef.current = pdfDoc;\n lastTargetPageRef.current = target;\n const t = setTimeout(() => scrollToPage(target, { smooth: !isInitial }), 50);\n return () => clearTimeout(t);\n }, [pdfDoc, page, initialPage, pageDims.length, scrollToPage]);\n\n // Measure base dimensions up front and reserve estimated space for all pages to avoid layout jumps / shaking on scroll.\n useEffect(() => {\n if (!pdfDoc) return;\n let cancelled = false;\n const doc = pdfDoc;\n\n (async () => {\n // 1. Measure Page 1 up front to obtain baseline page dimensions\n let p1: pdfjsLib.PDFPageProxy;\n try {\n p1 = await doc.getPage(1);\n } catch {\n return;\n }\n if (cancelled) return;\n\n const vp1 = p1.getViewport({ scale: 1, rotation: normalizeRotation(p1.rotate + rotation) });\n const p1Dim = { width: vp1.width, height: vp1.height };\n\n // 2. Reserve estimated space up front for all pages based on Page 1\n setPageDims((prev) => {\n if (\n prev.length === doc.numPages &&\n Math.abs((prev[0]?.width ?? 0) - p1Dim.width) <= 0.5 &&\n Math.abs((prev[0]?.height ?? 0) - p1Dim.height) <= 0.5\n ) {\n return prev;\n }\n return estimatePageDimensions(doc.numPages, p1Dim);\n });\n\n if (doc.numPages <= 1) return;\n\n // 3. Measure remaining page dimensions up front in parallel batches\n const allDims = estimatePageDimensions(doc.numPages, p1Dim);\n let mismatch = false;\n const batchSize = 25;\n\n for (let start = 2; start <= doc.numPages; start += batchSize) {\n if (cancelled) return;\n const end = Math.min(doc.numPages, start + batchSize - 1);\n const batchPromises: Promise<void>[] = [];\n\n for (let p = start; p <= end; p++) {\n const pageNum = p;\n batchPromises.push((async () => {\n try {\n const page = await doc.getPage(pageNum);\n if (cancelled) return;\n const vp = page.getViewport({ scale: 1, rotation: normalizeRotation(page.rotate + rotation) });\n if (Math.abs(vp.width - p1Dim.width) > 0.5 || Math.abs(vp.height - p1Dim.height) > 0.5) {\n mismatch = true;\n }\n allDims[pageNum - 1] = { width: vp.width, height: vp.height };\n } catch {\n // Retain estimated p1Dim\n }\n })());\n }\n\n await Promise.all(batchPromises);\n }\n\n if (cancelled) return;\n\n // 4. Update pageDims only if any page had different dimensions than the page 1 estimate\n if (mismatch) {\n const container = containerRef.current;\n if (container && container.scrollTop > 0 && pageTransitionRef.current === 'continuous') {\n const cRow = visibleRowRef.current;\n const newLayout = computeRowLayout(\n rowsRef.current,\n (p) => allDims[p - 1] ?? p1Dim,\n scaleRef.current,\n GAP\n );\n const oldTop = rowLayoutRef.current.tops[cRow] ?? 0;\n const newTop = newLayout.tops[cRow] ?? 0;\n const delta = newTop - oldTop;\n if (delta !== 0) {\n container.scrollTop += delta;\n }\n }\n setPageDims(allDims);\n }\n })();\n\n return () => {\n cancelled = true;\n };\n }, [pdfDoc, rotation]);\n\n // Dynamic Fit to Width calculation\n const handleFitToWidth = useCallback(\n (detail?: { ratio?: number } | number) => {\n const dims = dimsFor(pageNum);\n if (!containerRef.current || !dims.width) return;\n const availableWidth = containerRef.current.clientWidth - 48;\n const rawRatio = typeof detail === 'number' ? detail : detail?.ratio;\n const effectiveRatio =\n typeof rawRatio === 'number' && Number.isFinite(rawRatio) && rawRatio > 0\n ? rawRatio\n : (typeof initialWidthRatioValue === 'number' && !detail ? initialWidthRatioValue : 1.0);\n\n activeFitModeRef.current = { type: 'fit-width', ratio: effectiveRatio };\n\n if (availableWidth > 0 && dims.width > 0) {\n const newScale = calculateFitWidthScale(availableWidth, dims.width, effectiveRatio);\n if (newScale !== scale) {\n isProgrammaticScaleRef.current = true;\n setScale(newScale);\n } else {\n isProgrammaticScaleRef.current = false;\n }\n if (containerRef.current && (pageNum === 1 || containerRef.current.scrollTop <= 1)) {\n containerRef.current.scrollTop = 0;\n containerRef.current.scrollLeft = 0;\n }\n }\n },\n [dimsFor, pageNum, scale, setScale, initialWidthRatioValue]\n );\n\n // Dynamic Fit to Page calculation\n const handleFitToPage = useCallback(() => {\n activeFitModeRef.current = { type: 'fit-page' };\n const dims = dimsFor(pageNum);\n if (!containerRef.current || !dims.width || !dims.height) return;\n const availableWidth = containerRef.current.clientWidth - 48;\n const availableHeight = containerRef.current.clientHeight - 48;\n if (availableWidth > 0 && availableHeight > 0 && dims.width > 0 && dims.height > 0) {\n const scaleX = availableWidth / dims.width;\n const scaleY = availableHeight / dims.height;\n const newScale = clampScale(Math.min(scaleX, scaleY));\n if (newScale !== scale) {\n isProgrammaticScaleRef.current = true;\n setScale(newScale);\n } else {\n isProgrammaticScaleRef.current = false;\n }\n if (containerRef.current && (pageNum === 1 || containerRef.current.scrollTop <= 1)) {\n containerRef.current.scrollTop = 0;\n containerRef.current.scrollLeft = 0;\n }\n }\n }, [dimsFor, pageNum, scale, setScale]);\n\n useBusEvent('action-fit-to-width', (detail) => handleFitToWidth(detail as { ratio?: number } | number | undefined));\n useBusEvent('action-fit-to-page', () => handleFitToPage());\n\n // Responsive container resize observer: automatically refits scale if in a fit or width-ratio mode\n useEffect(() => {\n if (responsive === false) return;\n const container = containerRef.current;\n if (!container || typeof ResizeObserver === 'undefined') return;\n\n let rafId: number | null = null;\n let prevWidth = container.clientWidth;\n let prevHeight = container.clientHeight;\n\n const handleResize = () => {\n const currentWidth = container.clientWidth;\n const currentHeight = container.clientHeight;\n\n if (currentWidth <= 0 || currentHeight <= 0) return;\n if (Math.abs(currentWidth - prevWidth) < 1 && Math.abs(currentHeight - prevHeight) < 1) return;\n\n prevWidth = currentWidth;\n prevHeight = currentHeight;\n\n setContainerDimensions({ width: currentWidth, height: currentHeight });\n\n if (!activeFitModeRef.current) return;\n\n if (rafId) cancelAnimationFrame(rafId);\n rafId = requestAnimationFrame(() => {\n const mode = activeFitModeRef.current;\n if (mode?.type === 'fit-width') {\n handleFitToWidth({ ratio: mode.ratio });\n } else if (mode?.type === 'fit-page') {\n handleFitToPage();\n }\n });\n };\n\n const observer = new ResizeObserver(handleResize);\n observer.observe(container);\n window.addEventListener('resize', handleResize);\n\n return () => {\n observer.disconnect();\n window.removeEventListener('resize', handleResize);\n if (rafId) cancelAnimationFrame(rafId);\n };\n }, [responsive, handleFitToWidth, handleFitToPage]);\n\n const getUnrotatedPoint = (e: React.MouseEvent<Element>, pageNumber: number) => {\n const rect = e.currentTarget.getBoundingClientRect();\n const rawX = (e.clientX - rect.left) / scale;\n const rawY = (e.clientY - rect.top) / scale;\n const dims = dimsFor(pageNumber);\n const unW = rotation % 180 === 0 ? dims.width : dims.height;\n const unH = rotation % 180 === 0 ? dims.height : dims.width;\n return convertToUnrotated(rawX, rawY, rotation, unW, unH);\n };\n\n const handleMouseDown = (e: React.MouseEvent<Element>, targetPageNum: number) => {\n if (!activeTool) return;\n \n const { x, y } = getUnrotatedPoint(e, targetPageNum);\n\n if (activeTool === 'text' || activeTool === 'note') {\n e.preventDefault();\n return;\n }\n\n if (activeTool === 'eraser') {\n setIsDrawing(true);\n return;\n }\n\n setStartPos({ x, y });\n setCurrentPos({ x, y });\n if (activeTool === 'freehand') {\n setIsDrawing(true);\n setFreehandPoints([{ x, y }]);\n setActiveDrawingPageNum(targetPageNum);\n } else if (['rectangle', 'ellipse', 'line', 'arrow', 'highlight', 'underline', 'strikeout', 'squiggly', 'redaction'].includes(activeTool)) {\n setIsDrawing(true);\n setActiveDrawingPageNum(targetPageNum);\n } else if (['callout', 'link'].includes(activeTool)) {\n setIsDrawing(true);\n setActiveDrawingPageNum(targetPageNum);\n }\n };\n\n const commitTextAnnotation = () => {\n if (activeTextEditor && currentText.trim()) {\n if (activeTextEditor.annId) {\n commitAnnotations(annotations.map(a => \n a.id === activeTextEditor.annId ? { ...a, text: currentText } : a\n ));\n } else {\n const annId = newAnnotationId();\n const defaultWidth = Math.max(160, Math.min(320, currentText.length * 9 + 20));\n const lineCount = currentText.split('\\n').length;\n const defaultHeight = Math.max(36, lineCount * 22);\n commitAnnotations([...annotations, {\n id: annId,\n type: activeTextEditor.type,\n pageIndex: activeTextEditor.pageIndex,\n x: activeTextEditor.x,\n y: activeTextEditor.y,\n width: defaultWidth,\n height: defaultHeight,\n text: currentText,\n points: activeTextEditor.points,\n color: currentColor, strokeWidth: currentStrokeWidth, opacity: currentOpacity\n }]);\n }\n }\n setActiveTextEditor(null);\n setCurrentText('');\n if (activeTool === 'text') {\n setActiveTool(null);\n }\n };\n\n const handleMouseMove = (e: React.MouseEvent<Element>, targetPageNum: number) => {\n if (!isDrawing) return;\n \n const { x, y } = getUnrotatedPoint(e, targetPageNum);\n setCurrentPos({ x, y });\n\n if (activeTool === 'freehand') {\n setFreehandPoints(prev => [...prev, { x, y }]);\n }\n };\n\n const handleMouseUp = (e: React.MouseEvent<Element>, targetPageNum: number) => {\n if (activeTool === 'text' || activeTool === 'note' || activeTool === 'digital_signature' || activeTool === 'link') {\n if (activeTool === 'link') {\n const { x, y } = getUnrotatedPoint(e, targetPageNum);\n if (permissions?.canAddAnnotations === false) return;\n \n // Auto create a link box at click location\n const linkId = newAnnotationId();\n const newLinkAnn: any = {\n id: linkId,\n type: 'link',\n pageIndex: targetPageNum,\n x,\n y,\n width: 120,\n height: 35,\n text: 'Open Link',\n linkUrl: 'https://',\n color: 'transparent',\n strokeWidth: 0,\n opacity: 1,\n points: []\n };\n commitAnnotations([...annotations, newLinkAnn]);\n setSelectedAnnotationId(linkId);\n setIsLinkModalOpen(true);\n setActiveTool(null);\n return;\n } else if (activeTool === 'text' || activeTool === 'note') {\n const { x, y } = getUnrotatedPoint(e, targetPageNum);\n if (permissions?.canAddAnnotations === false) return;\n if (activeTextEditor) {\n commitTextAnnotation();\n }\n setActiveTextEditor({ x, y, type: activeTool as any, pageIndex: targetPageNum });\n setCurrentText('');\n }\n return;\n }\n\n if (!isDrawing) return;\n setIsDrawing(false);\n setActiveDrawingPageNum(null);\n if (!activeTool) return;\n \n if (activeTool === 'freehand') {\n if (freehandPoints.length > 2) {\n // Calculate bounding box for freehand to store x, y, width, height (simplified)\n const xs = freehandPoints.map(p => p.x);\n const ys = freehandPoints.map(p => p.y);\n const minX = Math.min(...xs);\n const maxX = Math.max(...xs);\n const minY = Math.min(...ys);\n const maxY = Math.max(...ys);\n \n commitAnnotations([...annotations, { \n id: newAnnotationId(), type: activeTool as any, pageIndex: targetPageNum,\n x: minX, y: minY, width: maxX - minX, height: maxY - minY,\n points: [...freehandPoints],\n strokes: [[...freehandPoints]],\n color: currentColor, strokeWidth: currentStrokeWidth, opacity: currentOpacity\n }]);\n }\n setFreehandPoints([]);\n } else {\n let width = Math.abs(currentPos.x - startPos.x);\n let height = Math.abs(currentPos.y - startPos.y);\n if (width > 5 || height > 5) {\n let x = Math.min(startPos.x, currentPos.x);\n let y = Math.min(startPos.y, currentPos.y);\n const points = (activeTool === 'line' || activeTool === 'arrow' || activeTool === 'callout') ? [startPos, currentPos] : undefined;\n \n if (['highlight', 'underline', 'strikeout', 'squiggly', 'redaction'].includes(activeTool) && height < 18) {\n height = Math.max(18, height);\n y = startPos.y - 9; // Center the highlight or redaction on the mouse path\n }\n \n if (activeTool === 'callout') {\n if (permissions?.canAddAnnotations === false) return;\n setActiveTextEditor({ x: currentPos.x, y: currentPos.y, type: 'callout', points, pageIndex: targetPageNum });\n setCurrentText('');\n return;\n }\n\n if (activeTool === 'redaction') {\n if (permissions?.canRedact === false) return;\n setManualRedactions(prev => [...prev, {\n id: `manual-${Date.now()}-${Math.random().toString(36).substr(2, 6)}`,\n pageIndex: targetPageNum,\n x,\n y,\n width,\n height,\n status: 'pending'\n }]);\n return;\n }\n\n if (permissions?.canAddAnnotations === false) return;\n\n commitAnnotations([...annotations, { \n id: newAnnotationId(), type: activeTool as any, pageIndex: targetPageNum, x, y, width, height, points,\n color: currentColor, strokeWidth: currentStrokeWidth, opacity: currentOpacity\n }]);\n }\n }\n };\n\n const handleEraserMove = (id: string) => {\n if (activeTool === 'eraser' && isDrawing) {\n commitAnnotations(annotations.filter(a => a.id !== id));\n }\n };\n\n const handleLinkClick = useCallback(async (linkUrl: string, ann?: Annotation, e?: React.MouseEvent) => {\n const parsed = parseLinkTarget(linkUrl);\n let defaultPrevented = false;\n\n const linkEvent: LinkClickEvent = {\n url: linkUrl,\n docUrl: parsed.docUrl,\n pageNumber: parsed.pageNumber,\n isInternalPage: parsed.isInternalPage,\n annotation: ann,\n originalEvent: e,\n preventDefault: () => {\n defaultPrevented = true;\n },\n get defaultPrevented() {\n return defaultPrevented;\n }\n };\n\n bus.emit('linkClicked', linkEvent);\n try {\n const res = await onLinkClick?.(linkEvent);\n if (res === false) {\n defaultPrevented = true;\n }\n } catch (err) {\n console.error('[teamsync-pdf-viewer] onLinkClick error:', err);\n }\n\n if (defaultPrevented) return;\n\n // Internal page jump\n if (parsed.isInternalPage && parsed.pageNumber) {\n scrollToPage(parsed.pageNumber);\n return;\n }\n\n // Resolve link if custom resolver provided\n let effectiveDocUrl = parsed.docUrl;\n let effectivePage = parsed.pageNumber;\n\n if (resolveLinkUrl && instance) {\n try {\n const resolved = await resolveLinkUrl(linkUrl, {\n sourceViewer: instance,\n annotation: ann\n });\n if (resolved) {\n if (typeof resolved === 'string') {\n const reParsed = parseLinkTarget(resolved);\n effectiveDocUrl = reParsed.docUrl ?? resolved;\n effectivePage = reParsed.pageNumber ?? effectivePage;\n } else {\n effectiveDocUrl = resolved.url;\n effectivePage = resolved.page ?? effectivePage;\n }\n }\n } catch (err) {\n console.error('[teamsync-pdf-viewer] resolveLinkUrl error:', err);\n }\n }\n\n // Check targetViewer\n const target = instance?.getTargetViewer();\n if (target && effectiveDocUrl) {\n try {\n await target.loadOrNavigate(effectiveDocUrl, { page: effectivePage });\n return;\n } catch (err) {\n console.error('[teamsync-pdf-viewer] Failed to open document in targetViewer:', err);\n }\n }\n\n // Fallback: window.open\n let linkHref = effectiveDocUrl || linkUrl;\n if (effectivePage && !linkHref.includes('#page=')) {\n linkHref = `${linkHref}#page=${effectivePage}`;\n }\n // SEC-05: Normalize protocol-relative URLs (//attacker.com) before checking relative paths\n if (linkHref.startsWith('//')) {\n linkHref = 'https:' + linkHref;\n } else if (!/^https?:\\/\\//i.test(linkHref) && !linkHref.startsWith('/') && !linkHref.startsWith('./') && !linkHref.startsWith('#')) {\n linkHref = 'https://' + linkHref;\n }\n const win = window.open(linkHref, '_blank', 'noopener,noreferrer');\n if (win) win.opener = null;\n }, [bus, instance, onLinkClick, resolveLinkUrl, scrollToPage]);\n\n // Sync targetViewer with WebViewerInstance\n useEffect(() => {\n if (instance && targetViewer !== undefined) {\n instance.setTargetViewer(targetViewer);\n }\n }, [instance, targetViewer]);\n\n // Listen for programmatic link openings\n useEffect(() => {\n return bus.on('action-open-link', (data: any) => {\n if (data?.url) {\n handleLinkClick(data.url);\n }\n });\n }, [bus, handleLinkClick]);\n\n const handleEraserClick = (id: string, e: React.MouseEvent) => {\n e.stopPropagation();\n if (activeTool === 'eraser') {\n if (permissions?.canDeleteAnnotations === false) return;\n commitAnnotations(annotations.filter(a => a.id !== id));\n if (selectedAnnotationId === id) {\n setSelectedAnnotationId(null);\n setContextMenuPos(null);\n }\n } else if (activeTool === null || activeTool === 'pan' || activeTool === 'select') {\n const ann = annotations.find(a => a.id === id);\n if (ann && ann.linkUrl && activeTab === 'View') {\n handleLinkClick(ann.linkUrl, ann, e);\n return;\n } else if (ann && (ann.type === 'note' || ann.type === 'callout')) {\n if (permissions?.canEditAnnotations === false || !annotationManager.canEdit(ann)) {\n setSelectedAnnotationId(id);\n return;\n }\n // Open edit mode for note / callout\n setActiveTextEditor({ x: ann.x, y: ann.y, type: ann.type as any, annId: ann.id, points: ann.points, pageIndex: ann.pageIndex });\n setCurrentText(ann.text || '');\n if (ann.color) setCurrentColor(ann.color);\n } else if (ann && ann.type === 'text') {\n setSelectedAnnotationId(id);\n } else if (ann && ann.type === 'link') {\n if (permissions?.canEditAnnotations === false || !annotationManager.canEdit(ann)) {\n setSelectedAnnotationId(id);\n return;\n }\n setIsLinkModalOpen(true);\n }\n setSelectedAnnotationId(id);\n \n const container = containerRef.current;\n const containerRect = container?.getBoundingClientRect();\n if (containerRect && container) {\n setContextMenuPos({\n top: e.clientY - containerRect.top + container.scrollTop,\n left: e.clientX - containerRect.left + container.scrollLeft\n });\n }\n }\n };\n\n const handleScroll = (e: React.UIEvent<HTMLDivElement>) => {\n setScrollPos({\n top: e.currentTarget.scrollTop,\n left: e.currentTarget.scrollLeft\n });\n visibleRowRef.current = rowIndexAtOffset(e.currentTarget.scrollTop);\n };\n\n useEffect(() => {\n if (pdfDoc && containerRef.current && pageTransition === 'continuous') {\n const midPoint = scrollPos.top + containerRef.current.clientHeight / 2;\n const cRowIndex = Math.max(0, Math.min(rows.length - 1, rowIndexAtOffset(midPoint)));\n const currentPage = rows[cRowIndex] ? rows[cRowIndex][0] : 1;\n if (currentPage !== pageNum) {\n setPageNum(currentPage);\n }\n }\n }, [scrollPos.top, scale, pdfDoc, pageNum, rowIndexAtOffset, pageTransition, rows]);\n\n return (\n <div style={{ flex: 1, display: 'flex', minHeight: 0, backgroundColor: 'var(--bg-color)', overflow: 'hidden' }}>\n {sidebars && (\n <LeftSidebar\n isOpen={leftSidebarOpen}\n pdfDoc={pdfDoc}\n pageNum={pageNum}\n setPageNum={(p) => scrollToPage(p)}\n />\n )}\n <div style={{ flex: 1, display: 'flex', flexDirection: 'column', minWidth: 0, minHeight: 0, backgroundColor: 'var(--bg-color)', overflow: 'hidden' }}>\n {/* Compare Sub-toolbar */}\n {compareState.isActive && (\n <CompareToolbar\n compareState={compareState}\n is90Fit={isCompare90Fit}\n zoomMultiplier={compareZoomMultiplier}\n onZoomIn={handleCompareZoomIn}\n onZoomOut={handleCompareZoomOut}\n onFit90={handleCompareFit90}\n activeTool={activeTool}\n onSetTool={(tool) => setActiveTool(tool as any)}\n onSetMode={(mode) => setCompareState(prev => ({ ...prev, mode }))}\n onSetColors={(colorA, colorB) => setCompareState(prev => ({ ...prev, colorA, colorB }))}\n onToggleCurtain={() => setCompareState(prev => ({ ...prev, showCurtain: !prev.showCurtain }))}\n onPrevDiff={() => {\n if (compareState.diffItems.length === 0) return;\n const newIdx = (compareState.currentDiffIndex - 1 + compareState.diffItems.length) % compareState.diffItems.length;\n handleSelectDiff(newIdx);\n }}\n onNextDiff={() => {\n if (compareState.diffItems.length === 0) return;\n const newIdx = (compareState.currentDiffIndex + 1) % compareState.diffItems.length;\n handleSelectDiff(newIdx);\n }}\n onExit={() => {\n setCompareState(prev => ({ ...prev, isActive: false }));\n setPdfDocB(null);\n setTextDiffs([]);\n setIsCompare90Fit(true);\n setCompareZoomMultiplier(1.0);\n }}\n />\n )}\n {/* Sub-toolbar */}\n {activeTab === 'Annotate' && (\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px', padding: '8px 16px', backgroundColor: '#fff', borderBottom: '1px solid var(--border-color)', height: '40px' }}>\n <ToolButton icon={<Undo2 size={16} />} disabled={!annotationManager.canUndo} onClick={handleUndo} label=\"Undo\" />\n <ToolButton icon={<Redo2 size={16} />} disabled={!annotationManager.canRedo} onClick={handleRedo} label=\"Redo\" />\n <div style={{ width: '1px', height: '24px', backgroundColor: 'var(--border-color)', margin: '0 4px' }} />\n\n <ToolButton icon={<Highlighter size={16} />} active={activeTool === 'highlight'} onClick={() => { setActiveTool('highlight'); setCurrentColor('#fbc02d'); setCurrentOpacity(0.5); setCurrentStrokeWidth(16); }} label=\"Text Highlight\" />\n <ToolButton icon={<Underline size={16} />} active={activeTool === 'underline'} onClick={() => { setActiveTool('underline'); setCurrentColor('#d32f2f'); setCurrentOpacity(1); setCurrentStrokeWidth(2); }} label=\"Underline\" />\n <ToolButton icon={<Strikethrough size={16} />} active={activeTool === 'strikeout'} onClick={() => { setActiveTool('strikeout'); setCurrentColor('#d32f2f'); setCurrentOpacity(1); setCurrentStrokeWidth(2); }} label=\"Strikeout\" />\n <ToolButton icon={<SquigglyIcon size={16} />} active={activeTool === 'squiggly'} onClick={() => { setActiveTool('squiggly'); setCurrentColor('#388e3c'); setCurrentOpacity(1); setCurrentStrokeWidth(1.5); }} label=\"Squiggly\" />\n <ToolButton icon={<Brush size={16} />} active={activeTool === 'freehand'} onClick={() => { setActiveTool('freehand'); setCurrentColor('#000000'); setCurrentOpacity(1); setCurrentStrokeWidth(2); }} label=\"Marker\" />\n <ToolButton icon={<Type size={16} />} active={activeTool === 'text'} onClick={() => { setActiveTool('text'); setCurrentColor('#000000'); setCurrentOpacity(1); }} label=\"Text\" />\n {permissions?.canRedact !== false && (\n <ToolButton icon={<EyeOff size={16} />} active={activeTool === 'redaction'} onClick={() => { setActiveTool('redaction'); setCurrentColor('#000000'); setCurrentOpacity(1); }} label=\"Redact\" />\n )}\n \n <div style={{ width: '1px', height: '24px', backgroundColor: 'var(--border-color)', margin: '0 8px' }} />\n \n\n <div style={{ display: 'flex', gap: '4px', borderRight: '1px solid var(--border-color)', paddingRight: '8px' }}>\n <ToolButton icon={<MessageSquareQuote size={16} />} active={activeTool === 'callout'} onClick={() => { setActiveTool('callout'); setCurrentOpacity(1); setCurrentStrokeWidth(2); }} label=\"Callout\" />\n </div>\n <div style={{ display: 'flex', gap: '4px' }}>\n <ToolButton icon={<Pen size={16} />} active={activeTool === 'freehand' && currentOpacity === 1} onClick={() => { setActiveTool('freehand'); setCurrentOpacity(1); setCurrentStrokeWidth(2); }} label=\"Freehand\" />\n {permissions?.canDeleteAnnotations !== false && (\n <ToolButton icon={<Eraser size={16} />} active={activeTool === 'eraser'} onClick={() => setActiveTool('eraser')} label=\"Eraser\" />\n )}\n </div>\n\n <div style={{ width: '1px', height: '24px', backgroundColor: 'var(--border-color)', margin: '0 8px' }} />\n\n <div style={{ display: 'flex', gap: '4px' }}>\n <ToolButton icon={<Minus size={16} />} active={activeTool === 'line'} onClick={() => setActiveTool('line')} label=\"Line\" />\n <ToolButton icon={<ArrowUpRight size={16} />} active={activeTool === 'arrow'} onClick={() => setActiveTool('arrow')} label=\"Arrow\" />\n <ToolButton icon={<Square size={16} />} active={activeTool === 'rectangle'} onClick={() => setActiveTool('rectangle')} label=\"Rectangle\" />\n <ToolButton icon={<CircleIcon size={16} />} active={activeTool === 'ellipse'} onClick={() => setActiveTool('ellipse')} label=\"Ellipse\" />\n <ToolButton icon={<LinkIcon size={16} />} active={activeTool === 'link'} onClick={() => setActiveTool('link')} label=\"Link\" />\n </div>\n \n <div style={{ flex: 1 }} />\n \n <div style={{ display: 'flex', alignItems: 'center', gap: '12px' }}>\n {['line', 'arrow', 'rectangle', 'ellipse', 'freehand', 'highlight', 'underline', 'strikeout', 'squiggly'].includes(activeTool || '') && (\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px', borderRight: '1px solid var(--border-color)', paddingRight: '12px' }}>\n <span style={{ fontSize: '12px', color: '#666', minWidth: '85px' }}>Thickness: <strong>{currentStrokeWidth}px</strong></span>\n <input \n type=\"range\" \n min=\"1\" \n max=\"24\" \n value={Math.min(24, Math.max(1, currentStrokeWidth))} \n onMouseDown={(e) => e.stopPropagation()}\n onChange={(e) => {\n const val = parseInt(e.target.value, 10);\n setCurrentStrokeWidth(val);\n if (selectedAnnotationId && !activeTextEditor) {\n commitAnnotations(annotations.map(a => a.id === selectedAnnotationId ? { ...a, strokeWidth: val } : a));\n }\n }}\n style={{ width: '90px', cursor: 'pointer' }}\n />\n </div>\n )}\n <div style={{ display: 'flex', gap: '4px' }}>\n {['#d32f2f', '#f57c00', '#fbc02d', '#388e3c', '#1976d2', '#7b1fa2', '#000000'].map(color => (\n <button\n key={color}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => {\n setCurrentColor(color);\n // If an annotation is selected but not actively being edited, update its color instantly\n if (selectedAnnotationId && !activeTextEditor) {\n commitAnnotations(annotations.map(a => a.id === selectedAnnotationId ? { ...a, color } : a));\n }\n }}\n style={{\n width: '18px', height: '18px', borderRadius: '50%', backgroundColor: color,\n border: currentColor === color ? '2px solid #000' : '1px solid transparent',\n cursor: 'pointer', outline: 'none', padding: 0\n }}\n />\n ))}\n </div>\n {pendingRedactionsCount > 0 && (\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px', marginLeft: '8px' }}>\n <button\n onClick={() => setIsCommitModalOpen(true)}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n backgroundColor: '#dc2626',\n color: '#ffffff',\n border: 'none',\n borderRadius: '6px',\n padding: '5px 12px',\n fontSize: '12px',\n fontWeight: 600,\n cursor: 'pointer',\n boxShadow: '0 2px 6px rgba(220, 38, 38, 0.3)'\n }}\n title=\"Apply all marked redactions permanently\"\n >\n <ShieldCheck size={16} />\n Apply Redactions ({pendingRedactionsCount})\n </button>\n\n <button\n onClick={handleDiscardAllRedactions}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n backgroundColor: '#ffffff',\n color: '#dc2626',\n border: '1px solid #fca5a5',\n borderRadius: '6px',\n padding: '5px 12px',\n fontSize: '12px',\n fontWeight: 600,\n cursor: 'pointer'\n }}\n title=\"Discard all pending unapplied redactions\"\n >\n <Trash2 size={14} color=\"#dc2626\" />\n Discard Redactions\n </button>\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* Forms Builder Sub-toolbar */}\n {activeTab === 'Forms' && formManager && (\n <FormsToolbar\n activeTool={activeFormTool}\n setActiveTool={setActiveFormTool}\n formManager={formManager}\n onSwitchToView={() => setActiveTab?.('View')}\n showFlowOrder={showFlowOrder}\n setShowFlowOrder={setShowFlowOrder}\n selectedRoleFilter={selectedRoleFilter}\n setSelectedRoleFilter={setSelectedRoleFilter}\n />\n )}\n\n {/* Forms View Filler Actions */}\n {activeTab === 'View' && formManager && (\n <FormFillerActions\n formManager={formManager}\n onDownloadFilledPdf={onDownloadFilledPdf}\n />\n )}\n\n {/* Commit Redactions Confirmation Modal */}\n {isCommitModalOpen && (\n <div style={{\n position: 'fixed',\n top: 0, left: 0, right: 0, bottom: 0,\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 9999\n }}>\n <div style={{\n backgroundColor: '#ffffff',\n borderRadius: '12px',\n padding: '24px',\n width: '460px',\n maxWidth: '90vw',\n boxShadow: '0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)'\n }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '12px', marginBottom: '16px' }}>\n <div style={{ width: '40px', height: '40px', borderRadius: '50%', backgroundColor: '#fee2e2', display: 'flex', alignItems: 'center', justifyContent: 'center', color: '#dc2626' }}>\n <ShieldCheck size={24} />\n </div>\n <div>\n <h3 style={{ margin: 0, fontSize: '16px', fontWeight: 600, color: '#111827' }}>Apply Redactions?</h3>\n <p style={{ margin: 0, fontSize: '13px', color: '#6b7280' }}>Permanent content removal</p>\n </div>\n </div>\n <p style={{ fontSize: '14px', color: '#374151', lineHeight: '1.5', marginBottom: '20px' }}>\n You are about to permanently apply <strong>{pendingRedactionsCount} redaction(s)</strong>. Marked areas will be blacked out and underlying text will be permanently removed. This action cannot be undone.\n </p>\n <div style={{ display: 'flex', justifyContent: 'flex-end', gap: '8px' }}>\n <button\n onClick={() => setIsCommitModalOpen(false)}\n style={{\n padding: '8px 14px',\n borderRadius: '6px',\n border: '1px solid #d1d5db',\n backgroundColor: '#ffffff',\n color: '#374151',\n fontSize: '13px',\n fontWeight: 500,\n cursor: 'pointer'\n }}\n >\n Cancel\n </button>\n <button\n onClick={() => {\n handleDiscardAllRedactions();\n setIsCommitModalOpen(false);\n }}\n style={{\n padding: '8px 14px',\n borderRadius: '6px',\n border: '1px solid #fca5a5',\n backgroundColor: '#fef2f2',\n color: '#dc2626',\n fontSize: '13px',\n fontWeight: 600,\n cursor: 'pointer'\n }}\n >\n Discard Redactions\n </button>\n <button\n onClick={() => {\n const nextManual: Redaction[] = manualRedactions.map(r => ({ ...r, status: 'applied' }));\n const nextAuto: Redaction[] = autoRedactions.map(r => ({ ...r, status: 'applied' }));\n const nextProp: Redaction[] = (redactions || []).map(r => ({ ...r, status: 'applied' }));\n const appliedList: Redaction[] = [...nextProp, ...nextAuto, ...nextManual].filter(r => r.status === 'applied');\n setManualRedactions(nextManual);\n setAutoRedactions(nextAuto);\n setIsCommitModalOpen(false);\n callbacksRef.current.onRedactionsApplied?.(appliedList);\n }}\n style={{\n padding: '8px 14px',\n borderRadius: '6px',\n border: 'none',\n backgroundColor: '#dc2626',\n color: '#ffffff',\n fontSize: '13px',\n fontWeight: 600,\n cursor: 'pointer'\n }}\n >\n Apply Redactions\n </button>\n </div>\n </div>\n </div>\n )}\n\n\n\n {/* Main Canvas / Compare Viewport Area */}\n <div style={{ flex: 1, display: 'flex', flexDirection: 'row', minWidth: 0, minHeight: 0, width: '100%', height: '100%', overflow: 'hidden', position: 'relative' }}>\n {compareState.isActive && compareState.mode === 'side-by-side' ? (\n <SideBySideViewer\n pdfDocA={pdfDoc}\n pdfDocB={pdfDocB}\n pageNum={pageNum}\n scale={scale}\n rotation={rotation}\n basePageDims={dimsFor(pageNum)}\n activeTab={activeTab}\n activeTool={activeTool}\n annotations={annotations}\n permissions={permissions}\n watermark={watermark}\n watermarkText={watermarkText}\n redactions={combinedRedactions}\n diffsA={compareState.pageDiffsA?.[pageNum] || []}\n diffsB={compareState.pageDiffsB?.[pageNum] || []}\n selectedDiffId={compareState.diffItems[compareState.currentDiffIndex]?.id}\n onSelectDiff={(id) => {\n const idx = compareState.diffItems.findIndex(d => d.id === id);\n if (idx !== -1) handleSelectDiff(idx);\n }}\n is90Fit={isCompare90Fit}\n zoomMultiplier={compareZoomMultiplier}\n onZoomIn={handleCompareZoomIn}\n onZoomOut={handleCompareZoomOut}\n />\n ) : (\n <>\n {activeTool === 'highlight' && (\n <style>{`\n .pdf-viewer-area, .pdf-viewer-area * {\n cursor: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PHBhdGggZD0iTTkgMTFsLTYgNnYzaDlsMy0zIi8+PHBhdGggZD0iTTIyIDEybC00LjYgNC42YTIgMiAwIDAgMS0yLjggMGwtNS4yLTUuMmEyIDIgMCAwIDEgMC0yLjhMMTQgNCIvPjwvc3ZnPg==') 0 24, auto !important;\n }\n `}</style>\n )}\n <div \n className=\"pdf-viewer-area\"\n style={{ \n flex: 1, \n display: 'flex',\n flexDirection: 'column',\n minWidth: 0,\n minHeight: 0,\n overflow: 'hidden', \n position: 'relative', \n backgroundColor: 'var(--bg-color)', \n cursor: isPanning ? 'grabbing' : (activeTool === 'pan' ? 'grab' : (activeTool === 'eraser' ? 'cell' : (activeTool === 'select' || activeTool === null ? 'default' : 'crosshair'))) \n }}\n onMouseMove={(e) => {\n if (isPanning && panStartRef.current && containerRef.current) {\n const dx = e.clientX - panStartRef.current.x;\n const dy = e.clientY - panStartRef.current.y;\n containerRef.current.scrollLeft = panStartRef.current.scrollLeft - dx;\n containerRef.current.scrollTop = panStartRef.current.scrollTop - dy;\n }\n }}\n onMouseLeave={() => {\n if (isPanning) {\n setIsPanning(false);\n panStartRef.current = null;\n }\n }}\n >\n <div \n ref={containerRef}\n onScroll={handleScroll}\n onMouseDown={(e) => {\n if (activeTool === 'pan') {\n if (e.button === 0) {\n setIsPanning(true);\n panStartRef.current = {\n x: e.clientX,\n y: e.clientY,\n scrollLeft: e.currentTarget.scrollLeft,\n scrollTop: e.currentTarget.scrollTop\n };\n }\n }\n }}\n onMouseUp={(_e) => {\n if (isPanning) {\n setIsPanning(false);\n panStartRef.current = null;\n }\n }}\n onContextMenu={(e) => {\n const hasTextSelection = Boolean(typeof window !== 'undefined' && window.getSelection()?.toString().trim());\n if (hasTextSelection) {\n // Allow native browser context menu on selected text (Copy, Search, etc.)\n return;\n }\n // Prevent default browser context menu on canvas\n e.preventDefault();\n e.stopPropagation();\n }}\n style={{ \n width: '100%', \n height: '100%', \n overflow: 'auto',\n position: 'relative'\n }}\n >\n {(() => {\n const renderRow = (row: number[], rIndex: number, isContinuous: boolean) => {\n const rTop = isContinuous ? (rowLayout.tops[rIndex] ?? 0) : 0;\n \n // Virtualization filtering (only for continuous)\n if (isContinuous && containerRef.current) {\n // Scale-aware virtualization buffer: at high zoom levels each page is enormous,\n // so a smaller row buffer prevents mounting excessive gigantic canvas elements in DOM.\n const bufferBefore = scale >= 4 ? 1 : scale >= 2 ? 2 : 4;\n const bufferAfter = scale >= 4 ? 1 : scale >= 2 ? 2 : 5;\n if (rIndex < visibleRowRef.current - bufferBefore || rIndex > visibleRowRef.current + bufferAfter) {\n return null;\n }\n }\n\n // Synthesize live drawing annotation if applicable\n const liveAnn = (isDrawing && activeDrawingPageNum && activeTool && activeTool !== 'eraser') ? (() => {\n if (activeTool === 'freehand') {\n return {\n id: 'temp-live-drawing', type: 'freehand' as const, pageIndex: activeDrawingPageNum,\n x: 0, y: 0, width: 0, height: 0, points: freehandPoints,\n color: currentColor, strokeWidth: currentStrokeWidth, opacity: currentOpacity\n };\n } else if (['highlight', 'underline', 'strikeout', 'squiggly'].includes(activeTool)) {\n let width = Math.abs(currentPos.x - startPos.x);\n let height = Math.abs(currentPos.y - startPos.y);\n let x = Math.min(startPos.x, currentPos.x);\n let y = Math.min(startPos.y, currentPos.y);\n if (height < 18) {\n height = Math.max(18, height);\n y = startPos.y - 9;\n }\n return {\n id: 'temp-live-drawing', type: activeTool as any, pageIndex: activeDrawingPageNum,\n x, y, width, height,\n color: currentColor, strokeWidth: currentStrokeWidth, opacity: activeTool === 'highlight' ? currentOpacity : 1\n };\n } else if (activeTool === 'redaction') {\n let width = Math.abs(currentPos.x - startPos.x);\n let height = Math.abs(currentPos.y - startPos.y);\n let x = Math.min(startPos.x, currentPos.x);\n let y = Math.min(startPos.y, currentPos.y);\n if (height < 18) {\n height = Math.max(18, height);\n y = startPos.y - 9;\n }\n return {\n id: 'temp-live-drawing', type: 'rectangle' as const, pageIndex: activeDrawingPageNum,\n x, y, width, height,\n color: '#000000', strokeWidth: 1, opacity: 0.7\n };\n } else if (['line', 'arrow', 'callout', 'rectangle', 'ellipse', 'link'].includes(activeTool as string)) {\n const width = Math.abs(currentPos.x - startPos.x);\n const height = Math.abs(currentPos.y - startPos.y);\n const x = Math.min(startPos.x, currentPos.x);\n const y = Math.min(startPos.y, currentPos.y);\n const points = (activeTool === 'line' || activeTool === 'arrow' || activeTool === 'callout') ? [startPos, currentPos] : undefined;\n return {\n id: 'temp-live-drawing', type: activeTool as any, pageIndex: activeDrawingPageNum,\n x, y, width, height, points,\n color: currentColor, strokeWidth: currentStrokeWidth, opacity: currentOpacity\n };\n }\n })() : null;\n\n return row.map((p, pIdx) => {\n let pLeft: number | undefined = undefined;\n const cW = containerDimensions.width || containerRef.current?.clientWidth || 0;\n const cH = containerDimensions.height || containerRef.current?.clientHeight || 0;\n const pageDim = dimsFor(p);\n const firstWidth = dimsFor(row[0]).width * scale;\n const thisWidth = pageDim.width * scale;\n if (row.length === 2) {\n if (pIdx === 0) pLeft = Math.max(0, cW / 2 - firstWidth);\n if (pIdx === 1) pLeft = Math.max(firstWidth, cW / 2);\n } else {\n pLeft = Math.max(0, cW / 2 - thisWidth / 2);\n }\n \n const displayAnns = annotations.map(a => (liveResizingAnn && a.id === liveResizingAnn.id ? liveResizingAnn : (liveMovingAnn && a.id === liveMovingAnn.id ? liveMovingAnn : a)));\n const pageAnnotations = (liveAnn && liveAnn.pageIndex === p) ? [...displayAnns, liveAnn] : displayAnns;\n\n return (\n <React.Fragment key={p}>\n <PageRenderer \n pageNum={p}\n pdfDoc={pdfDoc!}\n scale={scale}\n rotation={rotation}\n containerWidth={cW}\n containerHeight={cH}\n scrollTop={scrollPos.top}\n scrollLeft={scrollPos.left}\n pageTop={rTop}\n pageLeft={pLeft}\n basePageWidth={pageDim.width}\n basePageHeight={pageDim.height}\n activeTab={activeTab}\n activeTool={activeTool}\n annotations={pageAnnotations}\n transientHighlights={transientHighlights?.filter(h => h.pageIndex === p) || []}\n selectedAnnotationId={selectedAnnotationId}\n activeSearchResult={activeSearchResult}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n onAnnotationClick={handleEraserClick}\n onAnnotationDoubleClick={handleAnnotationDoubleClick}\n onStartResize={handleStartResize}\n onStartMove={handleStartMove}\n onAnnotationMouseEnter={handleEraserMove}\n onClearSelection={() => {\n if (justCreatedLinkRef.current || isLinkModalOpen) {\n justCreatedLinkRef.current = false;\n return;\n }\n setSelectedAnnotationId(null);\n setContextMenuPos(null);\n }}\n watermark={watermark}\n watermarkText={watermarkText}\n redactions={combinedRedactions}\n onDiscardRedaction={handleDiscardRedaction}\n onRendered={handlePageRendered}\n hideAnnotationsUntilPageRendered={hideAnnotationsUntilPageRendered}\n onLinkClick={handleLinkClick}\n formManager={formManager}\n activeFormTool={activeFormTool}\n setActiveFormTool={setActiveFormTool}\n canFillForms={permissions?.canFillForms !== false}\n showFlowOrder={showFlowOrder}\n selectedRoleFilter={selectedRoleFilter}\n />\n {compareState.isActive && compareState.mode === 'overlay' && pdfDocB && (\n <div style={{\n position: 'absolute',\n top: `${rTop}px`,\n left: pLeft !== undefined ? `${pLeft}px` : '0px',\n width: `${pageDim.width * scale}px`,\n height: `${pageDim.height * scale}px`,\n pointerEvents: 'none',\n mixBlendMode: compareState.blendMode as any,\n opacity: compareState.opacityB,\n zIndex: 12,\n filter: 'contrast(1.2) brightness(0.95)'\n }}>\n <PageRenderer \n pageNum={p}\n pdfDoc={pdfDocB}\n scale={scale}\n rotation={rotation}\n containerWidth={cW}\n containerHeight={cH}\n scrollTop={scrollPos.top}\n scrollLeft={scrollPos.left}\n pageTop={0}\n pageLeft={0}\n basePageWidth={pageDim.width}\n basePageHeight={pageDim.height}\n activeTab={activeTab}\n activeTool={null}\n annotations={[]}\n selectedAnnotationId={null}\n activeSearchResult={null}\n onMouseDown={() => {}}\n onMouseMove={() => {}}\n onMouseUp={() => {}}\n onAnnotationClick={() => {}}\n onAnnotationMouseEnter={() => {}}\n onClearSelection={() => {}}\n />\n </div>\n )}\n {compareState.isActive && (\n <div style={{\n position: 'absolute',\n top: `${rTop}px`,\n left: pLeft !== undefined ? `${pLeft}px` : '0px',\n width: `${pageDim.width * scale}px`,\n height: `${pageDim.height * scale}px`,\n pointerEvents: 'none',\n zIndex: 16\n }}>\n <DiffHighlightOverlay\n boxes={[\n ...(compareState.pageDiffsA?.[p] || []),\n ...(compareState.pageDiffsB?.[p] || [])\n ]}\n scale={scale}\n selectedDiffId={compareState.diffItems[compareState.currentDiffIndex]?.id}\n onSelectDiff={(id) => {\n const idx = compareState.diffItems.findIndex(d => d.id === id);\n if (idx !== -1) handleSelectDiff(idx);\n }}\n />\n </div>\n )}\n {activeTextEditor && activeTextEditor.pageIndex === p && (() => {\n const unW = rotation % 180 === 0 ? pageDim.width : pageDim.height;\n const unH = rotation % 180 === 0 ? pageDim.height : pageDim.width;\n const rotEditorPos = convertToRotated(activeTextEditor.x, activeTextEditor.y, rotation, unW, unH);\n return (\n <div style={{\n position: 'absolute',\n left: `${(pLeft || 0) + rotEditorPos.x * scale}px`,\n top: `${rTop + rotEditorPos.y * scale}px`,\n zIndex: 50,\n backgroundColor: '#fff',\n boxShadow: '0 2px 8px rgba(0,0,0,0.2)',\n borderRadius: '4px',\n display: 'flex',\n flexDirection: 'column'\n }}>\n <textarea\n ref={textareaRef}\n value={currentText}\n onChange={e => setCurrentText(e.target.value)}\n onBlur={(e) => {\n // Only commit on blur if we are not clicking inside the editor container\n if (!e.currentTarget.parentElement?.contains(e.relatedTarget as Node)) {\n commitTextAnnotation();\n }\n }}\n onKeyDown={e => { if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); commitTextAnnotation(); } }}\n style={{\n backgroundColor: 'transparent',\n border: 'none',\n color: currentColor,\n fontSize: '16px',\n fontFamily: 'sans-serif',\n minWidth: '150px',\n minHeight: '40px',\n outline: 'none',\n resize: 'both',\n padding: '8px'\n }}\n placeholder={activeTextEditor.type === 'note' ? \"Note text...\" : \"Type text...\"}\n autoFocus\n />\n <div style={{ display: 'flex', justifyContent: 'flex-end', padding: '4px 8px', borderTop: '1px solid #eee' }}>\n <button \n onMouseDown={(e) => { e.preventDefault(); commitTextAnnotation(); }}\n style={{ padding: '4px 12px', background: 'var(--primary)', color: '#fff', border: 'none', borderRadius: '4px', cursor: 'pointer', fontSize: '12px' }}\n >\n Save\n </button>\n </div>\n </div>\n );\n })()}\n </React.Fragment>\n );\n });\n };\n\n if (pageTransition === 'continuous') {\n return (\n <div style={{ \n position: 'relative', width: '100%', height: `${rowLayout.total}px`\n }}>\n {rows.map((row, rIndex) => renderRow(row, rIndex, true))}\n </div>\n );\n } else {\n const currentRowIndex = Math.max(0, rows.findIndex(row => row.includes(pageNum)));\n const currentRow = rows[currentRowIndex] || [];\n return (\n <div style={{ \n position: 'relative', width: '100%', minHeight: `${rowLayout.heights[currentRowIndex] ?? 0}px`\n }}>\n {renderRow(currentRow, currentRowIndex, false)}\n </div>\n );\n }\n })()}\n </div>\n \n {/* Pagination Controls for Page-By-Page */}\n {pageTransition === 'page-by-page' && pdfDoc && (\n <div style={{\n position: 'absolute',\n bottom: '16px',\n left: '50%',\n transform: 'translateX(-50%)',\n display: 'flex',\n alignItems: 'center',\n gap: '16px',\n backgroundColor: 'rgba(30, 30, 30, 0.8)',\n padding: '8px 16px',\n borderRadius: '24px',\n color: '#fff',\n zIndex: 100,\n boxShadow: '0 4px 12px rgba(0,0,0,0.15)'\n }}>\n <button \n onClick={() => setPageNum(Math.max(1, pageNum - 1))}\n disabled={pageNum <= 1}\n style={{ background: 'none', border: 'none', color: pageNum <= 1 ? '#888' : '#fff', cursor: pageNum <= 1 ? 'default' : 'pointer', display: 'flex', alignItems: 'center' }}\n >\n <ChevronLeft size={20} />\n </button>\n <span style={{ fontSize: '13px', fontWeight: 500 }}>\n Page {pageNum} of {pdfDoc.numPages}\n </span>\n <button \n onClick={() => setPageNum(Math.min(pdfDoc.numPages, pageNum + 1))}\n disabled={pageNum >= pdfDoc.numPages}\n style={{ background: 'none', border: 'none', color: pageNum >= pdfDoc.numPages ? '#888' : '#fff', cursor: pageNum >= pdfDoc.numPages ? 'default' : 'pointer', display: 'flex', alignItems: 'center' }}\n >\n <ChevronRight size={20} />\n </button>\n </div>\n )}\n \n {/* Modals and Overlays */} \n {!pdfDoc && (\n <div style={{\n position: 'absolute',\n top: 0, left: 0, right: 0, bottom: 0,\n display: 'flex',\n flexDirection: 'column',\n gap: '8px',\n alignItems: 'center',\n justifyContent: 'center',\n color: 'var(--text-muted)',\n padding: '24px',\n textAlign: 'center'\n }}>\n {loadError ? (\n <>\n <div style={{ fontWeight: 600, color: 'var(--text-color)' }}>\n {loadError.name === 'PasswordException' ? 'This document is password protected.' : 'The document could not be loaded.'}\n </div>\n <div style={{ fontSize: '12px', maxWidth: '480px', wordBreak: 'break-word' }}>{loadError.message}</div>\n </>\n ) : initialDoc ? 'Loading document…' : 'No document loaded.'}\n </div>\n )}\n\n {/* Pagination Floating Overlay (positioned within the viewer, not the window) */}\n {pdfDoc && (\n <div style={{\n position: 'absolute',\n bottom: '24px',\n left: '50%',\n transform: 'translateX(-50%)',\n backgroundColor: 'rgba(0, 0, 0, 0.75)',\n color: 'white',\n padding: '8px 16px',\n borderRadius: '24px',\n display: 'flex',\n alignItems: 'center',\n gap: '16px',\n zIndex: 100,\n boxShadow: '0 4px 12px rgba(0,0,0,0.2)',\n backdropFilter: 'blur(4px)'\n }}>\n <button \n onClick={() => scrollToPage(Math.max(1, pageNum - 1))}\n disabled={pageNum <= 1}\n style={{ background: 'none', border: 'none', color: pageNum <= 1 ? 'rgba(255,255,255,0.3)' : 'white', cursor: pageNum <= 1 ? 'default' : 'pointer', display: 'flex', padding: 0 }}\n >\n <ChevronLeft size={20} />\n </button>\n <span style={{ fontSize: '13px', fontWeight: 500, minWidth: '80px', textAlign: 'center' }}>\n Page {pageNum} / {pdfDoc.numPages}\n </span>\n <button \n onClick={() => scrollToPage(Math.min(pdfDoc.numPages, pageNum + 1))}\n disabled={pageNum >= pdfDoc.numPages}\n style={{ background: 'none', border: 'none', color: pageNum >= pdfDoc.numPages ? 'rgba(255,255,255,0.3)' : 'white', cursor: pageNum >= pdfDoc.numPages ? 'default' : 'pointer', display: 'flex', padding: 0 }}\n >\n <ChevronRight size={20} />\n </button>\n </div>\n )}\n \n {/* Annotation Context Menu */}\n {selectedAnnotationId && contextMenuPos && (\n <AnnotationContextMenu\n annotation={annotations.find(a => a.id === selectedAnnotationId)!}\n position={contextMenuPos}\n onCopy={() => {\n const annToCopy = annotations.find(a => a.id === selectedAnnotationId);\n if (annToCopy) {\n const newAnn = { ...annToCopy, id: newAnnotationId(), author: undefined, authorId: undefined, createdAt: undefined, modifiedAt: undefined, readOnly: undefined, xfdfExtras: undefined, x: annToCopy.x + 20, y: annToCopy.y + 20 };\n commitAnnotations([...annotations, newAnn]);\n }\n setSelectedAnnotationId(null);\n setContextMenuPos(null);\n }}\n onDelete={() => {\n commitAnnotations(annotations.filter(a => a.id !== selectedAnnotationId));\n setSelectedAnnotationId(null);\n setContextMenuPos(null);\n }}\n onUpdateColor={(color: string) => {\n commitAnnotations(annotations.map(a => a.id === selectedAnnotationId ? { ...a, color } : a));\n }}\n onOpenLinkModal={() => {\n setIsLinkModalOpen(true);\n setContextMenuPos(null);\n }}\n permissions={permissions}\n />\n )}\n {compareState.isActive && compareState.showCurtain && (\n <CompareCurtainSlider\n positionPercent={compareState.curtainPosition}\n onChangePosition={(pos) => setCompareState(prev => ({ ...prev, curtainPosition: pos }))}\n containerRef={containerRef}\n />\n )}\n {enableTextSelection !== false && showSelectionTooltip !== false && (\n <TextSelectionTooltip\n containerRef={containerRef}\n onCopy={(text) => bus.emit('action-text-copied', { text })}\n onAnnotateSelection={handleAnnotateSelection}\n />\n )}\n\n {/* Signature Sticky / Index Flags attached to the side of the viewer */}\n {formManager && (\n <SignatureIndexFlags\n formManager={formManager}\n activeTab={activeTab}\n onJumpToPage={(p) => scrollToPage(p, { smooth: true })}\n />\n )}\n </div>\n </>\n )}\n\n {compareState.isActive && (\n <DiffSummarySidebar\n isOpen={isDiffSidebarOpen}\n onClose={() => setIsDiffSidebarOpen(false)}\n diffItems={compareState.diffItems}\n textDiffs={textDiffs}\n currentDiffIndex={compareState.currentDiffIndex}\n onSelectDiff={(idx, item) => handleSelectDiff(idx, item)}\n onJumpToPage={(p) => scrollToPage(p)}\n />\n )}\n </div>\n </div>\n \n {isLinkModalOpen && selectedAnnotationId && (\n <InsertLinkModal\n initialUrl={annotations.find(a => a.id === selectedAnnotationId)?.linkUrl || ''}\n initialText={annotations.find(a => a.id === selectedAnnotationId)?.text || ''}\n showTextInput={!annotations.find(a => a.id === selectedAnnotationId)?.width || annotations.find(a => a.id === selectedAnnotationId)?.text === '' || annotations.find(a => a.id === selectedAnnotationId)?.text !== undefined}\n onClose={() => {\n const ann = annotations.find(a => a.id === selectedAnnotationId);\n if (ann && !ann.linkUrl) {\n commitAnnotations(annotations.filter(a => a.id !== selectedAnnotationId));\n }\n setIsLinkModalOpen(false);\n setSelectedAnnotationId(null);\n }}\n onSave={(url, text) => {\n commitAnnotations(annotations.map(a => {\n if (a.id === selectedAnnotationId) {\n const newText = text !== undefined ? text : a.text;\n const newWidth = newText ? Math.max(100, newText.length * 8 + 20) : a.width;\n return { ...a, linkUrl: url, text: newText, width: newWidth };\n }\n return a;\n }));\n setIsLinkModalOpen(false);\n setSelectedAnnotationId(null);\n }}\n />\n )}\n {sidebars && (\n <Sidebar\n isOpen={rightSidebarOpen}\n activeTab={sidebarTab}\n setActiveTab={setSidebarTab}\n annotations={annotations}\n setAnnotations={commitAnnotations}\n selectedAnnotationId={selectedAnnotationId}\n setSelectedAnnotationId={setSelectedAnnotationId}\n onSearch={search}\n searchResults={searchResults}\n isSearching={isSearching}\n searchProgress={searchProgress}\n onResultClick={handleSearchResultClick}\n onLinkClick={handleLinkClick}\n />\n )}\n </div>\n );\n}\n\nfunction ToolButton({ icon, active, onClick, label, disabled }: { icon: React.ReactNode, active?: boolean, onClick: () => void, label: string, disabled?: boolean }) {\n return (\n <button\n onClick={disabled ? undefined : onClick}\n title={label}\n disabled={disabled}\n style={{\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n width: '28px', height: '28px', border: 'none', borderRadius: '4px',\n backgroundColor: active ? '#e6f0fa' : 'transparent',\n color: active ? 'var(--primary)' : 'var(--text-color)',\n cursor: disabled ? 'not-allowed' : 'pointer',\n opacity: disabled ? 0.38 : 1,\n pointerEvents: disabled ? 'none' : 'auto'\n }}\n onMouseEnter={e => { if (!active && !disabled) e.currentTarget.style.backgroundColor = '#f3f4f6'; }}\n onMouseLeave={e => { if (!active && !disabled) e.currentTarget.style.backgroundColor = 'transparent'; }}\n >\n {icon}\n </button>\n );\n}\n\nfunction SquigglyIcon({ size = 16 }: { size?: number }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M4 8v5a4 4 0 0 0 8 0V8\" />\n <path d=\"M4 19c1.5-1.5 2.5-1.5 4 0s2.5 1.5 4 0 2.5-1.5 4 0 2.5 1.5 4 0\" />\n </svg>\n );\n}\n\n\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\nimport React, { useState, useMemo } from 'react';\nimport { X, Edit2, Search, RotateCcw, Check } from 'lucide-react';\nimport { useShortcuts, parseCommandString } from '../hooks/useShortcuts';\nimport type { ActionType, Shortcut } from '../hooks/useShortcuts';\n\ninterface SettingsModalProps {\n onClose: () => void;\n watermarkText: string;\n setWatermarkText: (text: string) => void;\n}\n\nexport default function SettingsModal({ onClose, watermarkText, setWatermarkText }: SettingsModalProps) {\n const { shortcuts, updateShortcut, resetShortcuts } = useShortcuts();\n const [activeTab, setActiveTab] = useState<'General' | 'Keyboard Shortcuts'>('Keyboard Shortcuts');\n const [editingAction, setEditingAction] = useState<ActionType | null>(null);\n const [searchQuery, setSearchQuery] = useState('');\n\n const handleKeyDown = (e: React.KeyboardEvent, action: ActionType) => {\n e.preventDefault();\n e.stopPropagation();\n\n // Escape cancels editing\n if (e.key === 'Escape') {\n setEditingAction(null);\n return;\n }\n\n // Ignore standalone modifier keys\n if (['Meta', 'Control', 'Shift', 'Alt'].includes(e.key)) return;\n\n const parts: string[] = [];\n if (e.metaKey || e.ctrlKey) parts.push('Meta');\n if (e.shiftKey) parts.push('Shift');\n if (e.altKey) parts.push('Alt');\n\n let key = e.key;\n if (key === ' ') key = 'Space';\n if (key === 'Backspace' || key === 'Delete') {\n key = 'Delete';\n } else if (e.shiftKey && (key === '+' || e.code === 'Equal')) {\n key = '=';\n } else if (e.shiftKey && (key === '_' || e.code === 'Minus')) {\n key = '-';\n } else if (key.length === 1) {\n key = key.toUpperCase();\n }\n\n parts.push(key);\n const internalCommand = parts.join('+');\n\n updateShortcut(action, internalCommand);\n setEditingAction(null);\n };\n\n const renderCommandBadges = (cmd: string) => {\n if (!cmd) return <span style={{ color: '#9ca3af', fontStyle: 'italic', fontSize: '13px' }}>None</span>;\n const parsed = parseCommandString(cmd);\n const isMac = typeof navigator !== 'undefined' && /mac/i.test(navigator.platform || navigator.userAgent || '');\n const tokens: string[] = [];\n\n if (parsed.meta) tokens.push(isMac ? '⌘' : 'Ctrl');\n if (parsed.alt) tokens.push(isMac ? '⌥' : 'Alt');\n if (parsed.shift) tokens.push(isMac ? '⇧' : 'Shift');\n if (parsed.key) {\n let k = parsed.key.toUpperCase();\n if (k === 'DELETE') k = isMac ? '⌫ Delete' : 'Del';\n tokens.push(k);\n }\n\n return (\n <div style={{ display: 'flex', gap: '4px', alignItems: 'center', flexWrap: 'wrap' }}>\n {tokens.map((t, idx) => (\n <kbd\n key={idx}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '3px 7px',\n fontSize: '11.5px',\n fontFamily: 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace',\n fontWeight: 600,\n color: '#1f2937',\n backgroundColor: '#f3f4f6',\n border: '1px solid #d1d5db',\n borderRadius: '4px',\n boxShadow: '0 1px 1px rgba(0,0,0,0.06)',\n minWidth: '20px',\n textAlign: 'center',\n }}\n >\n {t}\n </kbd>\n ))}\n </div>\n );\n };\n\n const query = searchQuery.trim().toLowerCase();\n\n const filteredShortcuts = useMemo(() => {\n if (!query) return shortcuts;\n return shortcuts.filter((s: Shortcut) => {\n const descMatch = s.description.toLowerCase().includes(query);\n const actionMatch = s.action.toLowerCase().includes(query);\n const cmdMatch = s.command.toLowerCase().includes(query);\n return descMatch || actionMatch || cmdMatch;\n });\n }, [shortcuts, query]);\n\n const generalMatches = useMemo(() => {\n if (!query) return true;\n return 'forensic watermark persistent diagonal text overlay'.toLowerCase().includes(query) ||\n Boolean(watermarkText && watermarkText.toLowerCase().includes(query));\n }, [query, watermarkText]);\n\n return (\n <div style={{ position: 'fixed', top: 0, left: 0, width: '100%', height: '100%', backgroundColor: 'rgba(0,0,0,0.5)', zIndex: 1000, display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n <div style={{ backgroundColor: '#fff', borderRadius: '8px', width: '800px', height: '620px', maxWidth: '92vw', maxHeight: '92vh', display: 'flex', flexDirection: 'column', boxShadow: '0 10px 25px rgba(0,0,0,0.2)', overflow: 'hidden' }}>\n \n {/* Header */}\n <div style={{ padding: '16px 24px', borderBottom: '1px solid var(--border-color)', display: 'flex', justifyContent: 'space-between', alignItems: 'center', backgroundColor: '#fff' }}>\n <h2 style={{ margin: 0, fontSize: '18px', fontWeight: 600, color: 'var(--text-color)' }}>Settings</h2>\n <button onClick={onClose} style={{ background: 'none', border: 'none', cursor: 'pointer', color: 'var(--text-muted)', display: 'flex', padding: '4px' }}>\n <X size={20} />\n </button>\n </div>\n\n {/* Search Bar */}\n <div style={{ padding: '12px 24px', borderBottom: '1px solid var(--border-color)', backgroundColor: '#fafafa' }}>\n <div style={{ position: 'relative' }}>\n <Search size={16} color=\"var(--text-muted)\" style={{ position: 'absolute', left: '12px', top: '50%', transform: 'translateY(-50%)' }} />\n <input \n type=\"text\" \n placeholder=\"Search shortcuts & settings...\" \n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n style={{\n width: '100%',\n padding: '9px 36px 9px 36px',\n border: '1px solid var(--border-color)',\n borderRadius: '6px',\n fontSize: '13px',\n boxSizing: 'border-box',\n outline: 'none',\n backgroundColor: '#fff',\n }}\n />\n {searchQuery && (\n <button\n onClick={() => setSearchQuery('')}\n style={{\n position: 'absolute', right: '10px', top: '50%', transform: 'translateY(-50%)',\n background: 'none', border: 'none', cursor: 'pointer', color: 'var(--text-muted)', display: 'flex', padding: 0\n }}\n title=\"Clear search\"\n >\n <X size={15} />\n </button>\n )}\n </div>\n </div>\n\n {/* Content */}\n <div style={{ display: 'flex', flex: 1, overflow: 'hidden' }}>\n {/* Sidebar Tabs */}\n <div style={{ width: '200px', borderRight: '1px solid var(--border-color)', backgroundColor: '#f9fafb', display: 'flex', flexDirection: 'column' }}>\n {(['General', 'Keyboard Shortcuts'] as const).map(tab => {\n const badgeCount = tab === 'Keyboard Shortcuts' ? (query ? filteredShortcuts.length : null) : (query && generalMatches ? 1 : null);\n return (\n <div \n key={tab}\n onClick={() => setActiveTab(tab)}\n style={{ \n padding: '12px 20px', \n cursor: 'pointer', \n backgroundColor: activeTab === tab ? '#eef2ff' : 'transparent', \n color: activeTab === tab ? 'var(--primary)' : 'var(--text-color)', \n fontWeight: activeTab === tab ? 600 : 400,\n fontSize: '13.5px',\n borderLeft: activeTab === tab ? '3px solid var(--primary)' : '3px solid transparent',\n transition: 'all 0.15s ease',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center'\n }}\n >\n <span>{tab}</span>\n {badgeCount !== null && (\n <span style={{\n fontSize: '11px',\n padding: '1px 6px',\n borderRadius: '10px',\n backgroundColor: activeTab === tab ? 'var(--primary)' : '#e5e7eb',\n color: activeTab === tab ? '#fff' : '#4b5563',\n fontWeight: 600\n }}>\n {badgeCount}\n </span>\n )}\n </div>\n );\n })}\n </div>\n\n {/* Main Area */}\n <div style={{ flex: 1, overflowY: 'auto', padding: '24px' }}>\n {activeTab === 'Keyboard Shortcuts' && (\n <div>\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: '16px' }}>\n <span style={{ fontSize: '13px', color: 'var(--text-muted)' }}>\n {query ? `${filteredShortcuts.length} of ${shortcuts.length} shortcuts` : `${shortcuts.length} shortcuts available`}\n </span>\n <button\n onClick={resetShortcuts}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n background: 'none',\n border: '1px solid var(--border-color)',\n borderRadius: '4px',\n padding: '4px 10px',\n fontSize: '12px',\n color: 'var(--text-muted)',\n cursor: 'pointer',\n }}\n title=\"Reset all shortcuts to defaults\"\n >\n <RotateCcw size={13} />\n Reset to Defaults\n </button>\n </div>\n\n {filteredShortcuts.length === 0 ? (\n <div style={{ textAlign: 'center', padding: '40px 16px', color: 'var(--text-muted)', fontSize: '13px' }}>\n <div>No shortcuts matching &ldquo;{searchQuery}&rdquo;</div>\n {generalMatches && (\n <div style={{ marginTop: '8px' }}>\n <button\n onClick={() => setActiveTab('General')}\n style={{ background: 'none', border: 'none', color: 'var(--primary)', cursor: 'pointer', fontSize: '13px', fontWeight: 500, textDecoration: 'underline' }}\n >\n Matching setting found in General tab &rarr;\n </button>\n </div>\n )}\n <button\n onClick={() => setSearchQuery('')}\n style={{ marginTop: '8px', background: 'none', border: 'none', color: 'var(--primary)', cursor: 'pointer', fontSize: '13px', fontWeight: 500 }}\n >\n Clear search\n </button>\n </div>\n ) : (\n <table style={{ width: '100%', borderCollapse: 'collapse', fontSize: '13.5px' }}>\n <thead>\n <tr style={{ borderBottom: '1px solid var(--border-color)', textAlign: 'left', color: 'var(--text-muted)', fontSize: '12px' }}>\n <th style={{ padding: '8px 12px', fontWeight: 600, width: '220px' }}>Shortcut</th>\n <th style={{ padding: '8px 12px', fontWeight: 600 }}>Description</th>\n <th style={{ padding: '8px 12px', fontWeight: 600, width: '70px', textAlign: 'center' }}>Action</th>\n </tr>\n </thead>\n <tbody>\n {filteredShortcuts.map((s: Shortcut) => (\n <tr key={s.action} style={{ borderBottom: '1px solid #f0f0f0' }}>\n <td style={{ padding: '12px 12px' }}>\n {editingAction === s.action ? (\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px' }}>\n <input \n autoFocus\n type=\"text\"\n placeholder=\"Press key combo...\"\n onKeyDown={(e) => handleKeyDown(e, s.action)}\n onBlur={() => setEditingAction(null)}\n style={{\n padding: '5px 8px',\n width: '150px',\n border: '2px solid var(--primary)',\n borderRadius: '4px',\n outline: 'none',\n fontSize: '12px',\n backgroundColor: '#eff6ff'\n }}\n />\n <button\n onMouseDown={(e) => { e.preventDefault(); setEditingAction(null); }}\n style={{ background: 'none', border: 'none', cursor: 'pointer', color: '#9ca3af', display: 'flex', padding: '2px' }}\n title=\"Cancel\"\n >\n <X size={14} />\n </button>\n </div>\n ) : (\n renderCommandBadges(s.command)\n )}\n </td>\n <td style={{ padding: '12px 12px', color: '#374151' }}>{s.description}</td>\n <td style={{ padding: '12px 12px', textAlign: 'center' }}>\n {editingAction === s.action ? (\n <span style={{ fontSize: '11px', color: 'var(--primary)', fontWeight: 600 }}>Recording</span>\n ) : (\n <button \n onClick={() => setEditingAction(s.action)}\n style={{\n background: '#f3f4f6',\n border: '1px solid #e5e7eb',\n borderRadius: '4px',\n cursor: 'pointer',\n color: 'var(--text-muted)',\n padding: '4px 8px',\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n fontSize: '12px',\n }}\n title=\"Edit shortcut\"\n >\n <Edit2 size={13} /> Edit\n </button>\n )}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n )}\n </div>\n )}\n \n {activeTab === 'General' && (\n <div>\n {query && !generalMatches ? (\n <div style={{ textAlign: 'center', padding: '40px 16px', color: 'var(--text-muted)', fontSize: '13px' }}>\n <div>No general settings matching &ldquo;{searchQuery}&rdquo;</div>\n {filteredShortcuts.length > 0 && (\n <div style={{ marginTop: '8px' }}>\n <button\n onClick={() => setActiveTab('Keyboard Shortcuts')}\n style={{ background: 'none', border: 'none', color: 'var(--primary)', cursor: 'pointer', fontSize: '13px', fontWeight: 500, textDecoration: 'underline' }}\n >\n {filteredShortcuts.length} matching shortcut{filteredShortcuts.length > 1 ? 's' : ''} found in Keyboard Shortcuts &rarr;\n </button>\n </div>\n )}\n <button\n onClick={() => setSearchQuery('')}\n style={{ marginTop: '8px', background: 'none', border: 'none', color: 'var(--primary)', cursor: 'pointer', fontSize: '13px', fontWeight: 500 }}\n >\n Clear search\n </button>\n </div>\n ) : (\n <div style={{ marginTop: '8px' }}>\n <label style={{ display: 'block', fontSize: '14px', fontWeight: 600, color: '#1f2937', marginBottom: '4px' }}>\n Forensic Watermark\n </label>\n <div style={{ fontSize: '13px', color: 'var(--text-muted)', marginBottom: '12px' }}>\n Add a persistent, diagonal text watermark that overlays all document pages.\n </div>\n <input \n type=\"text\" \n value={watermarkText}\n onChange={(e) => setWatermarkText(e.target.value)}\n placeholder=\"Leave blank to disable watermark\"\n style={{\n width: '100%',\n padding: '9px 12px',\n border: '1px solid var(--border-color)',\n borderRadius: '6px',\n fontSize: '13.5px',\n outline: 'none',\n boxSizing: 'border-box'\n }}\n />\n {watermarkText && (\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px', marginTop: '8px', color: '#16a34a', fontSize: '12.5px' }}>\n <Check size={14} /> Watermark active: &ldquo;{watermarkText}&rdquo;\n </div>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n\n </div>\n </div>\n );\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * TeamSync PDF Viewer SDK Version.\n *\n * This version is automatically synchronized with package.json and GitHub release tags.\n * DO NOT EDIT MANUALLY.\n */\ndeclare const __APP_VERSION__: string | undefined;\n\nexport const VERSION: string =\n typeof __APP_VERSION__ !== 'undefined' ? __APP_VERSION__ : '2.2.0';\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\nimport React from 'react';\nimport { X, Info, ExternalLink } from 'lucide-react';\nimport { VERSION } from '../version';\n\ninterface AboutModalProps {\n onClose: () => void;\n}\n\nexport default function AboutModal({ onClose }: AboutModalProps) {\n const [version, setVersion] = React.useState<string>(VERSION);\n const [releaseUrl, setReleaseUrl] = React.useState<string>(\n `https://github.com/angelbot-ai/TeamSync-PDF-Viewer/releases/tag/v${VERSION}`\n );\n\n React.useEffect(() => {\n let isMounted = true;\n fetch('/api/version')\n .then((res) => {\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return res.json();\n })\n .catch(() => {\n return fetch('https://api.github.com/repos/angelbot-ai/TeamSync-PDF-Viewer/releases/latest')\n .then((res) => {\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return res.json();\n })\n .then((data) => ({\n version: data.tag_name ? data.tag_name.replace(/^v/, '') : VERSION,\n releaseUrl: data.html_url || `https://github.com/angelbot-ai/TeamSync-PDF-Viewer/releases/tag/v${VERSION}`,\n }));\n })\n .then((data) => {\n if (isMounted && data && data.version) {\n setVersion(data.version);\n if (data.releaseUrl) {\n setReleaseUrl(data.releaseUrl);\n }\n }\n })\n .catch(() => {\n // Fallback to static VERSION\n });\n\n return () => {\n isMounted = false;\n };\n }, []);\n return (\n <div style={{\n position: 'fixed', top: 0, left: 0, right: 0, bottom: 0,\n backgroundColor: 'rgba(0,0,0,0.5)', display: 'flex', alignItems: 'center', justifyContent: 'center',\n zIndex: 3000\n }}>\n <div style={{\n backgroundColor: '#fff',\n color: '#333',\n borderRadius: '8px',\n width: '500px',\n maxWidth: '90%',\n boxShadow: '0 10px 25px rgba(0,0,0,0.2)',\n fontFamily: 'sans-serif',\n overflow: 'hidden',\n display: 'flex',\n flexDirection: 'column',\n maxHeight: '90vh'\n }}>\n {/* Header */}\n <div style={{ \n padding: '16px 24px', borderBottom: '1px solid #e5e7eb', \n display: 'flex', alignItems: 'center', justifyContent: 'space-between',\n backgroundColor: '#f9fafb'\n }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n <Info size={20} color=\"#2b76b9\" />\n <h2 style={{ margin: 0, fontSize: '18px', fontWeight: 600, color: '#111827' }}>About</h2>\n </div>\n <button \n onClick={onClose}\n style={{ background: 'none', border: 'none', cursor: 'pointer', color: '#6b7280' }}\n >\n <X size={20} />\n </button>\n </div>\n\n {/* Content */}\n <div style={{ padding: '24px', overflowY: 'auto' }}>\n <div style={{ textAlign: 'center', marginBottom: '24px' }}>\n <h1 style={{ margin: '0 0 8px 0', fontSize: '24px', color: '#1f2937' }}>TeamSync PDF Viewer</h1>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '8px', margin: '4px 0 0 0' }}>\n <span style={{ fontSize: '14px', color: '#6b7280' }}>Version {version}</span>\n <a\n href={releaseUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{\n fontSize: '12px',\n color: '#2b76b9',\n textDecoration: 'none',\n display: 'inline-flex',\n alignItems: 'center',\n gap: '3px',\n padding: '2px 8px',\n borderRadius: '4px',\n backgroundColor: '#eff6ff',\n border: '1px solid #dbeafe',\n fontWeight: 500,\n }}\n title=\"View release notes on GitHub\"\n >\n <span>Release Notes</span>\n <ExternalLink size={12} />\n </a>\n </div>\n <p style={{ margin: '8px 0 0 0', fontSize: '14px', color: '#4b5563' }}>© 2026 AngelBot Ai Pvt Ltd. All rights reserved.</p>\n <a href=\"https://www.teamsync.com\" target=\"_blank\" rel=\"noopener noreferrer\" style={{ display: 'inline-block', margin: '8px 0 0 0', fontSize: '14px', color: '#2b76b9', textDecoration: 'none', fontWeight: 500 }}>www.teamsync.com</a>\n <p style={{ margin: '8px 0 0 0', fontSize: '13px', color: '#4b5563', fontStyle: 'italic' }}>\n Licensed under the Common Public Attribution License Version 1.0 (CPAL).\n </p>\n </div>\n \n <h3 style={{ fontSize: '14px', fontWeight: 600, color: '#374151', borderBottom: '1px solid #e5e7eb', paddingBottom: '8px', marginBottom: '16px' }}>Open Source Licenses & Credits</h3>\n <p style={{ fontSize: '13px', color: '#4b5563', lineHeight: 1.5, marginBottom: '16px' }}>\n This software is made possible by open source software and other third-party libraries that are distributed under their respective licenses:\n </p>\n\n <ul style={{ paddingLeft: '20px', margin: 0, fontSize: '13px', color: '#4b5563', display: 'flex', flexDirection: 'column', gap: '8px' }}>\n <li><strong>pdfjs-dist</strong>: Licensed under the Apache License 2.0. Copyright Mozilla Foundation.</li>\n <li><strong>pdf-lib</strong>: Licensed under the MIT License. Copyright Andrew Dillon.</li>\n <li><strong>react</strong> / <strong>react-dom</strong>: Licensed under the MIT License. Copyright Meta Platforms, Inc.</li>\n <li><strong>lucide-react</strong>: Licensed under the ISC License. Copyright Lucide Contributors.</li>\n <li><strong>node-forge</strong>: Licensed under the BSD-3-Clause License or GPL. Copyright Digital Bazaar, Inc.</li>\n <li><strong>vite</strong>: Licensed under the MIT License. Copyright Evan You and Vite contributors.</li>\n </ul>\n\n <div style={{ marginTop: '16px', fontSize: '13px', textAlign: 'center' }}>\n <a href=\"/ThirdPartyNotices.txt\" target=\"_blank\" rel=\"noopener noreferrer\" style={{ color: '#2b76b9', textDecoration: 'none', fontWeight: 500 }}>\n View Full License Notices\n </a>\n </div>\n </div>\n \n {/* Footer */}\n <div style={{ padding: '16px 24px', backgroundColor: '#f9fafb', borderTop: '1px solid #e5e7eb', display: 'flex', justifyContent: 'flex-end' }}>\n <button \n onClick={onClose}\n style={{ \n backgroundColor: '#2b76b9', color: '#fff', border: 'none', borderRadius: '4px',\n padding: '8px 24px', fontSize: '14px', fontWeight: 500, cursor: 'pointer'\n }}\n >\n Close\n </button>\n </div>\n </div>\n </div>\n );\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * Per-instance event bus.\n *\n * Replaces the former `window.dispatchEvent(new CustomEvent('action-*'))` plumbing so that several\n * viewer instances can coexist on one page without cross-talk, and so that `destroy()` can drop\n * every listener an instance ever registered.\n */\n\nexport type BusListener<T = unknown> = (detail: T) => void;\n\nexport class ViewerBus {\n private readonly listeners = new Map<string, Set<BusListener<any>>>();\n private destroyed = false;\n\n /** Subscribe. Returns an unsubscribe function. */\n on<T = unknown>(type: string, listener: BusListener<T>): () => void {\n if (this.destroyed) return () => {};\n let set = this.listeners.get(type);\n if (!set) {\n set = new Set();\n this.listeners.set(type, set);\n }\n set.add(listener);\n return () => this.off(type, listener);\n }\n\n /** Subscribe for a single delivery. */\n once<T = unknown>(type: string, listener: BusListener<T>): () => void {\n const off = this.on<T>(type, (detail) => {\n off();\n listener(detail);\n });\n return off;\n }\n\n off<T = unknown>(type: string, listener: BusListener<T>): void {\n const set = this.listeners.get(type);\n if (!set) return;\n set.delete(listener);\n if (set.size === 0) this.listeners.delete(type);\n }\n\n /** Dispatch synchronously to every listener. Listener errors are isolated and logged. */\n emit<T = unknown>(type: string, detail?: T): void {\n if (this.destroyed) return;\n const set = this.listeners.get(type);\n if (!set || set.size === 0) return;\n for (const listener of Array.from(set)) {\n try {\n listener(detail as T);\n } catch (err) {\n console.error(`[teamsync-pdf-viewer] listener for \"${type}\" threw`, err);\n }\n }\n }\n\n listenerCount(type?: string): number {\n if (type) return this.listeners.get(type)?.size ?? 0;\n let n = 0;\n for (const set of this.listeners.values()) n += set.size;\n return n;\n }\n\n removeAll(): void {\n this.listeners.clear();\n }\n\n /** Drop every listener and refuse further subscriptions/emissions. */\n destroy(): void {\n this.removeAll();\n this.destroyed = true;\n }\n\n get isDestroyed(): boolean {\n return this.destroyed;\n }\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * Page geometry — the single authority for converting between the viewer's \"base page space\"\n * (pdf.js viewport at scale 1 with the page's intrinsic /Rotate applied; top-left origin, points)\n * and PDF user space (bottom-left origin, as written into XFDF / drawn by pdf-lib).\n *\n * The transform replicates pdf.js `PageViewport` exactly (display_utils.js) so results are\n * identical to `viewport.convertToPdfPoint` / `convertToViewportPoint`, but it only needs the\n * page's `view` (viewBox) and `rotate`, which keeps it synchronous and unit-testable.\n */\nimport type { PDFDocumentProxy, PDFPageProxy } from 'pdfjs-dist';\nimport { normalizeRotation } from '../utils/rotationUtils';\n\nexport type Matrix = [number, number, number, number, number, number];\n\nexport interface PageGeometry {\n /** 1-based page number */\n pageNumber: number;\n /** PDF user-space bounding box [x0, y0, x1, y1] (the CropBox pdf.js renders). */\n viewBox: [number, number, number, number];\n /** Intrinsic page rotation (/Rotate), normalized to 0/90/180/270. */\n rotate: number;\n /** Base page size in points (already swapped for 90/270). */\n width: number;\n height: number;\n /** Base-space (viewer) -> PDF user-space transform is the inverse of this viewport transform. */\n transform: Matrix;\n}\n\nexport interface Rect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface Point {\n x: number;\n y: number;\n}\n\n/** PDF rectangle as XFDF writes it: [llx, lly, urx, ury]. */\nexport type PdfRect = [number, number, number, number];\n\n/** Collapse -0 to 0 so equality checks and XFDF output never see a signed zero. */\nconst z = (n: number): number => (n === 0 ? 0 : n);\n\nfunction applyTransform(p: Point, m: Matrix): Point {\n return { x: z(p.x * m[0] + p.y * m[2] + m[4]), y: z(p.x * m[1] + p.y * m[3] + m[5]) };\n}\n\nfunction applyInverseTransform(p: Point, m: Matrix): Point {\n const d = m[0] * m[3] - m[1] * m[2];\n return {\n x: z((p.x * m[3] - p.y * m[2] + m[2] * m[5] - m[4] * m[3]) / d),\n y: z((-p.x * m[1] + p.y * m[0] + m[4] * m[1] - m[5] * m[0]) / d),\n };\n}\n\n/** Build the geometry for a page from its viewBox and intrinsic rotation (mirrors pdf.js PageViewport at scale 1). */\nexport function createPageGeometry(pageNumber: number, viewBox: [number, number, number, number], rotate: number): PageGeometry {\n const rotation = normalizeRotation(rotate);\n const [x0, y0, x1, y1] = viewBox;\n const centerX = (x1 + x0) / 2;\n const centerY = (y1 + y0) / 2;\n\n let rotateA: number, rotateB: number, rotateC: number, rotateD: number;\n switch (rotation) {\n case 180: rotateA = -1; rotateB = 0; rotateC = 0; rotateD = 1; break;\n case 90: rotateA = 0; rotateB = 1; rotateC = 1; rotateD = 0; break;\n case 270: rotateA = 0; rotateB = -1; rotateC = -1; rotateD = 0; break;\n default: rotateA = 1; rotateB = 0; rotateC = 0; rotateD = -1; break;\n }\n\n let offsetCanvasX: number, offsetCanvasY: number, width: number, height: number;\n if (rotateA === 0) {\n offsetCanvasX = Math.abs(centerY - y0);\n offsetCanvasY = Math.abs(centerX - x0);\n width = Math.abs(y1 - y0);\n height = Math.abs(x1 - x0);\n } else {\n offsetCanvasX = Math.abs(centerX - x0);\n offsetCanvasY = Math.abs(centerY - y0);\n width = x1 - x0;\n height = y1 - y0;\n }\n\n const transform: Matrix = [\n rotateA, rotateB, rotateC, rotateD,\n offsetCanvasX - rotateA * centerX - rotateC * centerY,\n offsetCanvasY - rotateB * centerX - rotateD * centerY,\n ];\n\n return { pageNumber, viewBox: [x0, y0, x1, y1], rotate: rotation, width, height, transform };\n}\n\nexport function geometryFromPage(page: PDFPageProxy): PageGeometry {\n const view = page.view as number[];\n return createPageGeometry(page.pageNumber, [view[0], view[1], view[2], view[3]], page.rotate);\n}\n\n/** Small per-document cache so callers can resolve geometry for many annotations cheaply. */\nexport function createGeometryResolver(pdfDoc: PDFDocumentProxy) {\n const cache = new Map<number, Promise<PageGeometry>>();\n return (pageNumber: number): Promise<PageGeometry> => {\n const n = Math.max(1, Math.min(pdfDoc.numPages, pageNumber));\n let p = cache.get(n);\n if (!p) {\n p = pdfDoc.getPage(n).then(geometryFromPage);\n cache.set(n, p);\n }\n return p;\n };\n}\n\nexport type GeometryResolver = (pageNumber: number) => Promise<PageGeometry>;\n\n// ---- point / rect / path conversions ----------------------------------------------------------\n\nexport function toPdfPoint(g: PageGeometry, p: Point): Point {\n return applyInverseTransform(p, g.transform);\n}\n\nexport function fromPdfPoint(g: PageGeometry, p: Point): Point {\n return applyTransform(p, g.transform);\n}\n\n/** Viewer rect (top-left origin) -> PDF rect [llx, lly, urx, ury]. */\nexport function rectToPdf(g: PageGeometry, r: Rect): PdfRect {\n const a = toPdfPoint(g, { x: r.x, y: r.y });\n const b = toPdfPoint(g, { x: r.x + r.width, y: r.y + r.height });\n return [Math.min(a.x, b.x), Math.min(a.y, b.y), Math.max(a.x, b.x), Math.max(a.y, b.y)];\n}\n\n/** PDF rect [llx, lly, urx, ury] -> viewer rect (top-left origin). */\nexport function rectFromPdf(g: PageGeometry, r: PdfRect): Rect {\n const a = fromPdfPoint(g, { x: r[0], y: r[1] });\n const b = fromPdfPoint(g, { x: r[2], y: r[3] });\n const x = Math.min(a.x, b.x);\n const y = Math.min(a.y, b.y);\n return { x, y, width: Math.abs(b.x - a.x), height: Math.abs(b.y - a.y) };\n}\n\nexport function pathToPdf(g: PageGeometry, points: Point[]): Point[] {\n return points.map((p) => toPdfPoint(g, p));\n}\n\nexport function pathFromPdf(g: PageGeometry, points: Point[]): Point[] {\n return points.map((p) => fromPdfPoint(g, p));\n}\n\n/**\n * XFDF QuadPoints for a viewer rect: x1,y1 (upper-left) x2,y2 (upper-right) x3,y3 (lower-left)\n * x4,y4 (lower-right) in PDF space — the order Acrobat and Apryse write for text markup.\n */\nexport function rectToQuadPoints(g: PageGeometry, r: Rect): number[] {\n const [llx, lly, urx, ury] = rectToPdf(g, r);\n return [llx, ury, urx, ury, llx, lly, urx, lly];\n}\n\n/** Bounding viewer rect of one or more XFDF quads (8 numbers each). */\nexport function quadPointsToRects(g: PageGeometry, quads: number[]): Rect[] {\n const rects: Rect[] = [];\n for (let i = 0; i + 7 < quads.length; i += 8) {\n const xs = [quads[i], quads[i + 2], quads[i + 4], quads[i + 6]];\n const ys = [quads[i + 1], quads[i + 3], quads[i + 5], quads[i + 7]];\n rects.push(rectFromPdf(g, [Math.min(...xs), Math.min(...ys), Math.max(...xs), Math.max(...ys)]));\n }\n return rects;\n}\n\nexport function unionRects(rects: Rect[]): Rect {\n if (rects.length === 0) return { x: 0, y: 0, width: 0, height: 0 };\n const x0 = Math.min(...rects.map((r) => r.x));\n const y0 = Math.min(...rects.map((r) => r.y));\n const x1 = Math.max(...rects.map((r) => r.x + r.width));\n const y1 = Math.max(...rects.map((r) => r.y + r.height));\n return { x: x0, y: y0, width: x1 - x0, height: y1 - y0 };\n}\n\n/** Round to 3 decimals for XFDF output (Apryse writes 3, Acrobat up to 6). */\nexport const fmt = (n: number): string => (Math.round(n * 1000) / 1000).toString();\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * PDF export: bakes annotations + watermark into a copy of the source document and rasterizes\n * redacted pages so the underlying content is destroyed.\n *\n * The source bytes come from the already-loaded pdf.js document (`pdfDocument.getData()`), so the\n * export never re-fetches the URL (presigned URLs are method-bound and may have expired) and never\n * issues HEAD probes.\n *\n * Geometry: every annotation is converted from the viewer's base page space to PDF user space\n * through `annotations/geometry.ts` (the same transform pdf.js uses), so baked markup lands exactly\n * where it was drawn — on any page size, CropBox offset or intrinsic /Rotate.\n */\nimport { PDFDocument, rgb, degrees, StandardFonts, BlendMode, type PDFPage } from 'pdf-lib';\nimport * as pdfjsLib from 'pdfjs-dist';\nimport { getDocumentParams } from './pdfAssets';\nimport type { Annotation } from '../annotations/types';\nimport type { Redaction, WatermarkOptions } from './types';\nimport type { FormField, FormDataRecord } from '../forms/types';\nimport { createPageGeometry, createGeometryResolver, pathToPdf, rectToPdf, toPdfPoint, type GeometryResolver, type PageGeometry } from '../annotations/geometry';\n\n/** Refuse to build documents larger than this in the browser (memory safety). */\nexport const MAX_EXPORT_BYTES = 500 * 1024 * 1024;\n\nexport interface ExportInput {\n /** Returns the original document bytes (prefer `pdfDocument.getData()`). */\n getSourceBytes: () => Promise<Uint8Array | ArrayBuffer>;\n /** Page geometry resolver (from the loaded pdf.js document). Derived from the bytes when absent. */\n getPageGeometry?: GeometryResolver;\n annotations: Annotation[];\n redactions: Redaction[];\n watermark?: WatermarkOptions;\n /** Name printed on digital-signature placeholder blocks when the annotation has no signer. */\n signerName?: string;\n formFields?: FormField[];\n formData?: FormDataRecord;\n}\n\nexport interface ExportOptions {\n /** Bake exactly these annotations instead of the live list. */\n explicitAnnotations?: Annotation[];\n /** Accepted for API compatibility; annotations are always taken from the live list / explicitAnnotations. */\n xfdfString?: string;\n}\n\nconst hexToRgb = (hex: string | undefined) => {\n const safe = hex && /^#[0-9a-f]{6}$/i.test(hex) ? hex : '#000000';\n const r = parseInt(safe.slice(1, 3), 16) / 255;\n const g = parseInt(safe.slice(3, 5), 16) / 255;\n const b = parseInt(safe.slice(5, 7), 16) / 255;\n return rgb(r, g, b);\n};\n\n/**\n * Decodes a base64 Data URL directly in memory without triggering network fetch.\n * Prevents SSRF / unhandled network rejections during PDF export.\n */\nfunction decodeBase64DataUrl(dataUrl: string): { bytes: Uint8Array; mime: string } | null {\n if (typeof dataUrl !== 'string' || !dataUrl.startsWith('data:')) return null;\n const match = dataUrl.match(/^data:([^;,]+)(?:;charset=[^;,]+)?;base64,(.*)$/s);\n if (!match) return null;\n const mime = match[1].toLowerCase();\n const base64Data = match[2].trim();\n try {\n const globalBuffer = (globalThis as any).Buffer;\n if (globalBuffer && typeof globalBuffer.from === 'function') {\n const buf = globalBuffer.from(base64Data, 'base64');\n return { bytes: new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength), mime };\n } else if (typeof atob !== 'undefined') {\n const binary = atob(base64Data);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return { bytes, mime };\n }\n } catch {\n return null;\n }\n return null;\n}\n\nfunction wrapText(text: string, maxWidth: number, fontSize: number): string[] {\n const approxCharWidth = fontSize * 0.55;\n const maxCharsPerLine = Math.max(1, Math.floor(maxWidth / approxCharWidth));\n const paragraphs = text.split('\\n');\n const lines: string[] = [];\n\n for (const p of paragraphs) {\n if (!p) {\n lines.push('');\n continue;\n }\n const words = p.split(/\\s+/);\n let currentLine = '';\n\n for (const word of words) {\n if (!currentLine) {\n currentLine = word;\n } else if ((currentLine + ' ' + word).length <= maxCharsPerLine) {\n currentLine += ' ' + word;\n } else {\n lines.push(currentLine);\n currentLine = word;\n }\n }\n if (currentLine) {\n lines.push(currentLine);\n }\n }\n return lines;\n}\n\nasync function bakeAnnotation(pdfDoc: PDFDocument, page: PDFPage, g: PageGeometry, ann: Annotation, signerName?: string): Promise<void> {\n const color = hexToRgb(ann.color);\n const opacity = ann.opacity ?? 1;\n const strokeWidth = ann.strokeWidth || 1;\n const rect = rectToPdf(g, { x: ann.x, y: ann.y, width: ann.width, height: ann.height });\n const [llx, lly, urx, ury] = rect;\n const w = urx - llx;\n const h = ury - lly;\n // Text drawn in user space appears rotated by /Rotate in the viewer; counter-rotate so it reads\n // upright the way it was authored.\n const textRotate = degrees(g.rotate);\n const topLeftBaseline = (x: number, y: number, size: number) => toPdfPoint(g, { x, y: y + size });\n\n switch (ann.type) {\n case 'rectangle':\n page.drawRectangle({ x: llx, y: lly, width: w, height: h, color, opacity, borderColor: color, borderWidth: strokeWidth, borderOpacity: 1 });\n return;\n case 'ellipse':\n page.drawEllipse({ x: llx + w / 2, y: lly + h / 2, xScale: w / 2, yScale: h / 2, color, opacity, borderColor: color, borderWidth: strokeWidth, borderOpacity: 1 });\n return;\n case 'highlight': {\n const rects = ann.rects && ann.rects.length > 0 ? ann.rects : [{ x: ann.x, y: ann.y, width: ann.width, height: ann.height }];\n for (const r of rects) {\n const [x0, y0, x1, y1] = rectToPdf(g, r);\n page.drawRectangle({ x: x0, y: y0, width: x1 - x0, height: y1 - y0, color, opacity: opacity < 1 ? opacity : 0.5, blendMode: BlendMode.Multiply });\n }\n return;\n }\n case 'underline': {\n const rects = ann.rects && ann.rects.length > 0 ? ann.rects : [{ x: ann.x, y: ann.y, width: ann.width, height: ann.height }];\n for (const r of rects) {\n const [s, e] = pathToPdf(g, [\n { x: r.x, y: r.y + r.height - 1.5 },\n { x: r.x + r.width, y: r.y + r.height - 1.5 }\n ]);\n page.drawLine({ start: s, end: e, color, opacity, thickness: strokeWidth || 1.5 });\n }\n return;\n }\n case 'strikeout': {\n const rects = ann.rects && ann.rects.length > 0 ? ann.rects : [{ x: ann.x, y: ann.y, width: ann.width, height: ann.height }];\n for (const r of rects) {\n const [s, e] = pathToPdf(g, [\n { x: r.x, y: r.y + r.height / 2 },\n { x: r.x + r.width, y: r.y + r.height / 2 }\n ]);\n page.drawLine({ start: s, end: e, color, opacity, thickness: strokeWidth || 1.5 });\n }\n return;\n }\n case 'squiggly': {\n const rects = ann.rects && ann.rects.length > 0 ? ann.rects : [{ x: ann.x, y: ann.y, width: ann.width, height: ann.height }];\n for (const r of rects) {\n const squigglyPts = [];\n const step = 3;\n let up = true;\n for (let curX = r.x; curX <= r.x + r.width; curX += step) {\n squigglyPts.push({ x: curX, y: r.y + r.height - (up ? 3 : 1) });\n up = !up;\n }\n if (squigglyPts.length >= 2) {\n const pdfPts = pathToPdf(g, squigglyPts);\n for (let i = 1; i < pdfPts.length; i++) {\n page.drawLine({ start: pdfPts[i - 1], end: pdfPts[i], color, opacity, thickness: strokeWidth || 1.5 });\n }\n }\n }\n return;\n }\n case 'line':\n case 'arrow': {\n const pts = ann.points && ann.points.length >= 2 ? ann.points : [{ x: ann.x, y: ann.y }, { x: ann.x + ann.width, y: ann.y + ann.height }];\n const [s, e] = pathToPdf(g, [pts[0], pts[1]]);\n page.drawLine({ start: s, end: e, color, opacity, thickness: strokeWidth });\n if (ann.type === 'arrow') {\n // Arrow head computed in viewer space (same as the on-screen rendering), then converted.\n const p1 = pts[0], p2 = pts[1];\n const angle = Math.atan2(p2.y - p1.y, p2.x - p1.x);\n const headLen = 15 + strokeWidth;\n const h1 = { x: p2.x - headLen * Math.cos(angle - Math.PI / 6), y: p2.y - headLen * Math.sin(angle - Math.PI / 6) };\n const h2 = { x: p2.x - headLen * Math.cos(angle + Math.PI / 6), y: p2.y - headLen * Math.sin(angle + Math.PI / 6) };\n const [ph1, ph2] = pathToPdf(g, [h1, h2]);\n page.drawLine({ start: ph1, end: e, color, opacity, thickness: strokeWidth });\n page.drawLine({ start: ph2, end: e, color, opacity, thickness: strokeWidth });\n }\n return;\n }\n case 'freehand': {\n const strokes = ann.strokes && ann.strokes.length > 0 ? ann.strokes : ann.points ? [ann.points] : [];\n for (const st of strokes) {\n const pdfPts = pathToPdf(g, st);\n for (let i = 1; i < pdfPts.length; i++) {\n page.drawLine({ start: pdfPts[i - 1], end: pdfPts[i], color, opacity, thickness: strokeWidth, lineCap: 1 });\n }\n }\n return;\n }\n case 'text': {\n if (!ann.text) return;\n const boxWidth = ann.width && ann.width > 0 ? ann.width : 200;\n const lines = wrapText(ann.text, boxWidth, 16);\n const lineHeight = 20;\n for (let i = 0; i < lines.length; i++) {\n if (!lines[i]) continue;\n const b = topLeftBaseline(ann.x, ann.y + i * lineHeight, 16);\n page.drawText(lines[i], { x: b.x, y: b.y, size: 16, color, opacity, rotate: textRotate });\n }\n return;\n }\n case 'note': {\n const [nx0, ny0, nx1, ny1] = rectToPdf(g, { x: ann.x, y: ann.y, width: 24, height: 24 });\n page.drawRectangle({ x: nx0, y: ny0, width: nx1 - nx0, height: ny1 - ny0, color: rgb(1, 0.97, 0.7), borderColor: color, borderWidth: strokeWidth });\n if (ann.text) {\n const b = topLeftBaseline(ann.x + 30, ann.y, 14);\n page.drawText(ann.text, { x: b.x, y: b.y, size: 14, color, opacity, rotate: textRotate });\n }\n return;\n }\n case 'callout': {\n const pts = ann.points && ann.points.length >= 2 ? ann.points : [{ x: ann.x, y: ann.y }, { x: ann.x, y: ann.y }];\n const [s, e] = pathToPdf(g, [pts[0], pts[1]]);\n page.drawLine({ start: s, end: e, color, opacity, thickness: strokeWidth });\n if (ann.text) {\n const boxW = ann.text.length * 8 + 20;\n const [bx0, by0, bx1, by1] = rectToPdf(g, { x: pts[1].x, y: pts[1].y, width: boxW, height: 24 });\n page.drawRectangle({ x: bx0, y: by0, width: bx1 - bx0, height: by1 - by0, color: rgb(1, 1, 1), borderColor: color, borderWidth: strokeWidth });\n const b = topLeftBaseline(pts[1].x + 10, pts[1].y + 2, 14);\n page.drawText(ann.text, { x: b.x, y: b.y, size: 14, color, opacity, rotate: textRotate });\n }\n return;\n }\n case 'signature': {\n if (!ann.imageUrl) return;\n const imageBytes = await fetch(ann.imageUrl).then((res) => res.arrayBuffer());\n const image = ann.imageUrl.startsWith('data:image/jpeg') || ann.imageUrl.startsWith('data:image/jpg')\n ? await pdfDoc.embedJpg(imageBytes)\n : await pdfDoc.embedPng(imageBytes);\n page.drawImage(image, { x: llx, y: lly, width: w, height: h, rotate: textRotate });\n return;\n }\n case 'digital_signature_placeholder': {\n const dateStr = ann.timestamp ? new Date(ann.timestamp).toLocaleString('en-GB') : new Date().toLocaleString('en-GB');\n const iconW = w * 0.15;\n page.drawRectangle({ x: llx, y: lly, width: w, height: h, color: rgb(1, 1, 1), borderColor: rgb(148 / 255, 163 / 255, 184 / 255), borderWidth: 1 });\n page.drawLine({ start: { x: llx + iconW, y: lly }, end: { x: llx + iconW, y: lly + h }, color: rgb(226 / 255, 232 / 255, 240 / 255), thickness: 1 });\n page.drawSvgPath('M22 6 L22 14 Q22 20 12 24 Q2 20 2 14 L2 6 L12 2 Z', { x: llx + iconW / 2 - 12, y: lly + h / 2 + 12, borderColor: rgb(2 / 255, 132 / 255, 199 / 255), borderWidth: 2, scale: 1 });\n page.drawSvgPath('M7 13 L10 16 L17 8', { x: llx + iconW / 2 - 12, y: lly + h / 2 + 12, borderColor: rgb(2 / 255, 132 / 255, 199 / 255), borderWidth: 2, scale: 1 });\n page.drawText(`Digitally signed by ${ann.signer || signerName || 'Unknown signer'}`, { x: llx + iconW + 10, y: lly + h - 16, size: 10, color: rgb(15 / 255, 23 / 255, 42 / 255) });\n page.drawText(`Date: ${dateStr}`, { x: llx + iconW + 10, y: lly + h - 28, size: 9, color: rgb(51 / 255, 65 / 255, 85 / 255) });\n page.drawText('Reason: Document Approval', { x: llx + iconW + 10, y: lly + h - 40, size: 9, color: rgb(51 / 255, 65 / 255, 85 / 255) });\n return;\n }\n case 'link':\n case 'opaque':\n default:\n return; // not visual (link) or not ours to render (opaque)\n }\n}\n\nasync function bakeWatermark(pdfDoc: PDFDocument, wm: WatermarkOptions): Promise<void> {\n const wmColor = hexToRgb(wm.color || '#737373');\n const wmOpacity = wm.opacity ?? 0.08;\n const helveticaFont = await pdfDoc.embedFont(StandardFonts.Helvetica);\n const angle = -Math.PI / 4;\n const cosA = Math.cos(angle);\n const sinA = Math.sin(angle);\n\n for (const page of pdfDoc.getPages()) {\n const { width, height } = page.getSize();\n if (wm.mode === 'single') {\n const fontSize = wm.size || 48;\n const textWidth = helveticaFont.widthOfTextAtSize(wm.text, fontSize);\n const dx = -textWidth / 2;\n const dy = -fontSize * 0.35;\n page.drawText(wm.text, {\n x: width / 2 + (dx * cosA - dy * sinA),\n y: height / 2 + (dx * sinA + dy * cosA),\n size: fontSize, font: helveticaFont, color: wmColor, opacity: wmOpacity, rotate: degrees(-45),\n });\n } else {\n const fontSize = wm.size || 18;\n const textWidth = helveticaFont.widthOfTextAtSize(wm.text, fontSize);\n const xStep = textWidth + 150;\n const yStep = 250;\n const dx = -textWidth / 2;\n const dy = -fontSize * 0.35;\n const rotatedDx = dx * cosA - dy * sinA;\n const rotatedDy = dx * sinA + dy * cosA;\n for (let y = -height; y < height * 2; y += yStep) {\n const offset = (Math.abs(y / yStep) % 2) * (xStep / 2);\n for (let x = -width; x < width * 2; x += xStep) {\n page.drawText(wm.text, { x: x + offset + rotatedDx, y: y + rotatedDy, size: fontSize, font: helveticaFont, color: wmColor, opacity: wmOpacity, rotate: degrees(-45) });\n }\n }\n }\n }\n}\n\nasync function rasterizeRedactions(pdfDoc: PDFDocument, redactions: Redaction[]): Promise<PDFDocument> {\n const tempBuffer = await pdfDoc.save();\n const loadingTask = pdfjsLib.getDocument({ data: tempBuffer, ...getDocumentParams() });\n const renderDoc = await loadingTask.promise;\n const flattenedPdf = await PDFDocument.create();\n\n try {\n for (let i = 1; i <= renderDoc.numPages; i++) {\n const pageRedactions = redactions.filter((r) => r.pageIndex === i);\n if (pageRedactions.length > 0) {\n const renderPage = await renderDoc.getPage(i);\n const rasterScale = 2.0;\n const viewport = renderPage.getViewport({ scale: rasterScale });\n const canvas = document.createElement('canvas');\n canvas.width = viewport.width;\n canvas.height = viewport.height;\n const ctx = canvas.getContext('2d');\n if (ctx) {\n await renderPage.render({ canvasContext: ctx, canvas, viewport }).promise;\n ctx.save();\n ctx.fillStyle = '#000000';\n for (const redaction of pageRedactions) {\n ctx.fillRect(\n Math.floor(redaction.x * rasterScale),\n Math.floor(redaction.y * rasterScale),\n Math.ceil(redaction.width * rasterScale),\n Math.ceil(redaction.height * rasterScale)\n );\n }\n ctx.restore();\n const imgDataUrl = canvas.toDataURL('image/jpeg', 0.95);\n const imgBytes = await fetch(imgDataUrl).then((res) => res.arrayBuffer());\n const pdfImage = await flattenedPdf.embedJpg(imgBytes);\n const originalVp = renderPage.getViewport({ scale: 1 });\n const newPage = flattenedPdf.addPage([originalVp.width, originalVp.height]);\n newPage.drawImage(pdfImage, { x: 0, y: 0, width: originalVp.width, height: originalVp.height });\n canvas.width = 0;\n canvas.height = 0;\n }\n renderPage.cleanup();\n } else {\n const [copiedPage] = await flattenedPdf.copyPages(pdfDoc, [i - 1]);\n flattenedPdf.addPage(copiedPage);\n }\n if (i % 5 === 0) await new Promise((resolve) => setTimeout(resolve, 0));\n }\n } finally {\n await loadingTask.destroy().catch(() => {});\n }\n return flattenedPdf;\n}\n\nexport async function buildPdfBytes(input: ExportInput, options: ExportOptions = {}): Promise<Uint8Array> {\n if (options.xfdfString) {\n console.warn('[teamsync-pdf-viewer] getFileData({ xfdfString }) is ignored; import the XFDF through annotationManager.importAnnotations() first.');\n }\n\n const raw = await input.getSourceBytes();\n const sourceBytes = raw instanceof Uint8Array ? raw : new Uint8Array(raw);\n if (sourceBytes.byteLength > MAX_EXPORT_BYTES) {\n const sizeMB = (sourceBytes.byteLength / (1024 * 1024)).toFixed(2);\n throw new Error(\n `File is too large (${sizeMB} MB) to save directly in the browser. ` +\n 'Use exportAnnotations() to save annotation data and apply it on your server.'\n );\n }\n\n const pdfDoc = await PDFDocument.load(sourceBytes, { ignoreEncryption: true });\n const pages = pdfDoc.getPages();\n const anns = options.explicitAnnotations || input.annotations;\n\n // Geometry: prefer the live pdf.js document; otherwise derive it from the bytes.\n let resolveGeometry = input.getPageGeometry;\n let geometryTask: pdfjsLib.PDFDocumentLoadingTask | null = null;\n if (!resolveGeometry && anns.length > 0) {\n geometryTask = pdfjsLib.getDocument({ data: sourceBytes.slice(), ...getDocumentParams() });\n resolveGeometry = createGeometryResolver(await geometryTask.promise);\n }\n\n try {\n for (const ann of anns) {\n const pageIdx = Math.max(0, Math.min((ann.pageIndex || 1) - 1, pages.length - 1));\n const g = await resolveGeometry!(pageIdx + 1);\n await bakeAnnotation(pdfDoc, pages[pageIdx], g, ann, input.signerName);\n }\n } finally {\n if (geometryTask) await geometryTask.destroy().catch(() => {});\n }\n\n // Bake form fields as AcroForms\n if (input.formFields && input.formFields.length > 0) {\n const form = pdfDoc.getForm();\n const values = input.formData || {};\n const usedFieldNames = new Set<string>();\n\n const getUniqueFieldName = (baseName: string): string => {\n let name = (baseName || 'field').trim();\n if (!usedFieldNames.has(name)) {\n usedFieldNames.add(name);\n return name;\n }\n let counter = 1;\n while (usedFieldNames.has(`${name}_${counter}`)) {\n counter++;\n }\n const uniqueName = `${name}_${counter}`;\n usedFieldNames.add(uniqueName);\n return uniqueName;\n };\n\n for (const field of input.formFields) {\n const pageIdx = Math.max(0, Math.min((field.pageIndex || 1) - 1, pages.length - 1));\n const targetPage = pages[pageIdx];\n\n let g: PageGeometry | null = null;\n if (resolveGeometry) {\n try {\n g = await resolveGeometry(pageIdx + 1);\n } catch {}\n }\n if (!g) {\n const { width, height } = targetPage.getSize();\n g = createPageGeometry(pageIdx + 1, [0, 0, width, height], targetPage.getRotation().angle);\n }\n\n const rect = rectToPdf(g, { x: field.x, y: field.y, width: field.width, height: field.height });\n const [llx, lly, urx, ury] = rect;\n const w = Math.max(10, urx - llx);\n const h = Math.max(10, ury - lly);\n const filledVal = values[field.name] !== undefined ? values[field.name] : field.defaultValue;\n const uniqueFieldName = getUniqueFieldName(field.name);\n\n try {\n if (field.type === 'text' || (field.type as string) === 'textbox') {\n const tf = form.createTextField(uniqueFieldName);\n tf.addToPage(targetPage, { x: llx, y: lly, width: w, height: h });\n if (field.fontSize) {\n try { tf.setFontSize(field.fontSize); } catch {}\n }\n if (filledVal !== undefined && filledVal !== null && filledVal !== '') tf.setText(String(filledVal));\n } else if (field.type === 'textarea') {\n const tf = form.createTextField(uniqueFieldName);\n tf.enableMultiline();\n tf.addToPage(targetPage, { x: llx, y: lly, width: w, height: h });\n if (field.fontSize) {\n try { tf.setFontSize(field.fontSize); } catch {}\n }\n if (filledVal !== undefined && filledVal !== null && filledVal !== '') tf.setText(String(filledVal));\n } else if (field.type === 'datetime') {\n const tf = form.createTextField(uniqueFieldName);\n tf.addToPage(targetPage, { x: llx, y: lly, width: w, height: h });\n if (field.fontSize) {\n try { tf.setFontSize(field.fontSize); } catch {}\n }\n if (filledVal !== undefined && filledVal !== null && filledVal !== '') tf.setText(String(filledVal));\n } else if (field.type === 'checkbox') {\n const cb = form.createCheckBox(uniqueFieldName);\n cb.addToPage(targetPage, { x: llx, y: lly, width: w, height: h });\n if (Boolean(filledVal)) cb.check();\n } else if (field.type === 'dropdown') {\n const dd = form.createDropdown(uniqueFieldName);\n if (field.options && field.options.length > 0) dd.setOptions(field.options);\n dd.addToPage(targetPage, { x: llx, y: lly, width: w, height: h });\n if (filledVal) dd.select(String(filledVal));\n } else if (field.type === 'checklist') {\n const opts = field.options && field.options.length > 0 ? field.options : ['Item 1'];\n const itemH = h / opts.length;\n const selectedList = Array.isArray(filledVal) ? filledVal : [];\n opts.forEach((opt, idx) => {\n const cb = form.createCheckBox(getUniqueFieldName(`${field.name}_${idx}`));\n cb.addToPage(targetPage, {\n x: llx,\n y: lly + h - (idx + 1) * itemH + 2,\n width: Math.min(itemH - 4, 16),\n height: Math.min(itemH - 4, 16),\n });\n if (selectedList.includes(opt)) cb.check();\n });\n } else if (field.type === 'signature') {\n const dataUrl = typeof filledVal === 'object' && filledVal ? (filledVal.dataUrl || (filledVal as any).imageUrl) : (typeof filledVal === 'string' && filledVal.startsWith('data:') ? filledVal : undefined);\n if (dataUrl) {\n try {\n const decoded = decodeBase64DataUrl(dataUrl);\n const imageBytes = decoded ? decoded.bytes : await fetch(dataUrl).then((res) => res.arrayBuffer());\n const isJpg = (decoded && (decoded.mime === 'image/jpeg' || decoded.mime === 'image/jpg')) || dataUrl.startsWith('data:image/jpeg') || dataUrl.startsWith('data:image/jpg');\n const image = isJpg\n ? await pdfDoc.embedJpg(imageBytes)\n : await pdfDoc.embedPng(imageBytes);\n targetPage.drawImage(image, { x: llx, y: lly, width: w, height: h });\n if (typeof filledVal === 'object' && filledVal?.signerName) {\n try {\n targetPage.drawText(`Digitally signed by ${filledVal.signerName}`, {\n x: llx,\n y: Math.max(0, lly - 10),\n size: 8,\n color: rgb(100 / 255, 116 / 255, 139 / 255),\n });\n } catch {}\n }\n } catch (err) {\n console.warn('[export] Failed to embed signature image:', err);\n }\n } else {\n // Unsigned signature placeholder box with baseline\n targetPage.drawRectangle({ x: llx, y: lly, width: w, height: h, color: rgb(1, 1, 1), borderColor: rgb(148 / 255, 163 / 255, 184 / 255), borderWidth: 1 });\n targetPage.drawLine({ start: { x: llx + 8, y: lly + 14 }, end: { x: llx + w - 8, y: lly + 14 }, color: rgb(148 / 255, 163 / 255, 184 / 255), thickness: 1 });\n targetPage.drawText('X', { x: llx + 10, y: lly + 17, size: 10, color: rgb(100 / 255, 116 / 255, 139 / 255) });\n targetPage.drawText(field.label || 'Signature', { x: llx + 24, y: lly + 17, size: 8.5, color: rgb(100 / 255, 116 / 255, 139 / 255) });\n }\n } else if (field.type === 'digital_signature') {\n const isSigned = Boolean(typeof filledVal === 'object' && filledVal && (filledVal.signerName || filledVal.certificateHash));\n const signer = (typeof filledVal === 'object' && filledVal?.signerName) || (typeof filledVal === 'string' ? filledVal : input.signerName) || 'Authorized Signer';\n const dateStr = (typeof filledVal === 'object' && filledVal?.timestamp) ? new Date(filledVal.timestamp).toLocaleString('en-GB') : new Date().toLocaleString('en-GB');\n const reason = (typeof filledVal === 'object' && filledVal?.reason) || 'Document Approval';\n const iconW = Math.min(w * 0.16, 40);\n\n targetPage.drawRectangle({ x: llx, y: lly, width: w, height: h, color: rgb(1, 1, 1), borderColor: rgb(148 / 255, 163 / 255, 184 / 255), borderWidth: 1 });\n targetPage.drawLine({ start: { x: llx + iconW, y: lly }, end: { x: llx + iconW, y: lly + h }, color: rgb(226 / 255, 232 / 255, 240 / 255), thickness: 1 });\n targetPage.drawSvgPath('M22 6 L22 14 Q22 20 12 24 Q2 20 2 14 L2 6 L12 2 Z', { x: llx + iconW / 2 - 12, y: lly + h / 2 + 12, borderColor: rgb(2 / 255, 132 / 255, 199 / 255), borderWidth: 2, scale: 1 });\n\n if (isSigned) {\n targetPage.drawSvgPath('M7 13 L10 16 L17 8', { x: llx + iconW / 2 - 12, y: lly + h / 2 + 12, borderColor: rgb(2 / 255, 132 / 255, 199 / 255), borderWidth: 2, scale: 1 });\n targetPage.drawText(`Digitally signed by ${signer}`, { x: llx + iconW + 8, y: lly + h - 16, size: 9.5, color: rgb(15 / 255, 23 / 255, 42 / 255) });\n targetPage.drawText(`Date: ${dateStr}`, { x: llx + iconW + 8, y: lly + h - 28, size: 8.5, color: rgb(51 / 255, 65 / 255, 85 / 255) });\n targetPage.drawText(`Reason: ${reason}`, { x: llx + iconW + 8, y: lly + h - 40, size: 8.5, color: rgb(51 / 255, 65 / 255, 85 / 255) });\n } else {\n targetPage.drawText(field.label || 'Digital Signature Placeholder', { x: llx + iconW + 8, y: lly + h / 2 - 4, size: 9.5, color: rgb(100 / 255, 116 / 255, 139 / 255) });\n }\n }\n } catch (e) {\n console.warn(`[teamsync-pdf-viewer] Could not bake form field ${field.name}:`, e);\n }\n }\n }\n\n if (input.watermark?.text) await bakeWatermark(pdfDoc, input.watermark);\n\n const combinedRedactions = input.redactions || [];\n const finalDoc = combinedRedactions.length > 0 ? await rasterizeRedactions(pdfDoc, combinedRedactions) : pdfDoc;\n return await finalDoc.save();\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * XFDF serializer / parser.\n *\n * Writes the subset of XFDF (ISO 32000 + Acrobat/Apryse conventions) that maps onto this viewer's\n * annotation model, and reads anything back. Elements it cannot model become `opaque`\n * annotations that re-export verbatim, and unknown attributes / children of known elements are\n * preserved in `xfdfExtras`, so a document can round-trip through another viewer (Apryse, Acrobat)\n * without losing metadata. Geometry goes through `annotations/geometry.ts`, the single coordinate\n * authority (base page space <-> PDF user space).\n */\nimport type { Annotation, AnnotationInput, AnnotationPoint } from './types';\nimport { newAnnotationId } from './ids';\nimport {\n fmt,\n pathFromPdf,\n pathToPdf,\n quadPointsToRects,\n rectFromPdf,\n rectToPdf,\n rectToQuadPoints,\n unionRects,\n type GeometryResolver,\n type PageGeometry,\n type PdfRect,\n type Point,\n} from './geometry';\n\nexport const XFDF_NS = 'http://ns.adobe.com/xfdf/';\n\nexport interface XfdfExportOptions {\n /** Annotations to serialize (default: all given). */\n annotList?: Annotation[];\n /** Write the author's display name into `title` (default true). */\n useDisplayAuthor?: boolean;\n}\n\n/** Custom data namespace inside Apryse's `trn-custom-data` element (survives an Apryse round-trip). */\nconst CUSTOM_KEY = 'tspdf';\n\n// ---- helpers ----------------------------------------------------------------------------------\n\nconst escapeXml = (s: string): string =>\n s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;').replace(/'/g, '&apos;');\n\nfunction pad(n: number, w = 2): string {\n return String(n).padStart(w, '0');\n}\n\n/** ISO-8601 -> PDF date `D:YYYYMMDDHHmmSS+HH'mm'`. */\nexport function toPdfDate(iso: string | undefined): string {\n const d = iso ? new Date(iso) : new Date();\n if (Number.isNaN(d.getTime())) return toPdfDate(undefined);\n const tz = -d.getTimezoneOffset();\n const sign = tz >= 0 ? '+' : '-';\n const tzh = pad(Math.floor(Math.abs(tz) / 60));\n const tzm = pad(Math.abs(tz) % 60);\n return `D:${d.getFullYear()}${pad(d.getMonth() + 1)}${pad(d.getDate())}${pad(d.getHours())}${pad(d.getMinutes())}${pad(d.getSeconds())}${sign}${tzh}'${tzm}'`;\n}\n\n/** PDF date -> ISO-8601 (best effort; returns undefined when unparseable). */\nexport function fromPdfDate(pdf: string | null | undefined): string | undefined {\n if (!pdf) return undefined;\n const m = /^D:(\\d{4})(\\d{2})?(\\d{2})?(\\d{2})?(\\d{2})?(\\d{2})?([+\\-Z])?(\\d{2})?'?(\\d{2})?/.exec(pdf.trim());\n if (!m) {\n const t = Date.parse(pdf);\n return Number.isNaN(t) ? undefined : new Date(t).toISOString();\n }\n const [, Y, Mo = '01', D = '01', h = '00', mi = '00', s = '00', tzs, tzh = '00', tzm = '00'] = m;\n let offset = '';\n if (tzs === 'Z' || !tzs) offset = 'Z';\n else offset = `${tzs}${tzh}:${tzm}`;\n const t = Date.parse(`${Y}-${Mo}-${D}T${h}:${mi}:${s}${offset}`);\n return Number.isNaN(t) ? undefined : new Date(t).toISOString();\n}\n\nconst toHexColor = (c: string | undefined): string | undefined => {\n if (!c || c === 'transparent') return undefined;\n if (/^#[0-9a-f]{6}$/i.test(c)) return c.toUpperCase();\n if (/^#[0-9a-f]{3}$/i.test(c)) return `#${c[1]}${c[1]}${c[2]}${c[2]}${c[3]}${c[3]}`.toUpperCase();\n return undefined;\n};\n\nconst attr = (name: string, value: string | number | undefined | null): string =>\n value === undefined || value === null || value === '' ? '' : ` ${name}=\"${escapeXml(String(value))}\"`;\n\nfunction customDataElement(data: Record<string, unknown>): string {\n return `<trn-custom-data bytes=\"${escapeXml(JSON.stringify({ [CUSTOM_KEY]: data }))}\"/>`;\n}\n\nfunction readCustomData(el: Element): Record<string, unknown> {\n const node = Array.from(el.children).find((c) => c.localName === 'trn-custom-data');\n if (!node) return {};\n try {\n const parsed = JSON.parse(node.getAttribute('bytes') || '{}');\n const data = parsed?.[CUSTOM_KEY];\n return data && typeof data === 'object' ? data : {};\n } catch {\n return {};\n }\n}\n\nfunction pointsAttr(points: Point[]): string {\n return points.map((p) => `${fmt(p.x)},${fmt(p.y)}`).join(';');\n}\n\nfunction parsePoints(s: string | null): Point[] {\n if (!s) return [];\n return s\n .split(';')\n .map((pair) => pair.trim().split(/[,\\s]+/).map(Number))\n .filter((xy) => xy.length >= 2 && xy.every((n) => Number.isFinite(n)))\n .map(([x, y]) => ({ x, y }));\n}\n\nfunction parseNumbers(s: string | null): number[] {\n if (!s) return [];\n return s.split(/[,\\s]+/).map(Number).filter((n) => Number.isFinite(n));\n}\n\nfunction pdfRectAttr(r: PdfRect): string {\n return r.map(fmt).join(',');\n}\n\n/** Attributes we own on every element (so they are not carried over from `xfdfExtras`). */\nconst OWNED_ATTRS = new Set([\n 'page', 'rect', 'color', 'interior-color', 'width', 'opacity', 'name', 'title', 'subject', 'date',\n 'creationdate', 'flags', 'coords', 'start', 'end', 'head', 'tail', 'icon', 'IT', 'callout', 'style',\n]);\n/** Child elements we own / regenerate. */\nconst OWNED_CHILDREN = new Set(['contents', 'contents-richtext', 'inklist', 'imagedata', 'OnActivation', 'trn-custom-data', 'defaultstyle', 'defaultappearance', 'popup', 'vertices']);\n\n// ---- export -----------------------------------------------------------------------------------\n\nfunction commonAttrs(a: Annotation, g: PageGeometry, useDisplayAuthor: boolean, rectOverride?: PdfRect): string {\n const rect = rectOverride ?? rectToPdf(g, { x: a.x, y: a.y, width: a.width, height: a.height });\n const created = a.createdAt ?? (a.timestamp ? new Date(a.timestamp).toISOString() : undefined);\n const flags = ['print', ...(a.readOnly ? ['readonly', 'locked'] : [])].join(',');\n return (\n attr('page', a.pageIndex - 1) +\n attr('rect', pdfRectAttr(rect)) +\n attr('name', a.id) +\n (useDisplayAuthor ? attr('title', a.author) : '') +\n attr('date', toPdfDate(a.modifiedAt ?? created)) +\n attr('creationdate', toPdfDate(created)) +\n attr('flags', flags) +\n attr('opacity', a.opacity !== undefined && a.opacity !== 1 ? fmt(a.opacity) : undefined)\n );\n}\n\nfunction extraAttrs(a: Annotation): string {\n const attrs = a.xfdfExtras?.attrs;\n if (!attrs) return '';\n return Object.entries(attrs)\n .filter(([k]) => !OWNED_ATTRS.has(k))\n .map(([k, v]) => attr(k, v))\n .join('');\n}\n\nfunction extraChildren(a: Annotation): string {\n return (a.xfdfExtras?.children ?? []).join('');\n}\n\nfunction customData(a: Annotation, extra: Record<string, unknown> = {}): string {\n const data: Record<string, unknown> = { type: a.type, ...extra };\n if (a.authorId) data.authorId = a.authorId;\n if (a.strokeWidth !== undefined) data.strokeWidth = a.strokeWidth;\n return customDataElement(data);\n}\n\nconst contentsElement = (text: string | undefined): string => (text ? `<contents>${escapeXml(text)}</contents>` : '');\n\nconst defaultStyle = (a: Annotation, size: number): string =>\n `<defaultstyle>font: Helvetica ${size}pt; text-align: left; color: ${toHexColor(a.color) ?? '#000000'}</defaultstyle>` +\n `<defaultappearance>0 0 0 rg /Helv ${size} Tf</defaultappearance>`;\n\n/** Serialize one annotation to an XFDF element (no envelope). */\nexport async function annotationToXfdfFragment(a: Annotation, resolve: GeometryResolver, opts: XfdfExportOptions = {}): Promise<string> {\n if (a.type === 'opaque' && a.rawXfdf) return a.rawXfdf;\n const g = await resolve(a.pageIndex);\n const useDisplayAuthor = opts.useDisplayAuthor !== false;\n const color = toHexColor(a.color);\n const strokeAttrs = attr('color', color) + attr('width', a.strokeWidth);\n const common = (rect?: PdfRect) => commonAttrs(a, g, useDisplayAuthor, rect) + extraAttrs(a);\n const tail = (extra: Record<string, unknown> = {}) => customData(a, extra) + extraChildren(a);\n\n switch (a.type) {\n case 'rectangle':\n return `<square${common()}${strokeAttrs}${attr('interior-color', color)} subject=\"Rectangle\">${tail()}</square>`;\n case 'ellipse':\n return `<circle${common()}${strokeAttrs}${attr('interior-color', color)} subject=\"Ellipse\">${tail()}</circle>`;\n case 'line':\n case 'arrow': {\n const pts = a.points && a.points.length >= 2 ? a.points : [{ x: a.x, y: a.y }, { x: a.x + a.width, y: a.y + a.height }];\n const [s, e] = pathToPdf(g, [pts[0], pts[1]]);\n const rect: PdfRect = [Math.min(s.x, e.x), Math.min(s.y, e.y), Math.max(s.x, e.x), Math.max(s.y, e.y)];\n const head = a.type === 'arrow' ? attr('head', 'OpenArrow') : '';\n return `<line${common(rect)}${strokeAttrs} start=\"${fmt(s.x)},${fmt(s.y)}\" end=\"${fmt(e.x)},${fmt(e.y)}\"${head} subject=\"${a.type === 'arrow' ? 'Arrow' : 'Line'}\">${tail()}</line>`;\n }\n case 'freehand': {\n const strokes = a.strokes && a.strokes.length > 0 ? a.strokes : a.points ? [a.points] : [];\n const gestures = strokes.map((st) => `<gesture>${pointsAttr(pathToPdf(g, st))}</gesture>`).join('');\n const all = strokes.flat();\n const bbox = all.length ? rectToPdf(g, boundsOf(all, a.strokeWidth)) : undefined;\n return `<ink${common(bbox)}${strokeAttrs} subject=\"Free Hand\"><inklist>${gestures}</inklist>${tail()}</ink>`;\n }\n case 'highlight':\n case 'underline':\n case 'strikeout':\n case 'squiggly': {\n const rects = a.rects && a.rects.length > 0 ? a.rects : [{ x: a.x, y: a.y, width: a.width, height: a.height }];\n const coords = rects.flatMap((r) => rectToQuadPoints(g, r)).map(fmt).join(',');\n const bbox = rectToPdf(g, unionRects(rects));\n const tag = a.type;\n const subject = a.type === 'highlight' ? 'Highlight' : a.type === 'underline' ? 'Underline' : a.type === 'strikeout' ? 'StrikeOut' : 'Squiggly';\n return `<${tag}${common(bbox)}${attr('color', color)} coords=\"${coords}\" subject=\"${subject}\">${tail()}</${tag}>`;\n }\n case 'text':\n return `<freetext${common()}${attr('color', color)} subject=\"Free Text\">${contentsElement(a.text)}${defaultStyle(a, 16)}${tail()}</freetext>`;\n case 'callout': {\n const pts = a.points && a.points.length >= 2 ? a.points : [{ x: a.x, y: a.y }, { x: a.x, y: a.y }];\n const [s, e] = pathToPdf(g, [pts[0], pts[1]]);\n const boxRect = rectToPdf(g, { x: pts[1].x, y: pts[1].y, width: a.text ? a.text.length * 8 + 20 : 100, height: 24 });\n const bbox: PdfRect = [Math.min(s.x, boxRect[0]), Math.min(s.y, boxRect[1]), Math.max(e.x, boxRect[2]), Math.max(e.y, boxRect[3])];\n return `<freetext${common(bbox)}${strokeAttrs} IT=\"FreeTextCallout\" callout=\"${fmt(s.x)},${fmt(s.y)},${fmt(e.x)},${fmt(e.y)}\" subject=\"Callout\">${contentsElement(a.text)}${defaultStyle(a, 14)}${tail({ box: boxRect })}</freetext>`;\n }\n case 'note':\n return `<text${common(rectToPdf(g, { x: a.x, y: a.y, width: 24, height: 24 }))}${attr('color', color)} icon=\"Comment\" subject=\"Sticky Note\">${contentsElement(a.text)}${tail()}</text>`;\n case 'link': {\n const url = a.linkUrl ?? '';\n const action = url.startsWith('#page=')\n ? `<OnActivation><Action Trigger=\"U\"><GoTo><Dest><Fit Page=\"${Math.max(0, (parseInt(url.slice(6), 10) || 1) - 1)}\"/></Dest></GoTo></Action></OnActivation>`\n : url\n ? `<OnActivation><Action Trigger=\"U\"><URI Name=\"${escapeXml(url)}\"/></Action></OnActivation>`\n : '';\n return `<link${common()}${attr('color', color)} subject=\"Link\">${action}${contentsElement(a.text)}${tail()}</link>`;\n }\n case 'signature':\n return `<stamp${common()} subject=\"Signature\">${a.imageUrl ? `<imagedata>${escapeXml(a.imageUrl)}</imagedata>` : ''}${tail({ signer: a.signer, signType: a.signType, timestamp: a.timestamp })}</stamp>`;\n case 'digital_signature_placeholder':\n return `<stamp${common()} subject=\"Digital Signature\">${tail({ signer: a.signer, timestamp: a.timestamp })}</stamp>`;\n case 'opaque':\n return a.rawXfdf ?? '';\n default:\n return '';\n }\n}\n\nfunction boundsOf(points: AnnotationPoint[], pad = 0) {\n const xs = points.map((p) => p.x);\n const ys = points.map((p) => p.y);\n const half = pad / 2;\n const x = Math.min(...xs) - half;\n const y = Math.min(...ys) - half;\n return { x, y, width: Math.max(...xs) - x + half, height: Math.max(...ys) - y + half };\n}\n\n/** Serialize annotations to a complete XFDF document. */\nexport async function annotationsToXfdf(annotations: Annotation[], resolve: GeometryResolver, opts: XfdfExportOptions = {}): Promise<string> {\n const list = opts.annotList ?? annotations;\n const fragments = await Promise.all(list.map((a) => annotationToXfdfFragment(a, resolve, opts)));\n return (\n `<?xml version=\"1.0\" encoding=\"UTF-8\"?>` +\n `<xfdf xmlns=\"${XFDF_NS}\" xml:space=\"preserve\"><annots>${fragments.filter(Boolean).join('')}</annots></xfdf>`\n );\n}\n\n// ---- import -----------------------------------------------------------------------------------\n\nfunction collectExtras(el: Element): Annotation['xfdfExtras'] {\n const attrs: Record<string, string> = {};\n for (const a of Array.from(el.attributes)) {\n if (!OWNED_ATTRS.has(a.name) && !a.name.startsWith('xmlns')) attrs[a.name] = a.value;\n }\n const children: string[] = [];\n for (const c of Array.from(el.children)) {\n if (!OWNED_CHILDREN.has(c.localName)) children.push(new XMLSerializer().serializeToString(c));\n }\n // Keep Apryse custom data that is not ours (e.g. teamsyncId) verbatim.\n const custom = Array.from(el.children).find((c) => c.localName === 'trn-custom-data');\n if (custom) {\n try {\n const parsed = JSON.parse(custom.getAttribute('bytes') || '{}');\n if (parsed && typeof parsed === 'object') {\n const rest = { ...parsed };\n delete rest[CUSTOM_KEY];\n if (Object.keys(rest).length > 0) {\n children.push(`<trn-custom-data bytes=\"${escapeXml(JSON.stringify(rest))}\"/>`);\n }\n }\n } catch {\n children.push(new XMLSerializer().serializeToString(custom));\n }\n }\n const out: Annotation['xfdfExtras'] = {};\n if (Object.keys(attrs).length) out.attrs = attrs;\n if (children.length) out.children = children;\n return Object.keys(out).length ? out : undefined;\n}\n\nfunction childText(el: Element, name: string): string | undefined {\n const c = Array.from(el.children).find((x) => x.localName === name);\n return c?.textContent ?? undefined;\n}\n\nfunction baseFromElement(el: Element, g: PageGeometry): Omit<AnnotationInput, 'type'> & { id: string } {\n const rectNums = parseNumbers(el.getAttribute('rect'));\n const rect = rectNums.length === 4 ? rectFromPdf(g, [rectNums[0], rectNums[1], rectNums[2], rectNums[3]]) : { x: 0, y: 0, width: 0, height: 0 };\n const custom = readCustomData(el);\n const color = toHexColor(el.getAttribute('color') || el.getAttribute('interior-color') || undefined) ?? '#000000';\n const opacityAttr = el.getAttribute('opacity');\n const opacity = opacityAttr !== null && Number.isFinite(Number(opacityAttr)) ? Number(opacityAttr) : 1;\n const widthAttr = el.getAttribute('width');\n const strokeWidth = typeof custom.strokeWidth === 'number' ? custom.strokeWidth : widthAttr !== null && Number.isFinite(Number(widthAttr)) ? Number(widthAttr) : 1;\n const flags = (el.getAttribute('flags') || '').toLowerCase();\n const readOnly = flags.includes('readonly') || flags.includes('locked');\n return {\n id: el.getAttribute('name') || newAnnotationId(),\n pageIndex: (parseInt(el.getAttribute('page') || '0', 10) || 0) + 1,\n x: rect.x,\n y: rect.y,\n width: rect.width,\n height: rect.height,\n color,\n strokeWidth,\n opacity,\n author: el.getAttribute('title') || undefined,\n authorId: typeof custom.authorId === 'string' ? custom.authorId : undefined,\n createdAt: fromPdfDate(el.getAttribute('creationdate')),\n modifiedAt: fromPdfDate(el.getAttribute('date')),\n readOnly: readOnly || undefined,\n xfdfExtras: collectExtras(el),\n };\n}\n\nfunction elementToAnnotation(el: Element, g: PageGeometry): Annotation | null {\n const kind = el.localName.toLowerCase();\n const custom = readCustomData(el);\n const base = baseFromElement(el, g);\n\n const opaque = (): Annotation => ({\n ...base,\n type: 'opaque',\n opaqueKind: kind,\n rawXfdf: new XMLSerializer().serializeToString(el),\n xfdfExtras: undefined,\n });\n\n switch (kind) {\n case 'square':\n return { ...base, type: 'rectangle' };\n case 'circle':\n return { ...base, type: 'ellipse' };\n case 'line': {\n const s = parseNumbers(el.getAttribute('start'));\n const e = parseNumbers(el.getAttribute('end'));\n const head = (el.getAttribute('head') || 'None').toLowerCase();\n const tailAttr = (el.getAttribute('tail') || 'None').toLowerCase();\n if (s.length < 2 || e.length < 2) return opaque();\n const [ps, pe] = pathFromPdf(g, [{ x: s[0], y: s[1] }, { x: e[0], y: e[1] }]);\n const bounds = boundsOf([ps, pe]);\n const isArrow = head !== 'none' || tailAttr !== 'none';\n return { ...base, ...bounds, type: isArrow ? 'arrow' : 'line', points: [ps, pe] };\n }\n case 'ink': {\n const gestures = Array.from(el.getElementsByTagName('*')).filter((n) => n.localName === 'gesture');\n const strokes = gestures.map((ge) => pathFromPdf(g, parsePoints(ge.textContent))).filter((st) => st.length > 0);\n if (strokes.length === 0) return opaque();\n const all = strokes.flat();\n return { ...base, ...boundsOf(all), type: 'freehand', points: strokes[0], strokes };\n }\n case 'highlight':\n case 'underline':\n case 'strikeout':\n case 'squiggly': {\n const quads = parseNumbers(el.getAttribute('coords'));\n const rects = quads.length >= 8 ? quadPointsToRects(g, quads) : [{ x: base.x, y: base.y, width: base.width, height: base.height }];\n const bbox = unionRects(rects);\n const type = kind as 'highlight' | 'underline' | 'strikeout' | 'squiggly';\n const defaultOpacity = type === 'highlight' ? 0.5 : 1;\n return {\n ...base,\n ...bbox,\n type,\n rects: rects.length > 1 ? rects : undefined,\n opacity: base.opacity === 1 && type === 'highlight' ? 0.5 : (base.opacity ?? defaultOpacity)\n };\n }\n case 'freetext': {\n const text = childText(el, 'contents') ?? '';\n const it = el.getAttribute('IT') || '';\n const callout = parseNumbers(el.getAttribute('callout'));\n if (it === 'FreeTextCallout' || custom.type === 'callout' || callout.length >= 4) {\n const pts = callout.length >= 4 ? pathFromPdf(g, [{ x: callout[0], y: callout[1] }, { x: callout[2], y: callout[3] }]) : [{ x: base.x, y: base.y }, { x: base.x, y: base.y }];\n return { ...base, type: 'callout', text, points: pts, x: pts[1].x, y: pts[1].y, width: Math.max(100, text.length * 8 + 20), height: 30 };\n }\n return { ...base, type: 'text', text, width: Math.max(base.width, 100), height: Math.max(base.height, 30) };\n }\n case 'text':\n return { ...base, type: 'note', text: childText(el, 'contents') ?? '', width: 24, height: 24 };\n case 'link': {\n const uri = Array.from(el.getElementsByTagName('*')).find((n) => n.localName === 'URI');\n const fit = Array.from(el.getElementsByTagName('*')).find((n) => n.localName === 'Fit' || n.localName === 'XYZ' || n.localName === 'FitH');\n let linkUrl = uri?.getAttribute('Name') ?? '';\n if (!linkUrl && fit) linkUrl = `#page=${(parseInt(fit.getAttribute('Page') || '0', 10) || 0) + 1}`;\n return { ...base, type: 'link', linkUrl, text: childText(el, 'contents') ?? '', color: 'transparent', strokeWidth: 0, opacity: 1, points: [] };\n }\n case 'stamp': {\n const image = childText(el, 'imagedata');\n if (custom.type === 'digital_signature_placeholder') {\n return { ...base, type: 'digital_signature_placeholder', signer: typeof custom.signer === 'string' ? custom.signer : undefined, timestamp: typeof custom.timestamp === 'number' ? custom.timestamp : undefined };\n }\n if (image) {\n return { ...base, type: 'signature', imageUrl: image, signer: typeof custom.signer === 'string' ? custom.signer : undefined, timestamp: typeof custom.timestamp === 'number' ? custom.timestamp : undefined };\n }\n return opaque();\n }\n default:\n return opaque();\n }\n}\n\n/**\n * Parse an XFDF document OR bare annotation elements (a concatenation of fragments) into\n * annotations. Unknown elements become `opaque` (re-exported verbatim).\n */\n/** Remove every `<?xml … ?>` declaration (linear scan — no regex backtracking on hostile input). */\nfunction stripXmlDeclarations(input: string): string {\n let out = '';\n let pos = 0;\n for (;;) {\n const start = input.indexOf('<?xml', pos);\n if (start === -1) break;\n const end = input.indexOf('?>', start + 5);\n if (end === -1) break;\n out += input.slice(pos, start);\n pos = end + 2;\n }\n return out + input.slice(pos);\n}\n\nexport async function parseXfdf(xml: string, resolve: GeometryResolver): Promise<Annotation[]> {\n // Hosts may store one full XFDF document per annotation and concatenate them inside an\n // envelope, so XML declarations can appear anywhere and <xfdf>/<annots> wrappers can nest.\n // Strip every declaration and collect annotation elements from every <annots> at any depth.\n const cleaned = stripXmlDeclarations(xml).trim();\n if (!cleaned) return [];\n // XFDF never carries a DTD; refuse one outright (entity expansion / external entity tricks).\n if (/<!DOCTYPE|<!ENTITY/i.test(cleaned)) {\n throw new Error('[teamsync-pdf-viewer] invalid XFDF: DOCTYPE/ENTITY declarations are not allowed');\n }\n // Parsed as application/xml: the parser is inert (no script execution, no resource loading)\n // and the resulting DOM is only read as data.\n const wrapped = `<xfdf xmlns=\"${XFDF_NS}\"><annots>${cleaned}</annots></xfdf>`;\n const doc = new DOMParser().parseFromString(wrapped, 'application/xml');\n const error = doc.getElementsByTagName('parsererror')[0];\n if (error) throw new Error(`[teamsync-pdf-viewer] invalid XFDF: ${error.textContent?.slice(0, 200)}`);\n\n const WRAPPERS = new Set(['xfdf', 'annots', 'fields', 'f', 'ids']);\n const elements = Array.from(doc.getElementsByTagName('*')).filter(\n (n) => n.parentElement?.localName === 'annots' && !WRAPPERS.has(n.localName)\n );\n const out: Annotation[] = [];\n for (const el of elements) {\n const page = (parseInt(el.getAttribute('page') || '0', 10) || 0) + 1;\n const g = await resolve(page);\n const ann = elementToAnnotation(el, g);\n if (ann) out.push(ann);\n }\n return out;\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * AnnotationManager — the canonical annotation list of a viewer instance.\n *\n * Responsibilities:\n * - single source of truth for the annotation list (React reads it via subscribe/getSnapshot)\n * - undo / redo history for user edits\n * - granular `annotationChanged` events (`add` | `modify` | `delete`, with an `imported` flag)\n * mirroring Apryse's annotationManager so host persistence bridges are near drop-in\n * - authorship stamping and edit permissions (read-only viewer, read-only annotation, other\n * author's annotation) enforced centrally in `commit()`\n * - XFDF import / export through `annotations/xfdf.ts` + `annotations/geometry.ts`\n */\nimport type { PDFDocumentProxy } from 'pdfjs-dist';\nimport type { Annotation, AnnotationInput } from './types';\nimport { newAnnotationId } from './ids';\nimport { createGeometryResolver, type GeometryResolver } from './geometry';\nimport { annotationsToXfdf, annotationToXfdfFragment, parseXfdf, type XfdfExportOptions } from './xfdf';\n\nexport type AnnotationAction = 'add' | 'modify' | 'delete';\n\nexport interface AnnotationChangedEvent {\n annotations: Annotation[];\n action: AnnotationAction;\n /** True when the change came from importAnnotations()/programmatic APIs flagged as imported. */\n imported: boolean;\n}\n\nexport interface CommitOptions {\n /** Mark the change as an import round-trip (not persisted by host bridges, not undoable). */\n imported?: boolean;\n /** Bypass read-only / authorship checks (programmatic host operations). */\n force?: boolean;\n /** Record in the undo history (default: true unless imported). */\n undoable?: boolean;\n}\n\nexport interface ViewerUserInfo {\n id?: string;\n name?: string;\n}\n\ntype ChangedListener = (event: AnnotationChangedEvent) => void;\n\n/** One undoable user action, recorded as the operations it performed (not a snapshot), so undo\n * and redo leave annotations imported in between untouched. */\ninterface HistoryEntry {\n added: Annotation[];\n modified: Array<{ before: Annotation; after: Annotation }>;\n deleted: Annotation[];\n}\n\nconst MAX_HISTORY = 100;\nconst nowIso = () => new Date().toISOString();\n\nexport class AnnotationManager {\n private list: Annotation[] = [];\n private past: HistoryEntry[] = [];\n private future: HistoryEntry[] = [];\n private changedListeners = new Set<ChangedListener>();\n private listListeners = new Set<() => void>();\n private user: ViewerUserInfo = {};\n private readOnly = false;\n private canEditOthers = false;\n private resolver: GeometryResolver | null = null;\n\n // ---- document / user / permissions ------------------------------------------------------\n\n setDocument(doc: PDFDocumentProxy | null): void {\n this.resolver = doc ? createGeometryResolver(doc) : null;\n }\n\n hasDocument(): boolean {\n return this.resolver !== null;\n }\n\n setCurrentUser(name: string, id?: string): void {\n this.user = { name, id: id ?? this.user.id };\n }\n\n setCurrentUserInfo(user: ViewerUserInfo | undefined): void {\n this.user = { ...(user ?? {}) };\n }\n\n getCurrentUser(): string {\n return this.user.name ?? '';\n }\n\n getCurrentUserInfo(): ViewerUserInfo {\n return { ...this.user };\n }\n\n setReadOnly(readOnly: boolean): void {\n this.readOnly = readOnly;\n }\n\n isReadOnly(): boolean {\n return this.readOnly;\n }\n\n /** Allow editing/deleting annotations authored by other users (default false). */\n setCanEditOthers(value: boolean): void {\n this.canEditOthers = value;\n }\n\n /** Whether the current user may modify or delete this annotation through the UI. */\n canEdit(a: Annotation): boolean {\n if (this.readOnly || a.readOnly || a.type === 'opaque') return false;\n if (this.canEditOthers) return true;\n if (!a.authorId && !a.author) return true; // unattributed (legacy / local draft)\n if (a.authorId) return Boolean(this.user.id) && a.authorId === this.user.id;\n return Boolean(this.user.name) && a.author === this.user.name;\n }\n\n canAdd(): boolean {\n return !this.readOnly;\n }\n\n // ---- reading --------------------------------------------------------------------------------\n\n /** The current list. The array reference is stable until the next change. */\n getAnnotationsList(): Annotation[] {\n return this.list;\n }\n\n getAnnotationById(id: string): Annotation | undefined {\n return this.list.find((a) => a.id === id);\n }\n\n /** React `useSyncExternalStore` pair. */\n subscribe = (listener: () => void): (() => void) => {\n this.listListeners.add(listener);\n return () => { this.listListeners.delete(listener); };\n };\n\n getSnapshot = (): Annotation[] => this.list;\n\n addEventListener(type: 'annotationChanged', listener: ChangedListener): () => void {\n if (type !== 'annotationChanged') return () => {};\n this.changedListeners.add(listener);\n return () => this.removeEventListener(type, listener);\n }\n\n removeEventListener(type: 'annotationChanged', listener: ChangedListener): void {\n if (type !== 'annotationChanged') return;\n this.changedListeners.delete(listener);\n }\n\n /** Apryse-compat no-op: React re-renders from the list. */\n drawAnnotationsFromList(_annotations: Annotation[]): void {}\n\n // ---- history --------------------------------------------------------------------------------\n\n get canUndo(): boolean {\n return this.past.length > 0;\n }\n\n get canRedo(): boolean {\n return this.future.length > 0;\n }\n\n undo(): boolean {\n const entry = this.past.pop();\n if (!entry) return false;\n const addedIds = new Set(entry.added.map((a) => a.id));\n const before = new Map(entry.modified.map((m) => [m.after.id, m.before]));\n const next = this.list.filter((a) => !addedIds.has(a.id)).map((a) => before.get(a.id) ?? a);\n for (const d of entry.deleted) if (!next.some((a) => a.id === d.id)) next.push(d);\n this.future.unshift(entry);\n this.apply(next, { force: true, undoable: false, imported: false, keepHistory: true });\n return true;\n }\n\n redo(): boolean {\n const entry = this.future.shift();\n if (!entry) return false;\n const deletedIds = new Set(entry.deleted.map((a) => a.id));\n const after = new Map(entry.modified.map((m) => [m.before.id, m.after]));\n const next = this.list.filter((a) => !deletedIds.has(a.id)).map((a) => after.get(a.id) ?? a);\n for (const ad of entry.added) if (!next.some((a) => a.id === ad.id)) next.push(ad);\n this.past.push(entry);\n this.apply(next, { force: true, undoable: false, imported: false, keepHistory: true });\n return true;\n }\n\n // ---- mutation ---------------------------------------------------------------------------------\n\n /**\n * Replace the whole list (the UI's edit path). Diffs against the current list, enforces\n * permissions (rejected edits keep the previous version), records history and emits one\n * `annotationChanged` event per action.\n */\n commit(next: Annotation[], opts: CommitOptions = {}): Annotation[] {\n return this.apply(next, { ...opts, keepHistory: false });\n }\n\n addAnnotations(inputs: AnnotationInput[], opts: CommitOptions = {}): Annotation[] {\n const withIds = inputs.map((i) => ({ ...i, id: i.id ?? newAnnotationId() }) as Annotation);\n this.commit([...this.list, ...withIds], opts);\n return withIds.map((a) => this.getAnnotationById(a.id)).filter((a): a is Annotation => Boolean(a));\n }\n\n updateAnnotation(id: string, patch: Partial<AnnotationInput>, opts: CommitOptions = {}): Annotation | undefined {\n const existing = this.getAnnotationById(id);\n if (!existing) return undefined;\n this.commit(this.list.map((a) => (a.id === id ? { ...a, ...patch, id } : a)), opts);\n return this.getAnnotationById(id);\n }\n\n deleteAnnotations(targets: Array<Annotation | string>, opts: CommitOptions = {}): void {\n const ids = new Set(targets.map((t) => (typeof t === 'string' ? t : t.id)));\n this.commit(this.list.filter((a) => !ids.has(a.id)), opts);\n }\n\n /** Remove every annotation (e.g. on document switch). Not undoable, emits deletes as imported. */\n clear(): void {\n this.past = [];\n this.future = [];\n this.apply([], { imported: true, force: true, undoable: false, keepHistory: false });\n }\n\n // ---- XFDF -------------------------------------------------------------------------------------\n\n /**\n * Import an XFDF document or bare fragments. Annotations whose `name` already exists are\n * replaced (modify), new ones added; the change is flagged `imported` and is not undoable.\n * Returns the imported annotations as they now exist in the list.\n */\n async importAnnotations(xfdf: string): Promise<Annotation[]> {\n const resolver = this.requireResolver();\n const parsed = await parseXfdf(xfdf, resolver);\n if (parsed.length === 0) return [];\n const incoming = new Map(parsed.map((a) => [a.id, a]));\n const merged = this.list.map((a) => incoming.get(a.id) ?? a);\n for (const a of parsed) if (!this.list.some((x) => x.id === a.id)) merged.push(a);\n this.commit(merged, { imported: true, force: true, undoable: false });\n return parsed.map((a) => this.getAnnotationById(a.id)).filter((a): a is Annotation => Boolean(a));\n }\n\n /**\n * Export as XFDF. With `annotList`, returns the bare fragment(s) for those annotations (the\n * form hosts persist per annotation); without it, a complete XFDF document.\n */\n async exportAnnotations(opts: XfdfExportOptions = {}): Promise<string> {\n const resolver = this.requireResolver();\n if (opts.annotList) {\n const parts = await Promise.all(opts.annotList.map((a) => annotationToXfdfFragment(a, resolver, opts)));\n return parts.join('');\n }\n return annotationsToXfdf(this.list, resolver, opts);\n }\n\n /** Legacy bespoke JSON export (pre-1.2 `exportAnnotations()` shape). */\n exportAnnotationsLegacyJson(): string {\n return JSON.stringify(this.list, null, 2);\n }\n\n // ---- internals ----------------------------------------------------------------------------------\n\n private requireResolver(): GeometryResolver {\n if (!this.resolver) throw new Error('[teamsync-pdf-viewer] no document loaded — XFDF needs page geometry');\n return this.resolver;\n }\n\n private apply(next: Annotation[], opts: CommitOptions & { keepHistory: boolean }): Annotation[] {\n const prev = this.list;\n const imported = Boolean(opts.imported);\n const force = Boolean(opts.force);\n const prevById = new Map(prev.map((a) => [a.id, a]));\n const nextIds = new Set(next.map((a) => a.id));\n\n const added: Annotation[] = [];\n const modified: Annotation[] = [];\n const modifiedPairs: Array<{ before: Annotation; after: Annotation }> = [];\n const deleted: Annotation[] = [];\n const finalList: Annotation[] = [];\n\n for (const a of next) {\n const p = prevById.get(a.id);\n if (!p) {\n if (!imported && !force && this.readOnly) continue; // reject: viewer is read-only\n const stamped = this.stampNew(a, imported);\n added.push(stamped);\n finalList.push(stamped);\n } else if (p !== a) {\n if (!imported && !force && !this.canEdit(p)) {\n finalList.push(p); // reject the edit, keep the previous version\n continue;\n }\n const m: Annotation = imported ? a : { ...a, modifiedAt: nowIso() };\n modified.push(m);\n modifiedPairs.push({ before: p, after: m });\n finalList.push(m);\n } else {\n finalList.push(a);\n }\n }\n for (const p of prev) {\n if (nextIds.has(p.id)) continue;\n if (!imported && !force && !this.canEdit(p)) {\n finalList.push(p); // reject the deletion\n continue;\n }\n deleted.push(p);\n }\n\n if (added.length === 0 && modified.length === 0 && deleted.length === 0) {\n // Nothing effectively changed (all edits rejected or identical list): keep the reference.\n return this.list;\n }\n\n if (!opts.keepHistory && (opts.undoable ?? !imported)) {\n this.past.push({ added, modified: modifiedPairs, deleted });\n if (this.past.length > MAX_HISTORY) this.past.shift();\n this.future = [];\n }\n\n this.list = finalList;\n for (const l of Array.from(this.listListeners)) {\n try { l(); } catch (err) { console.error('[teamsync-pdf-viewer] list listener threw', err); }\n }\n if (added.length) this.emit({ annotations: added, action: 'add', imported });\n if (modified.length) this.emit({ annotations: modified, action: 'modify', imported });\n if (deleted.length) this.emit({ annotations: deleted, action: 'delete', imported });\n return this.list;\n }\n\n private stampNew(a: Annotation, imported: boolean): Annotation {\n if (imported) return a;\n const created = a.createdAt ?? nowIso();\n return {\n ...a,\n author: a.author ?? this.user.name,\n authorId: a.authorId ?? this.user.id,\n createdAt: created,\n modifiedAt: a.modifiedAt ?? created,\n };\n }\n\n private emit(event: AnnotationChangedEvent): void {\n for (const l of Array.from(this.changedListeners)) {\n try { l(event); } catch (err) { console.error('[teamsync-pdf-viewer] annotationChanged listener threw', err); }\n }\n }\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * WebViewerInstance — the imperative handle returned by `createWebViewer()` and exposed through\n * `<TeamSyncViewer ref>`. Keeps the legacy `UI` / `Core` facade for drop-in compatibility.\n */\nimport type React from 'react';\nimport type * as pdfjsLib from 'pdfjs-dist';\nimport { ViewerBus } from './eventBus';\nimport { buildPdfBytes, type ExportOptions } from './export';\nimport type { Annotation } from '../annotations/types';\nimport { AnnotationManager } from '../annotations/AnnotationManager';\nimport { createGeometryResolver } from '../annotations/geometry';\nimport type { Redaction, WatermarkOptions, ViewerEventMap, ViewerEventType, TransientHighlight, ViewerUser } from './types';\nimport { searchPdfText, type SearchResult } from '../hooks/usePdfSearch';\nimport { copyTextToClipboard } from '../utils/clipboardUtils';\nimport { FormManager } from '../forms/FormManager';\nimport type {\n FormField,\n FormDataRecord,\n FormValidationResult,\n FormRole,\n FormFeatureOptions,\n} from '../forms/types';\n\n/** Options passed to `instance.loadDocument(url, options)`. */\nexport interface LoadDocumentOptions {\n page?: number;\n initialPage?: number;\n /**\n * Custom HTTP headers sent with every document request (e.g. Authorization: Bearer <token>).\n * Passed directly to the underlying PDF.js engine.\n */\n httpHeaders?: Record<string, string>;\n /**\n * Alias for `httpHeaders` providing an alternative headers option.\n */\n customHeaders?: Record<string, string>;\n /**\n * Maximum number of bytes fetched per HTTP 206 range request.\n * Default is 65536 (= 64 KB).\n */\n rangeChunkSize?: number;\n /**\n * Disable chunked streaming of PDF file data.\n * Default is false.\n */\n disableStream?: boolean;\n /**\n * Disable automatic background pre-fetching of remaining PDF file chunks when range requests are enabled.\n * When true, only pages explicitly navigated to are fetched.\n * Automatically disables streaming as required by the underlying PDF.js engine.\n * Default is false.\n */\n disableAutoFetch?: boolean;\n /**\n * Disable HTTP 206 range requests entirely, forcing the full PDF to download.\n * Default is false.\n */\n disableRange?: boolean;\n /** Send cookies with the document request (same-origin session-bound URLs). Default false. */\n withCredentials?: boolean;\n /** Password for password-protected PDFs. */\n password?: string;\n}\n\n/** Callbacks the React component installs so the instance can reach live state. */\nexport interface ViewerBinding {\n getAnnotations(): Annotation[];\n getRedactions(): Redaction[];\n getWatermark(): WatermarkOptions | undefined;\n getPdfDocument(): pdfjsLib.PDFDocumentProxy | null;\n getDocumentUrl(): string | undefined;\n getFileName(): string | undefined;\n getCurrentUserName(): string | undefined;\n getCurrentPage(): number;\n getPageCount(): number;\n loadDocument(url: string, options?: LoadDocumentOptions): void;\n goToPage(pageNumber: number, options?: { smooth?: boolean }): void;\n getTransientHighlights(): TransientHighlight[];\n setTransientHighlights(highlights: TransientHighlight[]): void;\n}\n\nconst noBinding = (): never => {\n throw new Error('[teamsync-pdf-viewer] viewer is not mounted (was destroy() called?)');\n};\n\nexport class WebViewerInstance {\n private static instances = new Map<string, WebViewerInstance>();\n\n /** Retrieve a registered WebViewerInstance by its ID. */\n static getInstance(id: string): WebViewerInstance | undefined {\n return WebViewerInstance.instances.get(id);\n }\n\n /** Register a WebViewerInstance with an ID. */\n static registerInstance(id: string, instance: WebViewerInstance): void {\n WebViewerInstance.instances.set(id, instance);\n }\n\n /** Unregister an instance by its ID. */\n static unregisterInstance(id: string): void {\n WebViewerInstance.instances.delete(id);\n }\n\n /** Clear all registered instances (primarily for testing). */\n static clearInstances(): void {\n WebViewerInstance.instances.clear();\n }\n\n readonly bus: ViewerBus;\n /** Annotation list, history, permissions and XFDF import/export. */\n readonly annotationManager: AnnotationManager;\n /** Form fields schema, values, validation, and history. */\n readonly formManager: FormManager;\n /** Root element of the viewer once mounted. */\n element: HTMLElement | null = null;\n /** Unique identifier for this instance. */\n id?: string;\n\n private binding: ViewerBinding | null = null;\n private unmountRoot: (() => void) | null = null;\n private destroyed = false;\n private targetViewerTarget:\n | WebViewerInstance\n | React.RefObject<WebViewerInstance | null>\n | (() => WebViewerInstance | null)\n | string\n | null = null;\n\n constructor(\n bus: ViewerBus,\n annotationManager: AnnotationManager = new AnnotationManager(),\n id?: string,\n formManager: FormManager = new FormManager()\n ) {\n this.bus = bus;\n this.annotationManager = annotationManager;\n this.formManager = formManager;\n if (id) {\n this.id = id;\n WebViewerInstance.registerInstance(id, this);\n }\n }\n\n /** Sets the target viewer instance, ref, getter, or ID to receive cross-document links. */\n setTargetViewer(\n target:\n | WebViewerInstance\n | React.RefObject<WebViewerInstance | null>\n | (() => WebViewerInstance | null)\n | string\n | null\n ): void {\n this.targetViewerTarget = target;\n }\n\n /** Resolves the target viewer instance if configured. */\n getTargetViewer(): WebViewerInstance | null {\n const t = this.targetViewerTarget;\n if (!t) return null;\n if (typeof t === 'string') {\n return WebViewerInstance.getInstance(t) ?? null;\n }\n if (typeof t === 'function') {\n return t();\n }\n if (typeof t === 'object' && 'current' in t) {\n return t.current;\n }\n return t;\n }\n\n // ---- lifecycle -------------------------------------------------------------------------\n\n /** @internal */\n _bind(binding: ViewerBinding, element: HTMLElement | null): void {\n this.binding = binding;\n this.element = element;\n }\n\n /** @internal */\n _unbind(): void {\n this.binding = null;\n }\n\n /** @internal — installed by createWebViewer() so destroy() can unmount the React root. */\n _setUnmount(fn: () => void): void {\n this.unmountRoot = fn;\n }\n\n get isDestroyed(): boolean {\n return this.destroyed;\n }\n\n get isMounted(): boolean {\n return this.binding !== null;\n }\n\n /**\n * Tear the viewer down: unmounts the React tree created by `createWebViewer()`, drops every\n * listener and refuses further use. Safe to call twice.\n */\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n if (this.id) {\n WebViewerInstance.unregisterInstance(this.id);\n }\n try {\n this.bus.emit('destroy', {});\n } finally {\n const unmount = this.unmountRoot;\n this.unmountRoot = null;\n this.binding = null;\n this.element = null;\n this.bus.destroy();\n if (unmount) {\n // React refuses synchronous unmounts from inside its own render/commit phase.\n Promise.resolve().then(unmount);\n }\n }\n }\n\n // ---- events ----------------------------------------------------------------------------\n\n on<K extends ViewerEventType>(type: K, listener: (detail: ViewerEventMap[K]) => void): () => void {\n return this.bus.on(type, listener as (d: unknown) => void);\n }\n\n off<K extends ViewerEventType>(type: K, listener: (detail: ViewerEventMap[K]) => void): void {\n this.bus.off(type, listener as (d: unknown) => void);\n }\n\n // ---- document --------------------------------------------------------------------------\n\n /** Load (or reload) a document by URL. Resolves when loaded, rejects on load error. */\n loadDocument(\n url: string,\n options?: LoadDocumentOptions\n ): Promise<{ url: string; numPages: number }> {\n const b = this.binding ?? noBinding();\n const targetPage = options?.page ?? options?.initialPage;\n return new Promise((resolve, reject) => {\n const offLoaded = this.bus.on<ViewerEventMap['documentLoaded']>('documentLoaded', (d) => {\n if (d.url !== url) return;\n cleanup();\n if (targetPage && targetPage > 0) {\n setTimeout(() => {\n try {\n this.goToPage(targetPage, { smooth: true });\n } catch {}\n }, 50);\n }\n resolve(d);\n });\n const offError = this.bus.on<ViewerEventMap['documentLoadError']>('documentLoadError', (d) => {\n if (d.url !== url) return;\n cleanup();\n reject(d.error);\n });\n const cleanup = () => {\n offLoaded();\n offError();\n };\n b.loadDocument(url, options);\n });\n }\n\n /**\n * Loads a document or navigates to a page within it. If the document is already loaded,\n * directly navigates to the requested page without reloading.\n */\n async loadOrNavigate(\n url: string,\n options?: LoadDocumentOptions\n ): Promise<{ url: string; numPages: number } | void> {\n const targetPage = options?.page ?? options?.initialPage;\n if (this.getDocumentUrl() === url) {\n if (targetPage && targetPage > 0) {\n this.goToPage(targetPage, { smooth: true });\n }\n return;\n }\n return this.loadDocument(url, options);\n }\n\n /**\n * Programmatically trigger link following for a given link URL or target,\n * routing through targetViewer or opening appropriately.\n */\n openLink(linkUrl: string): void {\n this.bus.emit('action-open-link', { url: linkUrl });\n }\n\n getDocumentUrl(): string | undefined {\n return this.binding?.getDocumentUrl();\n }\n\n getPdfDocument(): pdfjsLib.PDFDocumentProxy | null {\n return this.binding?.getPdfDocument() ?? null;\n }\n\n getCurrentPage(): number {\n return this.binding?.getCurrentPage() ?? 0;\n }\n\n getPageCount(): number {\n return this.binding?.getPageCount() ?? 0;\n }\n\n /** Navigate to a specific page number (1-based). */\n goToPage(pageNumber: number, options: { smooth?: boolean } = {}): void {\n const b = this.binding;\n if (b) {\n b.goToPage(pageNumber, options);\n } else {\n this.bus.emit('action-go-to-page', { page: pageNumber, smooth: options.smooth });\n }\n }\n\n /** Set the current page number (1-based). Alias of goToPage. */\n setCurrentPage(pageNumber: number): void {\n this.goToPage(pageNumber);\n }\n\n /**\n * Scale the document to fit the container width.\n *\n * @param ratio - Optional width ratio fraction (e.g. `0.7` for 70% of available width).\n * Defaults to `1.0` (100% full-width fit).\n */\n fitWidth(ratio?: number): void {\n this.bus.emit('action-fit-to-width', typeof ratio === 'number' ? { ratio } : undefined);\n }\n\n /** Alias of `fitWidth`. */\n fitToWidth(ratio?: number): void {\n this.fitWidth(ratio);\n }\n\n /** Scale the document to fit the entire page within the container viewport. */\n fitPage(): void {\n this.bus.emit('action-fit-to-page');\n }\n\n /** Alias of `fitPage`. */\n fitToPage(): void {\n this.fitPage();\n }\n\n /**\n * Search the document for text matches, returning snippets and page bounding boxes.\n *\n * @param query - Search term.\n * @param options - Search options:\n * - `pages`: Specific 1-based page numbers to search. Defaults to all pages.\n */\n async searchText(query: string, options: { pages?: number[] } = {}): Promise<SearchResult[]> {\n const pdf = this.getPdfDocument();\n if (!pdf) return [];\n const b = this.binding;\n const redactions = b ? b.getRedactions() : [];\n return searchPdfText(pdf, query, redactions, undefined, options.pages);\n }\n\n // ---- transient highlights (citations, search matches) -----------------------------------\n\n /** Get the current list of transient highlights. */\n getTransientHighlights(): TransientHighlight[] {\n return this.binding?.getTransientHighlights() ?? [];\n }\n\n /**\n * Set transient visual highlights across one or more pages.\n * These render directly on the PDF canvas but are NEVER saved into AnnotationManager\n * or exported to XFDF.\n */\n setTransientHighlights(highlights: TransientHighlight[]): void {\n const b = this.binding;\n if (b) {\n b.setTransientHighlights(highlights);\n } else {\n this.bus.emit('action-set-transient-highlights', { highlights });\n }\n this.bus.emit('transientHighlightsChanged', { highlights });\n }\n\n /** Add a single transient highlight to the current list. */\n addTransientHighlight(highlight: TransientHighlight): void {\n const current = this.getTransientHighlights();\n this.setTransientHighlights([...current, highlight]);\n }\n\n /** Clear all active transient highlights. */\n clearTransientHighlights(): void {\n this.setTransientHighlights([]);\n }\n\n /**\n * Search for a snippet or citation query, scroll to its page, and highlight it temporarily.\n * Returns the matched SearchResult or null if not found.\n *\n * @param query - The text snippet to locate and highlight.\n * @param options - Navigation and display options:\n * - `pageIndex`: Preferred page (1-based). When `scope: 'page'`, restricts search to this page.\n * - `scope`: Search scope. `'document'` (default) searches all pages, keeping `pageIndex` as a preference.\n * `'page'` restricts the search strictly to `pageIndex` (avoids full-document walk).\n * If `scope: 'page'` is provided without `pageIndex`, it gracefully degrades to `'document'`.\n * - `pulse`: Animate focus ring (default true).\n * - `scrollTo`: Scroll page into view (default true).\n * - `color`: Background highlight color.\n * - `tooltip`: Tooltip text above the highlight (defaults to matched snippet).\n */\n async highlightSnippet(\n query: string,\n options: {\n pageIndex?: number;\n scope?: 'document' | 'page';\n pulse?: boolean;\n scrollTo?: boolean;\n color?: string;\n tooltip?: string;\n } = {}\n ): Promise<SearchResult | null> {\n const searchOptions: { pages?: number[] } = {};\n if (options.scope === 'page' && options.pageIndex) {\n searchOptions.pages = [options.pageIndex];\n }\n const results = await this.searchText(query, searchOptions);\n let match = results[0];\n if (options.pageIndex) {\n match = results.find(r => r.pageIndex === options.pageIndex) || match;\n }\n if (!match) return null;\n\n const highlight: TransientHighlight = {\n id: match.id,\n pageIndex: match.pageIndex,\n bounds: match.bounds,\n color: options.color || 'rgba(250, 204, 21, 0.45)',\n borderColor: 'rgba(234, 179, 8, 0.85)',\n pulse: options.pulse !== false,\n tooltip: options.tooltip || match.snippet,\n };\n\n this.setTransientHighlights([highlight]);\n\n if (options.scrollTo !== false) {\n this.goToPage(match.pageIndex, { smooth: true });\n }\n\n return match;\n }\n\n // ---- annotations / export --------------------------------------------------------------\n\n getAnnotations(): Annotation[] {\n return this.annotationManager.getAnnotationsList();\n }\n\n /** Get the current list of redactions (pending and applied). */\n getRedactions(): Redaction[] {\n return this.binding?.getRedactions() ?? [];\n }\n\n /** Print the exported document (annotations, redactions and watermark baked in). */\n print(): void {\n this.bus.emit('action-print');\n }\n\n // ---- Forms API ------------------------------------------------------------------------\n\n /** Returns all defined form fields across all pages. */\n getFormFields(): FormField[] {\n return this.formManager.getFields();\n }\n\n /** Sets the form fields schema. */\n setFormFields(fields: FormField[]): void {\n this.formManager.setFields(fields);\n }\n\n /** Returns current filled form data values. */\n getFormData(): FormDataRecord {\n return this.formManager.getValues();\n }\n\n /** Sets current filled form data values. */\n setFormData(data: FormDataRecord): void {\n this.formManager.setValues(data);\n }\n\n /** Clears all filled form data values. */\n clearFormData(): void {\n this.formManager.clearValues();\n }\n\n /** Validates all required form fields (or only those assigned to the specified role). */\n validateForm(roleId?: string | null): FormValidationResult {\n return this.formManager.validate(roleId);\n }\n\n /** Exports filled form data as a JSON string. */\n async exportFormData(_format: 'json' = 'json'): Promise<string> {\n return this.formManager.exportDataJson();\n }\n\n /** Imports form data from a record object or JSON string. */\n importFormData(data: FormDataRecord | string): void {\n if (typeof data === 'string') {\n this.formManager.importDataJson(data);\n } else {\n this.formManager.setValues(data);\n }\n }\n\n /** Returns all configured form template roles. */\n getFormRoles(): FormRole[] {\n return this.formManager.getRoles();\n }\n\n /** Sets the list of form template roles. */\n setFormRoles(roles: FormRole[]): void {\n this.formManager.setRoles(roles);\n }\n\n /** Adds a new form template role. */\n addFormRole(role: FormRole): void {\n this.formManager.addRole(role);\n }\n\n /** Updates an existing form template role. */\n updateFormRole(id: string, updates: Partial<Omit<FormRole, 'id'>>): void {\n this.formManager.updateRole(id, updates);\n }\n\n /** Removes a form template role and unbinds any fields associated with it. */\n removeFormRole(id: string): void {\n this.formManager.removeRole(id);\n }\n\n /** Returns the active form role ID (or null for all). */\n getCurrentRole(): string | null {\n return this.formManager.getCurrentRole();\n }\n\n /** Sets the active form role ID (or null for all). */\n setCurrentRole(roleId: string | null): void {\n this.formManager.setCurrentRole(roleId);\n }\n\n /** Returns the current logged-in user details passed by the host application. */\n getCurrentUser(): ViewerUser | null {\n return this.formManager.getCurrentUser();\n }\n\n /**\n * Sets the current logged-in user details passed by the host application.\n * If the user specifies a role, that role is automatically activated in the viewer.\n */\n setCurrentUser(user: ViewerUser | null): void {\n this.formManager.setCurrentUser(user);\n }\n\n /** Returns current form feature options and visibility rules. */\n getFormOptions(): FormFeatureOptions {\n return this.formManager.getOptions();\n }\n\n /**\n * Programmatically sets form feature options.\n * Controls what form features are visible and interactive for the user\n * (e.g. allowUserSwitching, showSignatureFlags, showFlowNavigation, otherUserFieldsMode, etc.).\n */\n setFormOptions(options: Partial<FormFeatureOptions>): void {\n this.formManager.setOptions(options);\n }\n\n /** Advances focus to the next form field in the sequence. */\n nextFormField(roleId?: string | null): FormField | null {\n return this.formManager.goToNextField(roleId);\n }\n\n /** Moves focus to the previous form field in the sequence. */\n previousFormField(roleId?: string | null): FormField | null {\n return this.formManager.goToPreviousField(roleId);\n }\n\n /** Focuses a specific form field by ID. */\n focusFormField(fieldId: string): void {\n this.formManager.setActiveFieldId(fieldId);\n }\n\n /**\n * Build the exported PDF (annotations + watermark baked, redacted pages rasterized).\n * Uses the bytes of the loaded document; never re-fetches the URL.\n */\n async getFileData(options: ExportOptions = {}): Promise<Uint8Array> {\n const b = this.binding ?? noBinding();\n const pdf = b.getPdfDocument();\n const url = b.getDocumentUrl();\n if (!pdf && !url) throw new Error('No document loaded');\n\n const getSourceBytes = async () => {\n if (pdf) return pdf.getData();\n const response = await fetch(url as string);\n if (!response.ok) throw new Error(`Failed to fetch document (${response.status})`);\n return response.arrayBuffer();\n };\n\n return buildPdfBytes(\n {\n getSourceBytes,\n getPageGeometry: pdf ? createGeometryResolver(pdf) : undefined,\n annotations: this.annotationManager.getAnnotationsList(),\n redactions: b.getRedactions(),\n watermark: b.getWatermark(),\n signerName: this.formManager.getEffectiveSignerName() || b.getCurrentUserName(),\n formFields: this.formManager.getFields(),\n formData: this.formManager.getValues(),\n },\n options\n );\n }\n\n /**\n * Returns the currently selected text string from the document viewer, or an empty string if nothing is selected.\n */\n getSelectedText(): string {\n if (typeof window === 'undefined') return '';\n const selection = window.getSelection();\n return selection ? selection.toString() : '';\n }\n\n /**\n * Copies the currently selected text to the system clipboard.\n * Resolves to true if copying succeeded, false otherwise.\n */\n async copySelectedText(): Promise<boolean> {\n const text = this.getSelectedText();\n if (!text) return false;\n const success = await copyTextToClipboard(text);\n if (success) {\n this.bus.emit('textCopied', { text });\n }\n return success;\n }\n\n // ---- legacy facade ---------------------------------------------------------------------\n\n readonly UI = {\n /** Theming is not implemented; kept for API compatibility. */\n setTheme: (_theme: string) => {},\n goToPage: (pageNumber: number) => this.goToPage(pageNumber),\n setCurrentPageNumber: (pageNumber: number) => this.goToPage(pageNumber),\n openElements: (elements: string[]) => this.bus.emit('action-open-elements', { elements }),\n closeElements: (elements: string[]) => this.bus.emit('action-close-elements', { elements }),\n enableElements: (elements: string[]) => this.bus.emit('action-open-elements', { elements }),\n disableElements: (elements: string[]) => this.bus.emit('action-close-elements', { elements }),\n setActiveLeftPanel: (panel: string) => this.bus.emit('action-set-active-left-panel', { panel }),\n setToolMode: (tool: string | null) => {\n let normalizedTool: any = tool;\n if (tool && (tool.toLowerCase() === 'select' || tool.toLowerCase() === 'textselect')) {\n normalizedTool = 'select';\n } else if (tool && tool.toLowerCase() === 'pan') {\n normalizedTool = 'pan';\n }\n this.bus.emit('action-set-tool', { tool: normalizedTool });\n },\n getSelectedText: () => this.getSelectedText(),\n copySelectedText: () => this.copySelectedText(),\n fitWidth: (ratio?: number) => this.bus.emit('action-fit-to-width', typeof ratio === 'number' ? { ratio } : undefined),\n fitPage: () => this.bus.emit('action-fit-to-page'),\n fitToWidth: (ratio?: number) => this.bus.emit('action-fit-to-width', typeof ratio === 'number' ? { ratio } : undefined),\n fitToPage: () => this.bus.emit('action-fit-to-page'),\n startCompare: (docA: any, docB: any, options?: any) => {\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent('action-start-compare', { detail: { docA, docB, options } }));\n }\n },\n stopCompare: () => {\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent('action-stop-compare'));\n }\n },\n setCompareMode: (mode: 'overlay' | 'side-by-side' | 'semantic') => {\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent('action-set-compare-mode', { detail: { mode } }));\n }\n },\n setCompareColors: (colorA: string, colorB: string) => {\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent('action-set-compare-colors', { detail: { colorA, colorB } }));\n }\n },\n };\n\n readonly Core = ((self: WebViewerInstance) => ({\n /** The real AnnotationManager (XFDF import/export, granular events, permissions). */\n get annotationManager(): AnnotationManager {\n return self.annotationManager;\n },\n /** The FormManager (form schema, values, validation). */\n get formManager(): FormManager {\n return self.formManager;\n },\n documentViewer: {\n addEventListener: (event: string, callback: (detail: unknown) => void): (() => void) =>\n self.bus.on(event, callback),\n removeEventListener: (event: string, callback: (detail: unknown) => void): void =>\n self.bus.off(event, callback),\n getCurrentPage: (): number => self.getCurrentPage(),\n getPageCount: (): number => self.getPageCount(),\n goToPage: (pageNumber: number): void => self.goToPage(pageNumber),\n setCurrentPage: (pageNumber: number): void => self.goToPage(pageNumber),\n setCurrentPageNumber: (pageNumber: number): void => self.goToPage(pageNumber),\n getDocument: () => ({\n getFileData: (options?: ExportOptions) => self.getFileData(options),\n }),\n },\n }))(this);\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * Printing: the exported document (annotations / redactions / watermark baked in) is loaded into a\n * hidden iframe and printed through the browser's PDF viewer. Falls back to opening the PDF in a\n * new tab when the frame cannot print (e.g. the browser has no inline PDF viewer).\n */\nexport interface PrintOptions {\n title?: string;\n /** How long the hidden frame is kept alive for the print dialog (default 60s). */\n timeoutMs?: number;\n}\n\nexport async function printPdfBytes(bytes: Uint8Array, opts: PrintOptions = {}): Promise<void> {\n if (typeof document === 'undefined') throw new Error('[teamsync-pdf-viewer] printing needs a browser');\n const blob = new Blob([bytes as BlobPart], { type: 'application/pdf' });\n const url = URL.createObjectURL(blob);\n const iframe = document.createElement('iframe');\n iframe.style.cssText = 'position:fixed;right:0;bottom:0;width:0;height:0;border:0;visibility:hidden;';\n iframe.title = opts.title ?? 'Print';\n iframe.setAttribute('aria-hidden', 'true');\n\n await new Promise<void>((resolve, reject) => {\n let settled = false;\n const cleanup = () => {\n iframe.remove();\n URL.revokeObjectURL(url);\n };\n const finish = () => {\n if (settled) return;\n settled = true;\n setTimeout(cleanup, opts.timeoutMs ?? 60000);\n resolve();\n };\n iframe.onload = () => {\n try {\n const w = iframe.contentWindow;\n if (!w) throw new Error('no frame window');\n w.focus();\n w.print();\n } catch {\n // No inline PDF viewer (or it refused): let the user print from a new tab instead.\n window.open(url, '_blank', 'noopener');\n }\n finish();\n };\n iframe.onerror = () => {\n cleanup();\n if (!settled) {\n settled = true;\n reject(new Error('[teamsync-pdf-viewer] print frame failed to load'));\n }\n };\n document.body.appendChild(iframe);\n iframe.src = url;\n });\n}\n","import type {\n OfficeFileType,\n OfficeDocumentCategory,\n OfficeBadgeMeta,\n OfficeDocumentInfo,\n} from './types';\n\nconst MIME_MAP: Record<string, OfficeFileType> = {\n // Word\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'docx',\n 'application/msword': 'doc',\n // PowerPoint\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation': 'pptx',\n 'application/vnd.ms-powerpoint': 'ppt',\n // Excel\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': 'xlsx',\n 'application/vnd.ms-excel': 'xls',\n};\n\nconst EXTENSION_MAP: Record<string, OfficeFileType> = {\n docx: 'docx',\n doc: 'doc',\n pptx: 'pptx',\n ppt: 'ppt',\n xlsx: 'xlsx',\n xls: 'xls',\n};\n\n/**\n * Extracts file extension from a URL, path, or filename, taking into account query parameters,\n * hash fragments, and standard file paths.\n */\nfunction extractExtension(pathOrUrl: string): string | null {\n try {\n const clean = pathOrUrl.split('#')[0].split('?')[0];\n\n // If the path itself is an API conversion endpoint, it serves PDF output directly\n if (clean.endsWith('/api/convert') || clean.endsWith('/convert')) {\n return null;\n }\n\n // 1. Check for filename param in hash or query (e.g., #filename=report.docx or ?filename=report.docx)\n const urlMatch = pathOrUrl.match(/[?&#](?:filename|file|name)=([^&#]+)/i);\n if (urlMatch && urlMatch[1]) {\n const decoded = decodeURIComponent(urlMatch[1]);\n const ext = extractExtensionFromSimpleName(decoded);\n if (ext) return ext;\n }\n\n // 2. Check path portion without query or hash\n return extractExtensionFromSimpleName(clean);\n } catch {\n return null;\n }\n}\n\nfunction extractExtensionFromSimpleName(name: string): string | null {\n const lastSlash = Math.max(name.lastIndexOf('/'), name.lastIndexOf('\\\\'));\n const filename = lastSlash >= 0 ? name.slice(lastSlash + 1) : name;\n const lastDot = filename.lastIndexOf('.');\n if (lastDot <= 0 || lastDot === filename.length - 1) return null;\n return filename.slice(lastDot + 1).toLowerCase();\n}\n\n/**\n * Detects whether a string URL, File, or Blob represents a supported Microsoft Office document.\n */\nexport function getOfficeFileType(target: unknown): OfficeFileType | null {\n if (!target) return null;\n\n // File or Blob instance\n if (typeof (globalThis as any).Blob !== 'undefined' && target instanceof Blob) {\n if (typeof (globalThis as any).File !== 'undefined' && target instanceof File && target.name) {\n const ext = extractExtension(target.name);\n if (ext && ext in EXTENSION_MAP) {\n return EXTENSION_MAP[ext];\n }\n }\n if (target.type && target.type in MIME_MAP) {\n return MIME_MAP[target.type];\n }\n return null;\n }\n\n // String URL or filename\n if (typeof target === 'string') {\n const ext = extractExtension(target);\n if (ext && ext in EXTENSION_MAP) {\n return EXTENSION_MAP[ext];\n }\n }\n\n return null;\n}\n\n/**\n * Returns true if the given input is a supported Microsoft Office document.\n */\nexport function isOfficeDocument(target: unknown): boolean {\n return getOfficeFileType(target) !== null;\n}\n\n/**\n * Returns the broad document category ('word' | 'powerpoint' | 'excel') for an Office file type.\n */\nexport function getOfficeDocumentCategory(fileType: OfficeFileType): OfficeDocumentCategory {\n switch (fileType) {\n case 'docx':\n case 'doc':\n return 'word';\n case 'pptx':\n case 'ppt':\n return 'powerpoint';\n case 'xlsx':\n case 'xls':\n return 'excel';\n }\n}\n\n/**\n * Returns standard MIME type for an Office file type.\n */\nexport function getOfficeMimeType(fileType: OfficeFileType): string {\n switch (fileType) {\n case 'docx':\n return 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';\n case 'doc':\n return 'application/msword';\n case 'pptx':\n return 'application/vnd.openxmlformats-officedocument.presentationml.presentation';\n case 'ppt':\n return 'application/vnd.ms-powerpoint';\n case 'xlsx':\n return 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';\n case 'xls':\n return 'application/vnd.ms-excel';\n }\n}\n\n/**\n * Metadata used to display themed UI badges, spinners, and icons for Office document types.\n */\nexport function getOfficeBadgeMeta(fileType: OfficeFileType): OfficeBadgeMeta {\n const category = getOfficeDocumentCategory(fileType);\n switch (category) {\n case 'word':\n return {\n category: 'word',\n name: fileType === 'docx' ? 'Word Document (.docx)' : 'Word Document (.doc)',\n extension: fileType.toUpperCase(),\n brandColor: '#185abd',\n darkBrandColor: '#103f91',\n iconName: 'word',\n };\n case 'powerpoint':\n return {\n category: 'powerpoint',\n name: fileType === 'pptx' ? 'PowerPoint Presentation (.pptx)' : 'PowerPoint Presentation (.ppt)',\n extension: fileType.toUpperCase(),\n brandColor: '#d24726',\n darkBrandColor: '#9b2e15',\n iconName: 'powerpoint',\n };\n case 'excel':\n return {\n category: 'excel',\n name: fileType === 'xlsx' ? 'Excel Workbook (.xlsx)' : 'Excel Spreadsheet (.xls)',\n extension: fileType.toUpperCase(),\n brandColor: '#107c41',\n darkBrandColor: '#094e28',\n iconName: 'excel',\n };\n }\n}\n\n/**\n * Inspects a target and returns rich Office metadata if it is an Office document.\n */\nexport function getOfficeDocumentInfo(target: unknown): OfficeDocumentInfo | null {\n const fileType = getOfficeFileType(target);\n if (!fileType) return null;\n\n const category = getOfficeDocumentCategory(fileType);\n const mimeType = getOfficeMimeType(fileType);\n\n let fileName: string | undefined;\n let originalUrl: string | undefined;\n\n if (typeof (globalThis as any).File !== 'undefined' && target instanceof File) {\n fileName = target.name;\n } else if (typeof target === 'string') {\n originalUrl = target;\n const clean = target.split('#')[0].split('?')[0];\n const lastSlash = Math.max(clean.lastIndexOf('/'), clean.lastIndexOf('\\\\'));\n fileName = lastSlash >= 0 ? clean.slice(lastSlash + 1) : clean;\n }\n\n return {\n fileType,\n category,\n fileName,\n originalUrl,\n mimeType,\n };\n}\n\nexport const isOfficeDocumentUrl = isOfficeDocument;\nexport const isOfficeFile = isOfficeDocument;\nexport const detectOfficeType = getOfficeFileType;\nexport function isOfficeExtension(ext: string): boolean {\n return getOfficeFileType(`file.${ext.replace(/^\\./, '')}`) !== null;\n}\nexport const SUPPORTED_OFFICE_EXTENSIONS = ['docx', 'doc', 'pptx', 'ppt', 'xlsx', 'xls'] as const;\n","import type { OfficeConverterConfig, OfficeFileType } from './types';\nimport { getOfficeFileType, getOfficeMimeType } from './officeDetector';\n\n// In-memory cache for converted PDF ArrayBuffers across document switches in the current session\nconst memoryCache = new Map<string, ArrayBuffer>();\n\n/**\n * Computes a cache key for a document (string URL or File/Blob/Buffer).\n */\nasync function computeCacheKey(\n fileOrUrl: string | File | Blob | ArrayBuffer,\n fileType: OfficeFileType\n): Promise<string> {\n if (typeof fileOrUrl === 'string') {\n return `office_cache:${fileType}:${fileOrUrl}`;\n }\n\n if (typeof (globalThis as any).File !== 'undefined' && fileOrUrl instanceof File) {\n return `office_cache:${fileType}:${fileOrUrl.name}:${fileOrUrl.size}:${fileOrUrl.lastModified}`;\n }\n\n if (typeof (globalThis as any).Blob !== 'undefined' && fileOrUrl instanceof Blob) {\n return `office_cache:${fileType}:blob:${fileOrUrl.size}:${fileOrUrl.type}`;\n }\n\n if (fileOrUrl instanceof ArrayBuffer) {\n return `office_cache:${fileType}:buffer:${fileOrUrl.byteLength}`;\n }\n\n return `office_cache:${fileType}:${String(fileOrUrl)}`;\n}\n\nfunction createBlobUrl(blob: Blob): string {\n try {\n return URL.createObjectURL(blob);\n } catch {\n return `blob:office-${Math.random().toString(36).slice(2, 9)}`;\n }\n}\n\n/**\n * Retrieves a cached converted PDF from memory or sessionStorage.\n */\nexport async function getCachedOfficePdf(\n fileOrUrl: string | File | Blob | ArrayBuffer,\n fileType: OfficeFileType,\n cacheMode: OfficeConverterConfig['cache'] = 'memory'\n): Promise<ArrayBuffer | null> {\n if (cacheMode === 'none' || cacheMode === false) return null;\n\n const key = await computeCacheKey(fileOrUrl, fileType);\n\n if (memoryCache.has(key)) {\n return memoryCache.get(key)!.slice(0);\n }\n\n if (cacheMode === 'session' && typeof window !== 'undefined' && window.sessionStorage) {\n try {\n const base64 = window.sessionStorage.getItem(key);\n if (base64) {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n memoryCache.set(key, bytes.buffer);\n return bytes.buffer;\n }\n } catch {\n // Ignore quota exceeded or storage errors\n }\n }\n\n return null;\n}\n\n/**\n * Stores a converted PDF in memory and optionally sessionStorage.\n */\nexport async function setCachedOfficePdf(\n fileOrUrl: string | File | Blob | ArrayBuffer,\n fileType: OfficeFileType,\n pdfBuffer: ArrayBuffer,\n cacheMode: OfficeConverterConfig['cache'] = 'memory'\n): Promise<void> {\n if (cacheMode === 'none' || cacheMode === false) return;\n\n const key = await computeCacheKey(fileOrUrl, fileType);\n memoryCache.set(key, pdfBuffer.slice(0));\n\n if (cacheMode === 'session' && typeof window !== 'undefined' && window.sessionStorage) {\n try {\n // Only cache documents under 5MB in sessionStorage to avoid QuotaExceededError\n if (pdfBuffer.byteLength < 5 * 1024 * 1024) {\n const bytes = new Uint8Array(pdfBuffer);\n let binary = '';\n const chunkSize = 8192;\n for (let i = 0; i < bytes.length; i += chunkSize) {\n binary += String.fromCharCode.apply(null, Array.from(bytes.subarray(i, i + chunkSize)));\n }\n window.sessionStorage.setItem(key, btoa(binary));\n }\n } catch {\n // Ignore sessionStorage failure\n }\n }\n}\n\n/**\n * Clears the converted document cache.\n */\nexport function clearOfficeCache(): void {\n memoryCache.clear();\n if (typeof window !== 'undefined' && window.sessionStorage) {\n try {\n const keysToRemove: string[] = [];\n for (let i = 0; i < window.sessionStorage.length; i++) {\n const k = window.sessionStorage.key(i);\n if (k && k.startsWith('office_cache:')) {\n keysToRemove.push(k);\n }\n }\n keysToRemove.forEach((k) => window.sessionStorage.removeItem(k));\n } catch {}\n }\n}\n\nexport interface ConvertOfficeDocumentResult {\n /** Raw PDF ArrayBuffer ready for PDF.js or downstream processing */\n pdfBuffer: ArrayBuffer;\n /** Browser Blob Object URL (e.g. blob:http...) ready for rendering or iframe preview */\n objectUrl: string;\n /** Whether the document was served from cache */\n fromCache: boolean;\n}\n\n/**\n * Converts an Office document (Word, PowerPoint, Excel) into a standardized PDF ArrayBuffer\n * and Blob URL using either a custom converter or the configured backend microservice.\n */\nexport async function convertOfficeDocument(\n fileOrUrl: string | File | Blob | ArrayBuffer,\n config: OfficeConverterConfig,\n fileName?: string\n): Promise<ConvertOfficeDocumentResult> {\n const fileType = getOfficeFileType(fileOrUrl);\n if (!fileType) {\n throw new Error(\n `Unsupported Office document format. Expected .docx, .doc, .pptx, .ppt, .xlsx, or .xls.`\n );\n }\n\n // 1. Check cache first\n const cacheMode = config.cache ?? 'memory';\n const cached = await getCachedOfficePdf(fileOrUrl, fileType, cacheMode);\n if (cached) {\n const blob = new Blob([cached], { type: 'application/pdf' });\n const objectUrl = createBlobUrl(blob);\n return { pdfBuffer: cached, objectUrl, fromCache: true };\n }\n\n let pdfBuffer: ArrayBuffer;\n\n // 2. Custom conversion hook takes precedence if supplied\n if (config.convert) {\n const converted = await config.convert(fileOrUrl, fileType, {\n fileName,\n excelOptions: config.excelOptions,\n });\n\n if (typeof converted === 'string') {\n if (converted.startsWith('blob:') || converted.startsWith('data:') || converted.startsWith('http')) {\n const resp = await fetch(converted);\n pdfBuffer = await resp.arrayBuffer();\n } else {\n throw new Error(`Custom converter returned an invalid URL string: ${converted}`);\n }\n } else if (converted instanceof ArrayBuffer) {\n pdfBuffer = converted;\n } else if (converted instanceof Uint8Array) {\n const copy = new Uint8Array(converted.byteLength);\n copy.set(converted);\n pdfBuffer = copy.buffer;\n } else if (typeof Blob !== 'undefined' && converted instanceof Blob) {\n pdfBuffer = await converted.arrayBuffer();\n } else {\n throw new Error(`Custom converter returned an unsupported data type.`);\n }\n } else {\n // 3. Built-in HTTP backend conversion\n if (!config.endpoint) {\n throw new Error(\n `No conversion endpoint or custom converter configured. Please specify 'officeConverter.endpoint' in viewer options or provide a custom 'officeConverter.convert' function.`\n );\n }\n\n // Prepare headers\n let customHeaders: Record<string, string> = {};\n if (config.headers) {\n customHeaders = typeof config.headers === 'function' ? await config.headers() : { ...config.headers };\n }\n\n if (config.authToken) {\n const token = typeof config.authToken === 'function' ? await config.authToken() : config.authToken;\n if (token) {\n customHeaders['Authorization'] =\n token.startsWith('Bearer ') || token.startsWith('Basic ') ? token : `Bearer ${token}`;\n }\n }\n\n // Resolve file content to Blob/File\n let uploadBlob: Blob;\n let uploadFileName = fileName || `document.${fileType}`;\n\n if (typeof fileOrUrl === 'string') {\n // Fetch source file from URL\n const sourceResp = await fetch(fileOrUrl);\n if (!sourceResp.ok) {\n throw new Error(\n `Failed to fetch Office document from URL: ${fileOrUrl} (HTTP ${sourceResp.status})`\n );\n }\n uploadBlob = await sourceResp.blob();\n if (!fileName) {\n const match = fileOrUrl.match(/[?&#](?:filename|file|name)=([^&#]+)/i);\n if (match && match[1]) {\n const decoded = decodeURIComponent(match[1]);\n const lastSlash = Math.max(decoded.lastIndexOf('/'), decoded.lastIndexOf('\\\\'));\n uploadFileName = lastSlash >= 0 ? decoded.slice(lastSlash + 1) : decoded;\n } else {\n const clean = fileOrUrl.split('#')[0].split('?')[0];\n const lastSlash = Math.max(clean.lastIndexOf('/'), clean.lastIndexOf('\\\\'));\n if (lastSlash >= 0) {\n uploadFileName = clean.slice(lastSlash + 1);\n }\n }\n }\n } else if (typeof (globalThis as any).File !== 'undefined' && fileOrUrl instanceof File) {\n uploadBlob = fileOrUrl;\n uploadFileName = fileOrUrl.name;\n } else if (typeof (globalThis as any).Blob !== 'undefined' && fileOrUrl instanceof Blob) {\n uploadBlob = fileOrUrl;\n } else if (fileOrUrl instanceof ArrayBuffer) {\n uploadBlob = new Blob([fileOrUrl], { type: getOfficeMimeType(fileType) });\n } else {\n throw new Error('Unsupported Office document input source.');\n }\n\n // Ensure uploadFileName always has a valid Office extension so Gotenberg identifies the engine\n if (!uploadFileName.includes('.') || uploadFileName.endsWith('.')) {\n uploadFileName = `${uploadFileName.replace(/\\.$/, '')}.${fileType}`;\n }\n\n // Construct FormData for Gotenberg / LibreOffice microservice.\n // Gotenberg accepts files under the 'files' field name. Providing exactly one file returns the converted PDF directly.\n const formData = new FormData();\n formData.append('files', uploadBlob, uploadFileName);\n\n if (config.excelOptions) {\n if (config.excelOptions.fitToPageWidth) {\n formData.append('fitToPageWidth', 'true');\n }\n if (config.excelOptions.includeGridlines) {\n formData.append('includeGridlines', 'true');\n }\n }\n\n const convertResp = await fetch(config.endpoint, {\n method: 'POST',\n headers: customHeaders,\n body: formData,\n });\n\n if (!convertResp.ok) {\n let errorDetail = '';\n try {\n errorDetail = await convertResp.text();\n } catch {}\n throw new Error(\n `Document conversion service failed with HTTP ${convertResp.status}: ${errorDetail || convertResp.statusText}`\n );\n }\n\n pdfBuffer = await convertResp.arrayBuffer();\n }\n\n // 4. Save to cache\n await setCachedOfficePdf(fileOrUrl, fileType, pdfBuffer, cacheMode);\n\n const blob = new Blob([pdfBuffer], { type: 'application/pdf' });\n const objectUrl = createBlobUrl(blob);\n\n return {\n pdfBuffer,\n objectUrl,\n fromCache: false,\n };\n}\n\n/**\n * Convenience helper to convert a remote Office document URL.\n */\nexport async function convertOfficeUrl(\n url: string,\n config: OfficeConverterConfig,\n fileName?: string\n): Promise<ConvertOfficeDocumentResult> {\n return convertOfficeDocument(url, config, fileName);\n}\n\n/**\n * Convenience helper to convert a local Office File or Blob.\n */\nexport async function convertOfficeFile(\n file: File | Blob,\n config: OfficeConverterConfig,\n fileName?: string\n): Promise<ConvertOfficeDocumentResult> {\n return convertOfficeDocument(file, config, fileName);\n}\n\n/**\n * Unified Office converter service object.\n */\nexport const officeConverter = {\n convert: convertOfficeDocument,\n convertDocument: convertOfficeDocument,\n convertUrl: convertOfficeUrl,\n convertFile: convertOfficeFile,\n getCached: getCachedOfficePdf,\n setCached: setCachedOfficePdf,\n clearCache: clearOfficeCache,\n};\n\n","import React from 'react';\nimport type { OfficeFileType } from './types';\nimport { getOfficeBadgeMeta } from './officeDetector';\n\nexport interface OfficeLoadingOverlayProps {\n fileType: OfficeFileType;\n fileName?: string;\n error?: Error | null;\n onRetry?: () => void;\n}\n\nexport const OfficeLoadingOverlay: React.FC<OfficeLoadingOverlayProps> = ({\n fileType,\n fileName,\n error,\n onRetry,\n}) => {\n const meta = getOfficeBadgeMeta(fileType);\n\n return (\n <div\n style={{\n position: 'absolute',\n inset: 0,\n backgroundColor: 'rgba(255, 255, 255, 0.95)',\n backdropFilter: 'blur(4px)',\n zIndex: 100,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '24px',\n color: '#1e293b',\n fontFamily:\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif',\n }}\n >\n <div\n style={{\n maxWidth: '460px',\n width: '100%',\n backgroundColor: '#ffffff',\n borderRadius: '16px',\n boxShadow: '0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1)',\n border: '1px solid #e2e8f0',\n padding: '32px 28px',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n textAlign: 'center',\n }}\n >\n {/* Document Type Badge */}\n <div\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '8px',\n backgroundColor: meta.brandColor,\n color: '#ffffff',\n padding: '6px 14px',\n borderRadius: '9999px',\n fontSize: '12px',\n fontWeight: 600,\n letterSpacing: '0.05em',\n textTransform: 'uppercase',\n marginBottom: '20px',\n boxShadow: `0 4px 12px ${meta.brandColor}40`,\n }}\n >\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\" />\n <polyline points=\"14 2 14 8 20 8\" />\n <line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\" />\n <line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\" />\n <polyline points=\"10 9 9 9 8 9\" />\n </svg>\n {meta.extension} Document\n </div>\n\n {/* Icon & Animation */}\n {!error ? (\n <div style={{ position: 'relative', width: '64px', height: '64px', marginBottom: '20px' }}>\n <svg\n style={{\n animation: 'teamsync-spin 1.2s cubic-bezier(0.4, 0, 0.2, 1) infinite',\n width: '64px',\n height: '64px',\n }}\n viewBox=\"0 0 50 50\"\n >\n <circle\n cx=\"25\"\n cy=\"25\"\n r=\"20\"\n fill=\"none\"\n stroke=\"#e2e8f0\"\n strokeWidth=\"4\"\n />\n <circle\n cx=\"25\"\n cy=\"25\"\n r=\"20\"\n fill=\"none\"\n stroke={meta.brandColor}\n strokeWidth=\"4\"\n strokeDasharray=\"80\"\n strokeDashoffset=\"60\"\n strokeLinecap=\"round\"\n />\n </svg>\n <div\n style={{\n position: 'absolute',\n inset: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontWeight: 700,\n fontSize: '15px',\n color: meta.brandColor,\n }}\n >\n {meta.extension[0]}\n </div>\n </div>\n ) : (\n <div\n style={{\n width: '56px',\n height: '56px',\n borderRadius: '50%',\n backgroundColor: '#fee2e2',\n color: '#ef4444',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n marginBottom: '20px',\n }}\n >\n <svg\n width=\"28\"\n height=\"28\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\" />\n </svg>\n </div>\n )}\n\n {/* Title */}\n <h3\n style={{\n margin: '0 0 8px 0',\n fontSize: '18px',\n fontWeight: 600,\n color: '#0f172a',\n }}\n >\n {error ? 'Conversion Failed' : `Preparing ${meta.name}`}\n </h3>\n\n {/* Filename if available */}\n {fileName && (\n <p\n style={{\n margin: '0 0 12px 0',\n fontSize: '13px',\n color: '#64748b',\n fontWeight: 500,\n maxWidth: '360px',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n title={fileName}\n >\n {fileName}\n </p>\n )}\n\n {/* Body message */}\n <p\n style={{\n margin: '0 0 20px 0',\n fontSize: '13px',\n lineHeight: 1.5,\n color: error ? '#b91c1c' : '#475569',\n }}\n >\n {error\n ? error.message || 'An error occurred while converting the Office document.'\n : 'Rendering document with native fonts, vector graphics, and formatting…'}\n </p>\n\n {/* Action Button on Error */}\n {error && onRetry && (\n <button\n onClick={onRetry}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '6px',\n backgroundColor: meta.brandColor,\n color: '#ffffff',\n border: 'none',\n borderRadius: '8px',\n padding: '9px 18px',\n fontSize: '13px',\n fontWeight: 500,\n cursor: 'pointer',\n transition: 'opacity 0.2s',\n }}\n onMouseOver={(e) => ((e.currentTarget as HTMLElement).style.opacity = '0.9')}\n onMouseOut={(e) => ((e.currentTarget as HTMLElement).style.opacity = '1')}\n >\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"1 4 1 10 7 10\" />\n <path d=\"M3.51 15a9 9 0 1 0 2.13-9.36L1 10\" />\n </svg>\n Retry Conversion\n </button>\n )}\n </div>\n\n <style>{`\n @keyframes teamsync-spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n `}</style>\n </div>\n );\n};\n","/**\n * TeamSync PDF Viewer SDK — Office Pre-Conversion Hook & Helper\n *\n * Implements the Host-Side component of the Enterprise Hybrid Architecture:\n * Allows host applications to pre-convert Office documents before mounting\n * the viewer, cache results, inspect conversion state, and pass ready-to-view\n * PDF URLs directly to <TeamSyncViewer fileUrl={pdfUrl} />.\n */\n\nimport { useState, useEffect, useRef, useCallback } from 'react';\nimport { isOfficeDocument, getOfficeFileType, getOfficeDocumentInfo } from './officeDetector';\nimport { convertOfficeDocument, getCachedOfficePdf } from './officeConverter';\nimport type { OfficeConverterConfig, OfficeFileType, OfficeDocumentInfo } from './types';\n\nexport interface UseOfficeDocumentOptions {\n /** Converter configuration (endpoint, authToken, cache mode, etc.) */\n converterConfig?: OfficeConverterConfig;\n /** Optional file name override */\n fileName?: string;\n /** Whether to automatically convert when the document changes (defaults to true) */\n autoConvert?: boolean;\n}\n\nexport interface UseOfficeDocumentResult {\n /** Whether the input source was identified as a Microsoft Office document */\n isOffice: boolean;\n /** Detected office file type ('docx', 'pptx', 'xlsx', etc.) or null if PDF */\n fileType: OfficeFileType | null;\n /** Detailed metadata about the office document */\n documentInfo: OfficeDocumentInfo | null;\n /** Whether conversion is actively in progress */\n isConverting: boolean;\n /** The final PDF URL ready for the viewer (<TeamSyncViewer fileUrl={pdfUrl} />) */\n pdfUrl: string | null;\n /** Raw PDF ArrayBuffer */\n pdfBuffer: ArrayBuffer | null;\n /** Whether the document was served from memory/session cache */\n fromCache: boolean;\n /** Any error encountered during conversion */\n error: Error | null;\n /** Manually trigger conversion or retry */\n convert: () => Promise<string | null>;\n}\n\n/**\n * React hook that pre-converts Office documents into viewable PDF URLs before viewer mounting.\n * If the input is already a PDF, it passes through immediately with `isConverting: false`.\n */\nfunction createBlobUrl(blob: Blob): string {\n try {\n return URL.createObjectURL(blob);\n } catch {\n return `blob:office-${Math.random().toString(36).slice(2, 9)}`;\n }\n}\n\nexport function useOfficeDocument(\n fileOrUrl: string | File | Blob | ArrayBuffer | null | undefined,\n options: UseOfficeDocumentOptions = {}\n): UseOfficeDocumentResult {\n const { autoConvert = true } = options;\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const [isConverting, setIsConverting] = useState<boolean>(false);\n const [pdfUrl, setPdfUrl] = useState<string | null>(() => {\n // If initially given a string URL that is NOT an office doc, initialize immediately\n if (typeof fileOrUrl === 'string' && !isOfficeDocument(fileOrUrl)) {\n return fileOrUrl;\n }\n return null;\n });\n const [pdfBuffer, setPdfBuffer] = useState<ArrayBuffer | null>(null);\n const [fromCache, setFromCache] = useState<boolean>(false);\n const [error, setError] = useState<Error | null>(null);\n\n const createdObjectUrlRef = useRef<string | null>(null);\n\n const isOffice = fileOrUrl ? isOfficeDocument(fileOrUrl) : false;\n const fileType = fileOrUrl ? getOfficeFileType(fileOrUrl) : null;\n const documentInfo = fileOrUrl ? getOfficeDocumentInfo(fileOrUrl) : null;\n\n const cleanupUrl = useCallback(() => {\n if (createdObjectUrlRef.current) {\n URL.revokeObjectURL(createdObjectUrlRef.current);\n createdObjectUrlRef.current = null;\n }\n }, []);\n\n const runConversion = useCallback(async (): Promise<string | null> => {\n if (!fileOrUrl) {\n cleanupUrl();\n setPdfUrl(null);\n setPdfBuffer(null);\n return null;\n }\n\n const { converterConfig = {}, fileName } = optionsRef.current;\n\n // Pass through PDFs directly\n if (!isOffice) {\n if (typeof fileOrUrl === 'string') {\n cleanupUrl();\n setPdfUrl(fileOrUrl);\n setPdfBuffer(null);\n setFromCache(false);\n setError(null);\n return fileOrUrl;\n }\n if (typeof (globalThis as any).Blob !== 'undefined' && fileOrUrl instanceof Blob) {\n cleanupUrl();\n const url = createBlobUrl(fileOrUrl);\n createdObjectUrlRef.current = url;\n setPdfUrl(url);\n setFromCache(false);\n setError(null);\n return url;\n }\n return null;\n }\n\n setIsConverting(true);\n setError(null);\n\n try {\n const result = await convertOfficeDocument(fileOrUrl, converterConfig, fileName);\n cleanupUrl();\n createdObjectUrlRef.current = result.objectUrl;\n\n setPdfUrl(result.objectUrl);\n setPdfBuffer(result.pdfBuffer);\n setFromCache(result.fromCache);\n setIsConverting(false);\n return result.objectUrl;\n } catch (err: any) {\n const convertedError = err instanceof Error ? err : new Error(String(err));\n setError(convertedError);\n setIsConverting(false);\n return null;\n }\n }, [fileOrUrl, isOffice, cleanupUrl]);\n\n useEffect(() => {\n if (autoConvert && fileOrUrl) {\n runConversion();\n }\n return () => {\n cleanupUrl();\n };\n }, [fileOrUrl, autoConvert, runConversion, cleanupUrl]);\n\n return {\n isOffice,\n fileType,\n documentInfo,\n isConverting,\n pdfUrl,\n pdfBuffer,\n fromCache,\n error,\n convert: runConversion,\n };\n}\n\n/**\n * Standalone asynchronous preloader for Office documents.\n * Can be called anywhere (e.g. in loaders, event handlers, or background tasks).\n */\nexport async function preloadOfficeDocument(\n fileOrUrl: string | File | Blob | ArrayBuffer,\n config: OfficeConverterConfig,\n fileName?: string\n): Promise<{\n pdfUrl: string;\n pdfBuffer: ArrayBuffer;\n fromCache: boolean;\n fileType: OfficeFileType | 'pdf';\n}> {\n if (!isOfficeDocument(fileOrUrl)) {\n if (typeof fileOrUrl === 'string') {\n const resp = await fetch(fileOrUrl);\n const buffer = await resp.arrayBuffer();\n return { pdfUrl: fileOrUrl, pdfBuffer: buffer, fromCache: false, fileType: 'pdf' };\n }\n if (typeof (globalThis as any).Blob !== 'undefined' && fileOrUrl instanceof Blob) {\n const buffer = await fileOrUrl.arrayBuffer();\n const url = createBlobUrl(fileOrUrl);\n return { pdfUrl: url, pdfBuffer: buffer, fromCache: false, fileType: 'pdf' };\n }\n if (fileOrUrl instanceof ArrayBuffer) {\n const blob = new Blob([fileOrUrl], { type: 'application/pdf' });\n return { pdfUrl: createBlobUrl(blob), pdfBuffer: fileOrUrl, fromCache: false, fileType: 'pdf' };\n }\n }\n\n const fileType = getOfficeFileType(fileOrUrl) || 'docx';\n const result = await convertOfficeDocument(fileOrUrl, config, fileName);\n\n return {\n pdfUrl: result.objectUrl,\n pdfBuffer: result.pdfBuffer,\n fromCache: result.fromCache,\n fileType,\n };\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * <TeamSyncViewer> — the embeddable viewer component.\n *\n * Owns every piece of UI state the demo application shell used to own (tabs, panels, zoom, layout,\n * rotation), sizes itself to its container, scopes keyboard shortcuts and the action bus to this\n * instance (several viewers can share a page) and exposes a WebViewerInstance via `ref` / `onReady`.\n */\nimport React, { useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react';\nimport type * as pdfjsLib from 'pdfjs-dist';\n// Library styles are extracted to dist/style.css by the lib build (consumers import\n// 'teamsync-pdf-viewer/style.css'); bundlers keep this import because of `sideEffects` metadata.\nimport '../index.css';\nimport Header from './Header';\nimport DocumentViewer, { type DocumentLoadErrorInfo } from './DocumentViewer';\nimport SettingsModal from './SettingsModal';\nimport AboutModal from './AboutModal';\nimport { ViewerBus } from '../core/eventBus';\nimport { ViewerBusContext } from '../core/busContext';\nimport { WebViewerInstance, type LoadDocumentOptions } from '../core/ViewerInstance';\nimport { AnnotationManager } from '../annotations/AnnotationManager';\nimport { FormManager } from '../forms/FormManager';\nimport { printPdfBytes } from '../core/print';\nimport { useShortcuts, matchShortcut } from '../hooks/useShortcuts';\nimport type { WebViewerOptions, SDKPermissions, Redaction, TransientHighlight, LinkClickEvent } from '../core/types';\nimport type { Annotation } from '../annotations/types';\nimport { calculateNextZoomIn, calculateNextZoomOut, clampScale, MIN_SCALE, MAX_SCALE } from '../utils/zoomUtils';\nimport {\n getOfficeDocumentInfo,\n convertOfficeDocument,\n OfficeLoadingOverlay,\n type OfficeConverterConfig,\n type OfficeFileType,\n} from '../office';\n\nexport interface TeamSyncViewerProps extends Omit<WebViewerOptions, 'path'> {\n /** URL of the PDF to display. Alias of `initialDoc`; `fileUrl` wins when both are set. */\n fileUrl?: string;\n /** Fires once, after mount, with the instance handle. */\n onReady?: (instance: WebViewerInstance) => void;\n onDocumentLoaded?: (info: { url: string; numPages: number }) => void;\n /**\n * Fires when the document could not be loaded. `retry(newUrl?)` reloads — pass a fresh URL when\n * the previous one was a presigned link that expired.\n */\n onDocumentLoadError?: (error: Error, retry: (newUrl?: string) => void, info: DocumentLoadErrorInfo) => void;\n /** Fires once per document, after the first page canvas has been painted. */\n onFirstPageRendered?: (info: { url: string; pageNumber: number }) => void;\n /** Fires whenever any page canvas has finished rendering. */\n onPageRendered?: (info: { url: string; pageNumber: number }) => void;\n /** Fires (in addition to onDocumentLoadError) when the document is password protected. */\n onPasswordRequired?: (info: { url: string }) => void;\n onPageChange?: (pageNumber: number, numPages: number) => void;\n onAnnotationsChange?: (annotations: Annotation[]) => void;\n /** Fires whenever pending or applied redactions change in the viewer. */\n onRedactionsChange?: (redactions: Redaction[]) => void;\n /** Fires once per user click of Apply in the confirmation modal with all applied redactions. */\n onRedactionsApplied?: (redactions: Redaction[]) => void;\n /** Fires whenever transient highlights change. */\n onTransientHighlightsChange?: (highlights: TransientHighlight[]) => void;\n /** Fires whenever the user selects text within the document. */\n onTextSelected?: (info: { text: string }) => void;\n /** Fires whenever text is copied from the document. */\n onTextCopied?: (info: { text: string }) => void;\n /** Unique ID for this viewer instance, enabling other viewers to target it by name. */\n id?: string;\n /**\n * Target viewer instance, ref, getter, or instance ID to open cross-document links in.\n * When a link annotation pointing to another PDF is clicked, the document will automatically\n * be loaded and navigated in this target viewer instance.\n */\n targetViewer?:\n | WebViewerInstance\n | React.RefObject<WebViewerInstance | null>\n | (() => WebViewerInstance | null)\n | string;\n /**\n * Optional custom resolver for cross-document links.\n * Allows transforming relative filenames, document IDs, or URNs into full fetchable document URLs or target pages.\n */\n resolveLinkUrl?: (\n linkUrl: string,\n context: { sourceViewer: WebViewerInstance; annotation?: Annotation }\n ) => string | { url: string; page?: number } | Promise<string | { url: string; page?: number } | null> | null;\n /**\n * Fires when a link annotation or embedded PDF link is clicked.\n * Call `event.preventDefault()` to suppress default behavior.\n */\n onLinkClick?: (event: LinkClickEvent) => boolean | void | Promise<void>;\n /**\n * Configuration for viewing Microsoft Office documents (.docx, .doc, .pptx, .ppt, .xlsx, .xls).\n */\n officeConverter?: OfficeConverterConfig;\n /** Fires when an Office document starts converting to PDF. */\n onOfficeConverting?: (info: { fileType: OfficeFileType; url?: string; fileName?: string }) => void;\n /** Fires when an Office document has successfully converted to PDF. */\n onOfficeConverted?: (info: { fileType: OfficeFileType; url?: string; fromCache: boolean }) => void;\n /** Fires when an Office document conversion encounters an error. */\n onOfficeConversionError?: (info: { fileType: OfficeFileType; error: Error; url?: string }) => void;\n className?: string;\n style?: React.CSSProperties;\n}\n\nconst newId = (): string =>\n typeof crypto !== 'undefined' && 'randomUUID' in crypto ? crypto.randomUUID() : `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n\nexport const TeamSyncViewer = React.forwardRef<WebViewerInstance, TeamSyncViewerProps>(function TeamSyncViewer(props, ref) {\n const {\n fileUrl, initialDoc, initialScale, initialWidthRatio, widthRatio, responsive = true, initialPage, page, transientHighlights: propTransientHighlights,\n plugins, redactions, regexRedactions,\n enableAnnotations, enableSign = false, watermark, permissions, enableRedactions,\n canAddAnnotations, canEditAnnotations, canDeleteAnnotations, readOnly = false,\n assets, withCredentials = false, httpHeaders, customHeaders, rangeChunkSize, disableStream, disableAutoFetch, disableRange, toolbar = true, sidebars = true, leftPanelOpen = true,\n className, style, hideAnnotationsUntilPageRendered = true,\n enableTextSelection = true, defaultTool = 'select', showSelectionTooltip = true,\n id, targetViewer, resolveLinkUrl, onLinkClick,\n officeConverter, onOfficeConverting, onOfficeConverted, onOfficeConversionError,\n currentUser,\n formManager: propFormManager,\n formOptions,\n currentRole,\n formRoles,\n formFields,\n formData,\n } = props;\n\n // Latest props for callbacks/bindings that must not re-subscribe on every render.\n const latest = useRef(props);\n latest.current = props;\n\n const rootRef = useRef<HTMLDivElement>(null);\n const bus = useMemo(() => new ViewerBus(), []);\n const annotationManager = useMemo(() => new AnnotationManager(), []);\n\n // Initialize FormManager once per viewer lifecycle; subsequent updates are synced via useEffect hooks\n const [internalFormManager] = useState(\n () => new FormManager(formFields, formData, formRoles, formOptions, currentUser)\n );\n const formManager = propFormManager || internalFormManager;\n const instanceRef = useRef<WebViewerInstance | null>(null);\n if (!instanceRef.current) instanceRef.current = new WebViewerInstance(bus, annotationManager, id, formManager);\n const instance = instanceRef.current;\n useImperativeHandle(ref, () => instance, [instance]);\n\n // Sync formFields when passed as prop\n useEffect(() => {\n if (formFields) {\n formManager.setFields(formFields);\n }\n }, [formManager, formFields]);\n\n // Sync formData when passed as prop\n useEffect(() => {\n if (formData) {\n formManager.setValues(formData);\n }\n }, [formManager, formData]);\n\n // Sync formRoles when passed as prop\n useEffect(() => {\n if (formRoles) {\n formManager.setRoles(formRoles);\n }\n }, [formManager, formRoles]);\n\n // Sync formOptions when passed as prop\n useEffect(() => {\n if (formOptions) {\n formManager.setOptions(formOptions);\n }\n }, [formManager, formOptions]);\n\n // Sync currentUser when passed as prop\n useEffect(() => {\n if (currentUser !== undefined) {\n formManager.setCurrentUser(currentUser ?? null);\n }\n }, [formManager, currentUser]);\n\n // Sync currentRole when passed as prop\n useEffect(() => {\n if (currentRole !== undefined) {\n formManager.setCurrentRole(currentRole);\n }\n }, [formManager, currentRole]);\n\n // Sync SDK permissions for forms (canCreateForms, canFillForms)\n useEffect(() => {\n const updates: { canCreateForms?: boolean; canFillForms?: boolean } = {};\n if (permissions?.canCreateForms !== undefined) updates.canCreateForms = permissions.canCreateForms;\n if (permissions?.canFillForms !== undefined) updates.canFillForms = permissions.canFillForms;\n if (Object.keys(updates).length > 0) {\n formManager.setOptions(updates);\n }\n }, [formManager, permissions?.canCreateForms, permissions?.canFillForms]);\n\n useEffect(() => {\n if (id) {\n instance.id = id;\n WebViewerInstance.registerInstance(id, instance);\n return () => {\n WebViewerInstance.unregisterInstance(id);\n };\n }\n }, [instance, id]);\n\n useEffect(() => {\n if (targetViewer !== undefined) {\n instance.setTargetViewer(targetViewer);\n }\n }, [instance, targetViewer]);\n\n // ---- document ------------------------------------------------------------------------------\n const requestedUrl = fileUrl ?? initialDoc;\n const [docUrl, setDocUrl] = useState<string | undefined>(requestedUrl);\n const [dynamicDocOptions, setDynamicDocOptions] = useState<LoadDocumentOptions | undefined>(undefined);\n const [loadNonce, setLoadNonce] = useState(0);\n useEffect(() => {\n setDocUrl(requestedUrl);\n setDynamicDocOptions(undefined);\n }, [requestedUrl]);\n const loadDocument = useCallback((url: string, options?: LoadDocumentOptions) => {\n setDocUrl(url);\n setDynamicDocOptions(options);\n setLoadNonce((n) => n + 1);\n }, []);\n\n // ---- Office document conversion handling ---------------------------------------------------\n const officeInfo = useMemo(() => getOfficeDocumentInfo(docUrl), [docUrl]);\n const [convertedOfficePdfUrl, setConvertedOfficePdfUrl] = useState<string | undefined>(undefined);\n const resolvedPdfUrl = officeInfo ? convertedOfficePdfUrl : docUrl;\n const [officeConversionState, setOfficeConversionState] = useState<\n 'idle' | 'converting' | 'converted' | 'error'\n >(officeInfo ? 'converting' : 'idle');\n const [officeConversionError, setOfficeConversionError] = useState<Error | null>(null);\n\n useEffect(() => {\n if (!docUrl) {\n setConvertedOfficePdfUrl(undefined);\n setOfficeConversionState('idle');\n setOfficeConversionError(null);\n return;\n }\n\n if (!officeInfo) {\n // Standard PDF document: pass directly to DocumentViewer\n setConvertedOfficePdfUrl(undefined);\n setOfficeConversionState('idle');\n setOfficeConversionError(null);\n return;\n }\n\n // Office document detected\n if (!officeConverter) {\n const err = new Error(\n `Document \"${officeInfo.fileName || 'document'}\" is a Microsoft ${officeInfo.category} document (${officeInfo.fileType.toUpperCase()}). To view Office files, configure the 'officeConverter' prop on <TeamSyncViewer> or in WebViewer options.`\n );\n setConvertedOfficePdfUrl(undefined);\n setOfficeConversionState('error');\n setOfficeConversionError(err);\n bus.emit('officeConversionError', { fileType: officeInfo.fileType, error: err, url: docUrl });\n latest.current.onOfficeConversionError?.({ fileType: officeInfo.fileType, error: err, url: docUrl });\n return;\n }\n\n let cancelled = false;\n let convertedObjectUrl: string | null = null;\n\n setOfficeConversionState('converting');\n setOfficeConversionError(null);\n bus.emit('officeConverting', {\n fileType: officeInfo.fileType,\n url: docUrl,\n fileName: officeInfo.fileName,\n });\n latest.current.onOfficeConverting?.({\n fileType: officeInfo.fileType,\n url: docUrl,\n fileName: officeInfo.fileName,\n });\n\n convertOfficeDocument(docUrl, officeConverter, officeInfo.fileName)\n .then((res) => {\n if (cancelled) {\n URL.revokeObjectURL(res.objectUrl);\n return;\n }\n convertedObjectUrl = res.objectUrl;\n setConvertedOfficePdfUrl(res.objectUrl);\n setOfficeConversionState('converted');\n bus.emit('officeConverted', {\n fileType: officeInfo.fileType,\n url: docUrl,\n fromCache: res.fromCache,\n });\n latest.current.onOfficeConverted?.({\n fileType: officeInfo.fileType,\n url: docUrl,\n fromCache: res.fromCache,\n });\n })\n .catch((err) => {\n if (cancelled) return;\n const error = err instanceof Error ? err : new Error(String(err));\n setConvertedOfficePdfUrl(undefined);\n setOfficeConversionState('error');\n setOfficeConversionError(error);\n bus.emit('officeConversionError', {\n fileType: officeInfo.fileType,\n error,\n url: docUrl,\n });\n latest.current.onOfficeConversionError?.({\n fileType: officeInfo.fileType,\n error,\n url: docUrl,\n });\n });\n\n return () => {\n cancelled = true;\n if (convertedObjectUrl) {\n URL.revokeObjectURL(convertedObjectUrl);\n }\n };\n }, [docUrl, loadNonce, officeInfo, officeConverter, bus]);\n\n // ---- UI state (formerly the demo App shell) --------------------------------------------------\n const [activeTab, setActiveTab] = useState('View');\n const [leftSidebarOpen, setLeftSidebarOpen] = useState(sidebars && leftPanelOpen);\n const [rightSidebarOpen, setRightSidebarOpen] = useState(false);\n const [sidebarTab, setSidebarTab] = useState<'Comments' | 'Search'>('Comments');\n const [scale, setScale] = useState(typeof initialScale === 'number' ? initialScale : 1.0);\n const [isSettingsOpen, setIsSettingsOpen] = useState(false);\n const [isAboutModalOpen, setIsAboutModalOpen] = useState(false);\n const [pageTransition, setPageTransition] = useState<'continuous' | 'page-by-page'>('continuous');\n const [pageLayout, setPageLayout] = useState<'single' | 'double' | 'cover-facing'>('single');\n const [rotation, setRotation] = useState(0);\n // Empty by default: hosts opt into watermarks via the `watermark` prop.\n const [watermarkText, setWatermarkText] = useState('');\n\n const effectivePermissions = useMemo<SDKPermissions>(() => {\n if (readOnly) {\n return {\n canAddAnnotations: false,\n canEditAnnotations: false,\n canDeleteAnnotations: false,\n canRedact: false,\n canCreateForms: false,\n canFillForms: false,\n };\n }\n return {\n canAddAnnotations: permissions?.canAddAnnotations ?? canAddAnnotations ?? enableAnnotations !== false,\n canEditAnnotations: permissions?.canEditAnnotations ?? canEditAnnotations ?? enableAnnotations !== false,\n canDeleteAnnotations: permissions?.canDeleteAnnotations ?? canDeleteAnnotations ?? enableAnnotations !== false,\n canRedact: permissions?.canRedact ?? enableRedactions ?? true,\n canCreateForms: permissions?.canCreateForms ?? true,\n canFillForms: permissions?.canFillForms ?? true,\n };\n }, [readOnly, permissions, canAddAnnotations, canEditAnnotations, canDeleteAnnotations, enableAnnotations, enableRedactions]);\n const annotationsEnabled = !readOnly && enableAnnotations !== false;\n\n useEffect(() => {\n formManager.setReadOnly(effectivePermissions.canFillForms === false);\n }, [formManager, effectivePermissions.canFillForms]);\n\n // Keep the manager's user / permission state in sync with props.\n const currentUserId = props.currentUser?.id;\n const currentUserName = props.currentUser?.name;\n useEffect(() => {\n annotationManager.setCurrentUserInfo(currentUserId || currentUserName ? { id: currentUserId, name: currentUserName } : undefined);\n }, [annotationManager, currentUserId, currentUserName]);\n useEffect(() => {\n annotationManager.setReadOnly(readOnly);\n }, [annotationManager, readOnly]);\n useEffect(() => {\n annotationManager.setCanEditOthers(Boolean(permissions?.canEditOthers));\n }, [annotationManager, permissions?.canEditOthers]);\n\n // Annotations belong to a document: drop them when a different document is requested.\n useEffect(() => {\n annotationManager.clear();\n annotationManager.setDocument(null);\n }, [annotationManager, docUrl]);\n\n // Relay granular manager events to the instance bus (`instance.on('annotationChanged', ...)`).\n useEffect(() => annotationManager.addEventListener('annotationChanged', (e) => bus.emit('annotationChanged', e)), [annotationManager, bus]);\n\n useEffect(() => {\n if (effectivePermissions.canAddAnnotations === false && activeTab === 'Annotate') setActiveTab('View');\n if (effectivePermissions.canCreateForms === false && activeTab === 'Forms') setActiveTab('View');\n }, [effectivePermissions.canAddAnnotations, effectivePermissions.canCreateForms, activeTab]);\n\n // ---- live state exposed to the instance ------------------------------------------------------\n const redactionsRef = useRef<Redaction[]>([]);\n const pdfDocRef = useRef<pdfjsLib.PDFDocumentProxy | null>(null);\n const pageRef = useRef({ current: 1, count: 0 });\n const docUrlRef = useRef(docUrl);\n docUrlRef.current = docUrl;\n const signedBytesRef = useRef<Uint8Array | null>(null);\n const initialFitAppliedRef = useRef(false);\n\n // Transient highlights (citations, search matches)\n const [internalTransientHighlights, setInternalTransientHighlights] = useState<TransientHighlight[]>([]);\n const transientHighlights = useMemo(() => {\n return propTransientHighlights ?? internalTransientHighlights;\n }, [propTransientHighlights, internalTransientHighlights]);\n const transientHighlightsRef = useRef(transientHighlights);\n transientHighlightsRef.current = transientHighlights;\n\n const setTransientHighlights = useCallback((highlights: TransientHighlight[]) => {\n setInternalTransientHighlights(highlights);\n latest.current.onTransientHighlightsChange?.(highlights);\n }, []);\n\n useEffect(() => {\n instance._bind(\n {\n getAnnotations: () => annotationManager.getAnnotationsList(),\n getRedactions: () => redactionsRef.current,\n getWatermark: () => latest.current.watermark,\n getPdfDocument: () => pdfDocRef.current,\n getDocumentUrl: () => docUrlRef.current,\n getFileName: () => latest.current.fileName,\n getCurrentUserName: () => latest.current.currentUser?.name,\n getCurrentPage: () => pageRef.current.current,\n getPageCount: () => pageRef.current.count,\n loadDocument,\n goToPage: (pageNum: number, options?: { smooth?: boolean }) => {\n bus.emit('action-go-to-page', { page: pageNum, smooth: options?.smooth });\n },\n getTransientHighlights: () => transientHighlightsRef.current,\n setTransientHighlights,\n },\n rootRef.current\n );\n return () => instance._unbind();\n }, [instance, annotationManager, loadDocument, bus, setTransientHighlights]);\n\n // onReady + autoFocus, exactly once.\n const readyRef = useRef(false);\n useEffect(() => {\n if (readyRef.current) return;\n readyRef.current = true;\n if (latest.current.autoFocus) rootRef.current?.focus({ preventScroll: true });\n latest.current.onReady?.(instance);\n }, [instance]);\n\n // ---- bus wiring (formerly window listeners) --------------------------------------------------\n useEffect(() => {\n const openPanel = (tab: 'Comments' | 'Search') => {\n setRightSidebarOpen(true);\n setSidebarTab(tab);\n };\n\n const offs = [\n bus.on<{ elements?: string[] }>('action-open-elements', (d) => {\n const elements = d?.elements ?? [];\n if (elements.includes('leftPanel')) setLeftSidebarOpen(true);\n if (elements.includes('notesPanel')) openPanel('Comments');\n if (elements.includes('searchPanel')) openPanel('Search');\n }),\n bus.on<{ elements?: string[] }>('action-close-elements', (d) => {\n const elements = d?.elements ?? [];\n if (elements.includes('leftPanel')) setLeftSidebarOpen(false);\n if (elements.includes('notesPanel') || elements.includes('searchPanel')) setRightSidebarOpen(false);\n }),\n bus.on<{ panel?: string }>('action-set-active-left-panel', (d) => {\n const panel = d?.panel;\n if (panel === 'notesPanel') openPanel('Comments');\n else if (panel === 'searchPanel') openPanel('Search');\n else setLeftSidebarOpen(true);\n }),\n bus.on<{ tool: string | null }>('action-tool-changed', (d) => bus.emit('toolChanged', { tool: d?.tool ?? null })),\n bus.on('action-print', async () => {\n try {\n const data = await instance.getFileData();\n await printPdfBytes(data, { title: latest.current.fileName });\n } catch (err) {\n console.error('[teamsync-pdf-viewer] print failed', err);\n bus.emit('action-print-error', { error: err });\n }\n }),\n bus.on('action-download', async () => {\n try {\n let data = signedBytesRef.current;\n if (data) signedBytesRef.current = null; // consume the freshly signed bytes\n else data = await instance.getFileData();\n if (!data) return;\n const blob = new Blob([data as BlobPart], { type: 'application/pdf' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = latest.current.fileName || 'annotated_document.pdf';\n a.click();\n setTimeout(() => URL.revokeObjectURL(url), 1000);\n } catch (err) {\n console.error('[teamsync-pdf-viewer] download failed', err);\n bus.emit('action-download-error', { error: err });\n }\n }),\n bus.on<{ pageIndex: number; x: number; y: number; width: number; height: number }>(\n 'action-process-digital-signature',\n async (d) => {\n try {\n const { pageIndex, x, y, width, height } = d;\n const tempAnn: Annotation = {\n id: newId(),\n type: 'digital_signature_placeholder',\n pageIndex, x, y, width, height,\n color: '#0f172a', strokeWidth: 1, opacity: 1,\n signer: latest.current.currentUser?.name ?? 'Unknown signer',\n timestamp: Date.now(),\n };\n const explicitAnnotations = [...instance.getAnnotations(), tempAnn];\n bus.emit('action-waiting-for-pin-start');\n const data = await instance.getFileData({ explicitAnnotations });\n bus.emit('action-waiting-for-pin-end');\n if (!data) return;\n signedBytesRef.current = data;\n bus.emit('action-commit-digital-signature', { tempAnn });\n } catch (err: any) {\n bus.emit('action-waiting-for-pin-error', { error: err?.message ?? String(err) });\n console.error('[teamsync-pdf-viewer] process signature failed', err);\n }\n }\n ),\n bus.on<{ highlights: TransientHighlight[] }>('action-set-transient-highlights', (d) => {\n setTransientHighlights(d?.highlights ?? []);\n }),\n bus.on('action-clear-transient-highlights', () => {\n setTransientHighlights([]);\n }),\n // No external signing plugin in the loop: commit the placeholder to the page directly.\n bus.on<{ tempAnn: Annotation }>('action-commit-digital-signature', (d) =>\n bus.emit('action-commit-digital-signature-local', d)\n ),\n bus.on<{ text: string }>('action-text-selected', (d) => {\n bus.emit('textSelected', { text: d.text });\n latest.current.onTextSelected?.({ text: d.text });\n }),\n bus.on<{ text: string }>('action-text-copied', (d) => {\n bus.emit('textCopied', { text: d.text });\n latest.current.onTextCopied?.({ text: d.text });\n }),\n ];\n return () => offs.forEach((off) => off());\n }, [bus, instance, setTransientHighlights]);\n\n // ---- DocumentViewer callbacks ----------------------------------------------------------------\n const handleDocumentLoaded = useCallback(\n (doc: pdfjsLib.PDFDocumentProxy, url: string) => {\n pdfDocRef.current = doc;\n annotationManager.setDocument(doc);\n pageRef.current = { current: 1, count: doc.numPages };\n initialFitAppliedRef.current = false;\n const reportedUrl = docUrlRef.current ?? url;\n bus.emit('documentLoaded', { url: reportedUrl, numPages: doc.numPages });\n latest.current.onDocumentLoaded?.({ url: reportedUrl, numPages: doc.numPages });\n },\n [bus, annotationManager]\n );\n\n const handleLoadError = useCallback(\n (error: Error, info: DocumentLoadErrorInfo) => {\n pdfDocRef.current = null;\n annotationManager.setDocument(null);\n bus.emit('documentLoadError', { url: info.url, error, passwordRequired: info.passwordRequired });\n if (info.passwordRequired) latest.current.onPasswordRequired?.({ url: info.url });\n latest.current.onDocumentLoadError?.(error, (newUrl) => loadDocument(newUrl ?? info.url), info);\n },\n [bus, loadDocument, annotationManager]\n );\n\n const handleFirstPageRendered = useCallback(\n (pageNumber: number) => {\n const url = docUrlRef.current ?? '';\n if (!initialFitAppliedRef.current) {\n initialFitAppliedRef.current = true;\n const fit = latest.current.initialScale ?? 'fit-width';\n const widthRatio =\n latest.current.initialWidthRatio ??\n latest.current.widthRatio ??\n (typeof fit === 'object' && fit !== null && fit.type === 'fit-width' ? fit.ratio : undefined);\n if (typeof widthRatio === 'number' && Number.isFinite(widthRatio) && widthRatio > 0) {\n setTimeout(() => bus.emit('action-fit-to-width', { ratio: widthRatio }), 0);\n } else if (fit === 'fit-width') {\n setTimeout(() => bus.emit('action-fit-to-width'), 0);\n } else if (fit === 'fit-page') {\n setTimeout(() => bus.emit('action-fit-to-page'), 0);\n }\n }\n bus.emit('firstPageRendered', { url, pageNumber });\n latest.current.onFirstPageRendered?.({ url, pageNumber });\n },\n [bus]\n );\n\n const handlePageRendered = useCallback(\n (pageNumber: number) => {\n const url = docUrlRef.current ?? '';\n bus.emit('pageRendered', { url, pageNumber });\n latest.current.onPageRendered?.({ url, pageNumber });\n },\n [bus]\n );\n\n const handlePageChange = useCallback(\n (pageNumber: number, numPages: number) => {\n pageRef.current = { current: pageNumber, count: numPages };\n bus.emit('pageChanged', { pageNumber, numPages });\n latest.current.onPageChange?.(pageNumber, numPages);\n },\n [bus]\n );\n\n const handleAnnotationsChange = useCallback(\n (anns: Annotation[]) => {\n bus.emit('annotationsChanged', { annotations: anns });\n latest.current.onAnnotationsChange?.(anns);\n },\n [bus]\n );\n\n const handleRedactionsChange = useCallback(\n (reds: Redaction[]) => {\n redactionsRef.current = reds;\n bus.emit('redactionsChanged', { redactions: reds });\n latest.current.onRedactionsChange?.(reds);\n },\n [bus]\n );\n\n const handleRedactionsApplied = useCallback(\n (reds: Redaction[]) => {\n bus.emit('redactionsApplied', { redactions: reds });\n latest.current.onRedactionsApplied?.(reds);\n },\n [bus]\n );\n\n const { getCommand } = useShortcuts();\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const openSearchSidebar = useCallback(() => {\n if (sidebars) {\n setRightSidebarOpen(true);\n setSidebarTab('Search');\n setTimeout(() => bus.emit('action-focus-search'), 50);\n }\n }, [sidebars, bus]);\n\n const openFilePicker = useCallback(() => {\n fileInputRef.current?.click();\n }, []);\n\n useEffect(() => {\n const offSearch = bus.on('action-open-search', openSearchSidebar);\n const offFilePicker = bus.on('action-open-file-picker', openFilePicker);\n return () => {\n offSearch();\n offFilePicker();\n };\n }, [bus, openSearchSidebar, openFilePicker]);\n\n // Focus root element on mount if document is not currently focused elsewhere\n useEffect(() => {\n if (rootRef.current && (document.activeElement === document.body || !document.activeElement)) {\n rootRef.current.focus({ preventScroll: true });\n }\n }, []);\n\n // Global window keydown fallback so shortcuts fire reliably\n useEffect(() => {\n const handleGlobalKeyDown = (e: KeyboardEvent) => {\n const target = e.target as HTMLElement | null;\n if (\n target?.tagName === 'INPUT' ||\n target?.tagName === 'TEXTAREA' ||\n target?.isContentEditable\n ) {\n return;\n }\n\n const root = rootRef.current;\n if (!root) return;\n\n if (\n document.activeElement === document.body ||\n document.activeElement === document.documentElement ||\n document.activeElement === null ||\n root.contains(document.activeElement)\n ) {\n if (!root.contains(document.activeElement)) {\n if (matchShortcut(e, getCommand('SEARCH'))) {\n e.preventDefault();\n openSearchSidebar();\n return;\n }\n if (matchShortcut(e, getCommand('FILE_PICKER'))) {\n e.preventDefault();\n openFilePicker();\n return;\n }\n bus.emit('viewer-keydown', e);\n }\n }\n };\n\n window.addEventListener('keydown', handleGlobalKeyDown);\n return () => {\n window.removeEventListener('keydown', handleGlobalKeyDown);\n };\n }, [bus, getCommand, openSearchSidebar, openFilePicker]);\n\n // ---- root element handlers -------------------------------------------------------------------\n const handleRootKeyDownCapture = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (matchShortcut(e.nativeEvent, getCommand('SEARCH'))) {\n e.preventDefault();\n openSearchSidebar();\n return;\n }\n if (matchShortcut(e.nativeEvent, getCommand('FILE_PICKER'))) {\n e.preventDefault();\n openFilePicker();\n return;\n }\n bus.emit('viewer-keydown', e.nativeEvent);\n };\n\n // Clicking anywhere inside the viewer makes it the keyboard-shortcut target.\n const handleRootMouseDownCapture = () => {\n const root = rootRef.current;\n if (root && !root.contains(document.activeElement)) root.focus({ preventScroll: true });\n };\n\n const toggleFullscreen = () => {\n const target = rootRef.current ?? document.documentElement;\n if (!document.fullscreenElement) {\n target.requestFullscreen?.().catch(() => {});\n } else {\n document.exitFullscreen?.().catch(() => {});\n }\n };\n\n const openSidebarTab = (tab: 'Comments' | 'Search') => {\n if (!sidebars) return;\n if (rightSidebarOpen && sidebarTab === tab) {\n setRightSidebarOpen(false);\n } else {\n setRightSidebarOpen(true);\n setSidebarTab(tab);\n if (tab === 'Search') {\n setTimeout(() => bus.emit('action-focus-search'), 50);\n }\n }\n };\n\n return (\n <ViewerBusContext.Provider value={bus}>\n <div\n ref={rootRef}\n className={['tspdf-root', className].filter(Boolean).join(' ')}\n style={style}\n tabIndex={-1}\n data-teamsync-pdf-viewer=\"\"\n onKeyDownCapture={handleRootKeyDownCapture}\n onMouseDownCapture={handleRootMouseDownCapture}\n >\n {toolbar && (\n <Header\n activeTab={activeTab}\n setActiveTab={(tab) => {\n if (effectivePermissions.canAddAnnotations === false && tab === 'Annotate') return;\n setActiveTab(tab);\n }}\n leftSidebarOpen={leftSidebarOpen}\n setLeftSidebarOpen={(open) => { if (sidebars) setLeftSidebarOpen(open); }}\n rightSidebarOpen={rightSidebarOpen}\n setRightSidebarOpen={setRightSidebarOpen}\n sidebarTab={sidebarTab}\n scale={scale}\n onZoomIn={() => setScale((s) => calculateNextZoomIn(s))}\n onZoomOut={() => setScale((s) => calculateNextZoomOut(s))}\n onZoomSet={(s) => setScale(clampScale(s))}\n onOpenFile={openFilePicker}\n onDownload={() => bus.emit('action-download')}\n onFullScreen={toggleFullscreen}\n onSaveAs={() => bus.emit('action-download')}\n onPrint={() => bus.emit('action-print')}\n onOpenSettings={() => setIsSettingsOpen(true)}\n onOpenAbout={() => setIsAboutModalOpen(true)}\n onOpenSidebarTab={openSidebarTab}\n pageTransition={pageTransition}\n setPageTransition={setPageTransition}\n pageLayout={pageLayout}\n setPageLayout={setPageLayout}\n rotation={rotation}\n setRotation={setRotation}\n enableAnnotations={annotationsEnabled}\n enableSign={enableSign}\n plugins={plugins}\n permissions={effectivePermissions}\n />\n )}\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".pdf,application/pdf,.docx,.doc,.pptx,.ppt,.xlsx,.xls,application/vnd.openxmlformats-officedocument.wordprocessingml.document,application/msword,application/vnd.openxmlformats-officedocument.presentationml.presentation,application/vnd.ms-powerpoint,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel\"\n style={{ display: 'none' }}\n onChange={(e) => {\n const file = e.target.files?.[0];\n if (file) {\n const url = URL.createObjectURL(file);\n loadDocument(`${url}#filename=${encodeURIComponent(file.name)}`);\n }\n e.target.value = '';\n }}\n aria-hidden=\"true\"\n />\n <div style={{ display: 'flex', flex: 1, minHeight: 0, overflow: 'hidden', position: 'relative' }}>\n {officeInfo && officeConversionState === 'converting' && (\n <OfficeLoadingOverlay\n fileType={officeInfo.fileType}\n fileName={officeInfo.fileName}\n />\n )}\n {officeInfo && officeConversionState === 'error' && (\n <OfficeLoadingOverlay\n fileType={officeInfo.fileType}\n fileName={officeInfo.fileName}\n error={officeConversionError}\n onRetry={() => setLoadNonce((n) => n + 1)}\n />\n )}\n <DocumentViewer\n leftSidebarOpen={sidebars && leftSidebarOpen}\n rightSidebarOpen={sidebars && rightSidebarOpen}\n sidebarTab={sidebarTab}\n setSidebarTab={setSidebarTab}\n sidebars={sidebars}\n activeTab={activeTab}\n annotationManager={annotationManager}\n initialDoc={resolvedPdfUrl}\n loadNonce={loadNonce}\n withCredentials={dynamicDocOptions?.withCredentials ?? withCredentials}\n httpHeaders={dynamicDocOptions?.httpHeaders ?? httpHeaders}\n customHeaders={dynamicDocOptions?.customHeaders ?? customHeaders}\n rangeChunkSize={dynamicDocOptions?.rangeChunkSize ?? rangeChunkSize}\n disableStream={dynamicDocOptions?.disableStream ?? disableStream}\n disableAutoFetch={dynamicDocOptions?.disableAutoFetch ?? disableAutoFetch}\n disableRange={dynamicDocOptions?.disableRange ?? disableRange}\n password={dynamicDocOptions?.password}\n assets={assets}\n redactions={redactions}\n regexRedactions={regexRedactions}\n scale={scale}\n setScale={setScale}\n onAnnotationsChange={handleAnnotationsChange}\n onRedactionsChange={handleRedactionsChange}\n onRedactionsApplied={handleRedactionsApplied}\n onDocumentLoaded={handleDocumentLoaded}\n onLoadError={handleLoadError}\n onFirstPageRendered={handleFirstPageRendered}\n onPageRendered={handlePageRendered}\n onPageChange={handlePageChange}\n pageTransition={pageTransition}\n pageLayout={pageLayout}\n rotation={rotation}\n setRotation={setRotation}\n watermark={watermark}\n watermarkText={watermarkText}\n enableAnnotations={annotationsEnabled}\n initialPage={initialPage}\n page={page}\n transientHighlights={transientHighlights}\n permissions={effectivePermissions}\n hideAnnotationsUntilPageRendered={hideAnnotationsUntilPageRendered}\n enableTextSelection={enableTextSelection}\n defaultTool={defaultTool}\n showSelectionTooltip={showSelectionTooltip}\n initialScale={initialScale}\n initialWidthRatio={initialWidthRatio ?? widthRatio}\n responsive={responsive}\n instance={instance}\n targetViewer={targetViewer}\n resolveLinkUrl={resolveLinkUrl}\n onLinkClick={onLinkClick}\n formManager={formManager}\n setActiveTab={setActiveTab}\n onDownloadFilledPdf={() => bus.emit('action-download')}\n />\n </div>\n {isSettingsOpen && (\n <SettingsModal onClose={() => setIsSettingsOpen(false)} watermarkText={watermarkText} setWatermarkText={setWatermarkText} />\n )}\n {isAboutModalOpen && <AboutModal onClose={() => setIsAboutModalOpen(false)} />}\n </div>\n </ViewerBusContext.Provider>\n );\n});\n\nexport default TeamSyncViewer;\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * Imperative entry point: mounts <TeamSyncViewer> into an element and resolves with the instance.\n */\nimport React from 'react';\nimport ReactDOM from 'react-dom/client';\nimport { TeamSyncViewer } from '../components/TeamSyncViewer';\nimport type { WebViewerInstance } from './ViewerInstance';\nimport type { WebViewerOptions } from './types';\n\nexport function createWebViewer(options: WebViewerOptions, viewerElement: HTMLElement): Promise<WebViewerInstance> {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return Promise.reject(new Error('[teamsync-pdf-viewer] createWebViewer() requires a browser environment.'));\n }\n if (!viewerElement) {\n return Promise.reject(new Error('[teamsync-pdf-viewer] createWebViewer() needs a container element.'));\n }\n\n return new Promise((resolve) => {\n const root = ReactDOM.createRoot(viewerElement);\n const { path: _path, ...rest } = options;\n root.render(\n <TeamSyncViewer\n {...rest}\n style={{ width: '100%', height: '100%' }}\n onReady={(instance) => {\n instance._setUnmount(() => root.unmount());\n resolve(instance);\n }}\n />\n );\n });\n}\n\n/** @deprecated Use `createWebViewer`. Kept as an alias for drop-in compatibility. */\nexport const WebViewer = createWebViewer;\n"],"mappings":";;;;;;;;AAOA,IAAasB,KAAmBC,EAAgC,IAAI;;;ACApE,SAAgBC,KAA0B;CACxC,IAAMC,IAAMC,EAAWJ,EAAgB;CACvC,IAAI,CAACG,GACH,MAAU,MAAM,4EAA4E;CAE9F,OAAOA;AACT;AAMA,SAAgBE,GAAyB,GAAc,GAAgC;CACrF,IAAMF,IAAMD,GAAa,GACnBI,IAAMC,EAAOC,CAAQ;CAE3B,AADA,EAAI,UAAUA,GACdC,QAAgBN,EAAI,GAAMO,IAAO,MAAWJ,EAAI,QAAQK,CAAM,CAAC,GAAG,CAACR,GAAKO,CAAI,CAAC;AAC/E;;;ACpBA,IAAaE,KAAY,IACZC,KAAY,GAEZC,WACX,OAAO,YAAc,QACnB,+EAA+E,KAAK,UAAU,SAAS,KACtG,iCAAiC,KAAK,UAAU,SAAS,IAKjDC,KAAiB,MACjBC,KAAwB,MACxBC,KAAoB,SACpBC,KAA2B;AAQxC,SAAgBC,GAAoB,GAAsB,IAAA,GAA8B;CAEtF,OAAO,KAAK,IAAIC,GAAU,KAAK,OAAOC,KADzBA,IAAe,IAAI,MAAOA,IAAe,IAAI,KAAM,MACH,GAAG,IAAI,GAAG;AACzE;AAQA,SAAgBC,GAAqB,GAAsB,IAAWV,IAAmB;CAEvF,OAAO,KAAK,IAAIW,GAAU,KAAK,OAAOF,KADzBA,KAAgB,IAAI,MAAOA,KAAgB,IAAI,KAAM,MACL,GAAG,IAAI,GAAG;AACzE;AAKA,SAAgBG,GAAW,GAAe,IAAWZ,IAAW,IAAA,GAA8B;CAC5F,OAAO,KAAK,IAAIQ,GAAU,KAAK,IAAIG,GAAU,KAAK,MAAME,IAAQ,GAAG,IAAI,GAAG,CAAC;AAC7E;AAMA,SAAgBC,GACd,GACA,GACA,IAAQ,GACR,IAAWd,IACX,IAAA,GACQ;CAGR,OAFIe,KAAkB,KAAKC,KAAa,IAAU,IAE3CJ,GAAYG,KADI,OAAOE,KAAU,YAAY,OAAO,SAASA,CAAK,KAAKA,IAAQ,IAAIA,IAAQ,KAC5CD,GAAWL,GAAUH,CAAQ;AACrF;AAMA,SAAgBU,GACd,GACA,GACA,GACA,GACA,IAAShB,GAAiB,IAAIE,KAAwBD,IACtD,IAAYD,GAAiB,IAAII,KAA2BD,IACpD;CACR,IAAIc,IAAcN,IAAQO;CAU1B,OATIC,IAAgBF,IAAcG,MAChC,IAAcA,IAASD,IAErBE,IAAiBJ,IAAcG,MACjC,IAAcA,IAASC,IAEpBF,IAAgBF,KAAgBI,IAAiBJ,KAAeK,MACnE,IAAc,KAAK,KAAKA,KAAaH,IAAgBE,EAAe,IAE/DJ;AACT;AAuBA,SAAgBM,GAA4B,GAAkD;CAC5F,IAAM,EACJ,cACA,aACA,gBAAgBC,GAChB,iBAAiBC,GACjB,sBACA,qBACA,eAAeC,GACf,eACA,oBAAiB,OACfC;CAIJ,IAAIC,GACF,OAAO;EACL,YAAY;EACZ,WAAWC,KAAoB,IAAI,IAAIA;CACzC;CAGF,IAAMC,IAAgBC,GAAY,MAAM,QAAQA,GAAY,MAAM;CAIlE,IAAI,CAACD,KAAiBD,KAAoB,GACxC,OAAO;EACL,YAAY;EACZ,WAAW;CACb;CAGF,IAAMG,IAAKF,IAAgBC,EAAY,KAAMP,IAAK,GAC5CS,IAAKH,IAAgBC,EAAY,KAAMN,IAAK,GAE5CS,IAAIF,IAAKG,GACTC,IAAIH,IAAKJ,GAETQ,IAAS,KAAK,IAAI,GAAGb,IAAK,IAAKE,IAAQY,IAAa,CAAC,GAKrDC,IAJS,KAAK,IAAI,GAAGf,IAAK,IAAKE,IAAQc,IAAY,CAI5C,KAFCN,IAAIG,MACQG,IAAWF;CAGrC,OAAO;EACL,YAAY,KAAK,IAAI,GAAGC,IAAOP,CAAE;EACjC,WAAW,KAAK,IAAI,GAASQ,IAAWF,IAAhBF,IAA8BH,CAAE;CAC1D;AACF;;;AC/GA,IAAMQ,KAAO;CACX;CAAQ;CAAY;AACtB;AAEA,SAAwBC,GAAO,EAC7B,cAAW,iBACX,oBAAiB,uBACjB,qBAAkB,qBAAqBC,GACvC,eACA,UAAO,aAAU,cAAW,cAC5B,eACA,eAAY,iBAAc,aAAU,YAAS,mBAAgB,gBAAa,qBAC1E,mBAAgB,sBAAmB,gBAAY,kBAAe,aAAU,gBACxE,qBAAiB,GACjB,sBACA,iBAAa,IACb,YACA,kBACc;CACd,IAAMC,IAAgBC,KAAWA,EAAQ,MAAK,MAAKC,EAAE,MAAMA,EAAE,GAAG,YAAY,CAAC,CAAC,SAAS,MAAM,CAAC,GACxFC,IAAgBC,OAAe,MAAQ,EAAQJ,GAC/C,CAACK,IAAYC,KAAiBC,EAAS,EAAK,GAC5C,CAACC,GAAgBC,KAAqBF,EAAS,EAAK,GACpD,CAACG,IAAoBC,MAAyBJ,EAAS,EAAK,GAC5D,CAACK,IAAYC,MAAiBN,EAAwB,QAAQ,GAC9DO,KAAUjE,EAAuB,IAAI,GACrCkE,IAAclE,EAAuB,IAAI,GACzCmE,KAAkBnE,EAAuB,IAAI,GAC7CJ,KAAMD,GAAa;CAsBzB,OApBAG,GAAqC,wBAAwB,MAAMkE,GAAcI,GAAG,QAAQ,IAAI,CAAC,GAEjGlE,QAAgB;EACd,SAASmE,EAAmB,GAAmB;GAO7C,AANIJ,GAAQ,WAAW,CAACA,GAAQ,QAAQ,SAASK,EAAM,MAAc,KACnEb,EAAc,EAAK,GAEjBS,EAAY,WAAW,CAACA,EAAY,QAAQ,SAASI,EAAM,MAAc,KAC3EV,EAAkB,EAAK,GAErBO,GAAgB,WAAW,CAACA,GAAgB,QAAQ,SAASG,EAAM,MAAc,KACnFR,GAAsB,EAAK;EAE/B;EAEA,OADA,SAAS,iBAAiB,aAAaO,CAAkB,SAC5C;GACX,SAAS,oBAAoB,aAAaA,CAAkB;EAC9D;CACF,GAAG,CAAC,CAAC,GAGH,kBAAC,OAAD;EAAK,OAAO;GACV,SAAS;GACT,eAAe;GACf,cAAc;GACd,iBAAiB;GACjB,OAAO;EACT;EACE,UAAA,kBAAC,OAAD;GAAK,OAAO;IACV,SAAS;IACT,YAAY;IACZ,gBAAgB;IAChB,QAAQ;IACR,SAAS;GACX;GANA,UAAA;IAQE,kBAAC,OAAD;KAAK,OAAO;MAAE,SAAS;MAAQ,YAAY;MAAU,KAAK;KAAM;KAAhE,UAAA;MACE,kBAAC,OAAD;OAAK,KAAKJ;OAAS,OAAO,EAAE,UAAU,WAAW;OAAjD,UAAA,CACE,kBAACM,IAAD;QAAY,MAAM,kBAACC,IAAD,EAAM,MAAM,GAAK,CAAA;QAAG,OAAM;QAAO,eAAef,EAAc,CAACD,EAAU;QAAG,QAAQA;OAAa,CAAA,GAClHA,MACC,kBAAC,OAAD;QAAK,OAAO;SACV,UAAU;SAAY,KAAK;SAAQ,MAAM;SAAG,WAAW;SACvD,iBAAiB;SAAQ,cAAc;SAAO,WAAW;SACzD,OAAO;SAAS,QAAQ;SAAM,SAAS;SAAQ,eAAe;SAC9D,QAAQ;SAAiC,UAAU;QACrD;QALA,UAAA;SAMGiB,KACC,kBAACC,IAAD;UAAY,MAAM,kBAACC,IAAD,EAAY,MAAM,GAAK,CAAA;UAAG,OAAM;UAAc,eAAe;WAAgB,AAAdF,EAAW,GAAGhB,EAAc,EAAK;UAAG;SAAI,CAAA;SAE3H,kBAACiB,IAAD;UAAY,MAAM,kBAACE,IAAD,EAAU,MAAM,GAAK,CAAA;UAAG,OAAM;UAAW,eAAe;WAAgB,AAAdC,EAAW,GAAGpB,EAAc,EAAK;UAAG;SAAI,CAAA;SACpH,kBAACiB,IAAD;UAAY,MAAM,kBAACI,IAAD,EAAU,MAAM,GAAK,CAAA;UAAG,OAAM;UAAoB,eAAe;WAAkB,AAAhBC,EAAa,GAAGtB,EAAc,EAAK;UAAG;SAAI,CAAA;SAC/H,kBAACiB,IAAD;UAAY,MAAM,kBAACM,IAAD,EAAM,MAAM,GAAK,CAAA;UAAG,OAAM;UAAU,eAAe;WAAc,AAAZC,EAAS,GAAGxB,EAAc,EAAK;UAAG;SAAI,CAAA;SAC7G,kBAACiB,IAAD;UAAY,MAAM,kBAACQ,IAAD,EAAS,MAAM,GAAK,CAAA;UAAG,OAAM;UAAQ,UAAU,CAACC;UAAS,eAAe;WAAe,AAAbA,IAAU,GAAG1B,EAAc,EAAK;UAAG;SAAI,CAAA;SACnI,kBAAC,OAAD,EAAK,OAAO;UAAE,QAAQ;UAAO,iBAAiB;UAAuB,QAAQ;SAAQ,EAAI,CAAA;SACzF,kBAACiB,IAAD;UAAY,MAAM,kBAACU,IAAD;WAAQ,MAAM;WAAI,OAAM;UAAW,CAAA;UAAG,OAAM;UAAqB,eAAe;WAAoK,AAAlK,OAAO,cAAc,IAAI,YAAY,wBAAwB,EAAE,QAAQ;YAAE,MAAM;YAAkB,MAAM;YAAkB,SAAS,EAAE,MAAM,eAAe;WAAE,EAAE,CAAC,CAAC,GAAG3B,EAAc,EAAK;UAAG;SAAI,CAAA;SAChS,kBAACiB,IAAD;UAAY,MAAM,kBAACW,GAAD,EAAU,MAAM,GAAK,CAAA;UAAG,OAAM;UAAW,eAAe;WAAoB,AAAlBC,EAAe,GAAG7B,EAAc,EAAK;UAAG;SAAI,CAAA;QACrH;OAEJ,CAAA,CAAA;;MACL,kBAACc,IAAD;OACE,MAAM,kBAACgB,IAAD,EAAW,MAAM,GAAK,CAAA;OAC5B,OAAM;OACN,QAAQC;OACR,eAAeC,EAAmB,CAACD,CAAe;MACnD,CAAA;MACD,kBAAC,OAAD,EAAK,OAAO;OAAE,OAAO;OAAO,QAAQ;OAAQ,iBAAiB;OAAuB,QAAQ;MAAQ,EAAI,CAAA;MACxG,kBAAC,OAAD;OAAK,KAAKrB;OAAiB,OAAO,EAAE,UAAU,WAAW;OAAzD,UAAA,CACE,kBAAC,OAAD;QAAK,OAAO,EAAE,UAAU,WAAW;QACjC,UAAA,kBAACI,IAAD;SACE,MACE,kBAAC,OAAD;UAAK,OAAO;WAAE,UAAU;WAAY,SAAS;WAAQ,YAAY;WAAU,gBAAgB;UAAS;UAApG,UAAA,CACE,kBAACmB,GAAD,EAAU,MAAM,GAAK,CAAA,GACrB,kBAAC,OAAD;WAAK,OAAO;YAAE,UAAU;YAAY,OAAO;YAAQ,QAAQ;YAAQ,iBAAiB;YAAQ,cAAc;YAAO,SAAS;WAAM;WAC9H,UAAA,kBAACL,GAAD;YAAU,MAAM;YAAI,OAAM;WAAkB,CAAA;UACzC,CAAA,CACF;;SAEP,OAAM;SACN,QAAQxB;SACR,eAAeC,GAAsB,CAACD,EAAkB;QACzD,CAAA;OACE,CAAA,GACJA,MACC,kBAAC,OAAD;QAAK,OAAO;SACV,UAAU;SAAY,KAAK;SAAQ,MAAM;SAAG,WAAW;SACvD,iBAAiB;SAAQ,cAAc;SAAO,WAAW;SACzD,OAAO;SAAS,QAAQ;SAAM,SAAS;SAAQ,eAAe;SAC9D,QAAQ;SAAiC,UAAU;QACrD;QALA,UAAA;SAME,kBAAC,OAAD;UAAK,OAAO;WAAE,SAAS;WAAiB,UAAU;WAAQ,YAAY;WAAK,OAAO;UAAU;UAAG,UAAA;SAAoB,CAAA;SACnH,kBAACa,IAAD;UACE,MAAM,kBAACiB,IAAD,EAAW,MAAM,GAAK,CAAA;UAC5B,OAAM;UACN,UAAUC,MAAmB;UAC7B,eAAe;WAAmC,AAAjCC,EAAkB,YAAY,GAAG/B,GAAsB,EAAK;UAAG;SACjF,CAAA;SACD,kBAACY,IAAD;UACE,MAAM,kBAACvG,IAAD,EAAM,MAAM,GAAK,CAAA;UACvB,OAAM;UACN,UAAUyH,MAAmB;UAC7B,eAAe;WAAqC,AAAnCC,EAAkB,cAAc,GAAG/B,GAAsB,EAAK;UAAG;SACnF,CAAA;SAED,kBAAC,OAAD,EAAK,OAAO;UAAE,QAAQ;UAAO,iBAAiB;UAAuB,QAAQ;SAAQ,EAAI,CAAA;SAEzF,kBAAC,OAAD;UAAK,OAAO;WAAE,SAAS;WAAiB,UAAU;WAAQ,YAAY;WAAK,OAAO;UAAU;UAAG,UAAA;SAAqB,CAAA;SACpH,kBAACY,IAAD;UACE,MAAM,kBAACoB,IAAD,EAAU,MAAM,GAAK,CAAA;UAC3B,OAAM;UACN,eAAe;WAAsC,AAApCC,GAAaC,IAAW,MAAM,GAAG,GAAGlC,GAAsB,EAAK;UAAG;SACpF,CAAA;SACD,kBAACY,IAAD;UACE,MAAM,kBAACuB,IAAD,EAAW,MAAM,GAAK,CAAA;UAC5B,OAAM;UACN,eAAe;WAA4C,AAA1CF,GAAaC,IAAW,KAAK,OAAO,GAAG,GAAGlC,GAAsB,EAAK;UAAG;SAC1F,CAAA;SAED,kBAAC,OAAD,EAAK,OAAO;UAAE,QAAQ;UAAO,iBAAiB;UAAuB,QAAQ;SAAQ,EAAI,CAAA;SAEzF,kBAAC,OAAD;UAAK,OAAO;WAAE,SAAS;WAAiB,UAAU;WAAQ,YAAY;WAAK,OAAO;UAAU;UAAG,UAAA;SAAgB,CAAA;SAC/G,kBAACY,IAAD;UACE,MAAM,kBAACvG,IAAD,EAAM,MAAM,GAAK,CAAA;UACvB,OAAM;UACN,UAAU+H,OAAe;UACzB,eAAe;WAA2B,AAAzBC,EAAc,QAAQ,GAAGrC,GAAsB,EAAK;UAAG;SACzE,CAAA;SACD,kBAACY,IAAD;UACE,MAAM,kBAAC0B,GAAD,EAAM,MAAM,GAAK,CAAA;UACvB,OAAM;UACN,UAAUF,OAAe;UACzB,eAAe;WAA2B,AAAzBC,EAAc,QAAQ,GAAGrC,GAAsB,EAAK;UAAG;SACzE,CAAA;SACD,kBAACY,IAAD;UACE,MAAM,kBAACgB,GAAD,EAAU,MAAM,GAAK,CAAA;UAC3B,OAAM;UACN,UAAUQ,OAAe;UACzB,eAAe;WAAiC,AAA/BC,EAAc,cAAc,GAAGrC,GAAsB,EAAK;UAAG;SAC/E,CAAA;SAED,kBAAC,OAAD,EAAK,OAAO;UAAE,QAAQ;UAAO,iBAAiB;UAAuB,QAAQ;SAAQ,EAAI,CAAA;SAEzF,kBAACY,IAAD;UACE,MAAM,kBAAC2B,IAAD,EAAQ,MAAM,GAAK,CAAA;UACzB,OAAM;UACN,eAAe;WAAkB,AAAhBtB,EAAa,GAAGjB,GAAsB,EAAK;UAAG;SAChE,CAAA;QACE;OAEJ,CAAA,CAAA;;MACL,kBAAC,OAAD;OAAK,OAAO;QAAE,SAAS;QAAQ,YAAY;QAAU,KAAK;OAAM;OAAhE,UAAA;QACE,kBAAC,OAAD;SAAK,KAAKI;SAAa,OAAO;UAAE,UAAU;UAAY,SAAS;UAAQ,YAAY;SAAS;SAA5F,UAAA,CACE,kBAAC,OAAD;UAAK,OAAO;WACV,SAAS;WAAQ,YAAY;WAAU,iBAAiB;WACxD,cAAc;WAAO,QAAQP,IAAiB,6BAA6B;WAC3E,QAAQ;WAAW,YAAY;WAAQ,QAAQ;UACjD;UAJA,UAAA,CAKE,kBAAC,OAAD;WACE,eAAeC,EAAkB,CAACD,CAAc;WAChD,OAAO;YACL,SAAS;YAAgB,UAAU;YAAQ,YAAY;YACvD,SAAS;YAAQ,YAAY;YAAU,QAAQ;WACjD;WALF,UAAA,CAOG,KAAK,MAAMzC,IAAQ,GAAG,GAAE,GACtB;UACL,CAAA,GAAA,kBAAC,OAAD;WACE,eAAe0C,EAAkB,CAACD,CAAc;WAChD,OAAO;YACL,SAAS;YAAS,SAAS;YAAQ,YAAY;YAAU,QAAQ;YACjE,YAAY;YAAqB,OAAOA,IAAiB,mBAAmB;WAC9E;WAEC,UAAiB2C,EAAjB3C,IAAkB4C,IAA0BC,GAA3B,EAAW,MAAM,GAAK,CAA4B;UACjE,CAAA,CACF;SAEJ,CAAA,GAAA7C,KACC,kBAAC,OAAD;UAAK,OAAO;WACV,UAAU;WAAY,KAAK;WAAQ,MAAM;WAAG,WAAW;WACvD,iBAAiB;WAAQ,cAAc;WAAO,WAAW;WACzD,OAAO;WAAS,QAAQ;WAAM,SAAS;WAAQ,eAAe;WAC9D,QAAQ;WAAiC,UAAU;WAAU,SAAS;UACxE;UALA,UAAA;WAME,kBAACe,IAAD;YAAY,MAAM,kBAAC+B,IAAD,EAAgB,MAAM,GAAK,CAAA;YAAG,OAAM;YAAe,eAAe;aAAmC,AAAjC7G,GAAI,KAAK,qBAAqB,GAAGgE,EAAkB,EAAK;YAAG;WAAI,CAAA;WACrJ,kBAACc,IAAD;YAAY,MAAM,kBAACgC,IAAD,EAAW,MAAM,GAAK,CAAA;YAAG,OAAM;YAAc,eAAe;aAAkC,AAAhC9G,GAAI,KAAK,oBAAoB,GAAGgE,EAAkB,EAAK;YAAG;WAAI,CAAA;WAC9I,kBAAC,OAAD,EAAK,OAAO;YAAE,QAAQ;YAAO,iBAAiB;YAAuB,QAAQ;WAAQ,EAAI,CAAA;WACxF;YAAC;YAAM;YAAK;YAAM;YAAG;YAAM;YAAK;YAAG;YAAG;YAAG;YAAG;WAAC,CAAC,CAAC,KAAI,MAClD,kBAAC,OAAD;YAEE,eAAe;aAAsC,AAAjC+C,KAAWA,EAAUC,CAAS,GAAGhD,EAAkB,EAAK;YAAG;YAC/E,OAAO;aACL,SAAS;aAAY,UAAU;aAAQ,QAAQ;aAC/C,iBAAiB1C,MAAU0F,IAAY,YAAY;YACrD;YACA,eAAe,MAAM,EAAE,cAAc,MAAM,kBAAkB;YAC7D,eAAe,MAAM,EAAE,cAAc,MAAM,kBAAkB1F,MAAU0F,IAAY,YAAY;YARjG,UAAA,CAUG,KAAK,MAAMA,IAAY,GAAG,GAAE,GAC1B;WAVE,GAAAA,CAUF,CACN;WACD,kBAAC,OAAD,EAAK,OAAO;YAAE,QAAQ;YAAO,iBAAiB;YAAuB,QAAQ;WAAQ,EAAI,CAAA;WACzF,kBAAClC,IAAD;YAAY,MAAM,kBAACmC,IAAD,EAAY,MAAM,GAAK,CAAA;YAAG,OAAM;YAAe,eAAejD,EAAkB,EAAK;WAAI,CAAA;UACxG;SAEJ,CAAA,CAAA;;QACL,kBAACW,IAAD;SACE,MAAM,kBAACuC,GAAD;UAAa,MAAM;UAAI,OAAO5F,KAAA,KAAqB,wBAAwB;SAAsB,CAAA;SACvG,OAAM;SACN,SAAS6F;SACT,UAAU7F,KAASb;QACpB,CAAA;QACD,kBAACkE,IAAD;SACE,MAAM,kBAACyC,GAAD;UAAY,MAAM;UAAI,OAAO9F,KAAA,IAAqB,wBAAwB;SAAsB,CAAA;SACtG,OAAM;SACN,SAAS+F;SACT,UAAU/F,KAAA;QACX,CAAA;OACE;;MACL,kBAAC,OAAD,EAAK,OAAO;OAAE,OAAO;OAAO,QAAQ;OAAQ,iBAAiB;OAAuB,QAAQ;MAAQ,EAAI,CAAA;MACxG,kBAACqD,IAAD;OAAY,MAAM,kBAAC2C,GAAD,EAAc,MAAM,GAAK,CAAA;OAAG,OAAM;OAAc,QAAQnD,OAAe;OAAU,eAAenE,GAAI,KAAK,mBAAmB,EAAE,MAAM,SAAS,CAAC;MAAI,CAAA;MACpK,kBAAC2E,IAAD;OAAY,MAAM,kBAAC4C,IAAD,EAAM,MAAM,GAAK,CAAA;OAAG,OAAM;OAAW,QAAQpD,OAAe;OAAO,eAAenE,GAAI,KAAK,mBAAmB,EAAE,MAAM,MAAM,CAAC;MAAI,CAAA;KAChJ;;IAGL,kBAAC,OAAD;KAAK,OAAO;MAAE,SAAS;MAAQ,YAAY;MAAY,QAAQ;MAAQ,KAAK;KAAO;KAChF,UAAAoD,GAAK,QAAO,MAEX,EADIoE,MAAQ,eAAeC,MAAsB,MAASC,GAAa,sBAAsB,OACzFF,MAAQ,WAAWE,GAAa,mBAAmB,GAExD,CAAC,CAAC,KAAI,MACL,kBAAC,OAAD;MAEE,eAAeC,EAAaH,CAAG;MAC/B,OAAO;OACL,UAAU;OACV,YAAYI,MAAcJ,IAAM,MAAM;OACtC,OAAOI,MAAcJ,IAAM,mBAAmB;OAC9C,QAAQ;OACR,QAAQ;OACR,SAAS;OACT,YAAY;OACZ,cAAcI,MAAcJ,IAAM,6BAA6B;OAC/D,SAAS;MACX;MAEC,UAAAA;KACE,GAfEA,CAeF,CACN;IACE,CAAA;IAGL,kBAAC,OAAD;KAAK,OAAO;MAAE,SAAS;MAAQ,YAAY;MAAU,KAAK;KAAM;KAAhE,UAAA;MAGG9D,KACC,kBAAC,UAAD;OACE,eAAe1D,GAAI,KAAK,aAAa;OACrC,OAAO;QACL,YAAY;QAAW,QAAQ;QAAqB,OAAO;QAC3D,SAAS;QAAQ,YAAY;QAAU,gBAAgB;QAAU,KAAK;QACtE,QAAQ;QAAQ,SAAS;QAAU,cAAc;QAAO,QAAQ;QAChE,YAAY;QAAK,UAAU;OAC7B;OAPF,UAAA,CASE,kBAAC6H,IAAD;QAAK,MAAM;QAAI,OAAM;QAAU,MAAK;OAAW,CAAA,GAAC,MAE1C;;MAITC,KAAiB,KAChB,kBAAC,OAAD;OACE,eAAe9H,GAAI,KAAK,eAAe;OACvC,OAAO;QACL,iBAAiB;QAAW,OAAO;QACnC,cAAc;QAAQ,SAAS;QAC/B,SAAS;QAAQ,YAAY;QAAU,KAAK;QAC5C,QAAQ;QAAW,YAAY;QAAK,UAAU;OAChD;OACA,OAAM;OARR,UAAA;QAUE,kBAAC+H,IAAD,EAAa,MAAM,GAAK,CAAA;QAAC;QAAWD;OACjC;;MAGP,kBAAC,OAAD,EAAK,OAAO;OAAE,OAAO;OAAO,QAAQ;OAAQ,iBAAiB;OAAuB,QAAQ;MAAQ,EAAI,CAAA;MAExG,kBAACnD,IAAD;OACE,MAAM,kBAACqD,IAAD,EAAM,MAAM,GAAK,CAAA;OACvB,OAAM;OACN,SAASC;MACV,CAAA;MAED,kBAACtD,IAAD;OACE,MAAM,kBAACuD,IAAD,EAAQ,MAAM,GAAK,CAAA;OACzB,OAAM;OACN,QAAQC,KAAoBC,MAAe;OAC3C,eAAeC,EAAiB,QAAQ;MACzC,CAAA;MACD,kBAAC1D,IAAD;OACE,MAAM,kBAAC2D,GAAD,EAAe,MAAM,GAAK,CAAA;OAChC,OAAM;OACN,QAAQH,KAAoBC,MAAe;OAC3C,eAAeC,EAAiB,UAAU;MAC3C,CAAA;KACE;;GACF;;CACF,CAAA;AAET;AAEA,SAAS1D,GAAW,EAAE,SAAM,YAAS,YAAS,IAAO,cAAW,IAAO,YAAgH;CACrL,OACE,kBAAC,UAAD;EACS;EACP,SAAS4D,IAAW,KAAA,IAAYC;EACtB;EACV,OAAO;GACL,SAAS;GACT,YAAY;GACZ,gBAAgB;GAChB,OAAO;GACP,QAAQ;GACR,QAAQ;GACR,cAAc;GACd,iBAAiBC,IAAS,YAAY;GACtC,OAAOA,IAAS,mBAAmB;GACnC,QAAQF,IAAW,gBAAgB;GACnC,SAASA,IAAW,KAAM;GAC1B,SAAS;GACT,YAAY;GACZ,kBAAkB;EACpB;EACA,cAAc,MAAM;GAClB,AAAI,CAACE,KAAU,CAACF,MAAU,EAAE,cAAc,MAAM,kBAAkB;EACpE;EACA,aAAa,MAAM;GACjB,AAAI,CAACE,KAAU,CAACF,MAAU,EAAE,cAAc,MAAM,kBAAkB;EACpE;EAEC,UAAAG;CACK,CAAA;AAEZ;AAEA,SAAS5D,GAAW,EAAE,SAAM,UAAO,YAAS,cAAW,IAAO,cAAW,MAAiH;CACxL,IAAM,CAAC6D,GAASC,KAAc9E,EAAS,EAAK;CAC5C,OACE,kBAAC,OAAD;EACE,SAASyE,IAAW,KAAA,IAAYC;EAChC,oBAAoBI,EAAW,CAACL,CAAQ;EACxC,oBAAoBK,EAAW,EAAK;EACpC,OAAO;GACL,SAAS;GAAQ,YAAY;GAAU,KAAK;GAAQ,SAAS;GAC7D,QAAQL,IAAW,YAAY;GAAW,OAAOA,IAAW,SAAUM,IAAW,SAAS;GAC1F,iBAAiBN,IAAW,gBAAiBM,IAAW,mBAAoBF,IAAU,YAAY;GAClG,UAAU;EACZ;EATF,UAAA,CAWE,kBAAC,OAAD;GAAK,OAAO,EAAE,OAAOJ,IAAW,SAAUM,IAAW,SAAS,oBAAqB;GAAI,UAAAH;EAAU,CAAA,GACjG,kBAAC,QAAD,EAAA,UAAOI,EAAY,CAAA,CAChB;;AAET;;;ACxaA,SAAwBC,GAAsB,EAC5C,eACA,aACA,WACA,aACA,kBACA,oBACA,kBAC6B;CAC7B,IAAMC,IAAStB,GAAa,sBAAsB,IAC5CuB,IAAUvB,GAAa,uBAAuB,IAC9CwB,IAAYxB,GAAa,yBAAyB;CAKxD,OACE,kBAAC,OAAD;EACE,OAAO;GACL,UAAU;GACV,KAAK,GAAGyB,EAAS,IAAI;GACrB,MAAM,GAAGA,EAAS,KAAK;GACvB,iBAAiB;GACjB,QAAQ;GACR,cAAc;GACd,WAAW;GACX,SAAS;GACT,YAAY;GACZ,SAAS;GACT,KAAK;GACL,QAAQ;GACR,WAAW;EACb;EACA,UAAU,MAAM,EAAE,gBAAgB;EAhBpC,UAAA;GAkBGH,KACC,kBAAAxK,IAAA,EAAA,UAAA,CACE,kBAAC6K,IAAD;IAAY,MAAM,kBAAC7C,GAAD,EAAM,MAAM,GAAK,CAAA;IAAG,OAAM;IAAY,SAAS8C;GAAS,CAAA,GAC1E,kBAAC,OAAD,EAAK,OAAO;IAAE,OAAO;IAAO,QAAQ;IAAQ,iBAAiB;IAAW,QAAQ;GAAQ,EAAI,CAAA,CAC5F,EAAA,CAAA;GAGHL,KACC,kBAAAzK,IAAA,EAAA,UAAA,CACE,kBAAC,OAAD;IAAK,OAAO;KAAE,SAAS;KAAQ,YAAY;KAAU,KAAK;KAAO,SAAS;IAAQ;IAC/E,UAAA;KA/BK;KAAW;KAAW;KAAW;KAAW;KAAW;IA+B5D,CAAA,CAAO,KAAI,MACV,kBAAC,OAAD;KAEE,eAAe+K,EAAcC,CAAC;KAC9B,OAAO;MACL,OAAO;MACP,QAAQ;MACR,cAAc;MACd,iBAAiBA;MACjB,QAAQ;MACR,QAAQC,EAAW,UAAUD,IAAI,sBAAsB;KACzD;KACA,OAAO,aAAaA;IACrB,GAXMA,CAWN,CACF;GACE,CAAA,GACL,kBAAC,OAAD,EAAK,OAAO;IAAE,OAAO;IAAO,QAAQ;IAAQ,iBAAiB;IAAW,QAAQ;GAAQ,EAAI,CAAA,CAC5F,EAAA,CAAA;GAGHP,MACCQ,EAAW,SAAS,SAClB,kBAAC,UAAD;IACE,OAAOA,EAAW,UAAU,cAAcA,EAAW,QAAQ,KAAK;IAClE,SAASC;IACT,OAAO;KACL,SAAS;KACT,YAAY;KACZ,KAAK;KACL,QAAQ;KACR,cAAc;KACd,QAAQ;KACR,iBAAiB;KACjB,QAAQ;KACR,OAAO;KACP,SAAS;KACT,UAAU;KACV,YAAY;IACd;IACA,eAAe,MAAM,EAAE,cAAc,MAAM,kBAAkB;IAC7D,eAAe,MAAM,EAAE,cAAc,MAAM,kBAAkB;IAlB/D,UAAA,CAoBE,kBAACC,GAAD,EAAO,MAAM,GAAK,CAAA,GAAC,WAEb;GAER,CAAA,IAAA,kBAACN,IAAD;IAAY,MAAM,kBAAC5K,IAAD,EAAU,MAAM,GAAK,CAAA;IAAG,OAAM;IAAmB,SAASiL;GAAkB,CAAA;GAIjGR,KACC,kBAACG,IAAD;IAAY,MAAM,kBAACQ,IAAD,EAAQ,MAAM,GAAK,CAAA;IAAG,OAAM;IAAS,SAASC;IAAU,OAAM;GAAW,CAAA;EAE1F;;AAET;AAEA,SAAST,GAAW,EAAE,SAAM,UAAO,YAAS,WAAQ,aAA4F;CAC9I,OACE,kBAAC,UAAD;EACS;EACE;EACT,OAAO;GACL,SAAS;GACT,YAAY;GACZ,gBAAgB;GAChB,OAAO;GACP,QAAQ;GACR,cAAc;GACd,QAAQ;GACR,iBAAiB;GACjB,QAAQ;GACD;EACT;EACA,eAAe,MAAM,EAAE,cAAc,MAAM,kBAAkB;EAC7D,eAAe,MAAM,EAAE,cAAc,MAAM,kBAAkB;EAE5D,UAAAX;CACK,CAAA;AAEZ;;;AC5HA,SAAgBqB,GAAc,GAAsB;CAClD,IAAI,CAACC,GAAK,OAAO;CACjB,IAAMC,IAAUD,EAAI,KAAK;CAGzB,IAAI,oBAAoB,KAAKC,CAAO,GAAG,OAAO;CAG9C,IAAMC,IAAYD,EAAQ,MAAM,MAAM,CAAC,CAAC,EAAE,CAAC,YAAY;CAqBvD,OAlBIC,EAAU,SAAS,MAAM,IAAU,KAGnCD,EAAQ,WAAW,IAAI,IAClBC,EAAU,SAAS,MAAM,KAAKA,EAAU,SAAS,MAAM,KAAK,uBAAuB,KAAKD,CAAO,IAUxG,GANI,CAAC,uBAAuB,KAAKA,CAAO,KAMpCC,EAAU,SAAS,MAAM,KAAK,uBAAuB,KAAKD,CAAO;AAKvE;AAKA,SAAgBE,GAAgB,GAAmC;CACjE,IAAMC,KAAOC,KAAW,GAAA,CAAI,KAAK;CACjC,IAAI,CAACD,GACH,OAAO;EACL,QAAQA;EACR,gBAAgB;EAChB,eAAe;CACjB;CAIF,IAAIA,EAAI,WAAW,GAAG,GAAG;EACvB,IAAME,IAAYF,EAAI,MAAM,qBAAqB,GAC3CG,IAAaD,IAAY,SAASA,EAAU,IAAI,EAAE,IAAI,KAAA;EAC5D,OAAO;GACL,QAAQF;GACR,gBAAgB;GAChB,YAAYG,KAAcA,IAAa,IAAIA,IAAa,KAAA;GACxD,eAAe;EACjB;CACF;CAGA,IAAIC,IAAgBJ;CACpB,AAAI,eAAe,KAAKA,CAAG,MACzB,IAAgBA,EAAI,QAAQ,gBAAgB,EAAE;CAIhD,IAAIK,IAASD,GACTD,GAEEG,IAAYF,EAAc,QAAQ,GAAG;CAC3C,IAAIE,MAAc,IAAI;EACpB,IAAMC,IAAOH,EAAc,MAAME,CAAS;EAC1C,IAASF,EAAc,MAAM,GAAGE,CAAS;EACzC,IAAMJ,IAAYK,EAAK,MAAM,qBAAqB;EAClD,AAAIL,MACF,IAAa,SAASA,EAAU,IAAI,EAAE,IAClC,MAAMC,CAAU,KAAKA,KAAc,OACrC,IAAa,KAAA;CAGnB;CAEA,IAAMK,IAAQb,GAAcU,CAAM,GAC5BI,KAAS,gBAAgB,KAAKJ,CAAM,KAAKA,EAAO,WAAW,IAAI,MAAM,CAACG;CAE5E,OAAO;EACL,QAAQR;EACR,gBAAgB;EAChB,QAAyBK;EACzB;EACA,eAAeI;CACjB;AACF;AAOA,SAAgBC,GAAgB,GAAsB;CACpD,IAAI,CAACd,GAAK,OAAO;CACjB,IAAMC,IAAUD,EAAI,KAAK;CAgCzB,OA/BKC,IAGDA,EAAQ,WAAW,GAAG,IAAUA,IAGhCA,EAAQ,WAAW,IAAI,IAClB,WAAWA,IAIhB,qCAAqC,KAAKA,CAAO,IAC5C,MAIL,yBAAyB,KAAKA,CAAO,KAKrCA,EAAQ,WAAW,GAAG,KAAKA,EAAQ,WAAW,IAAI,KAAKA,EAAQ,WAAW,KAAK,KAK/E,CAAC,uBAAuB,KAAKA,CAAO,IAC/BA,IAIF,MA/Bc;AAgCvB;;;ACzIA,SAAwBc,GAAgB,EAAE,gBAAa,IAAI,iBAAc,IAAI,mBAAgB,IAAO,YAAS,aAAgC;CAC3I,IAAMC,IAAgBC,EAAW,WAAW,QAAQ,GAC9CC,IAAgBf,GAAgBc,CAAU,GAC1CE,IAAe,CAACH,KAAiB,EAAQ,GAAc,UAAWE,EAAc,gBAQhF,CAACtD,GAAWD,KAAgB7D,EANckH,IAC5C,SACAG,IACA,aACA,KAE8E,GAC5E,CAACnB,GAAKoB,KAAUtH,EAASkH,KAAiBG,IAAe,KAAKF,CAAU,GACxE,CAACI,GAAMC,KAAWxH,EAASkH,IAAgBC,EAAW,QAAQ,UAAU,EAAE,IAAI,GAAG,GACjF,CAACR,GAAQc,KAAazH,EAASqH,KAAeD,EAAc,UAAe,EAAE,GAC7E,CAACM,GAASC,KAAc3H,EAASqH,KAAgBD,EAAc,aAAa,OAAOA,EAAc,UAAU,IAAI,EAAE,GACjH,CAACQ,GAAMC,KAAW7H,EAAS8H,CAAW,GAEtCC,IACJjE,MAAc,QAAQ,CAACoC,EAAI,KAAK,IAChCpC,MAAc,SAAS,CAACyD,EAAK,KAAK,IAClC,CAACZ,EAAO,KAAK,GAETqB,UAAmB;EACvB,IAAID,GAAgB;EACpB,IAAIE,IAAW;EASf,AARA,AAKEA,IALEnE,MAAc,SACL,SAASyD,MACXzD,MAAc,aACZ4D,EAAQ,KAAK,IAAI,GAAGf,EAAO,KAAK,EAAE,QAAQe,EAAQ,KAAK,MAAMf,EAAO,KAAK,IAEzET,EAAI,KAAK,GAGlBgC,IACFC,EAAOF,GAAUL,EAAK,KAAK,KAAKK,CAAQ,IAExCE,EAAOF,CAAQ;CAEnB;CAQA,OACE,kBAAC,OAAD;EAAK,OAAO;GACV,UAAU;GAAS,KAAK;GAAG,MAAM;GAAG,OAAO;GAAG,QAAQ;GACtD,iBAAiB;GAAmB,SAAS;GAAQ,YAAY;GAAU,gBAAgB;GAC3F,QAAQ;EACV;EACE,UAAA,kBAAC,OAAD;GAAK,OAAO;IACV,iBAAiB;IACjB,OAAO;IACP,cAAc;IACd,OAAO;IACP,WAAW;IACX,YAAY;IACZ,UAAU;IACV,SAAS;IACT,eAAe;GACjB;GAVA,UAAA;IAYE,kBAAC,OAAD;KAAK,OAAO;MACV,SAAS;MAAQ,cAAc;MAC/B,SAAS;MAAQ,YAAY;MAAU,gBAAgB;KACzD;KAHA,UAAA,CAIE,kBAAC,MAAD;MAAI,OAAO;OAAE,QAAQ;OAAG,UAAU;OAAQ,YAAY;MAAI;MAAG,UAAA;KAAkC,CAAA,GAC/F,kBAAC,UAAD;MACE,SAASG;MACT,OAAO;OAAE,YAAY;OAAQ,QAAQ;OAAQ,QAAQ;OAAW,OAAO;MAAU;MAEjF,UAAA,kBAACC,IAAD,EAAG,MAAM,GAAK,CAAA;KACR,CAAA,CACL;;IAGL,kBAAC,OAAD;KAAK,OAAO,EAAE,SAAS,OAAO;KAA9B,UAAA;MAEE,kBAAC,OAAD;OAAK,OAAO;QAAE,SAAS;QAAQ,QAAQ;QAAqB,cAAc;QAAO,UAAU;QAAU,cAAc;OAAO;OAA1H,UAAA;QACE,kBAAC,OAAD;SACE,eAAexE,EAAa,KAAK;SACjC,OAAO;UAAE,MAAM;UAAG,WAAW;UAAU,SAAS;UAAO,iBAAiBC,MAAc,QAAQ,YAAY;UAAQ,OAAOA,MAAc,QAAQ,SAAS;UAAW,YAAY;UAAK,UAAU;UAAQ,QAAQ;SAAU;SAAG,UAAA;QAExN,CAAA;QACL,kBAAC,OAAD;SACE,eAAeD,EAAa,MAAM;SAClC,OAAO;UAAE,MAAM;UAAG,WAAW;UAAU,SAAS;UAAO,iBAAiBC,MAAc,SAAS,YAAY;UAAQ,OAAOA,MAAc,SAAS,SAAS;UAAW,YAAY;UAAK,UAAU;UAAQ,QAAQ;SAAU;SAAG,UAAA;QAE1N,CAAA;QACL,kBAAC,OAAD;SACE,eAAeD,EAAa,UAAU;SACtC,OAAO;UAAE,MAAM;UAAK,WAAW;UAAU,SAAS;UAAO,iBAAiBC,MAAc,aAAa,YAAY;UAAQ,OAAOA,MAAc,aAAa,SAAS;UAAW,YAAY;UAAK,UAAU;UAAQ,QAAQ;SAAU;SAAG,UAAA;QAEpO,CAAA;OACF;;MAGJA,MAAc,SACb,kBAAC,OAAD;OAAK,OAAO,EAAE,cAAcoE,IAAgB,SAAS,IAAI;OAAzD,UAAA,CACE,kBAAC,SAAD;QAAO,OAAO;SAAE,SAAS;SAAS,cAAc;SAAO,UAAU;SAAQ,YAAY;SAAK,OAAO;QAAU;QAA3G,UAAA,CAA8G,kBAC9F,kBAAC,QAAD;SAAM,OAAO,EAAE,OAAO,UAAU;SAAG,UAAA;QAAO,CAAA,CACnD;OACP,CAAA,GAAA,kBAAC,SAAD;QACE,MAAK;QACL,OAAOhC;QACP,WAAW,MAAMoB,EAAO,EAAE,OAAO,KAAK;QACtC,aAAY;QACZ,OAAO;SACL,OAAO;SAAQ,SAAS;SAAQ,WAAW;SAC3C,QAAQ,aAAcpB,EAAI,KAAK,IAAgB,YAAZ;SAAyB,cAAc;SAAO,UAAU;QAC7F;QACA,YAAY,MAAM;SAChB,AAAI,EAAE,QAAQ,WAAS8B,EAAW;QACpC;QACA,WAAA;OACD,CAAA,CACE;;MAGNlE,MAAc,UACb,kBAAC,OAAD;OAAK,OAAO,EAAE,cAAcoE,IAAgB,SAAS,IAAI;OAAzD,UAAA,CACE,kBAAC,SAAD;QAAO,OAAO;SAAE,SAAS;SAAS,cAAc;SAAO,UAAU;SAAQ,YAAY;SAAK,OAAO;QAAU;QAA3G,UAAA,CAA8G,0CACtE,kBAAC,QAAD;SAAM,OAAO,EAAE,OAAO,UAAU;SAAG,UAAA;QAAO,CAAA,CAC3E;OACP,CAAA,GAAA,kBAAC,SAAD;QACE,MAAK;QACL,OAAOX;QACP,KAAI;QACJ,WAAW,MAAMC,EAAQ,EAAE,OAAO,KAAK;QACvC,aAAY;QACZ,OAAO;SACL,OAAO;SAAQ,SAAS;SAAQ,WAAW;SAC3C,QAAQ,aAAcD,EAAK,KAAK,IAAgB,YAAZ;SAAyB,cAAc;SAAO,UAAU;QAC9F;QACA,YAAY,MAAM;SAChB,AAAI,EAAE,QAAQ,WAASS,EAAW;QACpC;QACA,WAAA;OACD,CAAA,CACE;;MAGNlE,MAAc,cACb,kBAAC,OAAD;OAAK,OAAO,EAAE,cAAcoE,IAAgB,SAAS,IAAI;OAAzD,UAAA;QACE,kBAAC,SAAD;SAAO,OAAO;UAAE,SAAS;UAAS,cAAc;UAAO,UAAU;UAAQ,YAAY;UAAK,OAAO;SAAU;SAA3G,UAAA,CAA8G,8BAClF,kBAAC,QAAD;UAAM,OAAO,EAAE,OAAO,UAAU;UAAG,UAAA;SAAO,CAAA,CAC/D;;QACP,kBAAC,SAAD;SACE,MAAK;SACL,OAAOvB;SACP,WAAW,MAAMc,EAAU,EAAE,OAAO,KAAK;SACzC,aAAY;SACZ,OAAO;UACL,OAAO;UAAQ,SAAS;UAAQ,WAAW;UAAc,cAAc;UACvE,QAAQ,aAAcd,EAAO,KAAK,IAAgB,YAAZ;UAAyB,cAAc;UAAO,UAAU;SAChG;SACA,YAAY,MAAM;UAChB,AAAI,EAAE,QAAQ,WAASqB,EAAW;SACpC;SACA,WAAA;QACD,CAAA;QACD,kBAAC,SAAD;SAAO,OAAO;UAAE,SAAS;UAAS,cAAc;UAAO,UAAU;UAAQ,YAAY;UAAK,OAAO;SAAU;SAA3G,UAAA,CAA8G,gBAChG,kBAAC,QAAD;UAAM,OAAO;WAAE,OAAO;WAAW,YAAY;WAAK,UAAU;UAAO;UAAG,UAAA;SAAqC,CAAA,CAClH;;QACP,kBAAC,SAAD;SACE,MAAK;SACL,OAAON;SACP,KAAI;SACJ,WAAW,MAAMC,EAAW,EAAE,OAAO,KAAK;SAC1C,aAAY;SACZ,OAAO;UACL,OAAO;UAAQ,SAAS;UAAQ,WAAW;UAC3C,QAAQ;UAAqB,cAAc;UAAO,UAAU;SAC9D;SACA,YAAY,MAAM;UAChB,AAAI,EAAE,QAAQ,WAASK,EAAW;SACpC;QACD,CAAA;OACE;;MAINE,KACC,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;OAAO,OAAO;QAAE,SAAS;QAAS,cAAc;QAAO,UAAU;QAAQ,YAAY;QAAK,OAAO;OAAU;OAA3G,UAAA,CAA8G,oBAC5F,kBAAC,QAAD;QAAM,OAAO;SAAE,OAAO;SAAW,YAAY;SAAK,UAAU;QAAO;QAAG,UAAA;OAAqC,CAAA,CACtH;MACP,CAAA,GAAA,kBAAC,SAAD;OACE,MAAK;OACL,OAAON;OACP,WAAW,MAAMC,EAAQ,EAAE,OAAO,KAAK;OACvC,aAxJR/D,MAAc,QAAcoC,KAAO,iBACnCpC,MAAc,SAAe,QAAQyD,MAClCZ,IAAS,GAAGA,IAASe,IAAU,UAAUA,EAAQ,KAAK,OAAO;OAuJxD,OAAO;QACL,OAAO;QAAQ,SAAS;QAAQ,WAAW;QAC3C,QAAQ;QAAqB,cAAc;QAAO,UAAU;OAC9D;OACA,YAAY,MAAM;QAChB,AAAI,EAAE,QAAQ,WAASM,EAAW;OACpC;MACD,CAAA,CACE,EAAA,CAAA;KAEJ;;IAGL,kBAAC,OAAD;KAAK,OAAO;MAAE,SAAS;MAAQ,WAAW;MAAqB,SAAS;MAAQ,gBAAgB;MAAY,iBAAiB;KAAU;KACrI,UAAA,kBAAC,UAAD;MACE,SAASA;MACT,UAAUD;MACV,OAAO;OACL,iBAAiBA,IAAiB,YAAY;OAAW,OAAO;OAAQ,QAAQ;OAAQ,cAAc;OACtG,SAAS;OAAY,UAAU;OAAQ,YAAY;OAAK,QAAQA,IAAiB,gBAAgB;MACnG;MACD,UAAA;KAEO,CAAA;IACL,CAAA;GACF;;CACF,CAAA;AAET;;;ACvNA,IAAaO,KAAgC;CAC3C;EAAE,QAAQ;EAAa,aAAa;EAAiC,gBAAgB;EAAgB,SAAS;CAAe;CAC7H;EAAE,QAAQ;EAAc,aAAa;EAAwC,gBAAgB;EAAgB,SAAS;CAAe;CACrI;EAAE,QAAQ;EAAQ,aAAa;EAAqC,gBAAgB;EAAU,SAAS;CAAS;CAChH;EAAE,QAAQ;EAAS,aAAa;EAA6B,gBAAgB;EAAU,SAAS;CAAS;CACzG;EAAE,QAAQ;EAAQ,aAAa;EAA6B,gBAAgB;EAAU,SAAS;CAAS;CACxG;EAAE,QAAQ;EAAQ,aAAa;EAA6B,gBAAgB;EAAgB,SAAS;CAAe;CACpH;EAAE,QAAQ;EAAe,aAAa;EAAwB,gBAAgB;EAAU,SAAS;CAAS;CAC1G;EAAE,QAAQ;EAAU,aAAa;EAA2B,gBAAgB;EAAU,SAAS;CAAS;CACxG;EAAE,QAAQ;EAAU,aAAa;EAA8B,gBAAgB;EAAU,SAAS;CAAS;AAC7G,GAEMC,KAAc,uBACdC,KAAe,+BAEjBC,KAAqC,MACnCC,qBAAY,IAAI,IAAgB;AAEtC,SAAgBC,KAAkC;CAChD,IAAI,OAAO,SAAW,OAAe,CAAC,OAAO,cAAc,OAAOL;CAClE,IAAI;EACF,IAAMM,IAAQ,OAAO,aAAa,QAAQL,EAAW;EACrD,IAAIK,GAAO;GACT,IAAMC,IAAS,KAAK,MAAMD,CAAK;GAC/B,IAAI,MAAM,QAAQC,CAAM,GACtB,OAAOP,GAAkB,KAAI,MAAO;IAClC,IAAMQ,IAAQD,EAAO,MAAM,MAAgBlJ,KAAKA,EAAE,WAAWoJ,EAAI,MAAM;IACvE,OAAOD,KAAS,OAAOA,EAAM,WAAY,WAAW;KAAE,GAAGC;KAAK,SAASD,EAAM;IAAQ,IAAIC;GAC3F,CAAC;EAEL;CACF,QAAQ,CAER;CACA,OAAOT;AACT;AAEA,SAASU,KAAoB;CAE3B,AADAN,GAAU,SAAQ,MAAMO,EAAG,CAAC,GACxB,OAAO,SAAW,OACpB,OAAO,cAAc,IAAI,YAAYT,EAAY,CAAC;AAEtD;AAEA,SAAgBU,KAAe;CAC7B,IAAM,CAACC,GAAWC,KAAgBpJ,SAChC,AAAsByI,OAAkBE,GAAoB,GACrDF,GACR;CAiDD,OA/CAjM,QAAgB;EACd,IAAM6M,UAAa;GAEjB,AADA,KAAkBV,GAAoB,GACtCS,EAAaX,EAAe;EAC9B;EAQA,OANAC,GAAU,IAAIW,CAAI,GACd,OAAO,SAAW,QACpB,OAAO,iBAAiB,WAAWA,CAAI,GACvC,OAAO,iBAAiBb,IAAca,CAAI,UAG/B;GAEX,AADAX,GAAU,OAAOW,CAAI,GACjB,OAAO,SAAW,QACpB,OAAO,oBAAoB,WAAWA,CAAI,GAC1C,OAAO,oBAAoBb,IAAca,CAAI;EAEjD;CACF,GAAG,CAAC,CAAC,GA4BE;EAAE;EAAW,gBA1BGC,GAAa,GAAoB,MAAuB;GAE7E,IAAMC,KADOd,MAAmBE,GAAoB,EAAA,CAC/B,KAAI,MAAKa,EAAE,WAAWC,IAAS;IAAE,GAAGD;IAAG,SAASE;GAAW,IAAIF,CAAC;GAMrF,AALA,KAAkBD,GACd,OAAO,SAAW,OAAe,OAAO,gBAC1C,OAAO,aAAa,QAAQhB,IAAa,KAAK,UAAUgB,CAAO,CAAC,GAElEH,EAAaG,CAAO,GACpBP,GAAkB;EACpB,GAAG,CAAC,CAiBgB;EAAgB,gBAfbM,QAAkB;GAMvC,AALA,KAAkBhB,IACd,OAAO,SAAW,OAAe,OAAO,gBAC1C,OAAO,aAAa,WAAWC,EAAW,GAE5Ca,EAAad,EAAiB,GAC9BU,GAAkB;EACpB,GAAG,CAAC,CAQgC;EAAgB,YANjCM,GAAa,MAA+B;GAE7D,IAAME,KADOf,MAAmBU,EAAA,CACjB,MAAK,MAAQQ,EAAK,WAAWF,CAAM;GAClD,OAAOD,IAAIA,EAAE,UAAU;EACzB,GAAG,CAACL,CAAS,CAEuC;CAAW;AACjE;AASA,SAAgBS,GAAmB,GAAsC;CACvE,IAAI,CAACC,GAAe,OAAO;EAAE,MAAM;EAAO,OAAO;EAAO,KAAK;EAAO,KAAK;CAAG;CAE5E,IAAMC,IAAYD,EAAc,MAAM,GAAG,GACrCE,IAAO,IACPC,IAAQ,IACRC,IAAM,IACJC,IAAsB,CAAC;CAE7B,KAAK,IAAIC,IAAI,GAAGA,IAAIL,EAAU,QAAQ,KAAK;EACzC,IAAMxD,IAAMwD,EAAUK,EAAE,CAAC,KAAK,GACxBC,IAAQ9D,EAAI,YAAY;EAE9B,AAAI8D,MAAU,UAAUA,MAAU,SAASA,MAAU,UAAUA,MAAU,aAAaA,MAAU,YAC9F,IAAO,KACEA,MAAU,UACnB,IAAQ,KACCA,MAAU,SAASA,MAAU,WACtC,IAAM,KACG9D,MAAQ,MAAM6D,IAAI,KAAKL,EAAUK,IAAI,OAAO,KAErDD,EAAU,KAAK,GAAG,IACT5D,MAAQ,MACjB4D,EAAU,KAAK5D,CAAG;CAEtB;CAMA,OAJIuD,EAAc,SAAS,GAAG,KAAKK,EAAU,WAAW,KACtDA,EAAU,KAAK,GAAG,GAGb;EAAE;EAAM;EAAO;EAAK,KAAKA,EAAU,KAAK,GAAG,CAAC,CAAC,YAAY;CAAE;AACpE;AAGA,SAAgBG,GAAc,GAAkB,GAAgC;CAC9E,IAAI,CAACR,GAAe,OAAO;CAC3B,IAAMhB,IAASe,GAAmBC,CAAa,GAEzCS,IAAgB,GAAQ,EAAE,WAAW,EAAE;CAE7C,IADIzB,EAAO,SAASyB,KAChBzB,EAAO,QAAQ,EAAQ,EAAE,QAAS,OAAO;CAE7C,IAAM0B,KAAY,EAAE,OAAO,GAAA,CAAI,YAAY,GACrCC,IAAY3B,EAAO,IAAI,YAAY;CAkCzC,OA/BI2B,MAAc,YAAYA,MAAc,cACtC3B,EAAO,UAAU,EAAQ,EAAE,WACxB0B,MAAa,YAAYA,MAAa,cADI,KAK/CC,MAAc,OAAOA,MAAc,MAIrC,EAHyBD,MAAa,OAAOA,MAAa,OAAO,EAAE,SAAS,WAAW,EAAE,SAAS,eAE9F1B,EAAO,SAAS,CAAC,EAAE,YACnB,CAACA,EAAO,SAAS2B,MAAc,OAAO,EAAE,YAK1CA,MAAc,OAAOA,MAAc,MAIrC,EAHmBD,MAAa,OAAOA,MAAa,OAAO,EAAE,SAAS,WAAW,EAAE,SAAS,oBAExF1B,EAAO,SAAS,CAAC,EAAE,YACnB,CAACA,EAAO,SAAS2B,MAAc,OAAO,EAAE,YAK1C3B,EAAO,UAAU,EAAQ,EAAE,YAK/B,GAFI0B,MAAaC,KACb,EAAE,QAAQ,EAAE,KAAK,YAAY,MAAM,MAAMA,OACzC,EAAE,QAAQ,EAAE,KAAK,YAAY,MAAM,QAAQA;AAGjD;;;AChMA,SAAgBC,GAAmB,GAAmB;CACpD,OAAOjB,EAAE,QAAQ,QAAQ,GAAG,CAAC,CAAC,KAAK;AACrC;AAOA,SAAgBkB,GAAc,GAAwB;CACpD,IAAIC,IAAW,IACTC,IAAwB,CAAC,GACzBC,IAAwB,CAAC;CAG/B,EAAM,SAAS,GAAM,MAAU;EAC7B,IAAMC,IAAMnB,EAAK,OAAO;EACxB,KAAK,IAAIQ,IAAI,GAAGA,IAAIW,EAAI,QAAQ,KAE9B,AADAF,EAAY,KAAKG,CAAK,GACtBF,EAAY,KAAKV,CAAC;EAIpB,AAFA,KAAYW,GAERnB,EAAK,UACP,KAAY,MACZiB,EAAY,KAAK,EAAE,GACnBC,EAAY,KAAK,EAAE,MAEnB,KAAY,KACZD,EAAY,KAAK,EAAE,GACnBC,EAAY,KAAK,EAAE;CAEvB,CAAC;CAGD,IAAIG,IAAW,IACTC,IAAsB,CAAC,GAEzBd,IAAI;CACR,OAAOA,IAAIQ,EAAS,SAAQ;EAC1B,IAAMO,IAAOP,EAASR;EACtB,IAAI,KAAK,KAAKe,CAAI,GAAG;GACnB,IAAMC,IAAWhB;GACjB,OAAOA,IAAIQ,EAAS,UAAU,KAAK,KAAKA,EAASR,EAAE,IACjD;GAGF,AADA,KAAY,KACZc,EAAU,KAAKE,CAAQ;EACzB,OAGE,AAFA,KAAYD,GACZD,EAAU,KAAKd,CAAC,GAChB;CAEJ;CAEA,OAAO;EACL;EACA;EACA;EACA;EACA;CACF;AACF;AAMA,SAAgBiB,GACd,GACA,GACA,GACA,GACgB;CAChB,IAAM,EAAE,gBAAa,mBAAgBC,GAC/BC,oBAAc,IAAI,IAA0C;CAElE,KAAK,IAAInB,IAAIoB,GAAUpB,IAAIqB,GAAY,KAAK;EAC1C,IAAMC,IAAUb,EAAYT,IACtBuB,IAAUb,EAAYV;EAC5B,IAAIsB,MAAY,KAAA,KAAaA,MAAY,IAAI;GAC3C,IAAME,IAAWL,EAAY,IAAIG,CAAO;GACxC,AAAIE,KACF,EAAS,MAAM,KAAK,IAAIA,EAAS,KAAKD,CAAO,GAC7C,EAAS,MAAM,KAAK,IAAIC,EAAS,KAAKD,CAAO,KAE7CJ,EAAY,IAAIG,GAAS;IAAE,KAAKC;IAAS,KAAKA;GAAQ,CAAC;EAE3D;CACF;CAEA,IAAME,IAAyB,CAAC;CAsBhC,OApBAN,EAAY,SAAS,GAAO,MAAc;EACxC,IAAM3B,IAAOkC,EAAMC;EACnB,IAAI,CAACnC,KAAQ,CAACA,EAAK,WAAW;EAE9B,IAAM5K,IAAI4K,EAAK,UAAU,IACnB1K,IAAI0K,EAAK,UAAU,IACnBoC,IAAQpC,EAAK,OACbqC,IAASrC,EAAK,UAAU,KAAK,IAAIA,EAAK,UAAU,EAAE,GAClDsC,KAAUtC,EAAK,OAAO,GAAA,CAAI;EAEhC,IAAIsC,IAAS,GAAG;GACd,IAAMC,IAAYH,IAAQE,GACpBE,IAASpN,IAAIqN,EAAM,MAAMF,GACzBG,KAAcD,EAAM,MAAMA,EAAM,MAAM,KAAKF;GACjD,EAAO,KAAK;IAAE,GAAGC;IAAQ;IAAG,OAAOE;IAAY;GAAO,CAAC;EACzD,OACE,EAAO,KAAK;GAAE;GAAG;GAAG;GAAO;EAAO,CAAC;CAEvC,CAAC,GAEMT;AACT;;;AC3GA,eAAsBU,GACpB,GACA,GACA,IAA0B,CAAC,GAC3B,GACA,GACyB;CACzB,IAAI,CAACC,KAAU,CAACC,EAAM,KAAK,GAAG,OAAO,CAAC;CAEtC,IAAMC,IAA0B,CAAC,GAC3BC,IAAKjC,GAAmB+B,CAAK,CAAC,CAAC,YAAY;CACjD,IAAI,CAACE,GAAI,OAAO,CAAC;CAEjB,IAAMC,IAAWJ,EAAO,UACpBK;CACJ,IAAIC,MAAU,KAAA,GAKZ;MAHA,IADgB,MAAM,KAAK,IAAI,IAAIA,CAAK,CAC1B,CAAA,CACX,QAAO,MAAK,OAAO,UAAUlN,CAAC,KAAKA,KAAK,KAAKA,KAAKgN,CAAQ,CAAC,CAC3D,MAAM,GAAG,MAAMG,IAAIC,CAAC,GACnBH,EAAY,WAAW,GAEzB,OADAI,IAAa,GAAG,GACT,CAAC;CACV,OAEA,IAAc,MAAM,KAAK,EAAE,QAAQL,EAAS,IAAI,GAAG,MAAMxC,IAAI,CAAC;CAKhE,KAAK,IAAI8C,IAAa,GAAGA,IAAaL,EAAY,QAAQ,KAAc,IAAW;EACjF,IAAMM,IAAaN,EAAY,MAAMK,GAAYA,IAAa,EAAS,GACjEE,IAAgBD,EAAW,KAAI,OAClC,YAAY;GACX,IAAM3F,IAAO,MAAMgF,EAAO,QAAQa,CAAO,GAIrCvB,KAAQ,MAHctE,EAAK,eAAe,EAAA,CAGtB;GACxB,IAAI8F,KAAcA,EAAW,SAAS,GAAG;IACvC,IAAMC,IAAiBD,EAAW,QAAO,MAAKE,EAAE,cAAcH,CAAO;IACrE,IAAIE,EAAe,SAAS,GAAG;KAC7B,IAAME,IAAKjG,EAAK,YAAY,EAAE,OAAO,EAAE,CAAC;KACxC,IAAQsE,EAAM,QAAQ,MAAc;MAClC,IAAI,CAAClC,EAAK,OAAOA,EAAK,IAAI,KAAK,MAAM,IAAI,OAAO;MAEhD,IAAM8D,IAAQ9D,EAAK,UAAU,IACvB+D,IAAQ/D,EAAK,UAAU,IACvBgE,IAAQhE,EAAK,OACbiE,IAAQjE,EAAK,UAAU,KAAK,IAAIA,EAAK,UAAU,EAAE,GACjDkE,IAAWL,EAAG,SAASE,IAAQE;MAErC,KAAK,IAAME,KAAOR,GAAgB;OAChC,IAAMS,IAAa,KAAK,IAAIN,GAAOK,EAAI,CAAC,IAAI,KAAK,IAAIL,IAAQE,GAAOG,EAAI,IAAIA,EAAI,KAAK,GAC/EE,IAAa,KAAK,IAAIH,GAAUC,EAAI,CAAC,IAAI,KAAK,IAAID,IAAWD,GAAOE,EAAI,IAAIA,EAAI,MAAM;OAE5F,IAAIC,KAAcC,GAChB,OAAO;MAEX;MACA,OAAO;KACT,CAAC;IACH;GACF;GAEA,IAAM3C,IAAWX,GAAcmB,CAAK,GAC9B,EAAE,aAAU,aAAU,iBAAcR,GACpC4C,IAAgBjD,EAAS,YAAY,GACvCkD,IAAI,GACFC,IAA8B,CAAC;GAErC,QAAQ,IAAIF,EAAc,QAAQvB,GAAIwB,CAAC,OAAO,KAAI;IAChD,IAAM3C,IAAWN,EAAUiD,IACrB1C,IAAaP,EAAUiD,IAAIxB,EAAG,SAAS,KAAK,GAC5C0B,IAAe,KAAK,IAAI,GAAG7C,IAAW,EAAE,GACxC8C,IAAa,KAAK,IAAI1D,EAAS,QAAQa,IAAa,EAAE,GACtD8C,IAAU3D,EAAS,UAAUyD,GAAcC,CAAU,CAAC,CAAC,QAAQ,OAAO,GAAG,GAEzEzC,IAASR,GAAkBS,GAAOR,GAAUE,GAAUC,CAAU;IAWtE,AATA2C,EAAY,KAAK;KACf,IAAI,IAAIf,EAAQ,MAAM7B;KACtB,WAAW6B;KACX;KACA,iBAAiB7B,IAAW6C;KAC5B,aAAa5C,IAAaD;KAC1B;IACF,CAAC,GAED,KAAKmB,EAAG;GACV;GAGA,OADAnF,EAAK,UAAU,GACR4G;EACT,EAAA,CAAG,CACL;EAOA,CAJA,MADgC,QAAQ,IAAIhB,CAAa,EAAA,CACvC,SAAQ,MAAeV,EAAQ,KAAK,GAAG0B,CAAW,CAAC,GAErEnB,IAAa,KAAK,OAAQC,IAAaC,EAAW,UAAUN,EAAY,SAAU,GAAG,CAAC,GAEtF,MAAM,IAAI,SAAQ,MAAW,WAAW2B,GAAS,EAAE,CAAC;CACtD;CAKA,OAFA9B,EAAQ,MAAM,GAAG,MAAMK,EAAE,YAAYC,EAAE,SAAS,GAEzCN;AACT;AAEA,SAAgB+B,GAAa,GAA0C,IAA0B,CAAC,GAAG;CACnG,IAAM,CAACC,GAAaC,KAAkB1O,EAAS,EAAK,GAC9C,CAAC2O,GAAeC,KAAoB5O,EAAyB,CAAC,CAAC,GAC/D,CAAC6O,GAAgBC,KAAqB9O,EAAS,CAAC;CAyBtD,OAAO;EAAE,QAvBMsJ,EACb,OAAO,MAAkB;GACvB,IAAI,CAACiD,KAAU,CAACC,EAAM,KAAK,GAAG;IAC5B,EAAiB,CAAC,CAAC;IACnB;GACF;GAGA,AADAkC,EAAe,EAAI,GACnBI,EAAkB,CAAC;GAEnB,IAAI;IACF,IAAMrC,IAAU,MAAMH,GAAcC,GAAQC,GAAOa,IAAY,MAAKyB,EAAkBnP,CAAC,CAAC;IACxF,EAAiB8M,CAAO;GAC1B,SAASsC,GAAO;IACd,QAAQ,MAAM,iBAAiBA,CAAK;GACtC,UAAU;IAER,AADAL,EAAe,EAAK,GACpBI,EAAkB,GAAG;GACvB;EACF,GACA,CAACvC,GAAQc,CAAU,CAGZ;EAAQ;EAAe;EAAa;EAAgB,mBAAmBuB,EAAiB,CAAC,CAAC;CAAE;AACvG;;;AC1IA,SAAwBI,GAAQ,EAC9B,WAAQ,gBAAa,mBAAgB,yBAAsB,4BAC3D,aAAU,kBAAe,gBAAa,mBAAgB,kBACtD,cAAW,iBAAc,kBACV;CACf,IAAM,CAACC,GAAaC,KAAkBlP,EAAS,EAAE,GAC3C,CAACmP,GAAcC,KAAmBpP,EAAS,GAAG,GAC9C,CAACqP,GAAYC,KAAiBtP,EAAS,EAAK,GAC5CuP,IAAiBjT,EAAyB,IAAI;CA0CpD,AAxCAE,QAAgB;EACd,IAAMgT,KAAmB,MAAkB;GACzC,IAAI,CAACH,GAAY;GACjB,IAAMI,IAAW,KAAK,IAAI,KAAK,IAAI,EAAE,SAAS,GAAG,GAAG,GAAG;GACvD,EAAgBA,CAAQ;EAC1B,GACMC,UAAsBJ,EAAc,EAAK;EAW/C,OATID,KACF,SAAS,KAAK,MAAM,SAAS,cAC7B,SAAS,KAAK,MAAM,aAAa,QACjC,OAAO,iBAAiB,aAAaG,CAAe,GACpD,OAAO,iBAAiB,WAAWE,CAAa,MAEhD,SAAS,KAAK,MAAM,SAAS,IAC7B,SAAS,KAAK,MAAM,aAAa,WAEtB;GAEX,AADA,OAAO,oBAAoB,aAAaF,CAAe,GACvD,OAAO,oBAAoB,WAAWE,CAAa;EACrD;CACF,GAAG,CAACL,CAAU,CAAC,GAEf7S,QAAgB;EACd,IAAMmT,IAAU,iBAAiB;GAC/B,EAASV,CAAW;EACtB,GAAG,GAAG;EACN,aAAa,aAAaU,CAAO;CACnC,GAAG,CAACV,GAAaW,CAAQ,CAAC,GAE1BpT,QAAgB;EACd,IAAIqT,KAAU/L,MAAc,UAAU;GACpC,IAAMgM,IAAQ,iBAAiB;IAE7B,AADAP,EAAe,SAAS,MAAM,GAC9BA,EAAe,SAAS,OAAO;GACjC,GAAG,EAAE;GACL,aAAa,aAAaO,CAAK;EACjC;CACF,GAAG,CAACD,GAAQ/L,CAAS,CAAC,GAEtB1H,GAAY,6BAA6B;EACvC,AAAImT,EAAe,YACjBA,EAAe,QAAQ,MAAM,GAC7BA,EAAe,QAAQ,OAAO;CAElC,CAAC;CAED,IAAMQ,IAAWC,EAAY,QAAO,MAAK;EAAC;EAAQ;EAAW;EAAQ;CAAM,CAAC,CAAC,SAASlD,EAAE,IAAI,CAAC,GAEvFmD,MAAgB,MAAe;EAEnC,AADAC,EAAeF,EAAY,QAAO,MAAKlD,EAAE,OAAOqD,CAAE,CAAC,GAC/CC,MAAyBD,KAAIE,EAAwB,IAAI;CAC/D;CAEA,OACE,kBAAC,OAAD;EAAK,OAAO;GACV,OAAOR,IAAS,GAAGV,EAAa,MAAM;GACtC,QAAQ;GACR,iBAAiB;GACjB,SAAS;GACT,YAAY;GACZ,QAAQ;GACR,YAAYE,IAAa,SAAS;GAClC,UAAU;EACZ;EATA,UAAA,CAWE,kBAAC,OAAD;GAAK,OAAO;IACV,OAAO,GAAGF,EAAa;IACvB,QAAQ;IACR,SAAS;IACT,eAAe;IACf,UAAU;GACZ;GANA,UAAA,CAOE,kBAAC,OAAD;IAAK,OAAO;KACV,SAAS;KACT,cAAc;KACd,iBAAiB;KACjB,SAAS;KACT,eAAe;KACf,KAAK;KACL,YAAY;IACd;IARA,UAAA,CASA,kBAAC,OAAD;KAAK,OAAO;MAAE,SAAS;MAAQ,KAAK;KAAO;KAA3C,UAAA,CACE,kBAAC,UAAD;MACE,eAAetL,EAAa,QAAQ;MACpC,OAAO;OACL,YAAY;OAAQ,QAAQ;OAAQ,SAAS;OAAS,QAAQ;OAAW,UAAU;OACnF,YAAYC,MAAc,WAAW,MAAM;OAAK,OAAOA,MAAc,WAAW,mBAAmB;OACnG,cAAcA,MAAc,WAAW,6BAA6B;MACtE;MACD,UAAA;KAEO,CAAA,GACR,kBAAC,UAAD;MACE,eAAeD,EAAa,UAAU;MACtC,OAAO;OACL,YAAY;OAAQ,QAAQ;OAAQ,SAAS;OAAS,QAAQ;OAAW,UAAU;OACnF,YAAYC,MAAc,aAAa,MAAM;OAAK,OAAOA,MAAc,aAAa,mBAAmB;OACvG,cAAcA,MAAc,aAAa,6BAA6B;MACxE;MACD,UAAA;KAEO,CAAA,CACL;IAEJ,CAAA,GAAAA,MAAc,YACb,kBAAC,OAAD;KAAK,OAAO;MAAE,UAAU;MAAY,cAAc;KAAO;KAAzD,UAAA;MACE,kBAACM,IAAD;OAAQ,MAAM;OAAI,OAAM;OAAU,OAAO;QAAE,UAAU;QAAY,MAAM;QAAQ,KAAK;OAAO;MAAI,CAAA;MAC/F,kBAAC,SAAD;OACE,KAAKmL;OACL,MAAK;OACL,aAAY;OACZ,OAAON;OACP,WAAU,MAAKC,EAAe,EAAE,OAAO,KAAK;OAC5C,YAAW,MAAK;QACd,AAAI,EAAE,QAAQ,YACZ,EAAE,eAAe,GACjBU,EAASX,CAAW;OAExB;OACA,OAAO;QACL,OAAO;QACP,SAAS;QACT,QAAQ;QACR,cAAc;QACd,UAAU;QACV,SAAS;QACT,WAAW;OACb;MACD,CAAA;MACAA,KACC,kBAAC,UAAD;OACE,eAAe;QAEb,AADAC,EAAe,EAAE,GACjBU,EAAS,EAAE;OACb;OACA,OAAO;QACL,UAAU;QACV,OAAO;QACP,KAAK;QACL,WAAW;QACX,YAAY;QACZ,QAAQ;QACR,QAAQ;QACR,SAAS;QACT,OAAO;OACT;OACA,OAAM;OAEN,UAAA,kBAACvH,IAAD,EAAG,MAAM,GAAK,CAAA;MACR,CAAA;KAEP;IAEJ,CAAA,CAAA;GAEL,CAAA,GAAA,kBAAC,OAAD;IAAK,OAAO;KAAE,MAAM;KAAG,WAAW;KAAQ,SAAS;KAAQ,SAAS;KAAQ,eAAe;KAAU,KAAK;IAAM;IAAhH,UAAA,CAEGvE,MAAc,cACb,kBAAAlJ,IAAA,EAAA,UAAA,CACGmV,EAAS,WAAW,KACnB,kBAAC,OAAD;KAAK,OAAO;MAAE,OAAO;MAAqB,UAAU;MAAQ,WAAW;MAAU,WAAW;KAAO;KAAG,UAAA;IAEjG,CAAA,GAENA,EAAS,KAAI,MACZ,kBAAC,OAAD;KAEE,eAAeM,EAAwBC,EAAQ,EAAE;KACrD,OAAO;MACL,SAAS;MACT,iBAAiB;MACjB,QAAQF,MAAyBE,EAAQ,KAAK,6BAA6B;MAC3E,cAAc;MACd,QAAQ;MACR,WAAW;KACb;KAVE,UAAA,CAYF,kBAAC,OAAD;MAAK,OAAO;OAAE,SAAS;OAAQ,gBAAgB;OAAiB,YAAY;OAAU,cAAc;MAAM;MAA1G,UAAA,CACE,kBAAC,OAAD;OAAK,OAAO;QAAE,SAAS;QAAQ,YAAY;QAAU,KAAK;QAAO,OAAO;OAAoB;OAA5F,UAAA;QACGA,EAAQ,SAAS,UAAU,kBAAC9L,GAAD,EAAe,MAAM,GAAK,CAAA;QACrD8L,EAAQ,SAAS,aAAa,kBAACC,IAAD,EAAe,MAAM,GAAK,CAAA;QACxDD,EAAQ,SAAS,UAAU,kBAACE,IAAD,EAAM,MAAM,GAAK,CAAA;QAC5CF,EAAQ,SAAS,UAAU,kBAACzV,IAAD,EAAU,MAAM,GAAK,CAAA;QACjD,kBAAC,QAAD;SAAM,OAAO;UAAE,UAAU;UAAQ,eAAe;SAAa;SAAI,UAAAyV,EAAQ;QAAW,CAAA;QACnFA,EAAQ,UAAU,kBAAC,QAAD;SAAM,OAAO;UAAE,UAAU;UAAQ,OAAO;SAAoB;SAA5D,UAAA,CAA+D,MAAGA,EAAQ,MAAa;;OACvG;MACL,CAAA,GAAA,kBAAC,UAAD;OACE,UAAU,MAAM;QAAuB,AAArBG,EAAE,gBAAgB,GAAGR,GAAaK,EAAQ,EAAE;OAAG;OACjE,OAAO;QAAE,YAAY;QAAQ,QAAQ;QAAQ,OAAO;QAAW,QAAQ;QAAW,SAAS;OAAM;OACjG,OAAM;OAEN,UAAA,kBAACvK,IAAD,EAAQ,MAAM,GAAK,CAAA;MACb,CAAA,CACL;KAEL,CAAA,GAAA,kBAAC,OAAD;MAAK,OAAO;OAAE,UAAU;OAAQ,OAAO;OAAqB,YAAY;OAAY,WAAW;MAAa;MACzG,UAAAuK,EAAQ,SAAS,SAChB,kBAAC,KAAD;OACE,MAAMtJ,GAAgBsJ,EAAQ,OAAO;OACrC,UAAU,MAAM;QACd,AAAII,KAAeJ,EAAQ,YACzBG,EAAE,eAAe,GACjBC,EAAYJ,EAAQ,SAASA,GAASG,CAAC;OAE3C;OACA,QAAO;OACP,KAAI;OACJ,OAAO;QAAE,OAAO;QAAkB,gBAAgB;QAAQ,QAAQ;OAAU;OAE3E,UAAAH,EAAQ,WAAW,kBAAC,QAAD;QAAM,OAAO;SAAE,WAAW;SAAU,OAAO;QAAoB;QAAG,UAAA;OAAgB,CAAA;MACrG,CAAA,IAEHA,EAAQ,QAAQ,kBAAC,QAAD;OAAM,OAAO;QAAE,WAAW;QAAU,OAAO;OAAoB;OAAG,UAAA;MAAmB,CAAA;KAEpG,CAAA,CACF;IAjDM,GAAAA,EAAQ,EAiDd,CACJ,CACC,EAAA,CAAA,GAGHxM,MAAc,YACb,kBAAAlJ,IAAA,EAAA,UAAA;KACG6T,KACC,kBAAC,OAAD;MAAK,OAAO;OAAE,UAAU;OAAQ,OAAO;OAAqB,WAAW;OAAU,WAAW;MAAO;MAAnG,UAAA;OAAsG;OACtFI;OAAe;MAC1B;;KAEN,CAACJ,KAAeQ,KAAeN,EAAc,WAAW,KACvD,kBAAC,OAAD;MAAK,OAAO;OAAE,UAAU;OAAQ,OAAO;OAAqB,WAAW;OAAU,WAAW;MAAO;MAAG,UAAA;KAEjG,CAAA;KAEN,CAACF,KAAeE,EAAc,SAAS,KACtC,kBAAC,OAAD;MAAK,OAAO;OAAE,UAAU;OAAQ,OAAO;OAAqB,cAAc;MAAM;MAAhF,UAAA,CACGA,EAAc,QAAO,gBACnB;;KAIN,CAACF,KAAe,MAAM,KAAK,IAAI,IAAIE,EAAc,KAAI,MAAKpB,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,KAAI,MAAW;MACvF,IAAMY,IAAcQ,EAAc,QAAO,MAAKpB,EAAE,cAAcH,CAAO;MACrE,OACE,kBAAC,OAAD;OAA6B,OAAO,EAAE,cAAc,OAAO;OAA3D,UAAA,CACE,kBAAC,OAAD;QAAK,OAAO;SAAE,UAAU;SAAQ,OAAO;SAAqB,cAAc;QAAM;QAAhF,UAAA,CAAmF,SAAMA,CAAa;OACtG,CAAA,GAAA,kBAAC,OAAD;QAAK,OAAO;SAAE,SAAS;SAAQ,eAAe;SAAU,KAAK;QAAM;QAChE,UAAAe,EAAY,KAAI,MACf,kBAAC,OAAD;SAEE,eAAewC,EAAcC,CAAM;SACnC,OAAO;UACL,SAAS;UACT,iBAAiB;UACjB,QAAQ;UACR,cAAc;UACd,QAAQ;UACR,UAAU;UACV,OAAO;SACT;SAXF,UAAA;UAaGA,EAAO,QAAQ,UAAU,GAAGA,EAAO,eAAe;UACnD,kBAAC,QAAD;WAAM,OAAO;YAAE,YAAY;YAAK,OAAO;WAAiB;WACrD,UAAAA,EAAO,QAAQ,UAAUA,EAAO,iBAAiBA,EAAO,kBAAkBA,EAAO,WAAW;UACzF,CAAA;UACLA,EAAO,QAAQ,UAAUA,EAAO,kBAAkBA,EAAO,WAAW;SAClE;QAjBE,GAAAA,EAAO,EAiBT,CACN;OACE,CAAA,CACF;MAzBK,GAAA,QAAQxD,GAyBb;KAET,CAAC;IACD,EAAA,CAAA,CAGD;GAEA,CAAA,CAAA;EAGJ,CAAA,GAAAyC,KACC,kBAAC,OAAD;GACE,mBAAmBP,EAAc,EAAI;GACrC,OAAO;IACL,UAAU;IACV,KAAK;IACL,OAAO;IACP,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,YAAY;IACZ,gBAAgB;IAChB,iBAAiB;GACnB;GAdF,UAAA,CAiBE,kBAAC,OAAD;IAAK,OAAO;KACV,OAAO;KACP,QAAQ;KACR,iBAAiB;KACjB,QAAQ;KACR,cAAc;KACd,SAAS;KACT,YAAY;KACZ,gBAAgB;KAChB,KAAK;KACL,WAAW;IACb;IAXA,UAAA,CAYE,kBAAC,OAAD,EAAK,OAAO;KAAE,OAAO;KAAO,QAAQ;KAAQ,iBAAiB;IAAU,EAAI,CAAA,GAC3E,kBAAC,OAAD,EAAK,OAAO;KAAE,OAAO;KAAO,QAAQ;KAAQ,iBAAiB;IAAU,EAAI,CAAA,CACxE;GACL,CAAA,GAAA,kBAAC,OAAD,EAAK,OAAO;IAAE,UAAU;IAAY,KAAK;IAAG,OAAO;IAAG,OAAO;IAAO,QAAQ;IAAQ,iBAAiB;IAAuB,QAAQ;GAAG,EAAI,CAAA,CACxI;EAEJ,CAAA,CAAA;;AAET;;;AClVA,IAAMuB,MAAa,EAAE,WAAQ,cAAW,aAAU,YAAS,eAA4B;CACrF,IAAMC,IAAexU,EAAuB,IAAI,GAC1CyU,IAAYzU,EAA0B,IAAI,GAC1C,CAAC0U,GAAWC,KAAgBjR,EAAS,EAAK,GAC1C,CAACkR,GAAaC,KAAkBnR,EAAiB,GAAI;CAgB3D,AAbAxD,QAAgB;EACd,IAAM4U,IAAW,IAAI,sBAAsB,MAAY;GACrD,AAAIC,EAAQ,EAAE,CAAC,iBACbJ,EAAa,EAAI,IAEjBA,EAAa,EAAK;EAEtB,GAAG,EAAE,YAAY,QAAQ,CAAC;EAG1B,OADIH,EAAa,WAASM,EAAS,QAAQN,EAAa,OAAO,SAClDM,EAAS,WAAW;CACnC,GAAG,CAAC,CAAC,GAEL5U,QAAgB;EACd,IAAI,CAACwU,GAAW;EAEhB,IAAIM,IAAkB,MAClBC,IAAc;EAwClB,QAFA,YApC+B;GAC7B,IAAI;IACF,IAAMhK,IAAO,MAAMgF,EAAO,QAAQiF,CAAS;IAC3C,IAAID,GAAa;IAGjB,IAAM/D,IAAKjG,EAAK,YAAY,EAAE,OAAO,EAAE,CAAC;IACxC,EAAeiG,EAAG,QAAQA,EAAG,MAAM;IAEnC,IAAMiE,IAAWlK,EAAK,YAAY,EAAE,SAAM,CAAC,GACrCmK,IAASX,EAAU;IACzB,IAAI,CAACW,GAAQ;IAEb,IAAMC,IAAMD,EAAO,WAAW,IAAI;IAClC,IAAI,CAACC,GAAK;IAEV,IAAM5T,IAAc,KAAK,IAAI,OAAO,oBAAoB,GAAG,CAAC;IAY5D,AAXA,EAAO,QAAQ,KAAK,MAAM0T,EAAS,QAAQ1T,CAAW,GACtD,EAAO,SAAS,KAAK,MAAM0T,EAAS,SAAS1T,CAAW,GACxD,EAAO,MAAM,QAAQ,GAAG0T,EAAS,MAAM,KACvC,EAAO,MAAM,SAAS,GAAGA,EAAS,OAAO,KAEzC,IAAalK,EAAK,OAAO;KACvB,eAAeoK;KACP;KACR,WAAW;MAAC5T;MAAa;MAAG;MAAGA;MAAa;MAAG;KAAC;KACtC;IACZ,CAAC,GACD,MAAMuT,EAAW;GACnB,SAAS,GAAQ;IACf,AAAI,EAAE,SAAS,iCACb,QAAQ,MAAM,0BAA0B,CAAC;GAE7C;EACF,EAEA,CAAW,SAEE;GAEX,AADA,IAAc,IACVA,KACFA,EAAW,OAAO;EAEtB;CACF,GAAG;EAAC/E;EAAQiF;EAAWhU;EAAOwT;CAAS,CAAC;CAGxC,IAAMY,IAAiB,MAAMpU,GACvBqU,IAAkBD,IAAiBV;CAEzC,OACE,kBAAC,OAAD;EACE,KAAKJ;EACI;EACT,OAAO;GACL,SAAS;GAAQ,eAAe;GAAU,YAAY;GAAU,QAAQ;GACxE,SAAS;GAAO,WAAW;GAC3B,WAAW,GAAGe,IAAkB,GAAG;EACrC;EAPF,UAAA,CASGb,IACC,kBAAC,OAAD;GAAK,OAAO;IACV,QAAQc,IAAW,6BAA6B;IAChD,SAAS;IAAO,iBAAiB;IACjC,WAAW;GACb;GACE,UAAA,kBAAC,UAAD;IAAQ,KAAKf;IAAW,OAAO;KAAE,SAAS;KAAS,iBAAiB;IAAO;GAAI,CAAA;EAC5E,CAAA,IAEL,kBAAC,OAAD,EAAK,OAAO;GACV,OAAO,GAAGa,EAAe;GAAK,QAAQ,GAAGC,EAAgB;GACzD,iBAAiB;GAAW,QAAQ;EACtC,EAAI,CAAA,GAEN,kBAAC,QAAD;GAAM,OAAO;IAAE,WAAW;IAAO,UAAU;IAAQ,OAAOC,IAAW,mBAAmB;IAAQ,YAAYA,IAAW,SAAS;GAAS;GACtI,UAAAN;EACG,CAAA,CACH;;AAET;AASA,SAAwBO,GAAY,EAAE,WAAQ,WAAQ,YAAS,iBAAgC;CAC7F,IAAM,CAACjO,GAAWD,KAAgB7D,EAAiD,YAAY,GACzF,CAACmP,GAAcC,KAAmBpP,EAAS,GAAG,GAC9C,CAACqP,GAAYC,KAAiBtP,EAAS,EAAK,GAG5C,CAACgS,GAAaC,KAAkBjS,EAAS,EAAE,GAG3CkS,IAAa,KAAOF,IAAc,MAAO;CAE/C,QAAgB;EACd,IAAMxC,KAAmB,MAAkB;GACzC,IAAI,CAACH,GAAY;GACjB,IAAMI,IAAW,KAAK,IAAI,KAAK,IAAI,EAAE,SAAS,GAAG,GAAG,GAAG;GACvD,EAAgBA,CAAQ;EAC1B,GACMC,UAAsBJ,EAAc,EAAK;EAW/C,OATID,KACF,SAAS,KAAK,MAAM,SAAS,cAC7B,SAAS,KAAK,MAAM,aAAa,QACjC,OAAO,iBAAiB,aAAaG,CAAe,GACpD,OAAO,iBAAiB,WAAWE,CAAa,MAEhD,SAAS,KAAK,MAAM,SAAS,IAC7B,SAAS,KAAK,MAAM,aAAa,WAEtB;GAEX,AADA,OAAO,oBAAoB,aAAaF,CAAe,GACvD,OAAO,oBAAoB,WAAWE,CAAa;EACrD;CACF,GAAG,CAACL,CAAU,CAAC;CAEf,IAAM1C,IAAWJ,IAASA,EAAO,WAAW,GAGtC4F,IAAa,MAAM,KAAK,EAAE,QAAQxF,EAAS,IAAI,GAAG,MAAMxC,IAAI,CAAC;CAEnE,OACE,kBAAC,OAAD;EAAK,OAAO;GACV,OAAO0F,IAAS,GAAGV,EAAa,MAAM;GACtC,QAAQ;GACR,iBAAiB;GACjB,SAAS;GACT,YAAY;GACZ,QAAQ;GACR,YAAYE,IAAa,SAAS;GAClC,UAAU;GACV,aAAaQ,IAAS,kCAAkC;EAC1D;EAVA,UAAA,CAWE,kBAAC,OAAD;GAAK,OAAO;IACV,OAAO,GAAGV,EAAa;IACvB,QAAQ;IACR,SAAS;IACT,eAAe;IACf,UAAU;GACZ;GANA,UAAA;IAQE,kBAAC,OAAD;KAAK,OAAO;MACV,SAAS;MAAQ,cAAc;MAAiC,iBAAiB;MAAQ,SAAS;KACpG;KAFA,UAAA;MAGE,kBAAC,UAAD;OACE,eAAetL,EAAa,YAAY;OACxC,OAAO;QAAE,MAAM;QAAG,SAAS;QAAO,YAAYC,MAAc,eAAe,mBAAmB;QAAQ,OAAOA,MAAc,eAAe,SAAS;QAAqB,QAAQ;QAAQ,cAAc;QAAO,QAAQ;QAAW,SAAS;QAAQ,gBAAgB;OAAS;OAC1Q,OAAM;OAEN,UAAA,kBAACpB,GAAD,EAAM,MAAM,GAAK,CAAA;MACX,CAAA;MACR,kBAAC,UAAD;OACE,eAAemB,EAAa,SAAS;OACrC,OAAO;QAAE,MAAM;QAAG,SAAS;QAAO,YAAYC,MAAc,YAAY,mBAAmB;QAAQ,OAAOA,MAAc,YAAY,SAAS;QAAqB,QAAQ;QAAQ,cAAc;QAAO,QAAQ;QAAW,SAAS;QAAQ,gBAAgB;OAAS;OACpQ,OAAM;OAEN,UAAA,kBAACsO,IAAD,EAAM,MAAM,GAAK,CAAA;MACX,CAAA;MACR,kBAAC,UAAD;OACE,eAAevO,EAAa,WAAW;OACvC,OAAO;QAAE,MAAM;QAAG,SAAS;QAAO,YAAYC,MAAc,cAAc,mBAAmB;QAAQ,OAAOA,MAAc,cAAc,SAAS;QAAqB,QAAQ;QAAQ,cAAc;QAAO,QAAQ;QAAW,SAAS;QAAQ,gBAAgB;OAAS;OACxQ,OAAM;OAEN,UAAA,kBAACuO,GAAD,EAAU,MAAM,GAAK,CAAA;MACf,CAAA;MACR,kBAAC,UAAD;OACE,OAAO;QAAE,MAAM;QAAG,SAAS;QAAO,YAAY;QAAQ,OAAO;QAAqB,QAAQ;QAAQ,cAAc;QAAO,QAAQ;QAAW,SAAS;QAAQ,gBAAgB;OAAS;OACpL,OAAM;OAEN,UAAA,kBAACC,IAAD,EAAgB,MAAM,GAAK,CAAA;MACrB,CAAA;KACL;;IAEJxO,MAAc,gBACb,kBAAAhJ,IAAA,EAAA,UAAA;KAEE,kBAAC,OAAD;MAAK,OAAO;OAAE,SAAS;OAAQ,YAAY;OAAU,SAAS;OAAa,KAAK;OAAO,cAAc;OAAiC,iBAAiB;MAAO;MAA9J,UAAA;OACE,kBAACyX,GAAD;QAAO,MAAM;QAAI,OAAM;QAAoB,OAAO,EAAE,QAAQ,UAAU;QAAG,eAAeN,EAAe,KAAK,IAAI,GAAGD,IAAc,EAAE,CAAC;OAAI,CAAA;OACxI,kBAAC,SAAD;QACE,MAAK;QACL,KAAI;QAAI,KAAI;QACZ,OAAOA;QACP,WAAW,MAAMC,EAAe,SAAS,EAAE,OAAO,KAAK,CAAC;QACxD,OAAO;SAAE,MAAM;SAAG,QAAQ;SAAO,aAAa;QAAiB;OAChE,CAAA;OACD,kBAACO,IAAD;QAAM,MAAM;QAAI,OAAM;QAAoB,OAAO,EAAE,QAAQ,UAAU;QAAG,eAAeP,EAAe,KAAK,IAAI,KAAKD,IAAc,EAAE,CAAC;OAAI,CAAA;MACtI;;KAGL,kBAAC,OAAD;MAAK,OAAO;OAAE,MAAM;OAAG,WAAW;OAAQ,SAAS;OAAS,iBAAiB;MAAU;MAAvF,UAAA,CACGzF,KAAU4F,EAAW,KAAI,MACxB,kBAACtB,IAAD;OAEU;OACR,WAAWlR;OACX,UAAUA,MAAMyN;OAChB,eAAeqF,EAAW9S,CAAC;OAC3B,OAAOuS;MACR,GANMvS,CAMN,CACF,GACA,CAAC4M,KACA,kBAAC,OAAD;OAAK,OAAO;QAAE,SAAS;QAAQ,WAAW;QAAU,OAAO;QAAQ,UAAU;OAAO;OAAG,UAAA;MAElF,CAAA,CAEJ;;KAGL,kBAAC,OAAD;MAAK,OAAO;OAAE,WAAW;OAAiC,SAAS;OAAQ,iBAAiB;MAAO;MAAnG,UAAA,CACE,kBAAC,OAAD;OAAK,OAAO;QAAE,UAAU;QAAQ,OAAO;QAAqB,cAAc;OAAM;OAAG,UAAA;MAE9E,CAAA,GACL,kBAAC,OAAD;OAAK,OAAO;QAAE,SAAS;QAAQ,KAAK;OAAM;OAA1C,UAAA,CACE,kBAAC,SAAD;QACE,MAAK;QACL,aAAY;QACZ,OAAO;SAAE,MAAM;SAAG,SAAS;SAAW,UAAU;SAAQ,QAAQ;SAAkB,cAAc;SAAO,SAAS;QAAO;OACxH,CAAA,GACD,kBAAC,UAAD;QAAQ,OAAO;SAAE,SAAS;SAAW,YAAY;SAAQ,QAAQ;SAAkB,cAAc;SAAO,QAAQ;SAAW,SAAS;SAAQ,YAAY;QAAS;QAC/J,UAAA,kBAACmG,IAAD;SAAa,MAAM;SAAI,OAAM;QAAqB,CAAA;OAC5C,CAAA,CACL;MACF,CAAA,CAAA;;IACL,EAAA,CAAA;IAGH5O,MAAc,gBACb,kBAAC,OAAD;KAAK,OAAO;MAAE,SAAS;MAAQ,WAAW;MAAU,OAAO;MAAQ,UAAU;KAAO;KAApF,UAAA;MAAuF;MAC3DA;MAAU;KACjC;;GAEJ;EAGL,CAAA,GAAA,kBAAC,OAAD;GACE,mBAAmBwL,EAAc,EAAI;GACrC,OAAO;IACL,OAAO;IACP,QAAQ;IACR,UAAU;IACV,OAAO;IACP,QAAQ;IACR,QAAQ;GACV;EACD,CAAA,CACE;;AAET;;;AC/RA,SAAgBqD,GAAmB,GAAc,GAAc,GAAkB,GAAa,GAAa;CACzG,IAAMC,KAAYtQ,IAAW,MAAO,OAAO;CAU3C,OATIsQ,MAAY,KACP;EAAE,GAAGC;EAAM,GAAGC,IAAMC;CAAK,IAE9BH,MAAY,MACP;EAAE,GAAGI,IAAMD;EAAM,GAAGD,IAAMD;CAAK,IAEpCD,MAAY,MACP;EAAE,GAAGI,IAAMH;EAAM,GAAGE;CAAK,IAE3B;EAAE,GAAGA;EAAM,GAAGF;CAAK;AAC5B;AAKA,SAAgBI,GAAiB,GAAa,GAAa,GAAkB,GAAa,GAAa;CACrG,IAAML,KAAYtQ,IAAW,MAAO,OAAO;CAU3C,OATIsQ,MAAY,KACP;EAAE,GAAGE,IAAMI;EAAK,GAAGC;CAAI,IAE5BP,MAAY,MACP;EAAE,GAAGI,IAAMG;EAAK,GAAGL,IAAMI;CAAI,IAElCN,MAAY,MACP;EAAE,GAAGM;EAAK,GAAGF,IAAMG;CAAI,IAEzB;EAAE,GAAGA;EAAK,GAAGD;CAAI;AAC1B;AAKA,SAAgBE,GAAqB,GAAW,GAAW,GAAe,GAAgB,GAAkB,GAAa,GAAa;CACpI,IAAMR,KAAYtQ,IAAW,MAAO,OAAO;CAU3C,OATIsQ,MAAY,KACP;EAAE,GAAGE,KAAO7T,IAAI+M;EAAS,GAAGjN;EAAG,OAAOiN;EAAQ,QAAQD;CAAM,IAEjE6G,MAAY,MACP;EAAE,GAAGI,KAAOjU,IAAIgN;EAAQ,GAAG+G,KAAO7T,IAAI+M;EAAS;EAAO;CAAO,IAElE4G,MAAY,MACP;EAAE,GAAG3T;EAAG,GAAG+T,KAAOjU,IAAIgN;EAAQ,OAAOC;EAAQ,QAAQD;CAAM,IAE7D;EAAE;EAAG;EAAG;EAAO;CAAO;AAC/B;AAKA,SAAgBsH,GAAqB,GAAkB,GAAa,GAAiC;CACnG,IAAMT,KAAYtQ,IAAW,MAAO,OAAO;CAC3C,IAAIsQ,MAAY,IAAI,OAAO,aAAaE,EAAI;CAC5C,IAAIF,MAAY,KAAK,OAAO,aAAaI,EAAI,IAAIF,EAAI;CACrD,IAAIF,MAAY,KAAK,OAAO,gBAAgBI,EAAI;AAElD;AAGA,SAAgBM,GAAkB,GAA0B;CAC1D,QAAShR,IAAW,MAAO,OAAO;AACpC;;;ACvDA,IAAaiR,KAA2C;CACtD,gBAAgB;CAChB,cAAc;CACd,oBAAoB;CACpB,kBAAkB;CAClB,oBAAoB;CACpB,oBAAoB;CACpB,gBAAgB;CAChB,WAAW;CACX,YAAY;CACZ,qBAAqB;CACrB,aAAa;AACf,GAEaC,KAA4B;CACvC;EAAE,IAAI;EAAU,MAAM;EAAU,OAAO;CAAU;CACjD;EAAE,IAAI;EAAU,MAAM;EAAU,OAAO;CAAU;CACjD;EAAE,IAAI;EAAU,MAAM;EAAU,OAAO;CAAU;AACnD,GAcMzY,KAAc,KAEP2Y,KAAb,MAAyB;CACvB,SAA8B,CAAC;CAC/B,SAAiC,CAAC;CAClC,QAA4B,CAAC,GAAGF,EAAa;CAC7C,gBAAuC;CACvC,cAAyC;CACzC,gBAAuC;CACvC,UAAsC,EAAE,GAAGD,GAAqB;CAChE,OAAkC,CAAC;CACnC,SAAoC,CAAC;CACrC,kCAA0B,IAAI,IAA8B;CAC5D,gCAAwB,IAAI,IAA4B;CACxD,iCAAyB,IAAI,IAAiC;CAC9D,sCAA8B,IAAI,IAAqC;CACvE,uCAA+B,IAAI,IAAsC;CACzE,mCAA2B,IAAI,IAA2C;CAC1E,gCAAwB,IAAI,IAAuC;CACnE,WAAmB;CAEnB,YACE,IAA6B,CAAC,GAC9B,IAAgC,CAAC,GACjC,IAA2BC,IAC3B,IAA8C,CAAC,GAC/C,IAAiC,MACjC;EAQA,AAPA,KAAK,SAAS,CAAC,GAAGG,CAAa,GAC/B,KAAK,SAAS,EAAE,GAAGC,EAAc,GACjC,KAAK,QAAQC,KAAgBA,EAAa,SAAS,IAAI,CAAC,GAAGA,CAAY,IAAI,CAAC,GAAGL,EAAa,GAC5F,KAAK,UAAU;GAAE,GAAGD;GAAsB,GAAGO;EAAe,GACxDC,KACF,KAAK,eAAeA,CAAW,GAE7B,KAAK,QAAQ,eACf,KAAK,eAAe,KAAK,QAAQ,WAAW;CAEhD;CAIA,eAAe,GAAgD;EAE7D,OADA,KAAK,gBAAgB,IAAIxX,CAAQ,SACpB,KAAK,gBAAgB,OAAOA,CAAQ;CACnD;CAEA,aAAa,GAA8C;EAEzD,OADA,KAAK,cAAc,IAAIA,CAAQ,SAClB,KAAK,cAAc,OAAOA,CAAQ;CACjD;CAEA,mBAA2B,GAA+C;EACxE,IAAMqE,IAA+B;GACnC,QAAQ,KAAK,UAAU;GACvB;EACF;EACA,KAAK,IAAMrE,KAAY,KAAK,iBAC1B,IAAI;GACF,EAASqE,CAAK;EAChB,SAASoT,GAAK;GACZ,QAAQ,MAAM,yCAAyCA,CAAG;EAC5D;CAEJ;CAEA,mBAAiC;EAC/B,IAAMC,IAAO,KAAK,UAAU;EAC5B,KAAK,IAAM1X,KAAY,KAAK,eAC1B,IAAI;GACF,EAAS0X,CAAI;EACf,SAASD,GAAK;GACZ,QAAQ,MAAM,uCAAuCA,CAAG;EAC1D;CAEJ;CAIA,cAA4B;EAK1B,AAJA,KAAK,KAAK,KAAK,EAAE,QAAQ,KAAK,MAAM,KAAK,UAAU,KAAK,MAAM,CAAC,EAAE,CAAC,GAC9D,KAAK,KAAK,SAASjZ,MACrB,KAAK,KAAK,MAAM,GAElB,KAAK,SAAS,CAAC;CACjB;CAEA,IAAI,UAAmB;EACrB,OAAO,KAAK,KAAK,SAAS;CAC5B;CAEA,IAAI,UAAmB;EACrB,OAAO,KAAK,OAAO,SAAS;CAC9B;CAEA,OAAgB;EACd,IAAI,CAAC,KAAK,SAAS,OAAO;EAC1B,IAAMmZ,IAAO,KAAK,KAAK,IAAI;EAI3B,OAHA,KAAK,OAAO,KAAK,EAAE,QAAQ,KAAK,MAAM,KAAK,UAAU,KAAK,MAAM,CAAC,EAAE,CAAC,GACpE,KAAK,SAASA,EAAK,QACnB,KAAK,mBAAmB,KAAK,GACtB;CACT;CAEA,OAAgB;EACd,IAAI,CAAC,KAAK,SAAS,OAAO;EAC1B,IAAMC,IAAO,KAAK,OAAO,IAAI;EAI7B,OAHA,KAAK,KAAK,KAAK,EAAE,QAAQ,KAAK,MAAM,KAAK,UAAU,KAAK,MAAM,CAAC,EAAE,CAAC,GAClE,KAAK,SAASA,EAAK,QACnB,KAAK,mBAAmB,KAAK,GACtB;CACT;CAIA,YAAyB;EACvB,OAAO,CAAC,GAAG,KAAK,MAAM;CACxB;CAEA,iBAAiB,GAAgC;EAC/C,OAAO,KAAK,OAAO,QAAQ,MAAMC,EAAE,cAAc5C,CAAS;CAC5D;CAEA,SAAS,GAAmC;EAC1C,OAAO,KAAK,OAAO,MAAM,MAAM4C,EAAE,OAAOjE,CAAE;CAC5C;CAEA,eAAe,GAAqC;EAClD,OAAO,KAAK,OAAO,MAAM,MAAMiE,EAAE,SAASC,CAAI;CAChD;CAEA,UAAU,GAA2B;EAEnC,AADA,KAAK,YAAY,GACjB,KAAK,SAAS,CAAC,GAAGC,CAAM;EAExB,KAAK,IAAMC,KAAS,KAAK,QACvB,AAAI,KAAK,OAAOA,EAAM,UAAU,KAAA,KAAaA,EAAM,iBAAiB,KAAA,MAClE,KAAK,OAAOA,EAAM,QAAQA,EAAM;EAIpC,AADA,KAAK,mBAAmB,KAAK,GAC7B,KAAK,iBAAiB;CACxB;CAEA,SAAS,GAAwB;EAC/B,KAAK,YAAY;EAGjB,IAAMC,IADS,KAAK,OAAO,MAAM,MAAMJ,EAAE,OAAOG,EAAM,EAC1B,IACxB;GAAE,GAAGA;GAAO,IAAI,SAAS,KAAK,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC;EAAI,IAChF,EAAE,GAAGA,EAAM;EAYf,AAVA,AAEEC,EAAS,cADU,KAAK,iBAAiBA,EAAS,SAC7B,CAAA,CAAW,SAAS,GAG3C,KAAK,OAAO,KAAKA,CAAQ,GACrBA,EAAS,iBAAiB,KAAA,KAAa,KAAK,OAAOA,EAAS,UAAU,KAAA,MACxE,KAAK,OAAOA,EAAS,QAAQA,EAAS,cACtC,KAAK,iBAAiB,IAExB,KAAK,mBAAmB,KAAK;CAC/B;CAEA,YAAY,GAAY,GAAyC,IAAgB,IAAe;EAC9F,IAAMC,IAAM,KAAK,OAAO,WAAW,MAAML,EAAE,OAAOjE,CAAE;EACpD,IAAIsE,MAAQ,IAAI,OAAO;EAEvB,AAAIC,KACF,KAAK,YAAY;EAEnB,IAAMC,IAAW,KAAK,OAAOF,IACvBG,IAAe;GAAE,GAAGD;GAAU,GAAGE;EAAQ;EAa/C,OAVIA,EAAQ,QAAQA,EAAQ,SAASF,EAAS,QACxC,KAAK,OAAOA,EAAS,UAAU,KAAA,MACjC,KAAK,OAAOE,EAAQ,QAAQ,KAAK,OAAOF,EAAS,OACjD,OAAO,KAAK,OAAOA,EAAS,OAC5B,KAAK,iBAAiB,IAI1B,KAAK,OAAOF,KAAOG,GACnB,KAAK,mBAAmB,QAAQ,GACzB;CACT;CAEA,YAAY,GAAqB;EAC/B,IAAMH,IAAM,KAAK,OAAO,WAAW,MAAML,EAAE,OAAOjE,CAAE;EACpD,IAAIsE,MAAQ,IAAI,OAAO;EAEvB,KAAK,YAAY;EACjB,IAAM,CAACK,KAAW,KAAK,OAAO,OAAOL,GAAK,CAAC;EAS3C,OARIK,KAAW,KAAK,OAAOA,EAAQ,UAAU,KAAA,MAC3C,OAAO,KAAK,OAAOA,EAAQ,OAC3B,KAAK,iBAAiB,IAEpB,KAAK,kBAAkB3E,KACzB,KAAK,iBAAiB,IAAI,GAE5B,KAAK,mBAAmB,QAAQ,GACzB;CACT;CAEA,cAAoB;EAMlB,AALA,KAAK,YAAY,GACjB,KAAK,SAAS,CAAC,GACf,KAAK,SAAS,CAAC,GACf,KAAK,iBAAiB,IAAI,GAC1B,KAAK,mBAAmB,OAAO,GAC/B,KAAK,iBAAiB;CACxB;CAIA,YAA4B;EAC1B,OAAO,EAAE,GAAG,KAAK,OAAO;CAC1B;CAEA,SAAS,GAAmB;EAC1B,OAAO,KAAK,OAAOkE;CACrB;CAEA,SAAS,GAAc,GAAkB;EAKvC,AAJA,KAAK,SAAS;GACZ,GAAG,KAAK;IACPA,IAAOU;EACV,GACA,KAAK,iBAAiB;CACxB;CAEA,UAAU,GAAiC;EAEzC,AADA,KAAK,SAAS,EAAE,GAAGC,EAAU,GAC7B,KAAK,iBAAiB;CACxB;CAEA,cAAoB;EAClB,IAAMC,IAA2B,CAAC;EAClC,KAAK,IAAMV,KAAS,KAAK,QACvB,AAAIA,EAAM,iBAAiB,KAAA,MACzB,EAASA,EAAM,QAAQA,EAAM;EAIjC,AADA,KAAK,SAASU,GACd,KAAK,iBAAiB;CACxB;CAEA,YAAY,GAAyB;EACnC,KAAK,WAAWC;CAClB;CAEA,aAAsB;EACpB,OAAO,KAAK;CACd;CAIA,WAAuB;EACrB,OAAO,CAAC,GAAG,KAAK,KAAK;CACvB;CAEA,SAAS,GAAyB;EAChC,KAAK,QAAQ,CAAC,GAAGC,CAAK;EACtB,KAAK,IAAMC,KAAK,KAAK,gBAAgB,EAAE,KAAK,SAAS,CAAC;CACxD;CAEA,QAAQ,GAAsB;EAC5B,IAAI,MAAK,MAAM,MAAM,MAAM7H,EAAE,OAAO8H,EAAK,EAAE,GAC3C;QAAK,MAAM,KAAKA,CAAI;GACpB,KAAK,IAAMD,KAAK,KAAK,gBAAgB,EAAE,KAAK,SAAS,CAAC;EADlC;CAEtB;CAEA,WAAW,GAAY,GAA8C;EACnE,IAAMX,IAAM,KAAK,MAAM,WAAW,MAAMlH,EAAE,OAAO4C,CAAE;EACnD,IAAIsE,MAAQ,IACZ;QAAK,MAAMA,KAAO;IAAE,GAAG,KAAK,MAAMA;IAAM,GAAGI;GAAQ;GACnD,KAAK,IAAMO,KAAK,KAAK,gBAAgB,EAAE,KAAK,SAAS,CAAC;EADH;CAErD;CAEA,WAAW,GAAkB;EAC3B,KAAK,QAAQ,KAAK,MAAM,QAAQ,MAAM7H,EAAE,OAAO4C,CAAE;EACjD,IAAImF,IAAgB;EASpB,IARA,KAAK,SAAS,KAAK,OAAO,KAAK,MACzBlB,EAAE,WAAWjE,KACf,IAAgB,IACT;GAAE,GAAGiE;GAAG,QAAQ,KAAA;EAAU,KAE5BA,CACR,GAEG,KAAK,kBAAkBjE,GAAI;GAC7B,KAAK,gBAAgB;GACrB,KAAK,IAAMiF,KAAK,KAAK,qBAAqB,EAAE,IAAI;EAClD;EAEA,KAAK,IAAMA,KAAK,KAAK,gBAAgB,EAAE,KAAK,SAAS,CAAC;EACtD,IAAIE,GACF,KAAK,IAAMF,KAAK,KAAK,iBACnB,EAAE;GACA,QAAQ,KAAK,UAAU;GACvB,QAAQ;EACV,CAAC;CAGP;CAEA,QAAQ,GAAmC;EACzC,IAAKjF,GACL,OAAO,KAAK,MAAM,MAAM,MAAM5C,EAAE,OAAO4C,CAAE;CAC3C;CAEA,cAAc,GAAmD;EAE/D,OADA,KAAK,eAAe,IAAI5T,CAAQ,SACnB,KAAK,eAAe,OAAOA,CAAQ;CAClD;CAEA,iBAAgC;EAC9B,OAAO,KAAK;CACd;CAEA,eAAe,GAA6B;EAC1C,KAAK,gBAAgBgZ;EACrB,KAAK,IAAMH,KAAK,KAAK,qBAAqB,EAAEG,CAAM;CACpD;CAEA,oBAAoB,GAAuD;EAEzE,OADA,KAAK,oBAAoB,IAAIhZ,CAAQ,SACxB,KAAK,oBAAoB,OAAOA,CAAQ;CACvD;CAKA,iBAAoC;EAClC,OAAO,KAAK,cAAc,EAAE,GAAG,KAAK,YAAY,IAAI;CACtD;CAMA,eAAe,GAA+B;EAE5C,AADA,KAAK,cAAciZ,IAAO,EAAE,GAAGA,EAAK,IAAI,MACpCA,GAAM,QACR,KAAK,eAAeA,EAAK,IAAI;EAE/B,KAAK,IAAMjZ,KAAY,KAAK,eAC1B,IAAI;GACF,EAAS,KAAK,eAAe,CAAC;EAChC,SAASyX,GAAK;GACZ,QAAQ,MAAM,8CAA8CA,CAAG;EACjE;CAEJ;CAGA,oBAAoB,GAAyD;EAE3E,OADA,KAAK,cAAc,IAAIzX,CAAQ,SAClB,KAAK,cAAc,OAAOA,CAAQ;CACjD;CAOA,yBAAiC;EAK/B,OAJI,KAAK,aAAa,OACb,KAAK,YAAY,OAEb,KAAK,QAAQ,KAAK,iBAAiB,KAAA,CACzC,CAAA,EAAM,QAAQ;CACvB;CAKA,aAAiC;EAC/B,OAAO,EAAE,GAAG,KAAK,QAAQ;CAC3B;CAKA,WAAW,GAAyC;EAClD,KAAK,UAAU;GAAE,GAAG,KAAK;GAAS,GAAGkZ;EAAK;EAC1C,KAAK,IAAMlZ,KAAY,KAAK,kBAC1B,IAAI;GACF,EAAS,KAAK,WAAW,CAAC;EAC5B,SAASyX,GAAK;GACZ,QAAQ,MAAM,0CAA0CA,CAAG;EAC7D;CAEJ;CAGA,gBAAgB,GAA6D;EAE3E,OADA,KAAK,iBAAiB,IAAIzX,CAAQ,SACrB,KAAK,iBAAiB,OAAOA,CAAQ;CACpD;CAIA,mBAAkC;EAChC,OAAO,KAAK;CACd;CAEA,iBAAiB,GAA8B;EAC7C,KAAK,gBAAgBmZ;EACrB,KAAK,IAAMN,KAAK,KAAK,sBAAsB,EAAEM,CAAO;CACtD;CAEA,oBAAoB,GAAwD;EAE1E,OADA,KAAK,qBAAqB,IAAInZ,CAAQ,SACzB,KAAK,qBAAqB,OAAOA,CAAQ;CACxD;CAMA,cAAc,GAAqC;EACjD,IAAMoZ,IAAaJ,MAAW,KAAA,IAAqB,KAAK,gBAAdA,GACtCK,IAAO,CAAC,GAAG,KAAK,MAAM;EAM1B,OAJID,MACF,IAAOC,EAAK,QAAQ,MAAMxB,EAAE,WAAWuB,CAAU,IAG5CC,EAAK,MAAM,GAAG,MACf9I,EAAE,cAAc,KAAA,KAAaC,EAAE,cAAc,KAAA,IACxCD,EAAE,YAAYC,EAAE,YAErBD,EAAE,cAAc,KAAA,IAChBC,EAAE,cAAc,KAAA,IAChBD,EAAE,cAAcC,EAAE,YAClB,KAAK,IAAID,EAAE,IAAIC,EAAE,CAAC,IAAI,KAAWD,EAAE,IAAIC,EAAE,IACtCD,EAAE,IAAIC,EAAE,IAFyBD,EAAE,YAAYC,EAAE,YADlB,IADA,EAKvC;CACH;CAEA,aAAa,GAAgC,GAA0C;EACrF,IAAM8I,IAAO,KAAK,cAAcN,CAAM;EACtC,IAAIM,EAAK,WAAW,GAAG,OAAO;EAC9B,IAAMC,IAAQC,KAAkB,KAAK;EACrC,IAAI,CAACD,GAAO,OAAOD,EAAK;EACxB,IAAMpB,IAAMoB,EAAK,WAAW,MAAMzB,EAAE,OAAO0B,CAAK;EAGhD,OAFIrB,MAAQ,KAAWoB,EAAK,KACxBpB,IAAM,IAAIoB,EAAK,SAAeA,EAAKpB,IAAM,KACtCoB,EAAK;CACd;CAEA,iBAAiB,GAAgC,GAA0C;EACzF,IAAMA,IAAO,KAAK,cAAcN,CAAM;EACtC,IAAIM,EAAK,WAAW,GAAG,OAAO;EAC9B,IAAMC,IAAQC,KAAkB,KAAK;EACrC,IAAI,CAACD,GAAO,OAAOD,EAAKA,EAAK,SAAS;EACtC,IAAMpB,IAAMoB,EAAK,WAAW,MAAMzB,EAAE,OAAO0B,CAAK;EAGhD,OAFIrB,MAAQ,KAAWoB,EAAKA,EAAK,SAAS,KACtCpB,IAAM,KAAK,IAAUoB,EAAKpB,IAAM,KAC7BoB,EAAKA,EAAK,SAAS;CAC5B;CAEA,cAAc,GAA0C;EACtD,IAAM1B,IAAO,KAAK,aAAa,KAAK,eAAeoB,CAAM;EAIzD,OAHIpB,KACF,KAAK,iBAAiBA,EAAK,EAAE,GAExBA;CACT;CAEA,kBAAkB,GAA0C;EAC1D,IAAMD,IAAO,KAAK,iBAAiB,KAAK,eAAeqB,CAAM;EAI7D,OAHIrB,KACF,KAAK,iBAAiBA,EAAK,EAAE,GAExBA;CACT;CAIA,SAAS,GAA8C;EACrD,IAAMyB,IAAaJ,MAAW,KAAA,IAAqB,KAAK,gBAAdA,GACpCS,IAAiC,CAAC;EAExC,KAAK,IAAMzB,KAAS,KAAK,QAAQ;GAE/B,IADI,CAACA,EAAM,YACPoB,KAAcpB,EAAM,UAAUA,EAAM,WAAWoB,GAAY;GAE/D,IAAMM,IAAM,KAAK,OAAO1B,EAAM,OACxB2B,IAAc3B,EAAM,SAASA,EAAM;GAEzC,AAAI0B,KAA6B,QAAQA,MAAQ,KAC/C,EAAO1B,EAAM,QAAQ,GAAG2B,EAAY,gBAC3B3B,EAAM,SAAS,eAAe,MAAM,QAAQ0B,CAAG,KAAKA,EAAI,WAAW,IAC5E,EAAO1B,EAAM,QAAQ,GAAG2B,EAAY,qCAC1B3B,EAAM,SAAS,eAAeA,EAAM,SAAS,wBAAwB,OAAO0B,KAAQ,aACvEA,EAAI,WAAWA,EAAI,cAAcA,EAAI,aAE1D,EAAO1B,EAAM,QAAQ,GAAG2B,EAAY;EAG1C;EAEA,OAAO;GACL,OAAO,OAAO,KAAKF,CAAM,CAAC,CAAC,WAAW;GACtC;EACF;CACF;CAIA,mBAA2B;EACzB,OAAO,KAAK,UACV;GACE,SAAS;GACT,QAAQ,KAAK;GACb,OAAO,KAAK;EACd,GACA,MACA,CACF;CACF;CAEA,iBAAiB,GAAuB;EACtC,IAAI;GACF,IAAMnN,IAAS,KAAK,MAAMsN,CAAI;GAC9B,IAAI,MAAM,QAAQtN,CAAM,GAEtB,OADA,KAAK,UAAUA,CAAM,GACd;GAET,IAAI,OAAOA,KAAW,YAAYA,KAAmB,MAAM,QAAQA,EAAO,MAAM,GAAG;IACjF,KAAK,UAAUA,EAAO,MAAM;IAC5B,IAAMuN,IAAY,MAAM,QAAQvN,EAAO,KAAK,IAAIA,EAAO,QAAQ;IAI/D,OAHIuN,KAAaA,EAAU,SAAS,KAClC,KAAK,SAASA,CAAS,GAElB;GACT;GACA,OAAO;EACT,QAAQ;GACN,OAAO;EACT;CACF;CAEA,iBAAyB;EACvB,OAAO,KAAK,UAAU,KAAK,QAAQ,MAAM,CAAC;CAC5C;CAEA,eAAe,GAAuB;EACpC,IAAI;GACF,IAAMvN,IAAS,KAAK,MAAMsN,CAAI;GAK9B,OAJI,OAAOtN,KAAW,YAAYA,KAAmB,CAAC,MAAM,QAAQA,CAAM,KACxE,KAAK,UAAUA,CAAM,GACd,MAEF;EACT,QAAQ;GACN,OAAO;EACT;CACF;AACF,GC/kBMwN,KAAgB;CACpB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,GAEMC,KAAmB;CACvB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,GAEaC,MAA6D,EACxE,UACA,WAAQ/C,IACR,cACA,WACA,iBACI;CACJ,IAAM,CAAC1P,GAAWD,KAAgB7D,EAA8B,SAAS,GACnE,CAACwW,GAAYC,KAAiBzW,EAAqBmV,CAAK,GACxD,CAACuB,GAAcC,KAAmB3W,EAAS,EAAK,GAChD,CAAC4W,GAAaC,KAAkB7W,EAAS,EAAE,GAC3C,CAAC8W,GAAcC,KAAmB/W,EAAS,SAAS;CAE1D,EAAM,gBAAgB;EACpB,EAAcmV,CAAK;CACrB,GAAG,CAACA,CAAK,CAAC;CAGV,IAAM,CAACd,GAAM2C,MAAWhX,EAASuU,EAAM,QAAQ,EAAE,GAC3C,CAACvP,GAAOiS,KAAYjX,EAASuU,EAAM,SAAS,EAAE,GAC9C,CAAC2C,GAAaC,KAAkBnX,EAASuU,EAAM,eAAe,EAAE,GAChE,CAAC6C,GAAUC,MAAerX,EAASuU,EAAM,YAAY,EAAK,GAC1D,CAAC+C,GAAcC,MAAmBvX,EAASuU,EAAM,iBAAiB,KAAA,IAAyC,KAA7B,OAAOA,EAAM,YAAY,CAAM,GAC7G,CAACiD,GAAYC,MAAiBzX,EAAyBuU,EAAM,cAAc,UAAU,GACrF,CAACmD,GAASC,KAAc3X,EAAmBuU,EAAM,UAAU,CAAC,GAAGA,EAAM,OAAO,IAAI,CAAC,YAAY,UAAU,CAAC,GACxG,CAACqD,IAAeC,KAAoB7X,EAAS,EAAE,GAG/C,CAACuV,GAAQuC,MAAa9X,EAASuU,EAAM,UAAU,EAAE,GACjD,CAACwD,IAAWC,MAAgBhY,EAAiBuU,EAAM,cAAc,KAAA,IAAsC,KAA1B,OAAOA,EAAM,SAAS,CAAM,GAGzG0D,IAAmB1D,EAAM,SAAS,eAAeA,EAAM,SAAS,qBAChE,CAAC2D,GAAeC,MAAoBnY,EACxCuU,EAAM,kBAAkBA,EAAM,SAAS,sBAAsB,YAAY,aAC3E,GACM,CAAC6D,GAAaC,MAAkBrY,EACpCuU,EAAM,gBAAgBA,EAAM,SAAS,sBAAsB,iBAAiB,YAC9E,GAGM,CAAC+D,GAAWC,MAAgBvY,EAASuU,EAAM,aAAa,SAAS,GACjE,CAACiE,IAAiBC,MAAsBzY,EAASuU,EAAM,mBAAmB,SAAS,GACnF,CAACmE,IAAaC,MAAkB3Y,EAASuU,EAAM,eAAe,SAAS,GACvE,CAACqE,IAAaC,KAAkB7Y,EAAiBuU,EAAM,eAAe,CAAC,GACvE,CAACuE,IAAcC,MAAmB/Y,EAAiBuU,EAAM,gBAAgB,CAAC,GAC1E,CAACyE,IAAYC,MAAiBjZ,EAASuU,EAAM,cAAc,SAAS,GACpE,CAAC2E,GAAUC,MAAenZ,EAAiBuU,EAAM,YAAY,EAAE,GAC/D,CAAC6E,GAAYC,KAAiBrZ,EAA4BuU,EAAM,cAAc,QAAQ,GACtF,CAAC+E,IAAWC,KAAgBvZ,EAA8BuU,EAAM,aAAa,QAAQ,GACrF,CAACiF,IAAWC,MAAgBzZ,EAAsCuU,EAAM,aAAa,MAAM,GAE3FmF,KAAa;EAAC;EAAa;EAAY;CAAO,CAAC,CAAC,SAASnF,EAAM,IAAI,GAEnEoF,WAAwB;EAC5B,IAAMxT,IAAUyR,GAAc,KAAK;EACnC,AAAKzR,MACLwR,EAAW,CAAC,GAAGD,GAASvR,CAAO,CAAC,GAChC0R,EAAiB,EAAE;CACrB,GAEM+B,KAAsB,MAAkB;EAC5C,EAAWlC,EAAQ,QAAQ,GAAG,MAAQjD,MAAQ1J,CAAK,CAAC;CACtD,GAEM8O,MAAoB,GAAe,MAA6B;EACpE,IAAMC,IAAYC,MAAc,OAAOhP,IAAQ,IAAIA,IAAQ;EAC3D,IAAI+O,IAAY,KAAKA,KAAapC,EAAQ,QAAQ;EAClD,IAAMsC,IAAO,CAAC,GAAGtC,CAAO,GAClB/N,IAAOqQ,EAAKjP;EAGlB,AAFA,EAAKA,KAASiP,EAAKF,IACnB,EAAKA,KAAanQ,GAClBgO,EAAWqC,CAAI;CACjB,GAEMC,WAA2B;EAC/B,IAAM9T,IAAUyQ,EAAY,KAAK;EACjC,IAAI,CAACzQ,GAAS;EACd,IAAMgK,IAAK,QAAQ,KAAK,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,KAChE+J,IAAoB;GACxB;GACA,MAAM/T;GACN,OAAO2Q;EACT;EAMA,AALAqD,IAAYD,CAAO,GACnBzD,GAAe,MAAS,CAAC,GAAGvC,GAAMgG,CAAO,CAAC,GAC1CpC,GAAU3H,CAAE,GACZwI,GAAe7B,CAAY,GAC3BD,EAAe,EAAE,GACjBF,EAAgB,EAAK;CACvB;CAiCA,OACE,kBAAC,OAAD;EACE,OAAO;GACL,UAAU;GACV,KAAK;GACL,MAAM;GACN,OAAO;GACP,QAAQ;GACR,iBAAiB;GACjB,SAAS;GACT,YAAY;GACZ,gBAAgB;GAChB,QAAQ;GACR,eAAe;EACjB;EACA,SAASvO;EAET,UAAA,kBAAC,OAAD;GACE,OAAO;IACL,iBAAiB;IACjB,cAAc;IACd,OAAO;IACP,UAAU;IACV,WAAW;IACX,SAAS;IACT,eAAe;IACf,WAAW;IACX,UAAU;IACV,YAAY;GACd;GACA,UAAU,MAAM,EAAE,gBAAgB;GAbpC,UAAA;IAgBE,kBAAC,OAAD;KACE,OAAO;MACL,SAAS;MACT,cAAc;MACd,SAAS;MACT,YAAY;MACZ,gBAAgB;MAChB,iBAAiB;KACnB;KARF,UAAA,CAUE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;MAAI,OAAO;OAAE,QAAQ;OAAG,UAAU;OAAQ,YAAY;OAAK,OAAO;MAAU;MAAG,UAAA;KAE3E,CAAA,GACJ,kBAAC,QAAD;MAAM,OAAO;OAAE,UAAU;OAAQ,OAAO;OAAW,eAAe;MAAa;MAA/E,UAAA,CAAkF,UACzEmM,EAAM,SAAS,cAAc,eAAeA,EAAM,SAAS,aAAa,gBAAgBA,EAAM,IACjG;KACH,CAAA,CAAA,EAAA,CAAA,GACL,kBAAC,UAAD;MACE,SAASnM;MACT,OAAO;OACL,YAAY;OACZ,QAAQ;OACR,QAAQ;OACR,OAAO;OACP,SAAS;OACT,cAAc;MAChB;MAEA,UAAA,kBAACC,IAAD,EAAG,MAAM,GAAK,CAAA;KACR,CAAA,CACL;;IAGL,kBAAC,OAAD;KACE,OAAO;MACL,SAAS;MACT,cAAc;MACd,iBAAiB;MACjB,SAAS;MACT,KAAK;KACP;KAPF,UAAA,CASE,kBAAC,UAAD;MACE,MAAK;MACL,eAAexE,EAAa,SAAS;MACrC,OAAO;OACL,SAAS;OACT,YAAY;OACZ,KAAK;OACL,SAAS;OACT,UAAU;OACV,YAAY;OACZ,QAAQ;OACR,cAAcC,MAAc,YAAY,sBAAsB;OAC9D,iBAAiB;OACjB,OAAOA,MAAc,YAAY,YAAY;OAC7C,QAAQ;MACV;MAfF,UAAA,CAiBE,kBAACsW,IAAD,EAAS,MAAM,GAAK,CAAA,GAAC,uBACf;KACR,CAAA,GAAA,kBAAC,UAAD;MACE,MAAK;MACL,eAAevW,EAAa,OAAO;MACnC,OAAO;OACL,SAAS;OACT,YAAY;OACZ,KAAK;OACL,SAAS;OACT,UAAU;OACV,YAAY;OACZ,QAAQ;OACR,cAAcC,MAAc,UAAU,sBAAsB;OAC5D,iBAAiB;OACjB,OAAOA,MAAc,UAAU,YAAY;OAC3C,QAAQ;MACV;MAfF,UAAA,CAiBE,kBAACuW,IAAD,EAAS,MAAM,GAAK,CAAA,GAAC,qBACf;KACL,CAAA,CAAA;;IAGL,kBAAC,OAAD;KAAK,OAAO;MAAE,SAAS;MAAa,WAAW;MAAQ,SAAS;MAAQ,eAAe;MAAU,KAAK;MAAQ,MAAM;KAAE;KACnH,UAAAvW,MAAc,YACb,kBAAA9I,IAAA,EAAA,UAAA;MAEE,kBAAC,OAAD,EAAA,UAAA;OACE,kBAAC,SAAD;QAAO,OAAO;SAAE,SAAS;SAAS,UAAU;SAAQ,YAAY;SAAK,OAAO;SAAW,cAAc;QAAM;QAA3G,UAAA,CAA8G,mBAC7F,kBAAC,QAAD;SAAM,OAAO,EAAE,OAAO,UAAU;SAAG,UAAA;QAAO,CAAA,CACpD;;OACP,kBAAC,SAAD;QACE,MAAK;QACL,OAAOqZ;QACP,WAAW,MAAM2C,GAAQ,EAAE,OAAO,KAAK;QACvC,aAAY;QACZ,OAAO;SACL,OAAO;SACP,SAAS;SACT,cAAc;SACd,QAAQ;SACR,UAAU;SACV,WAAW;QACb;OACD,CAAA;OACD,kBAAC,QAAD;QAAM,OAAO;SAAE,UAAU;SAAQ,OAAO;QAAU;QAAG,UAAA;OAA4D,CAAA;MAC9G,EAAA,CAAA;MAGL,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;OAAO,OAAO;QAAE,SAAS;QAAS,UAAU;QAAQ,YAAY;QAAK,OAAO;QAAW,cAAc;OAAM;OAAG,UAAA;MAEvG,CAAA,GACP,kBAAC,SAAD;OACE,MAAK;OACL,OAAOhS;OACP,WAAW,MAAMiS,EAAS,EAAE,OAAO,KAAK;OACxC,aAAY;OACZ,OAAO;QACL,OAAO;QACP,SAAS;QACT,cAAc;QACd,QAAQ;QACR,UAAU;QACV,WAAW;OACb;MACD,CAAA,CACE,EAAA,CAAA;MAGJgB,KACC,kBAAC,OAAD;OACE,OAAO;QACL,iBAAiB;QACjB,QAAQ;QACR,cAAc;QACd,SAAS;QACT,SAAS;QACT,eAAe;QACf,KAAK;OACP;OATF,UAAA;QAWE,kBAAC,OAAD;SAAK,OAAO;UAAE,SAAS;UAAQ,YAAY;UAAU,KAAK;SAAM;SAAhE,UAAA,CACE,kBAACqC,IAAD;UAAS,MAAM;UAAI,OAAM;SAAW,CAAA,GACpC,kBAAC,QAAD;UAAM,OAAO;WAAE,UAAU;WAAQ,YAAY;WAAK,OAAO;UAAU;UAAG,UAAA;SAEhE,CAAA,CACH;;QAGL,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;SAAO,OAAO;UAAE,SAAS;UAAS,UAAU;UAAQ,YAAY;UAAK,OAAO;UAAW,cAAc;SAAM;SAAG,UAAA;QAEvG,CAAA,GACP,kBAAC,OAAD;SAAK,OAAO;UAAE,SAAS;UAAQ,KAAK;SAAM;SAA1C,UAAA,CACE,kBAAC,UAAD;UACE,MAAK;UACL,eAAe;WAEb,AADAnC,GAAiB,YAAY,GACzBC,MAAgB,kBAAgBC,GAAe,WAAW;UAChE;UACA,OAAO;WACL,MAAM;WACN,SAAS;WACT,cAAc;WACd,QAAQ;WACR,aAAaH,MAAkB,eAAe,YAAY;WAC1D,iBAAiBA,MAAkB,eAAe,YAAY;WAC9D,OAAOA,MAAkB,eAAe,YAAY;WACpD,YAAYA,MAAkB,eAAe,MAAM;WACnD,UAAU;WACV,QAAQ;WACR,SAAS;WACT,YAAY;WACZ,gBAAgB;WAChB,KAAK;UACP;UArBF,UAAA,CAuBE,kBAACoC,IAAD,EAAS,MAAM,GAAK,CAAA,GAAC,uBACf;SACR,CAAA,GAAA,kBAAC,UAAD;UACE,MAAK;UACL,eAAe;WAEb,AADAnC,GAAiB,SAAS,GACtBC,MAAgB,eAAaC,GAAe,cAAc;UAChE;UACA,OAAO;WACL,MAAM;WACN,SAAS;WACT,cAAc;WACd,QAAQ;WACR,aAAaH,MAAkB,YAAY,YAAY;WACvD,iBAAiBA,MAAkB,YAAY,YAAY;WAC3D,OAAOA,MAAkB,YAAY,YAAY;WACjD,YAAYA,MAAkB,YAAY,MAAM;WAChD,UAAU;WACV,QAAQ;WACR,SAAS;WACT,YAAY;WACZ,gBAAgB;WAChB,KAAK;UACP;UArBF,UAAA,CAuBE,kBAACjU,IAAD,EAAa,MAAM,GAAK,CAAA,GAAC,sBACnB;SACL,CAAA,CAAA;QACF,CAAA,CAAA,EAAA,CAAA;QAGL,kBAAC,OAAD,EAAA,UAAA;SACE,kBAAC,SAAD;UAAO,OAAO;WAAE,SAAS;WAAS,UAAU;WAAQ,YAAY;WAAK,OAAO;WAAW,cAAc;UAAM;UAAG,UAAA;SAEvG,CAAA;SACP,kBAAC,SAAD;UACE,MAAK;UACL,OAAOmU;UACP,WAAW,MAAMC,GAAe,EAAE,OAAO,KAAK;UAC9C,aAAY;UACZ,OAAO;WACL,OAAO;WACP,SAAS;WACT,cAAc;WACd,QAAQ;WACR,UAAU;WACV,WAAW;WACX,iBAAiB;UACnB;SACD,CAAA;SACD,kBAAC,QAAD;UAAM,OAAO;WAAE,UAAU;WAAQ,OAAO;WAAW,WAAW;WAAO,SAAS;UAAQ;UAAG,UAAA;SAEnF,CAAA;QACH,EAAA,CAAA;OACF;;MAIP,kBAAC,OAAD,EAAA,UAAA;OACE,kBAAC,OAAD;QAAK,OAAO;SAAE,SAAS;SAAQ,YAAY;SAAU,gBAAgB;SAAiB,cAAc;QAAM;QAA1G,UAAA,CACE,kBAAC,SAAD;SAAO,OAAO;UAAE,SAAS;UAAQ,YAAY;UAAU,KAAK;UAAO,UAAU;UAAQ,YAAY;UAAK,OAAO;UAAW,QAAQ;SAAE;SAAlI,UAAA,CACE,kBAACkC,IAAD;UAAM,MAAM;UAAI,OAAM;SAAW,CAAA,GAAC,iBAC7B;QACP,CAAA,GAAA,kBAAC,UAAD;SACE,MAAK;SACL,eAAe5D,EAAgB,CAACD,CAAY;SAC5C,OAAO;UACL,YAAY;UACZ,QAAQ;UACR,OAAO;UACP,UAAU;UACV,QAAQ;UACR,YAAY;UACZ,SAAS;SACX;SAEC,UAAAA,IAAe,WAAW;QACrB,CAAA,CACL;;OAEJA,KACC,kBAAC,OAAD;QACE,OAAO;SACL,iBAAiB;SACjB,QAAQ;SACR,cAAc;SACd,SAAS;SACT,cAAc;SACd,SAAS;SACT,YAAY;SACZ,KAAK;QACP;QAVF,UAAA;SAYE,kBAAC,SAAD;UACE,MAAK;UACL,OAAOI;UACP,WAAW,MAAMC,EAAgB,EAAE,OAAO,KAAK;UAC/C,OAAO;WACL,OAAO;WACP,QAAQ;WACR,SAAS;WACT,QAAQ;WACR,cAAc;WACd,QAAQ;UACV;UACA,OAAM;SACP,CAAA;SACD,kBAAC,SAAD;UACE,MAAK;UACL,OAAOH;UACP,WAAW,MAAMC,EAAe,EAAE,OAAO,KAAK;UAC9C,aAAY;UACZ,OAAO;WACL,MAAM;WACN,SAAS;WACT,cAAc;WACd,QAAQ;WACR,UAAU;UACZ;UACA,YAAY,MAAM;WAChB,AAAI,EAAE,QAAQ,YACZ,EAAE,eAAe,GACjBoD,GAAmB;UAEvB;SACD,CAAA;SACD,kBAAC,UAAD;UACE,MAAK;UACL,SAASA;UACT,OAAO;WACL,SAAS;WACT,iBAAiB;WACjB,OAAO;WACP,QAAQ;WACR,cAAc;WACd,UAAU;WACV,YAAY;WACZ,QAAQ;WACR,YAAY;UACd;UACD,UAAA;SAEO,CAAA;QACL;;OAGP,kBAAC,UAAD;QACE,OAAO1E;QACP,WAAW,MAAM;SACf,IAAMU,IAAM,EAAE,OAAO;SACrB,GAAUA,CAAG;SACb,IAAMlR,IAAWyR,EAAW,MAAM,MAAMjJ,EAAE,OAAO0I,CAAG;SACpD,AACE0C,GADE5T,IACaA,EAAS,QAET,SAAS;QAE5B;QACA,OAAO;SACL,OAAO;SACP,SAAS;SACT,cAAc;SACd,QAAQ;SACR,UAAU;SACV,WAAW;SACX,iBAAiB;QACnB;QApBF,UAAA,CAsBE,kBAAC,UAAD;SAAQ,OAAM;SAAG,UAAA;QAAiC,CAAA,GACjDyR,EAAW,KAAK,MACf,kBAAC,UAAD;SAAmB,OAAOjJ,EAAE;SAA5B,UAAA;UACGA,EAAE;UAAK;UAAGA,EAAE;UAAM;SACb;QAFK,GAAAA,EAAE,EAEP,CACT,CACK;;OACR,kBAAC,QAAD;QAAM,OAAO;SAAE,UAAU;SAAQ,OAAO;SAAW,WAAW;SAAO,SAAS;QAAQ;QAAG,UAAA;OAEnF,CAAA;MACH,EAAA,CAAA;MAGL,kBAAC,OAAD,EAAA,UAAA;OACE,kBAAC,SAAD;QAAO,OAAO;SAAE,SAAS;SAAS,UAAU;SAAQ,YAAY;SAAK,OAAO;SAAW,cAAc;QAAM;QAAG,UAAA;OAEvG,CAAA;OACP,kBAAC,SAAD;QACE,MAAK;QACL,KAAI;QACJ,MAAK;QACL,OAAOwK;QACP,WAAW,MAAMC,GAAa,EAAE,OAAO,KAAK;QAC5C,aAAY;QACZ,OAAO;SACL,OAAO;SACP,SAAS;SACT,cAAc;SACd,QAAQ;SACR,UAAU;SACV,WAAW;QACb;OACD,CAAA;OACD,kBAAC,QAAD;QAAM,OAAO;SAAE,UAAU;SAAQ,OAAO;QAAU;QAAG,UAAA;OAE/C,CAAA;MACH,EAAA,CAAA;MAGJ;OAAC;OAAQ;OAAW;OAAY;MAAU,CAAC,CAAC,SAASzD,EAAM,IAAI,KAC9D,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;OAAO,OAAO;QAAE,SAAS;QAAS,UAAU;QAAQ,YAAY;QAAK,OAAO;QAAW,cAAc;OAAM;OAAG,UAAA;MAEvG,CAAA,GACP,kBAAC,SAAD;OACE,MAAK;OACL,OAAO2C;OACP,WAAW,MAAMC,EAAe,EAAE,OAAO,KAAK;OAC9C,aAAY;OACZ,OAAO;QACL,OAAO;QACP,SAAS;QACT,cAAc;QACd,QAAQ;QACR,UAAU;QACV,WAAW;OACb;MACD,CAAA,CACE,EAAA,CAAA;MAIN5C,EAAM,SAAS,cACd,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;OAAO,OAAO;QAAE,SAAS;QAAS,UAAU;QAAQ,YAAY;QAAK,OAAO;QAAW,cAAc;OAAM;OAAG,UAAA;MAEvG,CAAA,GACP,kBAAC,UAAD;OACE,OAAOiD;OACP,WAAW,MAAMC,GAAc,EAAE,OAAO,KAAuB;OAC/D,OAAO;QACL,OAAO;QACP,SAAS;QACT,cAAc;QACd,QAAQ;QACR,UAAU;QACV,WAAW;QACX,iBAAiB;OACnB;OAXF,UAAA;QAaE,kBAAC,UAAD;SAAQ,OAAM;SAAW,UAAA;QAAsC,CAAA;QAC/D,kBAAC,UAAD;SAAQ,OAAM;SAAO,UAAA;QAA8B,CAAA;QACnD,kBAAC,UAAD;SAAQ,OAAM;SAAO,UAAA;QAAyB,CAAA;OACxC;MACL,CAAA,CAAA,EAAA,CAAA;MAINiC,MACC,kBAAC,OAAD,EAAA,UAAA;OACE,kBAAC,SAAD;QAAO,OAAO;SAAE,SAAS;SAAS,UAAU;SAAQ,YAAY;SAAK,OAAO;SAAW,cAAc;QAAM;QACxG,UAAAnF,EAAM,SAAS,cAAc,oBAAoB;OAC7C,CAAA;OACP,kBAAC,OAAD;QAAK,OAAO;SAAE,SAAS;SAAQ,KAAK;SAAO,cAAc;QAAM;QAA/D,UAAA,CACE,kBAAC,SAAD;SACE,MAAK;SACL,OAAOqD;SACP,WAAW,MAAMC,EAAiB,EAAE,OAAO,KAAK;SAChD,YAAY,MAAM;UAChB,AAAI,EAAE,QAAQ,YACZ,EAAE,eAAe,GACjB8B,GAAgB;SAEpB;SACA,aAAY;SACZ,OAAO;UACL,MAAM;UACN,SAAS;UACT,cAAc;UACd,QAAQ;UACR,UAAU;SACZ;QACD,CAAA,GACD,kBAAC,UAAD;SACE,MAAK;SACL,SAASA;SACT,OAAO;UACL,SAAS;UACT,YAAY;UACZ,KAAK;UACL,SAAS;UACT,iBAAiB;UACjB,QAAQ;UACR,cAAc;UACd,UAAU;UACV,YAAY;UACZ,QAAQ;SACV;SAdF,UAAA,CAgBE,kBAACnH,IAAD,EAAM,MAAM,GAAK,CAAA,GAAC,MACZ;QACL,CAAA,CAAA;;OAEL,kBAAC,OAAD;QACE,OAAO;SACL,WAAW;SACX,WAAW;SACX,QAAQ;SACR,cAAc;SACd,SAAS;SACT,SAAS;SACT,eAAe;SACf,KAAK;SACL,iBAAiB;QACnB;QAEC,UAAAkF,EAAQ,WAAW,IAClB,kBAAC,QAAD;SAAM,OAAO;UAAE,UAAU;UAAQ,OAAO;UAAW,SAAS;UAAO,WAAW;SAAS;SAAG,UAAA;QAEpF,CAAA,IAENA,EAAQ,KAAK,GAAK,MAChB,kBAAC,OAAD;SAEE,OAAO;UACL,SAAS;UACT,YAAY;UACZ,gBAAgB;UAChB,SAAS;UACT,iBAAiB;UACjB,cAAc;UACd,QAAQ;UACR,UAAU;SACZ;SAXF,UAAA,CAaE,kBAAC,QAAD;UAAM,OAAO;WAAE,UAAU;WAAU,cAAc;WAAY,YAAY;UAAS;UAAI,UAAA8C;SAAU,CAAA,GAChG,kBAAC,OAAD;UAAK,OAAO;WAAE,SAAS;WAAQ,YAAY;WAAU,KAAK;UAAM;UAAhE,UAAA;WACE,kBAAC,UAAD;YACE,MAAK;YACL,eAAeX,GAAiBpF,GAAK,IAAI;YACzC,UAAUA,MAAQ;YAClB,OAAO;aACL,YAAY;aACZ,QAAQ;aACR,QAAQA,MAAQ,IAAI,YAAY;aAChC,SAAS;aACT,OAAOA,MAAQ,IAAI,YAAY;YACjC;YAEA,UAAA,kBAACgG,GAAD,EAAS,MAAM,GAAK,CAAA;WACd,CAAA;WACR,kBAAC,UAAD;YACE,MAAK;YACL,eAAeZ,GAAiBpF,GAAK,MAAM;YAC3C,UAAUA,MAAQiD,EAAQ,SAAS;YACnC,OAAO;aACL,YAAY;aACZ,QAAQ;aACR,QAAQjD,MAAQiD,EAAQ,SAAS,IAAI,YAAY;aACjD,SAAS;aACT,OAAOjD,MAAQiD,EAAQ,SAAS,IAAI,YAAY;YAClD;YAEA,UAAA,kBAACgD,GAAD,EAAW,MAAM,GAAK,CAAA;WAChB,CAAA;WACR,kBAAC,UAAD;YACE,MAAK;YACL,eAAed,EAAmBnF,CAAG;YACrC,OAAO;aACL,YAAY;aACZ,QAAQ;aACR,QAAQ;aACR,SAAS;aACT,OAAO;YACT;YAEA,UAAA,kBAAC1O,IAAD,EAAQ,MAAM,GAAK,CAAA;WACb,CAAA;UACL;SACF,CAAA,CAAA;QAxDE,GAAA0O,CAwDF,CACN;OAEA,CAAA;MACF,EAAA,CAAA;MAIP,kBAAC,OAAD;OAAK,OAAO;QAAE,SAAS;QAAQ,YAAY;QAAU,KAAK;OAAM;OAAhE,UAAA,CACE,kBAAC,SAAD;QACE,MAAK;QACL,IAAG;QACH,SAAS2C;QACT,WAAW,MAAMC,GAAY,EAAE,OAAO,OAAO;QAC7C,OAAO;SAAE,OAAO;SAAQ,QAAQ;SAAQ,QAAQ;QAAU;OAC3D,CAAA,GACD,kBAAC,SAAD;QAAO,SAAQ;QAAiB,OAAO;SAAE,UAAU;SAAQ,YAAY;SAAK,OAAO;SAAW,QAAQ;QAAU;QAAG,UAAA;OAE5G,CAAA,CACJ;;KACL,EAAA,CAAA,IAEF,kBAAArc,IAAA,EAAA,UAAA;MAEE,kBAAC,OAAD,EAAA,UAAA;OACE,kBAAC,SAAD;QAAO,OAAO;SAAE,SAAS;SAAQ,YAAY;SAAU,KAAK;SAAO,UAAU;SAAQ,YAAY;SAAK,OAAO;SAAW,cAAc;QAAM;QAA5I,UAAA,CACE,kBAACwV,IAAD;SAAM,MAAM;SAAI,OAAM;QAAW,CAAA,GAAC,oBAC7B;;OACP,kBAAC,OAAD;QAAK,OAAO;SAAE,SAAS;SAAQ,qBAAqB;SAAW,KAAK;QAAO;QAA3E,UAAA,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,QAAD;SAAM,OAAO;UAAE,UAAU;UAAQ,OAAO;SAAU;SAAG,UAAA;QAAiB,CAAA,GACtE,kBAAC,UAAD;SACE,OAAOwI;SACP,WAAW,MAAMC,GAAc,EAAE,OAAO,KAAK;SAC7C,OAAO;UACL,OAAO;UACP,SAAS;UACT,cAAc;UACd,QAAQ;UACR,UAAU;UACV,iBAAiB;UACjB,WAAW;SACb;SAXF,UAAA;UAaE,kBAAC,UAAD;WAAQ,OAAM;WAAU,UAAA;UAA4B,CAAA;UACpD,kBAAC,UAAD;WAAQ,OAAM;WAAoB,UAAA;UAAa,CAAA;UAC/C,kBAAC,UAAD;WAAQ,OAAM;WAA2B,UAAA;UAA+B,CAAA;UACxE,kBAAC,UAAD;WAAQ,OAAM;WAA2B,UAAA;UAA2B,CAAA;UACpE,kBAAC,UAAD;WAAQ,OAAM;WAA4B,UAAA;UAAgC,CAAA;SACpE;QACL,CAAA,CAAA,EAAA,CAAA,GACL,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,QAAD;SAAM,OAAO;UAAE,UAAU;UAAQ,OAAO;SAAU;SAAG,UAAA;QAAe,CAAA,GACpE,kBAAC,UAAD;SACE,OAAOC;SACP,WAAW,MAAMC,GAAY,SAAS,EAAE,OAAO,OAAO,EAAE,CAAC;SACzD,OAAO;UACL,OAAO;UACP,SAAS;UACT,cAAc;UACd,QAAQ;UACR,UAAU;UACV,iBAAiB;UACjB,WAAW;SACb;SAXF,UAAA;UAaE,kBAAC,UAAD;WAAQ,OAAO;WAAI,UAAA;UAAqB,CAAA;UACxC,kBAAC,UAAD;WAAQ,OAAO;WAAI,UAAA;UAAwB,CAAA;UAC3C,kBAAC,UAAD;WAAQ,OAAO;WAAI,UAAA;UAAsB,CAAA;UACzC,kBAAC,UAAD;WAAQ,OAAO;WAAI,UAAA;UAAqB,CAAA;UACxC,kBAAC,UAAD;WAAQ,OAAO;WAAI,UAAA;UAAuB,CAAA;UAC1C,kBAAC,UAAD;WAAQ,OAAO;WAAI,UAAA;UAAuB,CAAA;SACpC;QACL,CAAA,CAAA,EAAA,CAAA,CACF;;OAGL,kBAAC,OAAD;QAAK,OAAO;SAAE,SAAS;SAAQ,YAAY;SAAU,KAAK;SAAO,WAAW;QAAO;QAAnF,UAAA;SACE,kBAAC,UAAD;UACE,MAAK;UACL,eAAeE,EAAcD,MAAe,SAAS,WAAW,MAAM;UACtE,OAAO;WACL,SAAS;WACT,cAAc;WACd,QAAQ;WACR,iBAAiBA,MAAe,SAAS,YAAY;WACrD,OAAOA,MAAe,SAAS,YAAY;WAC3C,QAAQ;WACR,UAAU;WACV,YAAY;WACZ,SAAS;WACT,YAAY;WACZ,KAAK;UACP;UAfF,UAAA,CAiBE,kBAACuB,GAAD,EAAM,MAAM,GAAK,CAAA,GAAC,OACZ;;SACR,kBAAC,UAAD;UACE,MAAK;UACL,eAAepB,EAAaD,OAAc,WAAW,WAAW,QAAQ;UACxE,OAAO;WACL,SAAS;WACT,cAAc;WACd,QAAQ;WACR,iBAAiBA,OAAc,WAAW,YAAY;WACtD,OAAOA,OAAc,WAAW,YAAY;WAC5C,QAAQ;WACR,UAAU;WACV,WAAW;WACX,SAAS;WACT,YAAY;WACZ,KAAK;UACP;UAfF,UAAA,CAiBE,kBAACsB,IAAD,EAAQ,MAAM,GAAK,CAAA,GAAC,SACd;;SAER,kBAAC,OAAD,EAAK,OAAO;UAAE,OAAO;UAAO,QAAQ;UAAQ,iBAAiB;UAAW,QAAQ;SAAQ,EAAI,CAAA;SAE1F;UAAC;UAAQ;UAAU;SAAO,CAAC,CAAW,KAAK,MAC3C,kBAAC,UAAD;UAEE,MAAK;UACL,eAAenB,GAAaoB,CAAK;UACjC,OAAO;WACL,SAAS;WACT,cAAc;WACd,QAAQ;WACR,iBAAiBrB,OAAcqB,IAAQ,YAAY;WACnD,OAAOrB,OAAcqB,IAAQ,YAAY;WACzC,QAAQ;UACV;UACA,OAAO,SAASA;UAZlB,UAAA;WAcGA,MAAU,UAAU,kBAACC,GAAD,EAAW,MAAM,GAAK,CAAA;WAC1CD,MAAU,YAAY,kBAACE,GAAD,EAAa,MAAM,GAAK,CAAA;WAC9CF,MAAU,WAAW,kBAACG,GAAD,EAAY,MAAM,GAAK,CAAA;UACvC;SAhBD,GAAAH,CAgBC,CACT;QACE;;MACF,EAAA,CAAA;MAGL,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;OAAO,OAAO;QAAE,SAAS;QAAS,UAAU;QAAQ,YAAY;QAAK,OAAO;QAAW,cAAc;OAAM;OAAG,UAAA;MAEvG,CAAA,GACP,kBAAC,OAAD;OAAK,OAAO;QAAE,SAAS;QAAQ,YAAY;QAAU,KAAK;OAAM;OAAhE,UAAA,CACE,kBAAC,OAAD;QAAK,OAAO;SAAE,SAAS;SAAQ,KAAK;SAAO,UAAU;QAAO;QACzD,UAAAxE,GAAc,KAAK,MAClB,kBAAC,UAAD;SAEE,MAAK;SACL,eAAekC,GAAa7S,CAAC;SAC7B,OAAO;UACL,OAAO;UACP,QAAQ;UACR,cAAc;UACd,iBAAiBA;UACjB,QAAQ4S,MAAc5S,IAAI,sBAAsB;UAChD,QAAQ;UACR,WAAW4S,MAAc5S,IAAI,sBAAsB;SACrD;QACD,GAZMA,CAYN,CACF;OACE,CAAA,GACL,kBAAC,SAAD;QACE,MAAK;QACL,OAAO4S,EAAU,WAAW,GAAG,IAAIA,IAAY;QAC/C,WAAW,MAAMC,GAAa,EAAE,OAAO,KAAK;QAC5C,OAAO;SAAE,OAAO;SAAQ,QAAQ;SAAQ,SAAS;SAAG,QAAQ;SAAQ,cAAc;SAAO,QAAQ;QAAU;OAC5G,CAAA,CACE;MACF,CAAA,CAAA,EAAA,CAAA;MAGL,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;OAAO,OAAO;QAAE,SAAS;QAAS,UAAU;QAAQ,YAAY;QAAK,OAAO;QAAW,cAAc;OAAM;OAAG,UAAA;MAEvG,CAAA,GACP,kBAAC,OAAD;OAAK,OAAO;QAAE,SAAS;QAAQ,YAAY;QAAU,KAAK;OAAM;OAAhE,UAAA;QACE,kBAAC,OAAD;SAAK,OAAO;UAAE,SAAS;UAAQ,KAAK;UAAO,UAAU;SAAO;SACzD,UAAAjC,GAAiB,KAAK,MACrB,kBAAC,UAAD;UAEE,MAAK;UACL,eAAemC,GAAmB/S,CAAC;UACnC,OAAO;WACL,OAAO;WACP,QAAQ;WACR,cAAc;WACd,iBAAiBA,MAAM,gBAAgB,YAAYA;WACnD,QAAQ8S,OAAoB9S,IAAI,sBAAsB;WACtD,QAAQ;WACR,UAAU;WACV,UAAU;UACZ;UACA,OAAOA;UAEN,UAAAA,MAAM,iBACL,kBAAC,OAAD,EAAK,OAAO;WAAE,UAAU;WAAY,KAAK;WAAO,MAAM;WAAG,OAAO;WAAG,QAAQ;WAAS,iBAAiB;WAAW,WAAW;UAAgB,EAAI,CAAA;SAE3I,GAlBDA,CAkBC,CACT;QACE,CAAA;QACL,kBAAC,SAAD;SACE,MAAK;SACL,OAAO8S,GAAgB,WAAW,GAAG,IAAIA,KAAkB;SAC3D,WAAW,MAAMC,GAAmB,EAAE,OAAO,KAAK;SAClD,OAAO;UAAE,OAAO;UAAQ,QAAQ;UAAQ,SAAS;UAAG,QAAQ;UAAQ,cAAc;UAAO,QAAQ;SAAU;QAC5G,CAAA;QACD,kBAAC,UAAD;SACE,MAAK;SACL,eAAeA,GAAmB,aAAa;SAC/C,OAAO;UACL,SAAS;UACT,UAAU;UACV,iBAAiBD,OAAoB,gBAAgB,YAAY;UACjE,OAAOA,OAAoB,gBAAgB,YAAY;UACvD,QAAQ;UACR,cAAc;UACd,QAAQ;SACV;SACD,UAAA;QAEO,CAAA;OACL;MACF,CAAA,CAAA,EAAA,CAAA;MAGL,kBAAC,OAAD;OAAK,OAAO;QAAE,SAAS;QAAQ,qBAAqB;QAAW,KAAK;OAAO;OAA3E,UAAA,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,QAAD;QAAM,OAAO;SAAE,UAAU;SAAQ,OAAO;QAAU;QAAG,UAAA;OAAkB,CAAA,GACvE,kBAAC,OAAD;QAAK,OAAO;SAAE,SAAS;SAAQ,YAAY;SAAU,KAAK;SAAO,WAAW;QAAM;QAAlF,UAAA,CACE,kBAAC,SAAD;SACE,MAAK;SACL,OAAOE,GAAY,WAAW,GAAG,IAAIA,KAAc;SACnD,WAAW,MAAMC,GAAe,EAAE,OAAO,KAAK;SAC9C,OAAO;UAAE,OAAO;UAAQ,QAAQ;UAAQ,SAAS;UAAG,QAAQ;UAAQ,cAAc;UAAO,QAAQ;SAAU;QAC5G,CAAA,GACD,kBAAC,SAAD;SACE,MAAK;SACL,OAAOD;SACP,WAAW,MAAMC,GAAe,EAAE,OAAO,KAAK;SAC9C,OAAO;UAAE,MAAM;UAAG,SAAS;UAAW,UAAU;UAAQ,QAAQ;UAAqB,cAAc;SAAM;QAC1G,CAAA,CACE;OACF,CAAA,CAAA,EAAA,CAAA,GAEL,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,QAAD;QAAM,OAAO;SAAE,UAAU;SAAQ,OAAO;QAAU;QAAG,UAAA;OAA2B,CAAA,GAChF,kBAAC,OAAD;QAAK,OAAO;SAAE,SAAS;SAAQ,KAAK;SAAO,WAAW;QAAM;QAA5D,UAAA,CACE,kBAAC,UAAD;SACE,OAAOC;SACP,WAAW,MAAMC,EAAe,SAAS,EAAE,OAAO,OAAO,EAAE,CAAC;SAC5D,OAAO;UAAE,MAAM;UAAG,SAAS;UAAW,UAAU;UAAQ,QAAQ;UAAqB,cAAc;UAAO,iBAAiB;SAAU;SAHvI,UAAA;UAKE,kBAAC,UAAD;WAAQ,OAAO;WAAG,UAAA;UAAW,CAAA;UAC7B,kBAAC,UAAD;WAAQ,OAAO;WAAG,UAAA;UAAW,CAAA;UAC7B,kBAAC,UAAD;WAAQ,OAAO;WAAG,UAAA;UAAW,CAAA;SACvB;QACR,CAAA,GAAA,kBAAC,UAAD;SACE,OAAOC;SACP,WAAW,MAAMC,GAAgB,SAAS,EAAE,OAAO,OAAO,EAAE,CAAC;SAC7D,OAAO;UAAE,MAAM;UAAG,SAAS;UAAW,UAAU;UAAQ,QAAQ;UAAqB,cAAc;UAAO,iBAAiB;SAAU;SAHvI,UAAA;UAKE,kBAAC,UAAD;WAAQ,OAAO;WAAG,UAAA;UAAc,CAAA;UAChC,kBAAC,UAAD;WAAQ,OAAO;WAAG,UAAA;UAAW,CAAA;UAC7B,kBAAC,UAAD;WAAQ,OAAO;WAAG,UAAA;UAAW,CAAA;UAC7B,kBAAC,UAAD;WAAQ,OAAO;WAAI,UAAA;UAAY,CAAA;SACzB;QACL,CAAA,CAAA;OACF,CAAA,CAAA,EAAA,CAAA,CACF;;MAGL,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,QAAD;OAAM,OAAO;QAAE,UAAU;QAAQ,OAAO;QAAW,SAAS;QAAS,cAAc;OAAM;OAAG,UAAA;MAAwB,CAAA,GACpH,kBAAC,OAAD;OACE,OAAO;QACL,SAAS;QACT;QACA,UAAU,GAAGG,EAAS;QACtB;QACA;QACA;QACA,OAAOZ;QACP,iBAAiBE,OAAoB,gBAAgB,YAAYA;QACjE,QAAQ,GAAGI,GAAY,WAAWF;QAClC,cAAc,GAAGI,GAAa;QAC9B,WAAW;OACb;OAEC,UAAA5B,KAAelS,KAAS;MACtB,CAAA,CACF,EAAA,CAAA;KACL,EAAA,CAAA;IAED,CAAA;IAGL,kBAAC,OAAD;KACE,OAAO;MACL,SAAS;MACT,WAAW;MACX,iBAAiB;MACjB,SAAS;MACT,gBAAgB;MAChB,KAAK;KACP;KARF,UAAA,CAUE,kBAAC,UAAD;MACE,MAAK;MACL,SAASoD;MACT,OAAO;OACL,SAAS;OACT,cAAc;OACd,QAAQ;OACR,iBAAiB;OACjB,UAAU;OACV,YAAY;OACZ,OAAO;OACP,QAAQ;MACV;MACD,UAAA;KAEO,CAAA,GACR,kBAAC,UAAD;MACE,MAAK;MACL,eAr7Be;OACvB,IAAM6S,KAAiB5G,EAAK,KAAK,KAAKE,EAAM,KAAA,CAAM,QAAQ,QAAQ,GAAG,GAC/D2G,IAAkBnD,GAAU,KAAK,MAAM,KAAsC,KAAA,IAAjC,SAASA,GAAU,KAAK,GAAG,EAAE;OA0B/E,AAxBA5P,EAAO;QACL,MAAM8S;QACN,OAAOjW,EAAM,KAAK,KAAK,KAAA;QACvB,aAAakS,EAAY,KAAK,KAAK,KAAA;QACnC;QACA,cAAcI,MAAiB,KAAoB,KAAA,IAAfA;QACpC,YAAY/C,EAAM,SAAS,aAAaiD,IAAa,KAAA;QACrD,SAASkC,KAAahC,IAAU,KAAA;QAChC,QAAQnC,KAAU,KAAA;QAClB,WAAW,OAAO,SAAS2F,CAAe,IAAIA,IAAkB,KAAA;QAChE,MAAMjD,IAAoBC,MAAkB,YAAY,sBAAsB,cAAe3D,EAAM;QACnG,eAAe0D,IAAmBC,IAAgB,KAAA;QAClD,aAAaD,KAAoBG,EAAY,KAAK,KAAkB,KAAA;QACpE;QACA;QACA;QACA;QACA;QACA,YAAYY,OAAe,YAAyB,KAAA,IAAbA;QACvC;QACA;QACA;QACA;OACF,CAAC,GACD5Q,EAAQ;MACV;MAy5BU,OAAO;OACL,SAAS;OACT,cAAc;OACd,QAAQ;OACR,iBAAiB;OACjB,UAAU;OACV,YAAY;OACZ,OAAO;OACP,QAAQ;MACV;MACD,UAAA;KAEO,CAAA,CACL;;GACF;;CACF,CAAA;AAET,GCrjCa+S,MAAyD,EACpE,UACA,SACA,gBACA,iBACA,uBAAoB,IACpB,WACA,YACA,iBACI;CACJ,IAAMC,IAAY7G,EAAM,SAAS,uBAAuBA,EAAM,kBAAkB,WAC1E,CAAC2D,GAAeC,KAAoBnY,EAAwBob,IAAY,YAAY,YAAY,GAChG,CAACC,GAAeC,KAAoBtb,EAAqC,MAAM,GAG/Eub,IACH,OAAOC,KAAiB,YAAYA,GAAc,cACnDC,GAAa,QACbC,KACArG,GAAM,QACN,IACI,CAACsG,GAAYC,KAAiB5b,EAAiBub,CAAiB,GAGhEM,IACH,OAAOL,KAAiB,YAAYA,GAAc,UAAW,qBAC1D,CAACM,GAAeC,KAAoB/b,EAAiB6b,CAAa,GAGlE,CAACG,IAAgBC,KAAqBjc,EAAiB,CAAC,GACxDkc,IAAe;EACnB;GAAE,MAAM;GAAkB,OAAO;GAAU,QAAQ;EAA+C;EAClG;GAAE,MAAM;GAAiB,OAAO;GAAU,QAAQ;EAAoC;EACtF;GAAE,MAAM;GAAe,OAAO;GAAU,QAAQ;EAA+C;CACjG,GAGM,CAACC,GAAiBC,KAAsBpc,EAC5C,OAAOwb,KAAiB,YAAYA,GAAc,UAAUA,EAAa,UAAU,IACrF,GAGMzK,IAAYzU,EAA0B,IAAI,GAC1C+f,KAAe/f,EAAO,EAAK,GAC3BggB,IAAahgB,EAAoF,CAAC,CAAC,GACnG,CAACigB,IAAUC,KAAexc,EAAS,EAAK,GACxC,CAACyc,IAAUC,KAAe1c,EAAS,SAAS,GAC5C2c,IAAcrgB,EAAOmgB,EAAQ;CACnC,EAAY,UAAUA;CAGtB,IAAM,CAACG,MAAmB5c,QAAe;EACvC,IAAI,OAAOwb,KAAiB,YAAYA,GAAc,iBACpD,OAAOA,EAAa;EAEtB,IAAMqB,oBAAQ,IAAI,WAAW,EAAE;EAE/B,OADA,OAAO,OAAO,gBAAgBA,CAAK,GAC5B,MAAM,KAAKA,IAAQ,MAAM9P,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE;CAC1E,CAAC,GAGK+P,IAAexT,QAAkB;EACrC,IAAMoI,IAASX,EAAU;EACzB,IAAI,CAACW,GAAQ;EACb,IAAMC,IAAMD,EAAO,WAAW,IAAI;EAClC,IAAI,CAACC,GAAK;EAEV,IAAMoL,IAAM,OAAO,oBAAoB,GACjCC,IAAOtL,EAAO,sBAAsB,GACpCuL,IAAID,EAAK,QAAQ,IAAIA,EAAK,QAAStL,EAAO,eAAe,KACzDwL,IAAIF,EAAK,SAAS,IAAIA,EAAK,SAAUtL,EAAO,gBAAgB,KAE5DyL,IAAc,KAAK,MAAMF,IAAIF,CAAG,GAChCK,IAAe,KAAK,MAAMF,IAAIH,CAAG;EAYvC,CAVIrL,EAAO,UAAUyL,KAAezL,EAAO,WAAW0L,OACpD,EAAO,QAAQD,GACf,EAAO,SAASC,IAGlBzL,EAAI,iBAAiB,GACrBA,EAAI,MAAMoL,GAAKA,CAAG,GAClB,EAAI,UAAU,SACd,EAAI,WAAW,SAEfpL,EAAI,UAAU,GAAG,GAAGsL,GAAGC,CAAC;EAExB,KAAK,IAAMG,KAAUf,EAAW,SAC9B,IAAIe,EAAO,OAAO,WAAW,GAI7B;GAHA1L,EAAI,UAAU,GACd,EAAI,cAAc0L,EAAO,OACzB,EAAI,YAAYA,EAAO,SAAS,KAChC1L,EAAI,OAAO0L,EAAO,OAAO,EAAE,CAAC,GAAGA,EAAO,OAAO,EAAE,CAAC,CAAC;GACjD,KAAK,IAAIlT,IAAI,GAAGA,IAAIkT,EAAO,OAAO,QAAQ,KACxC,EAAI,OAAOA,EAAO,OAAOlT,EAAE,CAAC,GAAGkT,EAAO,OAAOlT,EAAE,CAAC,CAAC;GAKnD,AAHIkT,EAAO,OAAO,WAAW,KAC3B1L,EAAI,OAAO0L,EAAO,OAAO,EAAE,CAAC,IAAI,IAAKA,EAAO,OAAO,EAAE,CAAC,IAAI,EAAG,GAE/D1L,EAAI,OAAO;EAPsC;CASrD,GAAG,CAAC,CAAC;CA+BL,AA5BAnV,QAAgB;EACd,IAAI0b,MAAkB,gBAAgBmD,MAAkB,QAAQ;EAChE,IAAMvL,IAAQ,iBAAiB;GAC7B,IAAM4B,IAASX,EAAU;GACzB,IAAI,CAACW,GAAQ;GACb,IAAMC,IAAMD,EAAO,WAAW,IAAI;GAClC,IAAKC,MAELmL,EAAa,GAGT,OAAOtB,KAAiB,YAAYA,GAAc,WAAWc,EAAW,QAAQ,WAAW,KAAK,CAACC,KAAU;IAC7G,IAAMe,IAAM,IAAI,MAAM;IAQtB,AAPA,EAAI,eAAe;KACjB,IAAMN,IAAOtL,EAAO,sBAAsB,GACpCuL,IAAID,EAAK,QAAQ,IAAIA,EAAK,QAAStL,EAAO,eAAe,KACzDwL,IAAIF,EAAK,SAAS,IAAIA,EAAK,SAAUtL,EAAO,gBAAgB;KAElE,AADAC,EAAI,UAAU2L,GAAK,GAAG,GAAGL,GAAGC,CAAC,GAC7BV,EAAY,EAAI;IAClB,GACA,EAAI,MAAMhB,EAAa;GACzB;EACF,GAAG,EAAE;EAEL,aAAa,aAAa1L,CAAK;CACjC,GAAG;EAACoI;EAAemD;EAAeyB;CAAY,CAAC,GAG/CtgB,QAAgB;EACd,IAAM+gB,UAAwB;GAC5B,GAAa,UAAU;EACzB;EAGA,OAFA,OAAO,iBAAiB,WAAWA,CAAe,GAClD,OAAO,iBAAiB,YAAYA,CAAe,SACtC;GAEX,AADA,OAAO,oBAAoB,WAAWA,CAAe,GACrD,OAAO,oBAAoB,YAAYA,CAAe;EACxD;CACF,GAAG,CAAC,CAAC;CAGL,IAAMC,KAAgB,MAAiF;EACrG,IAAM9L,IAASX,EAAU;EACzB,IAAI,CAACW,GAAQ,OAAO;GAAE,GAAG;GAAG,GAAG;EAAE;EACjC,IAAMsL,IAAOtL,EAAO,sBAAsB;EAC1C,IAAI,aAAa,GAAG;GAClB,IAAM+L,IAAQ,EAAE,QAAQ;GACxB,OAAO;IAAE,GAAGA,EAAM,UAAUT,EAAK;IAAM,GAAGS,EAAM,UAAUT,EAAK;GAAI;EACrE;EACA,OAAO;GAAE,GAAG,EAAE,UAAUA,EAAK;GAAM,GAAG,EAAE,UAAUA,EAAK;EAAI;CAC7D,GAEMU,MAAmB,MAAiF;EACxG,AAAI,aAAa,KAAK,EAAE,QAAQ,WAAW,KAAK,EAAE,cAChD,EAAE,eAAe;EAEnB,IAAMhM,IAASX,EAAU;EACzB,IAAI,CAACW,GAAQ;EACb,IAAMC,IAAMD,EAAO,WAAW,IAAI;EAClC,IAAI,CAACC,GAAK;EAGV,AADA,GAAa,UAAU,IACvB6K,EAAY,EAAI;EAEhB,IAAMmB,IAAMH,EAAa,CAAC;EAc1B,AAbAlB,EAAW,QAAQ,KAAK;GACtB,QAAQ,CAACqB,CAAG;GACZ,OAAOhB,EAAY;GACnB,OAAO;EACT,CAAC,GAEDhL,EAAI,UAAU,GACd,EAAI,cAAcgL,EAAY,SAC9B,EAAI,YAAY,KAChB,EAAI,UAAU,SACd,EAAI,WAAW,SACfhL,EAAI,OAAOgM,EAAI,GAAGA,EAAI,CAAC,GACvBhM,EAAI,OAAOgM,EAAI,IAAI,IAAKA,EAAI,IAAI,EAAG,GACnChM,EAAI,OAAO;CACb,GAEMiM,MAAc,MAAiF;EACnG,IAAI,CAACvB,GAAa,SAAS;EAC3B,AAAI,aAAa,KAAK,EAAE,cACtB,EAAE,eAAe;EAEnB,IAAM3K,IAASX,EAAU;EACzB,IAAI,CAACW,GAAQ;EACb,IAAMC,IAAMD,EAAO,WAAW,IAAI;EAClC,IAAI,CAACC,GAAK;EAEV,IAAMgM,IAAMH,EAAa,CAAC,GACpBK,IAAevB,EAAW,QAAQA,EAAW,QAAQ,SAAS;EAMpE,AALIuB,KACFA,EAAa,OAAO,KAAKF,CAAG,GAG9BhM,EAAI,OAAOgM,EAAI,GAAGA,EAAI,CAAC,GACvBhM,EAAI,OAAO;CACb,GAEMmM,WAAsB;EAC1B,GAAa,UAAU;CACzB,GAEMC,UAA0B;EAC9B,EAAW,UAAU,CAAC;EACtB,IAAMrM,IAASX,EAAU;EACzB,IAAI,CAACW,GAAQ;EACb,IAAMC,IAAMD,EAAO,WAAW,IAAI;EAClC,IAAI,CAACC,GAAK;EACV,IAAMoL,IAAM,OAAO,oBAAoB;EAEvC,AADApL,EAAI,UAAU,GAAG,GAAGD,EAAO,QAAQqL,GAAKrL,EAAO,SAASqL,CAAG,GAC3DP,EAAY,EAAK;CACnB,GAGMwB,IAAuB1U,GAAa,GAAkB,MAA4C;EACtG,IAAI;GACF,IAAM2U,IAAY,SAAS,cAAc,QAAQ;GAEjD,AADA,EAAU,QAAQ,KAClB,EAAU,SAAS;GACnB,IAAMtM,IAAMsM,EAAU,WAAW,IAAI;GACrC,IAAItM,GAAK;IAKP,AAJA,EAAI,YAAY8K,IAChB,EAAI,OAAO,GAAGyB,EAAQ,MAAM,QAAQA,EAAQ,UAC5C,EAAI,YAAY,UAChB,EAAI,eAAe,UACnBvM,EAAI,SAASwM,KAAY,aAAa,KAAK,EAAE;IAC7C,IAAMlK,IAAOgK,EAAU,UAAU,WAAW;IAC5C,IAAIhK,KAAQA,EAAK,SAAS,MAAMA,MAAS,UACvC,OAAOA;GAEX;EACF,QAAQ,CAER;EAGA,IAAMmK,KAAa,MACjB5U,EACG,QAAQ,MAAM,OAAO,CAAC,CACtB,QAAQ,MAAM,MAAM,CAAC,CACrB,QAAQ,MAAM,MAAM,CAAC,CACrB,QAAQ,MAAM,QAAQ,CAAC,CACvB,QAAQ,MAAM,QAAQ,GAErB6U,IAAWD,EAAUD,KAAY,WAAW,GAI5CG,IAAM,sGAHOF,EAAUF,EAAQ,QAAQ,SAGqE,EAAW,wCAF3GE,EAAUF,EAAQ,SAAS,QAEwH,EAAU,UAD7JE,EAAU3B,MAAY,SACiJ,EAAU,oDAAoD4B,EAAS;EAEhQ,IAAI;GAEF,OAAO,6BADW,OAAO,OAAS,MAAc,KAAK,SAAS,mBAAmBC,CAAG,CAAC,CAAC,IAAI,mBAAmBA,CAAG;EAElH,QAAQ;GACN,OAAO,2BAA2B,mBAAmBA,CAAG;EAC1D;CACF,GAAG,CAAC7B,EAAQ,CAAC,GAGP8B,qBAA+B,IAAI,IAAI;EAAC;EAAa;EAAc;EAAa;CAAY,CAAC,GAG7FC,KAAoB,MAA2C;EACnE,IAAMC,IAAO,EAAE,OAAO,QAAQ;EAC9B,IAAI,CAACA,GAAM;EACX,IAAI,CAACF,GAA6B,IAAIE,EAAK,KAAK,YAAY,CAAC,GAAG;GAC9D,MAAM,sDAAsD;GAC5D;EACF;EACA,IAAMC,IAAS,IAAI,WAAW;EAO9B,AANA,EAAO,UAAU,MAAO;GACtB,IAAM9N,IAAS+N,EAAG,QAAQ;GAC1B,AAAI/N,KACFwL,EAAmBxL,CAAM;EAE7B,GACA8N,EAAO,cAAcD,CAAI;CAC3B,GAGMG,WAA2B;EAC/B,IAAI1G,MAAkB,WAAW;GAY/B,AADA/P,EAAO;IARL,MAAM;IACN,YAHgBwT,EAAW,KAAK,KAAKF,GAAa,QAAQ;IAI1D,aAAaA,GAAa;IAC1B,YAAYpG,GAAM,QAAQd,EAAM;IAChC,WAAW,KAAK,IAAI;IACpB,QAAQuH;IACR,iBAAiBc;GAEZ,CAAM,GACbxU,EAAQ;GACR;EACF;EAGA,IAAIyW,IAAe,IACbC,IAAkBnD,EAAW,KAAK,KAAKF,GAAa,QAAQ;EAElE,IAAIJ,MAAkB,QAAQ;GAC5B,IAAM3J,IAASX,EAAU;GAIzB,IAHIW,KAAU6K,OACZ,IAAe7K,EAAO,UAAU,WAAW,IAEzC,CAACmN,KAAgB,CAACtC,IAAU;IAC9B,MAAM,6CAA6C;IACnD;GACF;EACF,OAAO,IAAIlB,MAAkB,QAE3B;OADA,IAAe2C,EAAqBrC,EAAW,KAAK,KAAKF,GAAa,QAAQ,aAAaS,EAAaF,GAAe,GACnH,CAAC6C,GAAc;IACjB,MAAM,2CAA2C;IACjD;GACF;SACK,IAAIxD,MAAkB,aAC3B,IAAec,KAAmB,IAC9B,CAAC0C,IAAc;GACjB,MAAM,kDAAkD;GACxD;EACF;EAYF,AADA1W,EAAO;GAPL,MAAM;GACN,SAAS0W;GACT,YAAYC;GACZ,aAAarD,GAAa;GAC1B,YAAYpG,GAAM,QAAQd,EAAM;GAChC,WAAW,KAAK,IAAI;EAEf,CAAM,GACbnM,EAAQ;CACV,GAEM2W,IAAc1J,GAAM,SAAS;CAEnC,OACE,kBAAC,OAAD;EACE,OAAO;GACL,UAAU;GACV,KAAK;GACL,MAAM;GACN,OAAO;GACP,QAAQ;GACR,iBAAiB;GACjB,gBAAgB;GAChB,QAAQ;GACR,SAAS;GACT,YAAY;GACZ,gBAAgB;GAChB,SAAS;GACT,WAAW;GACX,eAAe;EACjB;EACA,UAAU,MAAM;GACd,AAAI,EAAE,WAAW,EAAE,iBAAejN,EAAQ;EAC5C;EAEA,UAAA,kBAAC,OAAD;GACE,OAAO;IACL,iBAAiB;IACjB,cAAc;IACd,WAAW;IACX,OAAO;IACP,UAAU;IACV,UAAU;IACV,SAAS;IACT,eAAe;IACf,WAAW;IACX,eAAe;GACjB;GAZF,UAAA;IAeE,kBAAC,OAAD;KACE,OAAO;MACL,SAAS;MACT,YAAY;MACZ,gBAAgB;MAChB,SAAS;MACT,cAAc;MACd,iBAAiB;KACnB;KARF,UAAA,CAUE,kBAAC,OAAD;MAAK,OAAO;OAAE,SAAS;OAAQ,YAAY;OAAU,KAAK;MAAM;MAAhE,UAAA,CACE,kBAAC,OAAD;OACE,OAAO;QACL,OAAO;QACP,QAAQ;QACR,cAAc;QACd,iBAAiB,GAAG2W,EAAY;QAChC,SAAS;QACT,YAAY;QACZ,gBAAgB;QAChB,OAAOA;OACT;OAEC,UAA8Bnc,EAA9BsV,MAAkB,YAAajU,KAA4BqW,IAA7B,EAAa,MAAM,GAAK,CAAwB;MAC5E,CAAA,GACL,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;OAAI,OAAO;QAAE,QAAQ;QAAG,UAAU;QAAQ,YAAY;QAAK,OAAO;OAAU;OACzE,UAAApC,MAAkB,YAAY,4BAA4B;MACzD,CAAA,GACJ,kBAAC,OAAD;OAAK,OAAO;QAAE,SAAS;QAAQ,YAAY;QAAU,KAAK;QAAO,UAAU;QAAQ,OAAO;QAAW,WAAW;QAAO,UAAU;OAAO;OAAxI,UAAA;QACG3D,EAAM,SAAS,kBAAC,QAAD,EAAA,UAAA,CAAOA,EAAM,OAAM,KAAS,EAAA,CAAA;QAC3Cc,KACC,kBAAC,QAAD;SACE,OAAO;UACL,SAAS;UACT,YAAY;UACZ,KAAK;UACL,iBAAiB,GAAG0J,EAAY;UAChC,OAAOA;UACP,SAAS;UACT,cAAc;UACd,YAAY;UACZ,UAAU;SACZ;SAXF,UAAA,CAYC,UACQ1J,EAAK,IACR;;QAEPoG,GAAa,OACZ,kBAAC,QAAD;SAAM,OAAO,EAAE,OAAO,UAAU;SAAhC,UAAA;UAAmC;UACzB,kBAAC,UAAD,EAAA,UAASA,EAAY,KAAa,CAAA;UACzCA,EAAY,QAAQ,KAAKA,EAAY,MAAM,KAAK;SAC7C;QACJ,CAAA,IAACpG,IAED,OADF,kBAAC,QAAD,EAAA,UAAM,qBAAwB,CAAA;OAE7B;MACF,CAAA,CAAA,EAAA,CAAA,CACF;KAEL,CAAA,GAAA,kBAAC,UAAD;MACE,MAAK;MACL,SAASjN;MACT,cAAW;MACX,OAAO;OACL,YAAY;OACZ,QAAQ;OACR,QAAQ;OACR,OAAO;OACP,SAAS;OACT,cAAc;OACd,SAAS;OACT,YAAY;OACZ,gBAAgB;MAClB;MAEA,UAAA,kBAACC,IAAD,EAAG,MAAM,GAAK,CAAA;KACR,CAAA,CACL;;IAGL,kBAAC,OAAD;KACE,OAAO;MACL,SAAS;MACT,SAAS;MACT,iBAAiB;MACjB,KAAK;KACP;KANF,UAAA,CAQE,kBAAC,UAAD;MACE,MAAK;MACL,eAAe8P,EAAiB,YAAY;MAC5C,OAAO;OACL,MAAM;OACN,SAAS;OACT,cAAc;OACd,QAAQ;OACR,aAAaD,MAAkB,eAAe6G,IAAc;OAC5D,iBAAiB7G,MAAkB,eAAe,GAAG6G,EAAY,MAAM;OACvE,OAAO7G,MAAkB,eAAe6G,IAAc;OACtD,YAAY7G,MAAkB,eAAe,MAAM;OACnD,UAAU;OACV,QAAQ;OACR,SAAS;OACT,YAAY;OACZ,gBAAgB;OAChB,KAAK;OACL,YAAY;MACd;MAnBF,UAAA,CAqBE,kBAACoC,IAAD,EAAS,MAAM,GAAK,CAAA,GACpB,kBAAC,QAAD,EAAA,UAAM,uBAA0B,CAAA,CAC1B;KAER,CAAA,GAAA,kBAAC,UAAD;MACE,MAAK;MACL,eAAenC,EAAiB,SAAS;MACzC,OAAO;OACL,MAAM;OACN,SAAS;OACT,cAAc;OACd,QAAQ;OACR,aAAaD,MAAkB,YAAY,YAAY;OACvD,iBAAiBA,MAAkB,YAAY,cAAc;OAC7D,OAAOA,MAAkB,YAAY,YAAY;OACjD,YAAYA,MAAkB,YAAY,MAAM;OAChD,UAAU;OACV,QAAQ;OACR,SAAS;OACT,YAAY;OACZ,gBAAgB;OAChB,KAAK;OACL,YAAY;MACd;MAnBF,UAAA,CAqBE,kBAACjU,IAAD,EAAa,MAAM,GAAK,CAAA,GACxB,kBAAC,QAAD,EAAA,UAAM,sBAAyB,CAAA,CACzB;KACL,CAAA,CAAA;;IAGL,kBAAC,OAAD;KAAK,OAAO;MAAE,SAAS;MAAa,WAAW;MAAQ,MAAM;KAAE;KAA/D,UAAA;MAEE,kBAAC,OAAD;OAAK,OAAO,EAAE,cAAc,OAAO;OAAnC,UAAA,CACE,kBAAC,OAAD;QAAK,OAAO;SAAE,SAAS;SAAQ,YAAY;SAAU,gBAAgB;SAAiB,cAAc;QAAM;QAA1G,UAAA,CACE,kBAAC,SAAD;SAAO,OAAO;UAAE,UAAU;UAAQ,YAAY;UAAK,OAAO;SAAU;SAAG,UAAA;QAEhE,CAAA,GACNwX,GAAa,QACZ,kBAAC,QAAD;SAAM,OAAO;UAAE,UAAU;UAAQ,OAAO;UAAW,YAAY;SAAI;SAAnE,UAAA,CAAsE,kBACrDA,EAAY,IACvB;QAEL,CAAA,CAAA;OACL,CAAA,GAAA,kBAAC,SAAD;QACE,MAAK;QACL,OAAOE;QACP,aAAY;QACZ,WAAW,MAAMC,EAAc,EAAE,OAAO,KAAK;QAC7C,OAAO;SACL,OAAO;SACP,SAAS;SACT,cAAc;SACd,QAAQ;SACR,UAAU;SACV,SAAS;SACT,WAAW;QACb;OACD,CAAA,CACE;;MAGJ1D,MAAkB,gBACjB,kBAAC,OAAD,EAAA,UAAA;OAEE,kBAAC,OAAD;QACE,OAAO;SACL,SAAS;SACT,cAAc;SACd,cAAc;SACd,KAAK;QACP;QANF,UAAA;SAQE,kBAAC,UAAD;UACE,MAAK;UACL,eAAeoD,EAAiB,MAAM;UACtC,OAAO;WACL,SAAS;WACT,QAAQ;WACR,cAAcD,MAAkB,SAAS,aAAa0D,MAAgB;WACtE,iBAAiB;WACjB,OAAO1D,MAAkB,SAAS0D,IAAc;WAChD,YAAY1D,MAAkB,SAAS,MAAM;WAC7C,UAAU;WACV,QAAQ;WACR,SAAS;WACT,YAAY;WACZ,KAAK;UACP;UAfF,UAAA,CAiBE,kBAACf,IAAD,EAAS,MAAM,GAAK,CAAA,GAAC,OACf;;SAER,kBAAC,UAAD;UACE,MAAK;UACL,eAAegB,EAAiB,MAAM;UACtC,OAAO;WACL,SAAS;WACT,QAAQ;WACR,cAAcD,MAAkB,SAAS,aAAa0D,MAAgB;WACtE,iBAAiB;WACjB,OAAO1D,MAAkB,SAAS0D,IAAc;WAChD,YAAY1D,MAAkB,SAAS,MAAM;WAC7C,UAAU;WACV,QAAQ;WACR,SAAS;WACT,YAAY;WACZ,KAAK;UACP;UAfF,UAAA,CAiBE,kBAAC7K,IAAD,EAAM,MAAM,GAAK,CAAA,GAAC,OACZ;;SAER,kBAAC,UAAD;UACE,MAAK;UACL,eAAe8K,EAAiB,QAAQ;UACxC,OAAO;WACL,SAAS;WACT,QAAQ;WACR,cAAcD,MAAkB,WAAW,aAAa0D,MAAgB;WACxE,iBAAiB;WACjB,OAAO1D,MAAkB,WAAW0D,IAAc;WAClD,YAAY1D,MAAkB,WAAW,MAAM;WAC/C,UAAU;WACV,QAAQ;WACR,SAAS;WACT,YAAY;WACZ,KAAK;UACP;UAfF,UAAA,CAiBE,kBAAC2D,GAAD,EAAQ,MAAM,GAAK,CAAA,GAAC,eACd;;QACL;;OAGJ3D,MAAkB,UACjB,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,OAAD;QACE,OAAO;SACL,UAAU;SACV,QAAQ;SACR,cAAc;SACd,iBAAiB;SACjB,UAAU;SACV,aAAa;QACf;QARF,UAAA;SAUE,kBAAC,UAAD;UACE,KAAKtK;UACL,OAAO;WAAE,OAAO;WAAQ,QAAQ;WAAS,SAAS;WAAS,QAAQ;UAAY;UAC/E,aAAa2M;UACb,aAAaE;UACb,WAAWE;UACX,cAAcA;UACd,cAAcJ;UACd,aAAaE;UACb,YAAYE;SACb,CAAA;SAGD,kBAAC,OAAD;UACE,OAAO;WACL,UAAU;WACV,MAAM;WACN,OAAO;WACP,QAAQ;WACR,cAAc;WACd,eAAe;UACjB;UAEA,UAAA,kBAAC,QAAD;WACE,OAAO;YACL,UAAU;YACV,MAAM;YACN,QAAQ;YACR,UAAU;YACV,OAAO;YACP,YAAY;WACd;WACD,UAAA;UAEK,CAAA;SACH,CAAA;SAEJ,CAACvB,MACA,kBAAC,OAAD;UACE,OAAO;WACL,UAAU;WACV,KAAK;WACL,MAAM;WACN,WAAW;WACX,OAAO;WACP,UAAU;WACV,eAAe;WACf,WAAW;UACb;UACD,UAAA;SAEI,CAAA;QAEJ;OAEL,CAAA,GAAA,kBAAC,OAAD;QAAK,OAAO;SAAE,SAAS;SAAQ,gBAAgB;SAAiB,YAAY;SAAU,WAAW;QAAM;QAAvG,UAAA,CACE,kBAAC,OAAD;SAAK,OAAO;UAAE,SAAS;UAAQ,YAAY;UAAU,KAAK;SAAM;SAAhE,UAAA,CACE,kBAAC,QAAD;UAAM,OAAO;WAAE,UAAU;WAAQ,OAAO;UAAU;UAAG,UAAA;SAAU,CAAA,GAC9D;UAAC;UAAW;UAAW;SAAS,CAAC,CAAC,KAAK,MACtC,kBAAC,UAAD;UAEE,MAAK;UACL,eAAeG,EAAYhX,CAAC;UAC5B,OAAO;WACL,OAAO;WACP,QAAQ;WACR,cAAc;WACd,iBAAiBA;WACjB,QAAQ+W,OAAa/W,IAAI,sBAAsB;WAC/C,QAAQ;WACR,SAAS;UACX;SACD,GAZMA,CAYN,CACF,CACE;QAEL,CAAA,GAAA,kBAAC,UAAD;SACE,MAAK;SACL,SAASqY;SACT,OAAO;UACL,SAAS;UACT,YAAY;UACZ,KAAK;UACL,SAAS;UACT,iBAAiB;UACjB,QAAQ;UACR,cAAc;UACd,UAAU;UACV,OAAO;UACP,QAAQ;SACV;SAdF,UAAA,CAgBE,kBAACkB,IAAD,EAAW,MAAM,GAAK,CAAA,GAAC,QACjB;QACL,CAAA,CAAA;OACF,CAAA,CAAA,EAAA,CAAA;OAIN5D,MAAkB,UACjB,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;QAAG,OAAO;SAAE,UAAU;SAAQ,OAAO;SAAW,QAAQ;QAAY;QAAG,UAAA;OAEpE,CAAA,GACH,kBAAC,OAAD;QAAK,OAAO;SAAE,SAAS;SAAQ,eAAe;SAAU,KAAK;QAAM;QAChE,UAAAa,EAAa,KAAK,GAAM,MACvB,kBAAC,OAAD;SAEE,eAAeD,EAAkBxH,CAAG;SACpC,OAAO;UACL,SAAS;UACT,cAAc;UACd,QAAQuH,OAAmBvH,IAAM,aAAasK,MAAgB;UAC9D,iBAAiB/C,OAAmBvH,IAAM,GAAGsK,EAAY,MAAM;UAC/D,QAAQ;UACR,SAAS;UACT,YAAY;UACZ,gBAAgB;UAChB,YAAY;SACd;SAbF,UAAA,CAeE,kBAAC,QAAD;UACE,OAAO;WACL,UAAU;WACV,YAAYG,EAAK;WACjB,WAAWA,EAAK;WAChB,OAAOzC;WACP,eAAe;UACjB;UAEC,UAAAd,EAAW,KAAK,KAAK;SAClB,CAAA,GACLK,OAAmBvH,KAAO,kBAAC0K,GAAD;UAAO,MAAM;UAAI,OAAOJ;SAAc,CAAA,CAC9D;QA1BE,GAAAtK,CA0BF,CACN;OACE,CAAA,CACF,EAAA,CAAA;OAIN4G,MAAkB,YACjB,kBAAC,OAAD,EAAA,UACE,kBAAC,OAAD;QACE,OAAO;SACL,QAAQ;SACR,cAAc;SACd,SAAS;SACT,WAAW;SACX,iBAAiB;QACnB;QAEC,UAAAc,IACC,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,OAAD;SACE,KAAKA;SACL,KAAI;SACJ,OAAO;UAAE,WAAW;UAAS,UAAU;UAAO,WAAW;UAAW,QAAQ;SAAmB;QAChG,CAAA,GACD,kBAAC,OAAD,EAAA,UACE,kBAAC,SAAD;SACE,OAAO;UACL,SAAS;UACT,SAAS;UACT,iBAAiB;UACjB,QAAQ;UACR,cAAc;UACd,UAAU;UACV,OAAO;UACP,QAAQ;SACV;SAVF,UAAA,CAWC,iBAEC,kBAAC,SAAD;UACE,MAAK;UACL,QAAO;UACP,OAAO,EAAE,SAAS,OAAO;UACzB,UAAUqC;SACX,CAAA,CACI;QACJ,CAAA,EAAA,CAAA,CACF,EAAA,CAAA,IAEL,kBAAC,OAAD,EAAA,UAAA;SACE,kBAACQ,GAAD;UAAQ,MAAM;UAAI,OAAM;UAAU,OAAO,EAAE,QAAQ,kBAAkB;SAAI,CAAA;SACzE,kBAAC,KAAD;UAAG,OAAO;WAAE,QAAQ;WAAa,UAAU;WAAQ,OAAO;WAAW,YAAY;UAAI;UAAG,UAAA;SAErF,CAAA;SACH,kBAAC,KAAD;UAAG,OAAO;WAAE,QAAQ;WAAc,UAAU;WAAQ,OAAO;UAAU;UAAG,UAAA;SAErE,CAAA;SACH,kBAAC,SAAD;UACE,OAAO;WACL,SAAS;WACT,SAAS;WACT,iBAAiBD;WACjB,OAAO;WACP,cAAc;WACd,UAAU;WACV,YAAY;WACZ,QAAQ;UACV;UAVF,UAAA,CAWC,eAEC,kBAAC,SAAD;WACE,MAAK;WACL,QAAO;WACP,OAAO,EAAE,SAAS,OAAO;WACzB,UAAUP;UACX,CAAA,CACI;;QACJ,EAAA,CAAA;OAEJ,CAAA,EACF,CAAA;MAEJ,EAAA,CAAA;MAINtG,MAAkB,aACjB,kBAAC,OAAD;OAAK,OAAO;QAAE,SAAS;QAAQ,eAAe;QAAU,KAAK;OAAO;OAApE,UAAA;QACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;SAAO,OAAO;UAAE,SAAS;UAAS,UAAU;UAAQ,YAAY;UAAK,OAAO;UAAW,cAAc;SAAM;SAAG,UAAA;QAEvG,CAAA,GACP,kBAAC,UAAD;SACE,OAAO4D;SACP,WAAW,MAAMC,EAAiB,EAAE,OAAO,KAAK;SAChD,OAAO;UACL,OAAO;UACP,SAAS;UACT,cAAc;UACd,QAAQ;UACR,UAAU;UACV,iBAAiB;UACjB,SAAS;UACT,WAAW;UACX,QAAQ;SACV;SAbF,UAAA;UAeE,kBAAC,UAAD;WAAQ,OAAM;WAAoB,UAAA;UAA+B,CAAA;UACjE,kBAAC,UAAD;WAAQ,OAAM;WAAwB,UAAA;UAAmC,CAAA;UACzE,kBAAC,UAAD;WAAQ,OAAM;WAAuB,UAAA;UAAgC,CAAA;UACrE,kBAAC,UAAD;WAAQ,OAAM;WAAa,UAAA;UAAwC,CAAA;SAC7D;QACL,CAAA,CAAA,EAAA,CAAA;QAGL,kBAAC,OAAD;SACE,OAAO;UACL,QAAQ;UACR,cAAc;UACd,iBAAiB;UACjB,SAAS;UACT,SAAS;UACT,KAAK;UACL,YAAY;SACd;SATF,UAAA,CAWE,kBAAC,OAAD;UACE,OAAO;WACL,OAAO;WACP,QAAQ;WACR,cAAc;WACd,iBAAiB;WACjB,SAAS;WACT,YAAY;WACZ,gBAAgB;WAChB,OAAO;WACP,YAAY;UACd;UAEA,UAAA,kBAAC9X,IAAD,EAAa,MAAM,GAAK,CAAA;SACrB,CAAA,GAEL,kBAAC,OAAD;UAAK,OAAO;WAAE,MAAM;WAAG,UAAU;UAAE;UAAnC,UAAA;WACE,kBAAC,OAAD;YAAK,OAAO;aAAE,UAAU;aAAQ,YAAY;aAAK,OAAO;aAAW,cAAc;YAAM;YAAvF,UAAA,CAA0F,wBACnE0X,EAAW,KAAK,KAAKF,GAAa,QAAQ,QAC5D;;WACJA,GAAa,SACZ,kBAAC,OAAD;YAAK,OAAO;aAAE,UAAU;aAAQ,OAAO;aAAW,cAAc;YAAM;YAAtE,UAAA,CAAyE,WAC/DA,EAAY,KACjB;;WAENpG,GAAM,QACL,kBAAC,OAAD;YAAK,OAAO;aAAE,UAAU;aAAQ,OAAO;aAAW,cAAc;YAAM;YAAtE,UAAA,CAAyE,UAChEA,EAAK,IACT;;WAEP,kBAAC,OAAD;YAAK,OAAO;aAAE,UAAU;aAAQ,OAAO;aAAW,cAAc;YAAM;YAAtE,UAAA,CAAyE,2BAChE,IAAI,KAAK,EAAA,CAAE,eAAe,OAAO,CACrC;;WACL,kBAAC,OAAD;YAAK,OAAO;aAAE,UAAU;aAAQ,OAAO;aAAW,cAAc;YAAM;YAAtE,UAAA,CAAyE,YAC9DyG,CACN;;WACL,kBAAC,OAAD;YACE,OAAO;aACL,UAAU;aACV,OAAO;aACP,YAAY;aACZ,WAAW;aACX,iBAAiB;aACjB,SAAS;aACT,cAAc;YAChB;YATF,UAAA;aAUC;aACWc,GAAgB,MAAM,GAAG,EAAE;aAAE;YACpC;;UACF;SACF,CAAA,CAAA;;QAEL,kBAAC,KAAD;SAAG,OAAO;UAAE,QAAQ;UAAG,UAAU;UAAQ,OAAO;UAAW,YAAY;SAAI;SAAG,UAAA;QAE3E,CAAA;OACA;;KAEJ;;IAGL,kBAAC,OAAD;KACE,OAAO;MACL,SAAS;MACT,YAAY;MACZ,gBAAgB;MAChB,SAAS;MACT,WAAW;MACX,iBAAiB;KACnB;KARF,UAAA,CAUGwC,KAAW5D,IACV,kBAAC,UAAD;MACE,MAAK;MACL,eAAe;OAEb,AADA4D,EAAQ,GACRhX,EAAQ;MACV;MACA,OAAO;OACL,SAAS;OACT,iBAAiB;OACjB,QAAQ;OACR,cAAc;OACd,OAAO;OACP,UAAU;OACV,QAAQ;MACV;MACD,UAAA;KAEO,CAAA,IAER,kBAAC,OAAD,CAAM,CAAA,GAGR,kBAAC,OAAD;MAAK,OAAO;OAAE,SAAS;OAAQ,KAAK;MAAM;MAA1C,UAAA,CACE,kBAAC,UAAD;OACE,MAAK;OACL,SAASA;OACT,OAAO;QACL,SAAS;QACT,iBAAiB;QACjB,QAAQ;QACR,cAAc;QACd,OAAO;QACP,UAAU;QACV,QAAQ;OACV;OACD,UAAA;MAEO,CAAA,GAER,kBAAC,UAAD;OACE,MAAK;OACL,SAASwW;OACT,OAAO;QACL,SAAS;QACT,iBAAiBG;QACjB,QAAQ;QACR,cAAc;QACd,OAAO;QACP,UAAU;QACV,YAAY;QACZ,QAAQ;QACR,SAAS;QACT,YAAY;QACZ,KAAK;QACL,WAAW;OACb;OAhBF,UAAA,CAkBE,kBAACI,GAAD,EAAO,MAAM,GAAK,CAAA,GAClB,kBAAC,QAAD,EAAA,UAAOjH,MAAkB,YAAY,mBAAmB,eAAqB,CAAA,CACvE;MACL,CAAA,CAAA;KACF,CAAA,CAAA;;GACF;;CACF,CAAA;AAET,GCpgCMjd,WACJ,OAAO,SAAW,OAAe,gBAAgB,SAC7C,OAAO,WAAW,IAClB,GAAG,KAAK,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,KAE/CqkB,MAAiD,EAC5D,YACA,UACA,aACA,kBACA,mBACA,cACA,eACA,kBACA,gBACA,kBAAe,IACf,mBAAgB,IAChB,wBAAqB,WACjB;CACJ,IAAM,CAAChL,GAAQiL,KAAavf,QAA4Bwf,EAAY,iBAAiBpS,CAAO,CAAC,GACvF,CAACqS,GAAQC,KAAa1f,QAA+Bwf,EAAY,UAAU,CAAC,GAC5E,CAACrK,GAAOwK,KAAY3f,QAA2Bwf,EAAY,SAAS,CAAC,GACrE,CAACI,GAAeC,MAAoB7f,QAA8Bwf,EAAY,eAAe,CAAC,GAC9F,CAACM,GAAeC,KAAoB/f,QAA8Bwf,EAAY,iBAAiB,CAAC,GAChG,CAAC9H,GAASC,KAAc3X,QAAmCwf,EAAY,WAAW,CAAC,GACnF,CAACQ,GAAiBC,MAAsBjgB,EAAwB,IAAI,GACpE,CAACkgB,GAAcC,MAAmBngB,EAA2B,IAAI,GACjE,CAACogB,IAAcC,KAAmBrgB,EAA2B,IAAI,GAGjE,CAACsgB,GAAcC,MAAmBvgB,EAAgF,IAAI,GAGtHwgB,IAAUlkB,EAON,IAAI,GAERwU,IAAexU,EAAuB,IAAI,GAE1C0W,KAAM1Q,IAAW,OAAQ,IAAIme,IAAgBC,GAC7C5N,KAAMxQ,IAAW,OAAQ,IAAIoe,IAAiBD;CAgDpD,AA7CAjkB,QAAgB;EACd,IAAMmkB,IAAcnB,EAAY,qBAAqB;GACnD,EAAUA,EAAY,iBAAiBpS,CAAO,CAAC;EACjD,CAAC,GACKwT,IAAYpB,EAAY,cAAc,MAAc;GAExD,GAAW,MACUA,EAAY,iBAAiBpS,CACtB,CAAA,CAAW,MAAM,MAAMyT,EAAWzM,EAAE,UAAUY,EAAUZ,EAAE,KAC7E,IAAoBY,IAAY6L,CACxC;EACH,CAAC,GACKC,IAAatB,EAAY,eAAe,MAAa;GACzD,EAASuB,CAAQ;EACnB,CAAC,GACKC,IAAexB,EAAY,qBAAqB,MAAS;GAC7D,GAAiByB,CAAI;EACvB,CAAC,GACKC,IAAc1B,EAAY,qBAAqB,MAAU;GAC7D,EAAiB2B,CAAK;EACxB,CAAC,GACKC,IAAe5B,EAAY,iBAAiB,MAAS;GACzD,EAAW/J,CAAI;EACjB,CAAC;EACD,aAAa;GAMX,AALAkL,EAAY,GACZC,EAAU,GACVE,EAAW,GACXE,EAAa,GACbE,EAAY,GACZE,EAAa;EACf;CACF,GAAG,CAAC5B,GAAapS,CAAO,CAAC,GAGzB5Q,QAAgB;EACd,IAAIsjB,KAAiBhc,MAAc,QAAQ;GACzC,IAAMud,IAAK,SAAS,eAAe,eAAevB,GAAe;GACjE,AAAIuB,KAAM,SAAS,kBAAkBA,KACnCA,EAAG,MAAM;EAEb;CACF,GAAG,CAACvB,GAAehc,CAAS,CAAC,GAG7BtH,QAAgB;EACd,IAAIsH,MAAc,WAAW,CAACkc,GAAiB;EAE/C,IAAMsB,KAAiB,MAAqB;GAC1C,AAAIpB,MACC,EAAE,QAAQ,YAAY,EAAE,QAAQ,gBAAgB,CAAC,CAAC,SAAS,UAAU,CAAC,CAAC,SAAU,EAAE,QAAwB,OAAO,MACrH,EAAE,eAAe,GACjBV,EAAY,YAAYQ,CAAe,GACvCC,GAAmB,IAAI;EAE3B;EAGA,OADA,OAAO,iBAAiB,WAAWqB,CAAa,SACnC,OAAO,oBAAoB,WAAWA,CAAa;CAClE,GAAG;EAACxd;EAAWkc;EAAiBR;EAAaU;CAAY,CAAC;CAG1D,IAAMqB,KAAoBjY,GAAa,MAAqC;EAC1E,IAAI,CAACwH,EAAa,SAAS,OAAO;GAAE,GAAG;GAAG,GAAG;EAAE;EAC/C,IAAMkM,IAAOlM,EAAa,QAAQ,sBAAsB;EAGxD,OAAO6B,IAFO,EAAE,UAAUqK,EAAK,QAAQxf,IACzB,EAAE,UAAUwf,EAAK,OAAOxf,GACA8E,GAAU0Q,IAAKF,EAAG;CAC1D,GAAG;EAACtV;EAAO8E;EAAU0Q;EAAKF;CAAG,CAAC,GAGxB0O,IAAa1d,MAAc,WAAW2d,KAAcA,MAAe,UAEnEC,KAAmB,MAAwB;EAC/C,IAAI,CAACF,GAAY;GACf,AAAI1d,MAAc,WAAW,EAAE,WAAWgN,EAAa,WACrDmP,GAAmB,IAAI;GAEzB;EACF;EAEA,AADA,EAAE,eAAe,GACjB,EAAE,gBAAgB;EAClB,IAAM0B,IAAKJ,GAAkB,CAAC;EAC9B,GAAgB;GAAE,QAAQI,EAAG;GAAG,QAAQA,EAAG;GAAG,MAAMA,EAAG;GAAG,MAAMA,EAAG;EAAE,CAAC;CACxE,GAEMnS,KAAkBlG,GAAa,MAAkB;EACrD,IAAIkX,EAAQ,SAAS;GACnB,EAAE,eAAe;GACjB,IAAMmB,IAAKJ,GAAkB,CAAC,GACxB,EAAE,SAAM,WAAQ,YAAS,WAAQ,WAAQ,oBAAiBf,EAAQ,SAClEoB,IAAKD,EAAG,IAAIxV,GACZ0V,IAAKF,EAAG,IAAIG;GAElB,IAAIrlB,MAAS,QAAQ;IACnB,IAAM2C,IAAO,KAAK,IAAI,GAAG,KAAK,IAAIqhB,IAAgBsB,EAAa,OAAOA,EAAa,IAAIH,CAAE,CAAC,GACpFI,IAAO,KAAK,IAAI,GAAG,KAAK,IAAItB,IAAiBqB,EAAa,QAAQA,EAAa,IAAIF,CAAE,CAAC;IAC5F,EAAY,YAAYnM,GAAS;KAAE,GAAG,KAAK,MAAMtW,CAAI;KAAG,GAAG,KAAK,MAAM4iB,CAAI;IAAE,GAAG,EAAK;GACtF,OAAO,IAAIvlB,MAAS,YAAYwlB,GAAQ;IACtC,IAAI,EAAE,MAAG,MAAG,UAAO,cAAWF;IAG9B,IAFIE,EAAO,SAAS,GAAG,MAAG,IAAQ,KAAK,IAAI,IAAIF,EAAa,QAAQH,CAAE,IAClEK,EAAO,SAAS,GAAG,MAAG,IAAS,KAAK,IAAI,IAAIF,EAAa,SAASF,CAAE,IACpEI,EAAO,SAAS,GAAG,GAAG;KACxB,IAAMC,IAAYH,EAAa,QAAQH;KACvC,AAAIM,KAAa,OACf,IAAQA,GACR,IAAIH,EAAa,IAAIH;IAEzB;IACA,IAAIK,EAAO,SAAS,GAAG,GAAG;KACxB,IAAME,IAAYJ,EAAa,SAASF;KACxC,AAAIM,KAAa,OACf,IAASA,GACT,IAAIJ,EAAa,IAAIF;IAEzB;IACA,EAAY,YAAYnM,GAAS;KAC/B,GAAG,KAAK,MAAM3W,CAAC;KACf,GAAG,KAAK,MAAME,CAAC;KACf,OAAO,KAAK,MAAM8M,CAAK;KACvB,QAAQ,KAAK,MAAMC,CAAM;IAC3B,GAAG,EAAK;GACV;GACA;EACF;EAEA,IAAIsU,GAAc;GAChB,IAAMqB,IAAKJ,GAAkB,CAAC;GAC9B,IAAgB,MAAQrN,IAAO;IAAE,GAAGA;IAAM,MAAMyN,EAAG;IAAG,MAAMA,EAAG;GAAE,IAAI,IAAI;EAC3E;CACF,GAAG;EAACrB;EAAciB;EAAmBd;EAAeC;EAAgBlB;CAAW,CAAC,GAE1E9P,IAAgBpG,QAAkB;EAKtC,IAJA,AACEkX,EAAQ,YAAU,MAGhBF,GAAc;GAChB,IAAM8B,IAAO,KAAK,IAAI9B,EAAa,QAAQA,EAAa,IAAI,GACtD+B,IAAO,KAAK,IAAI/B,EAAa,QAAQA,EAAa,IAAI,GACtDrD,IAAI,KAAK,IAAIqD,EAAa,OAAOA,EAAa,MAAM,GACpDpD,IAAI,KAAK,IAAIoD,EAAa,OAAOA,EAAa,MAAM;GAG1D,IAAImB,KAAcA,MAAe,YAAYxE,KAAK,MAAMC,KAAK,IAAI;IAC/D,IAAMoF,IAAwC;KAC5C,SAAS;KACT,UAAU;KACV,UAAU;KACV,WAAW;KACX,UAAU;KACV,OAAO;KACP,WAAW;KACX,mBAAmB;IACrB,GAEMC,IAAgB/C,EAAY,UAAU,CAAC,CAAC,QACxCgD,IAAeC,KAAsB,KAAA,GACrCC,IAAQjB,MAAe,aACvBkB,IAAelB,MAAe,qBAE9BjN,IAAsB;KAC1B,IAAIvZ,GAAM;KACV,MAAM,GAAGwmB,EAAW,GAAGc,IAAgB;KACvC,OAAOD,EAAcb,MAAe;KACpC,MAAMA,MAAe,YAAY,SAAUA;KAC3C,WAAWrU;KACX,GAAG,KAAK,MAAMgV,CAAI;KAClB,GAAG,KAAK,MAAMC,CAAI;KAClB,OAAO,KAAK,MAAMpF,CAAC;KACnB,QAAQ,KAAK,MAAMC,CAAC;KACpB,UAAU;KACV,QAAQsF;KACR,WAAWD,IAAgB;KAC3B,UAAU;KACV,WAAW;KACX,iBAAiB;KACjB,cAAc;KACd,aAAa;KACb,SAAS;MAAC;MAAa;MAAY;KAAO,CAAC,CAAC,SAASd,CAAU,IAC3D;MAAC;MAAY;MAAY;KAAU,IACnC,KAAA;KACJ,YAAYA,MAAe,aAAa,aAAa,KAAA;KACrD,eAAekB,IAAe,YAAYD,IAAQ,eAAe,KAAA;KACjE,aAAaC,IAAe,iBAAiBD,IAAQ,cAAc,KAAA;IACrE;IAIA,AAFAlD,EAAY,SAAShL,CAAQ,GAC7ByL,GAAmBzL,EAAS,EAAE,GAC9BoO,EAAc,QAAQ;GACxB;GAEA,GAAgB,IAAI;EACtB;CACF,GAAG;EAACtC;EAAcmB;EAAYrU;EAASoS;EAAaoD;EAAeH;CAAkB,CAAC;CAEtF,SACE,OAAO,iBAAiB,aAAajT,EAAe,GACpD,OAAO,iBAAiB,WAAWE,CAAa,SACnC;EAEX,AADA,OAAO,oBAAoB,aAAaF,EAAe,GACvD,OAAO,oBAAoB,WAAWE,CAAa;CACrD,IACC,CAACF,IAAiBE,CAAa,CAAC;CAEnC,IAAMmT,MAAmB,GAAkB,MAAwB;EACjE,IAAI/e,MAAc,WAAW2d,MAAe,UAAU;EAEtD,AADAhR,EAAE,gBAAgB,GAClBwP,GAAmB1L,EAAM,EAAE;EAC3B,IAAMoN,IAAKJ,GAAkB9Q,CAAC;EAC9B,EAAQ,UAAU;GAChB,MAAM;GACN,SAAS8D,EAAM;GACf,QAAQoN,EAAG;GACX,QAAQA,EAAG;GACX,cAAc,EAAE,GAAGpN,EAAM;EAC3B;CACF,GAEMuO,KAAqB,GAAkB,GAAgB,MAAwB;EACnF,EAAE,gBAAgB;EAClB,IAAMnB,IAAKJ,GAAkB9Q,CAAC;EAC9B,EAAQ,UAAU;GAChB,MAAM;GACN;GACA,SAAS8D,EAAM;GACf,QAAQoN,EAAG;GACX,QAAQA,EAAG;GACX,cAAc,EAAE,GAAGpN,EAAM;EAC3B;CACF,GAEMwO,MAAwB,GAAkB,MAAwB;EACtE,EAAE,gBAAgB;EAClB,IAAMC,IAAiB;GACrB,GAAGzO;GACH,IAAItZ,GAAM;GACV,MAAM,GAAGsZ,EAAM,KAAK;GACpB,GAAG,KAAK,IAAIkM,IAAgBlM,EAAM,OAAOA,EAAM,IAAI,EAAE;GACrD,GAAG,KAAK,IAAImM,IAAiBnM,EAAM,QAAQA,EAAM,IAAI,EAAE;GACvD,WAAWA,EAAM,cAAc,KAAA,IAAkC,KAAA,IAAtBA,EAAM,YAAY;EAC/D;EAEA,AADAiL,EAAY,SAASwD,CAAG,GACxB/C,GAAmB+C,EAAI,EAAE;CAC3B,GAEMC,MAAqB,GAAY,MAAwB;EAG7D,AAFAxS,EAAE,gBAAgB,GAClB+O,EAAY,YAAYrP,CAAE,GACtB6P,MAAoB7P,KAAI8P,GAAmB,IAAI;CACrD,GAGMiD,MAAsB,MAA2B;EACrD,AAAI,EAAE,QAAQ,UACZ,EAAE,eAAe,GACb,EAAE,WACJ1D,EAAY,kBAAkB,IAE9BA,EAAY,cAAc;CAGhC,GAGI2D,KAAc;CAClB,IAAI7C,GAAc;EAKhB,IAAM8C,IAAMhQ,GAJC,KAAK,IAAIkN,EAAa,QAAQA,EAAa,IAIvB,GAHpB,KAAK,IAAIA,EAAa,QAAQA,EAAa,IAGjB,GAF7B,KAAK,IAAIA,EAAa,OAAOA,EAAa,MAEP,GADnC,KAAK,IAAIA,EAAa,OAAOA,EAAa,MACJ,GAAGhe,GAAU0Q,IAAKF,EAAG;EAErE,KACE,kBAAC,OAAD,EACE,OAAO;GACL,UAAU;GACV,MAAM,GAAGsQ,EAAI,IAAI5lB,EAAM;GACvB,KAAK,GAAG4lB,EAAI,IAAI5lB,EAAM;GACtB,OAAO,GAAG4lB,EAAI,QAAQ5lB,EAAM;GAC5B,QAAQ,GAAG4lB,EAAI,SAAS5lB,EAAM;GAC9B,QAAQ;GACR,iBAAiB;GACjB,eAAe;GACf,QAAQ;EACV,EACD,CAAA;CAEL;CAEA,OACE,kBAAC,OAAD;EACE,KAAKsT;EACL,WAAU;EACV,aAAa4Q;EACb,OAAO;GACL,UAAU;GACV,KAAK;GACL,MAAM;GACN,OAAO;GACP,QAAQ;GACR,eAAe5d,MAAc,UAAU,SAAS;GAChD,QAAQ0d,IAAa,cAAc;GACnC,QAAQ;EACV;EAbF,UAAA;GAeG2B;GAGA7O,EAAO,KAAK,MAAU;IACrB,IAAM8O,IAAMhQ,GAAqBmB,EAAM,GAAGA,EAAM,GAAGA,EAAM,OAAOA,EAAM,QAAQjS,GAAU0Q,IAAKF,EAAG,GAC1FuQ,IAAavf,MAAc,WAAWkc,MAAoBzL,EAAM,IAChE+O,IAAa7D,EAAOlL,EAAM,UAAU,KAAA,IAAkCA,EAAM,gBAAgB,KAA5CkL,EAAOlL,EAAM,OAE7Dc,IAAOF,EAAM,MAAM,MAAM5H,EAAE,OAAOgH,EAAM,MAAM,GAC9CgP,IAAalO,GAAM,SAAS,WAC5BmO,IAAgB,GAAQf,KAAsBlO,EAAM,WAAWkO;IAKrE,IAAI3e,MAAc,SAChB,OACE,kBAAC,OAAD;KAEE,WAAU;KACV,UAAU,MAAM;MAEd,AADA2M,EAAE,gBAAgB,GAClBwP,GAAmB1L,EAAM,EAAE;KAC7B;KACA,gBAAgB,MAAM;MAEpB,AADA9D,EAAE,gBAAgB,GAClB0P,GAAgB5L,CAAK;KACvB;KACA,cAAc,MAAMsO,GAAgBtO,GAAO9D,CAAC;KAC5C,OAAO;MACL,UAAU;MACV,MAAM,GAAG2S,EAAI,IAAI5lB,EAAM;MACvB,KAAK,GAAG4lB,EAAI,IAAI5lB,EAAM;MACtB,OAAO,GAAG4lB,EAAI,QAAQ5lB,EAAM;MAC5B,QAAQ,GAAG4lB,EAAI,SAAS5lB,EAAM;MAC9B,iBAAiB6lB,IAAa,GAAGE,EAAW,MAAM,GAAGA,EAAW;MAChE,QAAQF,IAAa,aAAaE,MAAe,gBAAgBA;MACjE,cAAc,GAAGhP,EAAM,gBAAgB,EAAE;MACzC,QAAQ;MACR,QAAQ8O,IAAa,KAAK;MAC1B,SAAS;MACT,eAAe;MACf,gBAAgB;MAChB,SAAS;MACT,WAAW;MACX,WAAWA,IAAa,aAAaE,EAAW,MAAM;MACtD,SAASC,IAAgB,MAAO;MAChC,YAAY;KACd;KA/BF,UAAA;MAkCE,kBAAC,OAAD;OAAK,OAAO;QAAE,SAAS;QAAQ,YAAY;QAAU,gBAAgB;QAAiB,KAAK;QAAO,UAAU;OAAS;OAArH,UAAA,CACE,kBAAC,OAAD;QAAK,OAAO;SAAE,SAAS;SAAQ,YAAY;SAAU,KAAK;SAAO,UAAU;SAAG,UAAU;QAAS;QAAjG,UAAA,CACGC,KAAiBlP,EAAM,cAAc,KAAA,KACpC,kBAAC,QAAD;SACE,OAAO;UACL,UAAU,GAAG,KAAK,IAAI,GAAG,KAAK/W,CAAK,EAAE;UACrC,YAAY;UACZ,iBAAiB+lB;UACjB,OAAO;UACP,SAAS;UACT,cAAc;UACd,YAAY;UACZ,YAAY;SACd;SACA,OAAO,aAAahP,EAAM;SAX5B,UAAA,CAYC,KACGA,EAAM,SACJ;QAER,CAAA,GAAA,kBAAC,QAAD;SACE,OAAO;UACL,UAAU,GAAG,KAAK,IAAI,IAAI,KAAK/W,CAAK,EAAE;UACtC,YAAY;UACZ,OAAO+lB;UACP,YAAY;UACZ,cAAc;UACd,UAAU;SACZ;SARF,UAAA,CAUGhP,EAAM,SAASA,EAAM,MACrBA,EAAM,YAAY,kBAAC,QAAD;UAAM,OAAO,EAAE,OAAO,UAAU;UAAG,UAAA;SAAQ,CAAA,CAC1D;QACH,CAAA,CAAA;OAEL,CAAA,GAAA,kBAAC,OAAD;QAAK,OAAO;SAAE,SAAS;SAAQ,YAAY;SAAU,KAAK;SAAO,YAAY;QAAE;QAA/E,UAAA,CACGc,IACC,kBAAC,QAAD;SACE,OAAO;UACL,SAAS;UACT,YAAY;UACZ,KAAK;UACL,UAAU,GAAG,KAAK,IAAI,GAAG,IAAI7X,CAAK,EAAE;UACpC,iBAAiB,GAAG+lB,EAAW;UAC/B,OAAOA;UACP,QAAQ,aAAaA,EAAW;UAChC,SAAS;UACT,cAAc;UACd,YAAY;UACZ,YAAY;UACZ,UAAU,GAAG,MAAM/lB,EAAM;UACzB,UAAU;UACV,cAAc;SAChB;SACA,OAAO,SAAS6X,EAAK;SAjBvB,UAAA,CAmBE,kBAAC,QAAD,EAAM,OAAO;UAAE,OAAO;UAAO,QAAQ;UAAO,cAAc;UAAO,iBAAiBkO;UAAY,YAAY;SAAE,EAAI,CAAA,GAChH,kBAAC,QAAD;UAAM,OAAO;WAAE,UAAU;WAAU,cAAc;WAAY,YAAY;UAAS;UAAI,UAAAlO,EAAK;SAAW,CAAA,CAClG;QAEN,CAAA,IAAA,kBAAC,QAAD;SACE,OAAO;UACL,UAAU,GAAG,KAAK,IAAI,GAAG,IAAI7X,CAAK,EAAE;UACpC,iBAAiB;UACjB,OAAO;UACP,SAAS;UACT,cAAc;UACd,YAAY;SACd;SACA,OAAM;SACP,UAAA;QAEK,CAAA,GAGR,kBAAC,QAAD;SACE,OAAO;UACL,UAAU,GAAG,KAAK,IAAI,GAAG,IAAIA,CAAK,EAAE;UACpC,iBAAiB;UACjB,OAAO;UACP,SAAS;UACT,cAAc;UACd,eAAe;UACf,YAAY;SACd;SAEC,UAAA+W,EAAM;QACH,CAAA,CACH;OACF,CAAA,CAAA;;OAGHA,EAAM,SAAS,eAAeA,EAAM,SAAS,wBAC7C,kBAAC,OAAD;OACE,OAAO;QACL,UAAU;QACV,KAAK;QACL,MAAM;QACN,SAAS;QACT,YAAY;QACZ,QAAQ;QACR,YAAY;QACZ,eAAe;QACf,QAAQ;OACV;OAXF,UAAA,CAaE,kBAAC,OAAD;QACE,OAAO;SACL,iBAAiBgP;SACjB,OAAO;SACP,UAAU,GAAG,KAAK,IAAI,GAAG,MAAM/lB,CAAK,EAAE;SACtC,YAAY;SACZ,SAAS;SACT,cAAc;SACd,SAAS;SACT,YAAY;SACZ,KAAK;SACL,eAAe;SACf,YAAY;QACd;QAEA,UAAA,kBAAC,QAAD,EAAA,UAAA;SAAM;SACA+W,EAAM,gBAAgBA,EAAM,SAAS,sBAAsB,iBAAiB;SAC/Ec,IAAO,KAAKA,EAAK,KAAK,KAAK;QACxB,EAAA,CAAA;OACH,CAAA,GAEL,kBAAC,OAAD,EACE,OAAO;QACL,OAAO;QACP,QAAQ;QACR,WAAW;QACX,cAAc;QACd,YAAY,aAAakO;OAC3B,EACD,CAAA,CACE;;OAILhP,EAAM,SAAS,eAAeA,EAAM,SAAS,wBAC7C,kBAAC,OAAD;OACE,OAAO;QACL,MAAM;QACN,SAAS;QACT,eAAe;QACf,gBAAgB;QAChB,SAAS;OACX;OAEA,UAAA,kBAAC,OAAD;QACE,OAAO;SACL,SAAS;SACT,YAAY;SACZ,KAAK;SACL,cAAc,gBAAgBgP,EAAW;SACzC,eAAe;QACjB;QAPF,UAAA,CASE,kBAAC,QAAD;SAAM,OAAO;UAAE,UAAU;UAAQ,YAAY;UAAQ,OAAOA;SAAW;SAAG,UAAA;QAAO,CAAA,GACjF,kBAAC,QAAD;SAAM,OAAO;UAAE,UAAU,GAAG,KAAK,IAAI,GAAG,KAAK/lB,CAAK,EAAE;UAAK,OAAO;SAAU;SACvE,UAAA+W,EAAM,SAAS,sBAAsB,kCAAkC;QACpE,CAAA,CACH;;MACF,CAAA;MAIN8O,KACC,kBAAC,OAAD;OACE,OAAO;QACL,UAAU;QACV,KAAK;QACL,OAAO;QACP,SAAS;QACT,YAAY;QACZ,KAAK;QACL,iBAAiB;QACjB,SAAS;QACT,cAAc;QACd,WAAW;QACX,QAAQ;QACR,QAAQ;OACV;OACA,cAAc,MAAM,EAAE,gBAAgB;OAfxC,UAAA;QAkBE,kBAAC,OAAD;SACE,OAAO;UACL,SAAS;UACT,YAAY;UACZ,KAAK;UACL,cAAc;UACd,aAAa;SACf;SAPF,UAAA,CASE,kBAAC9I,IAAD;UAAM,MAAM;UAAI,OAAOgJ;SAAa,CAAA,GACpC,kBAAC,UAAD;UACE,OAAOhP,EAAM,UAAU;UACvB,WAAW,MAAM;WACf,EAAE,gBAAgB;WAClB,IAAMmP,IAASjT,EAAE,OAAO,SAAS,KAAA,GAC3BkT,IAAWxO,EAAM,MAAM,MAAM5H,EAAE,OAAOmW,CAAM;WAClD,EAAY,YAAYnP,EAAM,IAAI;YAChC,QAAQmP;YACR,aAAaC,IAAWA,EAAS,QAAQ,KAAA;WAC3C,CAAC;UACH;UACA,OAAO;WACL,UAAU;WACV,YAAY;WACZ,SAAS;WACT,cAAc;WACd,QAAQ,aAAaJ,EAAW;WAChC,iBAAiB;WACjB,OAAOA;WACP,QAAQ;WACR,SAAS;WACT,QAAQ;UACV;UACA,OAAM;UAvBR,UAAA,CAyBE,kBAAC,UAAD;WAAQ,OAAM;WAAG,UAAA;UAAc,CAAA,GAC9BpO,EAAM,KAAK,MACV,kBAAC,UAAD;WAAmB,OAAO5H,EAAE;WACzB,UAAAA,EAAE;UACG,GAFKA,EAAE,EAEP,CACT,CACK;SACL,CAAA,CAAA;;QAEL,kBAAC,UAAD;SACE,MAAK;SACL,OAAM;SACN,UAAU,MAAM;UAEd,AADAkD,EAAE,gBAAgB,GAClB0P,GAAgB5L,CAAK;SACvB;SACA,OAAO;UACL,YAAY;UACZ,QAAQ;UACR,QAAQ;UACR,SAAS;UACT,OAAOgP;SACT;SAEA,UAAA,kBAAC5hB,GAAD,EAAU,MAAM,GAAK,CAAA;QACf,CAAA;QACR,kBAAC,UAAD;SACE,MAAK;SACL,OAAM;SACN,UAAU,MAAMohB,GAAqBxO,GAAO9D,CAAC;SAC7C,OAAO;UACL,YAAY;UACZ,QAAQ;UACR,QAAQ;UACR,SAAS;UACT,OAAO;SACT;SAEA,UAAA,kBAAC/N,GAAD,EAAM,MAAM,GAAK,CAAA;QACX,CAAA;QACR,kBAAC,UAAD;SACE,MAAK;SACL,OAAM;SACN,UAAU,MAAMugB,GAAkB1O,EAAM,IAAI9D,CAAC;SAC7C,OAAO;UACL,YAAY;UACZ,QAAQ;UACR,QAAQ;UACR,SAAS;UACT,OAAO;SACT;SAEA,UAAA,kBAAC1K,IAAD,EAAQ,MAAM,GAAK,CAAA;QACb,CAAA;OACL;;MAINsd,KACC,kBAAAnoB,IAAA,EAAA,UACG;OAAC;OAAM;OAAK;OAAM;OAAK;OAAM;OAAK;OAAM;MAAG,CAAC,CAAC,KAAK,MAAW;OAC5D,IAAM0oB,IAAmC;QACvC,UAAU;QACV,OAAO;QACP,QAAQ;QACR,iBAAiB;QACjB,QAAQ,eAAeL;QACvB,cAAc;QACd,QAAQ;OACV;OAoBA,OAnBItB,EAAO,SAAS,GAAG,MAAG,EAAY,MAAM,SACxCA,EAAO,SAAS,GAAG,MAAG,EAAY,SAAS,SAC3CA,EAAO,SAAS,GAAG,MAAG,EAAY,OAAO,SACzCA,EAAO,SAAS,GAAG,MAAG,EAAY,QAAQ,UAC1CA,MAAW,OAAOA,MAAW,SAAK,EAAY,OAAO,uBACrDA,MAAW,OAAOA,MAAW,SAAK,EAAY,MAAM,sBAYxD,EAAY,SAAS;QATnB,IAAI;QACJ,GAAG;QACH,IAAI;QACJ,GAAG;QACH,IAAI;QACJ,GAAG;QACH,IAAI;QACJ,GAAG;OAEgB,EAAQA,IAG3B,kBAAC,OAAD;QAEE,OAAO2B;QACP,cAAc,MAAMd,EAAkBvO,GAAO0N,GAAQxR,CAAC;OACvD,GAHMwR,CAGN;MAEL,CAAC,EACD,CAAA;KAED;IAjWE,GAAA1N,EAAM,EAiWR;IAOT,IAAMsP,IAAoBjE,MAAkB,QAAQ,CAAC,CAACrL,EAAM,UAAUA,EAAM,WAAWqL;IAEvF,IAAIiE,KAAqBnM,EAAQ,wBAAwB,UACvD,OAAO;IAIT,IAAMoM,IAAa,EADMC,KAAgBrM,EAAQ,iBAAiB,OAC1BnD,EAAM,YAAYsP,GACpD/R,IAAWgO,MAAkBvL,EAAM,IAGnCyP,IAAsB,KAAK,IAAI,KAAKzP,EAAM,YAAY,MAAM/W,CAAK,GACjEymB,IAAsB1P,EAAM,cAAc,WAC1C2P,IAAsB3P,EAAM,cAAc,UAC1C4P,KAAqB5P,EAAM,aAAa,UACxC6P,IAAqB7P,EAAM,aAAa,QAExC8P,IAAqBR,IACvB,YACAtP,EAAM,aAAa,WAEjB+P,IAAmBT,IACrB,6BACAtP,EAAM,oBAAoB,gBAC1B,gBACAA,EAAM,mBAAmB,WAEvBgQ,KAAuBV,IACzB,YACAxO,IACCd,EAAM,eAAec,EAAK,QAC1Bd,EAAM,eAAe,CAACY,EAAM,MAAM,MAAM5H,EAAE,UAAUgH,EAAM,WAAW,IAAIA,EAAM,cAAc,WAE5FiQ,IAAuBjQ,EAAM,eAAe,KAC5CkQ,KAAwBlQ,EAAM,gBAAgB,GAE9CmQ,IAAcnQ,EAAM,SAAS,eAAeA,EAAM,SAAS,qBAC3DoQ,IACJ,OAAOrB,KAAe,YAAYA,IAC9BA,IACAA,IACA;KACE,MAAM/O,EAAM,SAAS,sBAAsB,YAAY;KACvD,SAAS,OAAO+O,KAAe,YAAYA,EAAW,WAAW,OAAO,IAAIA,IAAa,KAAA;KACzF,YAAY,OAAOA,KAAe,WAAWA,IAAa,KAAA;IAC5D,IACA,MACAsB,KAAW,GAAQD,MAAWA,EAAO,WAAWA,EAAO,cAAeA,EAAe,YAErFE,IAAsC;KAC1C,OAAO;KACP,QAAQ;KACR,UAAU,GAAGb,EAAoB;KACjC,YAAYC;KACZ,YAAYC;KACZ,WAAWC;KACX,WAAWC;KACX,OAAOC;KACP,iBAAiBC;KACjB,QAAQ,GAAGE,EAAqB,WAAWD;KAC3C,cAAc,GAAGE,GAAsB;KACvC,WAAW;KACX,SAAS;KACT,WAAW3S,IACP,eAAeyR,EAAW,MAC1BM,IACA,SACA;KACJ,QAAQC,IAAa,gBAAgB;KACrC,YAAY;IACd,GAEMgB,UAAoB;KACxB,EAAY,iBAAiBvQ,EAAM,EAAE;IACvC;IAEA,OACE,kBAAC,OAAD;KAEE,OAAO;MACL,UAAU;MACV,MAAM,GAAG6O,EAAI,IAAI5lB,EAAM;MACvB,KAAK,GAAG4lB,EAAI,IAAI5lB,EAAM;MACtB,OAAO,GAAG4lB,EAAI,QAAQ5lB,EAAM;MAC5B,QAAQ,GAAG4lB,EAAI,SAAS5lB,EAAM;MAC9B,QAAQsU,IAAW,KAAK;MACxB,WAAW;MACX,eAAe;KACjB;KAXF,UAAA;MAcI4S,IAqGA,kBAAC,OAAD;OACE,OAAO;QACL,UAAU;QACV,KAAKtB,EAAI,IAAI5lB,IAAQ,KAAK,GAAG4lB,EAAI,SAAS5lB,IAAQ,EAAE,MAAM;QAC1D,MAAM;QACN,SAAS;QACT,YAAY;QACZ,QAAQ;QACR,YAAY;QACZ,eAAe;QACf,QAAQ;OACV;OAXF,UAAA,CAaE,kBAAC,OAAD;QACE,OAAO;SACL,iBAAiBonB,KAAW,YAAYf,IAAoB,YAAYN;SACxE,OAAO;SACP,UAAU,GAAG,KAAK,IAAI,GAAG,MAAM/lB,CAAK,EAAE;SACtC,YAAY;SACZ,SAAS;SACT,cAAc;SACd,SAAS;SACT,YAAY;SACZ,KAAK;SACL,eAAe;SACf,YAAY;SACZ,UAAU,GAAG,KAAK,IAAI,KAAK4lB,EAAI,QAAQ5lB,IAAQ,GAAG,EAAE;QACtD;QAdF,UAAA;SAgBGqmB,KAAqBnM,EAAQ,wBAAwB,eAAe,kBAACqN,GAAD;UAAM,MAAM;UAAI,OAAO,EAAE,YAAY,EAAE;SAAI,CAAA;SAC/GtB,KAAiBlP,EAAM,cAAc,KAAA,KACpC,kBAAC,QAAD;UACE,OAAO;WACL,iBAAiB;WACjB,OAAO;WACP,UAAU,GAAG,KAAK,IAAI,KAAK,MAAM/W,CAAK,EAAE;WACxC,YAAY;WACZ,SAAS;WACT,cAAc;WACd,YAAY;WACZ,aAAa;WACb,YAAY;UACd;UACA,OAAO,SAAS+W,EAAM;UAZxB,UAAA,CAaC,KACGA,EAAM,SACJ;;SAEPqQ,KACC,kBAAA1pB,IAAA,EAAA,UAAA,CACE,kBAACikB,GAAD;UAAO,MAAM;UAAI,aAAa;UAAG,OAAO,EAAE,YAAY,EAAE;SAAI,CAAA,GAC5D,kBAAC,QAAD;UAAM,OAAO;WAAE,UAAU;WAAU,cAAc;WAAY,YAAY;UAAS;UAAlF,UAAA,CAAqF,UAC5E5K,EAAM,QAAQ,KAAKA,EAAM,UAAU,EACtC;SACN,CAAA,CAAA,EAAA,CAAA,IAEF,kBAAC,QAAD;UAAM,OAAO;WAAE,UAAU;WAAU,cAAc;WAAY,YAAY;UAAS;UAAlF,UAAA;WAAqF;WAC/EA,EAAM,gBAAgBA,EAAM,SAAS,sBAAsB,iBAAiB;WAC/EA,EAAM,SAASA,EAAM,UAAUA,EAAM,cAAc,MAAMA,EAAM,UAAU;WACzEc,IAAO,KAAKA,EAAK,KAAK,KAAK;WAC3Bd,EAAM,YAAY,kBAAC,QAAD;YAAM,OAAO,EAAE,OAAO,UAAU;YAAG,UAAA;WAAQ,CAAA;UAC1D;;QAEL;OAEL,CAAA,GAAA,kBAAC,OAAD,EACE,OAAO;QACL,OAAO;QACP,QAAQ;QACR,WAAW;QACX,cAAc;QACd,YAAY,aAAaqQ,KAAW,YAAYf,IAAoB,YAAYN;OAClF,EACD,CAAA,CACE;WA9KL,kBAAC,OAAD;OACE,OAAO;QACL,UAAU;QACV,KAAKH,EAAI,IAAI5lB,IAAQ,KAAK,GAAG4lB,EAAI,SAAS5lB,IAAQ,EAAE,MAAM;QAC1D,MAAM;QACN,SAAS;QACT,YAAY;QACZ,KAAK;QACL,iBAAiB;QACjB,OAAOqmB,IAAoB,YAAYN;QACvC,QAAQ,aAAaM,IAAoB,YAAY,GAAGN,EAAW;QACnE,UAAU,GAAG,KAAK,IAAI,KAAK,MAAM/lB,CAAK,EAAE;QACxC,SAAS;QACT,cAAc;QACd,eAAe;QACf,QAAQ;QACR,WAAW;QACX,YAAY;QACZ,YAAY;QACZ,UAAU,GAAG,KAAK,IAAI,KAAK4lB,EAAI,QAAQ5lB,IAAQ,GAAG,EAAE;OACtD;OApBF,UAAA;QAsBGqmB,KAAqBnM,EAAQ,wBAAwB,eACpD,kBAACqN,GAAD;SAAM,MAAM;SAAI,OAAO;UAAE,YAAY;UAAG,OAAO;SAAU;QAAI,CAAA;QAG9DtB,KAAiBlP,EAAM,cAAc,KAAA,KACpC,kBAAC,QAAD;SACE,OAAO;UACL,iBAAiBsP,IAAoB,YAAYN;UACjD,OAAO;UACP,UAAU,GAAG,KAAK,IAAI,KAAK,MAAM/lB,CAAK,EAAE;UACxC,YAAY;UACZ,SAAS;UACT,cAAc;UACd,YAAY;UACZ,YAAY;SACd;SACA,OAAO,SAAS+W,EAAM;SAXxB,UAAA,CAYC,KACGA,EAAM,SACJ;;QAIR,kBAAC,QAAD;SACE,OAAO;UACL,YAAY;UACZ,OAAOsP,IAAoB,YAAY;UACvC,UAAU;UACV,cAAc;UACd,YAAY;SACd;SACA,OAAOtP,EAAM,SAASA,EAAM;SAR9B,UAAA,CAUGA,EAAM,SAASA,EAAM,MACrBA,EAAM,YAAY,kBAAC,QAAD;UAAM,OAAO,EAAE,OAAO,UAAU;UAAG,UAAA;SAAQ,CAAA,CAC1D;;QAGLc,IACC,kBAAC,QAAD;SACE,OAAO;UACL,SAAS;UACT,YAAY;UACZ,KAAK;UACL,iBAAiB,GAAGkO,EAAW;UAC/B,OAAOA;UACP,UAAU,GAAG,KAAK,IAAI,KAAK,MAAM/lB,CAAK,EAAE;UACxC,YAAY;UACZ,SAAS;UACT,cAAc;UACd,YAAY;UACZ,YAAY;SACd;SACA,OAAO,SAAS6X,EAAK;SAdvB,UAAA,CAgBE,kBAAC,QAAD,EAAM,OAAO;UAAE,OAAO;UAAO,QAAQ;UAAO,cAAc;UAAO,iBAAiBkO;SAAW,EAAI,CAAA,GAChGlO,EAAK,IACF;QAEN,CAAA,IAAA,kBAAC,QAAD;SACE,OAAO;UACL,iBAAiB;UACjB,OAAO;UACP,UAAU,GAAG,KAAK,IAAI,KAAK,MAAM7X,CAAK,EAAE;UACxC,YAAY;UACZ,SAAS;UACT,cAAc;UACd,YAAY;UACZ,YAAY;SACd;SACA,OAAM;SACP,UAAA;QAEK,CAAA;OAEL;MAGL,CAAA;MA8EDknB,KAAe5gB,MAAc,UAAU4T,EAAQ,uBAAuB,OAAU,CAACkI,KAAiB,CAACrL,EAAM,UAAUA,EAAM,WAAWqL,MACnI,kBAAC,OAAD;OACE,WAAU;OACV,UAAU,MAAM;QAEd,AADAnP,EAAE,gBAAgB,GACbqT,KACHzD,EAAgB9L,CAAK;OAEzB;OACA,OAAO;QACL,UAAU;QACV,OAAO;QACP,KAAK;QACL,WAAW;QACX,QAAQ;QACR,QAAQuP,IAAa,YAAY;QACjC,YAAY;OACd;OACA,OACEc,KACI,WAAWrQ,EAAM,SAAS,gBAC1B,kBAAkBA,EAAM,SAAS;OAGvC,UAAA,kBAAC,OAAD;QACE,OAAO;SACL,iBAAiBqQ,KAAW,YAAYrB;SACxC,OAAO;SACP,SAAS;SACT,cAAc;SACd,UAAU,GAAG,KAAK,IAAI,GAAG,KAAK/lB,CAAK,EAAE;SACrC,YAAY;SACZ,SAAS;SACT,YAAY;SACZ,KAAK;SACL,YAAY;SACZ,WAAW;QACb;QAEC,UAAAonB,KACC,kBAAA1pB,IAAA,EAAA,UAAA,CACE,kBAACikB,GAAD;SAAO,MAAM;SAAI,aAAa;QAAI,CAAA,GAClC,kBAAC,QAAD,EAAA,UAAM,SAAY,CAAA,CAClB,EAAA,CAAA,IAEF,kBAAAjkB,IAAA,EAAA,UAAA,CACE,kBAACof,IAAD,EAAS,MAAM,GAAK,CAAA,GACpB,kBAAC,QAAD,EAAA,UAAM,OAAU,CAAA,CAChB,EAAA,CAAA;OAED,CAAA;MACF,CAAA;OAIL/F,EAAM,SAAS,UAAWA,EAAM,SAAoB,cACpD,kBAAC,SAAD;OACE,IAAI,eAAeA,EAAM;OACzB,MAAK;OACL,UAAUuP;OACV,OAAOR;OACP,aAAa/O,EAAM,eAAeA,EAAM,SAAS;OACjD,OAAOsP,IAAoB,sBAAsBxO,GAAM,QAAQ,mBAAmBA,IAAO,SAASA,EAAK,SAAS,KAAA;OAChH,WAAW,MAAMmK,EAAY,SAASjL,EAAM,MAAM9D,EAAE,OAAO,KAAK;OAChE,SAASqU;OACT,WAAW5B;OACX,OAAO;QACL,GAAG2B;QACH,SAAS,GAAG,IAAIrnB,EAAM,KAAK,IAAIA,EAAM;OACvC;MACD,CAAA;MAIF+W,EAAM,SAAS,cACd,kBAAC,YAAD;OACE,IAAI,eAAeA,EAAM;OACzB,UAAUuP;OACV,OAAOR;OACP,aAAa/O,EAAM,eAAeA,EAAM,SAAS;OACjD,OAAOsP,IAAoB,sBAAsBxO,GAAM,QAAQ,mBAAmBA,IAAO,SAASA,EAAK,SAAS,KAAA;OAChH,WAAW,MAAMmK,EAAY,SAASjL,EAAM,MAAM9D,EAAE,OAAO,KAAK;OAChE,SAASqU;OACT,WAAW5B;OACX,OAAO;QACL,GAAG2B;QACH,QAAQ;QACR,SAAS,GAAG,IAAIrnB,EAAM,KAAK,IAAIA,EAAM;OACvC;MACD,CAAA;MAIF+W,EAAM,SAAS,cACd,kBAAC,SAAD;OACE,IAAI,eAAeA,EAAM;OACzB,MAAMA,EAAM,eAAe,SAAS,SAASA,EAAM,eAAe,SAAS,SAAS;OACpF,UAAUuP;OACV,OAAOR;OACP,OAAOO,IAAoB,sBAAsBxO,GAAM,QAAQ,mBAAmBA,IAAO,SAASA,EAAK,SAAS,KAAA;OAChH,WAAW,MAAMmK,EAAY,SAASjL,EAAM,MAAM9D,EAAE,OAAO,KAAK;OAChE,SAASqU;OACT,WAAW5B;OACX,OAAO;QACL,GAAG2B;QACH,SAAS,GAAG,IAAIrnB,EAAM,KAAK,IAAIA,EAAM;OACvC;MACD,CAAA;MAIF+W,EAAM,SAAS,eACd,kBAAC,OAAD;OACE,IAAI,eAAeA,EAAM;OACzB,UAAUuP,IAAa,KAAK;OAC5B,SAASgB;OACT,WAAW5B;OACX,OAAOW,IAAoB,sBAAsBxO,GAAM,QAAQ,mBAAmBA,IAAO,SAASA,EAAK,SAAS,KAAA;OAChH,OAAO;QACL,GAAGwP;QACH,SAAS,GAAG,IAAIrnB,EAAM,KAAK,IAAIA,EAAM;QACrC,WAAW;QACX,SAAS;QACT,eAAe;QACf,KAAK,GAAG,IAAIA,EAAM;QAClB,QAAQsmB,IAAa,gBAAgB;OACvC;OAEE,WAAAvP,EAAM,WAAWA,EAAM,QAAQ,SAAS,IAAIA,EAAM,UAAU,CAAC,YAAY,EAAA,CAAG,KAAK,GAAK,MAAS;QAC/F,IAAMyQ,IAA+B,MAAM,QAAQ1B,CAAU,IAAIA,IAAa,CAAC,GACzE2B,IAAYD,EAAmB,SAASxK,CAAG;QAEjD,OACE,kBAAC,SAAD;SAEE,OAAO;UACL,SAAS;UACT,YAAY;UACZ,KAAK,GAAG,IAAIhd,EAAM;UAClB,UAAU,GAAGwmB,EAAoB;UACjC,YAAYC;UACZ,OAAOI;UACP,QAAQP,IAAa,gBAAgB;UACrC,YAAY;SACd;SAXF,UAAA,CAaE,kBAAC,SAAD;UACE,MAAK;UACL,UAAUA;UACV,SAASmB;UACT,WAAW,MAAM;WACf,AAAIxU,EAAE,OAAO,UACX+O,EAAY,SAASjL,EAAM,MAAM,CAAC,GAAGyQ,GAAoBxK,CAAG,CAAC,IAE7DgF,EAAY,SAASjL,EAAM,MAAMyQ,EAAmB,QAAQ,MAASrb,MAAS6Q,CAAG,CAAC;UAEtF;UACA,OAAO;WACL,QAAQsJ,IAAa,gBAAgB;WACrC,aAAaP;UACf;SACD,CAAA,GACD,kBAAC,QAAD,EAAA,UAAO/I,EAAU,CAAA,CACZ;QA7BA,GAAA0K,CA6BA;OAEX,CAAC;MACE,CAAA;MAIN3Q,EAAM,SAAS,cACd,kBAAC,OAAD;OACE,IAAI,eAAeA,EAAM;OACzB,UAAUuP,IAAa,KAAK;OAC5B,SAASgB;OACT,WAAW5B;OACX,OAAOW,IAAoB,sBAAsBxO,GAAM,QAAQ,mBAAmBA,IAAO,SAASA,EAAK,SAAS,KAAA;OAChH,OAAO;QACL,GAAGwP;QACH,SAAS;QACT,YAAY;QACZ,gBAAgB;QAChB,QAAQf,IAAa,gBAAgB;OACvC;OACA,eAAe;QACb,AAAKA,KACHtE,EAAY,SAASjL,EAAM,MAAM,CAAC+O,CAAU;OAEhD;OAEA,UAAA,kBAAC,SAAD;QACE,MAAK;QACL,UAAUQ;QACV,SAAS,EAAQR;QACjB,WAAW,MAAM9D,EAAY,SAASjL,EAAM,MAAM9D,EAAE,OAAO,OAAO;QAClE,OAAO;SACL,OAAO;SACP,QAAQ;SACR,QAAQqT,IAAa,gBAAgB;SACrC,aAAaP;QACf;OACD,CAAA;MACE,CAAA;MAINhP,EAAM,SAAS,cACd,kBAAC,UAAD;OACE,IAAI,eAAeA,EAAM;OACzB,UAAUuP;OACV,OAAOR;OACP,OAAOO,IAAoB,sBAAsBxO,GAAM,QAAQ,mBAAmBA,IAAO,SAASA,EAAK,SAAS,KAAA;OAChH,WAAW,MAAMmK,EAAY,SAASjL,EAAM,MAAM9D,EAAE,OAAO,KAAK;OAChE,SAASqU;OACT,WAAW5B;OACX,OAAO;QACL,GAAG2B;QACH,SAAS,GAAG,IAAIrnB,EAAM,KAAK,IAAIA,EAAM;QACrC,QAAQsmB,IAAa,gBAAgB;OACvC;OAZF,UAAA,CAcE,kBAAC,UAAD;QAAQ,OAAM;QAAI,UAAAvP,EAAM,gBAAgBA,EAAM,QAAQ,aAAaA,EAAM,MAAM,OAAO;OAAwB,CAAA,IAC5GA,EAAM,WAAW,CAAC,EAAA,CAAG,KAAK,GAAK,MAC/B,kBAAC,UAAD;QAAmB,OAAOiG;QACvB,UAAAA;OACK,GAFK0K,CAEL,CACT,CACK;;MAIT3Q,EAAM,SAAS,WACd,kBAAC,OAAD;OACE,IAAI,eAAeA,EAAM;OACzB,UAAUuP,IAAa,KAAK;OAC5B,SAASgB;OACT,WAAW5B;OACX,OAAO;QACL,GAAG2B;QACH,SAAS,GAAG,IAAIrnB,EAAM,KAAK,IAAIA,EAAM;QACrC,WAAW;QACX,SAAS;QACT,eAAe;QACf,KAAK,GAAG,IAAIA,EAAM;QAClB,QAAQsmB,IAAa,gBAAgB;OACvC;OAEE,WAAAvP,EAAM,WAAW,CAAC,EAAA,CAAG,KAAK,GAAK,MAC/B,kBAAC,SAAD;QAEE,OAAO;SACL,SAAS;SACT,YAAY;SACZ,KAAK,GAAG,IAAI/W,EAAM;SAClB,UAAU,GAAGwmB,EAAoB;SACjC,YAAYC;SACZ,OAAOI;SACP,QAAQP,IAAa,gBAAgB;SACrC,YAAY;QACd;QAXF,UAAA,CAaE,kBAAC,SAAD;SACE,MAAK;SACL,MAAM,SAASvP,EAAM;SACrB,UAAUuP;SACV,SAASR,MAAe9I;SACxB,gBAAgBgF,EAAY,SAASjL,EAAM,MAAMiG,CAAG;SACpD,OAAO;UACL,QAAQsJ,IAAa,gBAAgB;UACrC,aAAaP;SACf;QACD,CAAA,GACD,kBAAC,QAAD,EAAA,UAAO/I,EAAU,CAAA,CACZ;OAxBA,GAAA0K,CAwBA,CACR;MACE,CAAA;MAINR,KACC,kBAAC,OAAD;OACE,IAAI,eAAenQ,EAAM;OACzB,UAAUuP,IAAa,KAAK;OAC5B,SAASgB;OACT,YAAY,MAAM;QAEhB,AADA5B,GAAmBzS,CAAC,GAChB,CAACqT,MAAerT,EAAE,QAAQ,WAAWA,EAAE,QAAQ,SACjDA,EAAE,eAAe,GACjB4P,EAAgB9L,CAAK;OAEzB;OACA,eAAe;QACb,AAAKuP,KACHzD,EAAgB9L,CAAK;OAEzB;OACA,OAAO;QACL,GAAGsQ;QACH,QAAQf,IAAa,gBAAgB;QACrC,QAAQc,KACJ,eAAe9S,IAAWyR,IAAa,cACvC,gBAA2BA;QAC/B,iBAAiBqB,KACZN,KAAoB,YACrBT,IACA,6BACA;QACJ,SAAS,GAAG,IAAIrmB,EAAM,KAAK,IAAIA,EAAM;QACrC,SAAS;QACT,YAAY;QACZ,gBAAgB;QAChB,UAAU;QACV,UAAU;QACV,YAAY;OACd;OACA,OAAOsmB,IAAa,oBAAoBc,KAAW,sCAAsC;OAExF,UAAAA,MAAYD,IAEXA,EAAO,SAAS,aAAapQ,EAAM,SAAS,sBAE1C,kBAAC,OAAD;QACE,OAAO;SACL,SAAS;SACT,YAAY;SACZ,KAAK,GAAG,IAAI/W,EAAM;SAClB,OAAO;SACP,QAAQ;SACR,SAAS;SACT,WAAW;QACb;QATF,UAAA,CAWE,kBAAC,OAAD;SACE,OAAO;UACL,OAAO,GAAG,KAAKA,EAAM;UACrB,QAAQ,GAAG,KAAKA,EAAM;UACtB,cAAc;UACd,iBAAiB;UACjB,SAAS;UACT,YAAY;UACZ,gBAAgB;UAChB,OAAO;UACP,YAAY;SACd;SAEA,UAAA,kBAACyG,IAAD,EAAa,MAAM,KAAK,IAAI,IAAI,KAAKzG,CAAK,EAAI,CAAA;QAC3C,CAAA,GACL,kBAAC,OAAD;SAAK,OAAO;UAAE,MAAM;UAAG,UAAU;UAAG,UAAU;UAAU,YAAY;SAAK;SAAzE,UAAA;UACE,kBAAC,OAAD;WACE,OAAO;YACL,UAAU,GAAG,KAAK,IAAI,KAAK,KAAKA,CAAK,EAAE;YACvC,YAAY;YACZ,OAAO;YACP,YAAY;YACZ,UAAU;YACV,cAAc;WAChB;WARF,UAAA;YAUG+W,EAAM,QAAQ,GAAGA,EAAM,MAAM,MAAM;YAAG;YAAqBoQ,EAAO,cAAc;WAC9E;;UACL,kBAAC,OAAD;WACE,OAAO;YACL,UAAU,GAAG,KAAK,IAAI,GAAG,IAAInnB,CAAK,EAAE;YACpC,OAAO;YACP,YAAY;YACZ,UAAU;YACV,cAAc;WAChB;WAPF,UAAA;YASGmnB,EAAO,YAAY,IAAI,KAAKA,EAAO,SAAS,CAAC,CAAC,eAAe,OAAO,IAAI;YAAY;YACpFA,EAAO,SAAS,KAAKA,EAAO,WAAW;WACrC;;UACJA,EAAO,mBACN,kBAAC,OAAD;WACE,OAAO;YACL,UAAU,GAAG,KAAK,IAAI,GAAG,IAAInnB,CAAK,EAAE;YACpC,OAAO;YACP,YAAY;YACZ,YAAY;YACZ,UAAU;YACV,cAAc;WAChB;WARF,UAAA;YASC;YACWmnB,EAAO,gBAAgB,MAAM,GAAG,EAAE;YAAE;WAC3C;;SAEJ;QACF,CAAA,CAAA;OAGL,CAAA,IAAA,kBAAC,OAAD;QACE,OAAO;SACL,SAAS;SACT,eAAe;SACf,YAAY;SACZ,gBAAgB;SAChB,OAAO;SACP,QAAQ;SACR,UAAU;QACZ;QATF,UAAA,CAWGA,EAAO,WAAYA,EAAe,WACjC,kBAAC,OAAD;SACE,KAAKA,EAAO,WAAYA,EAAe;SACvC,KAAI;SACJ,OAAO;UACL,WAAW;UACX,UAAU;UACV,WAAW;UACX,SAAS;SACX;QACD,CAAA,IAED,kBAAC,QAAD;SAAM,OAAO;UAAE,UAAU,GAAG,KAAK,IAAI,IAAI,KAAKnnB,CAAK,EAAE;UAAK,YAAY;UAAW,OAAO6mB;SAAmB;SACxG,UAAAM,EAAO,cAAc;QAClB,CAAA,GAEPA,EAAO,cACN,kBAAC,QAAD;SACE,OAAO;UACL,UAAU,GAAG,KAAK,IAAI,KAAK,MAAMnnB,CAAK,EAAE;UACxC,OAAO;UACP,YAAY;UACZ,YAAY;UACZ,WAAW;SACb;SAPF,UAAA;UAQC;UACsBmnB,EAAO;UAAYpQ,EAAM,QAAQ,MAAMA,EAAM,UAAU;SACxE;QAEL,CAAA,CAAA;OAIP,CAAA,IAAA,kBAAC,OAAD;QACE,OAAO;SACL,OAAO;SACP,QAAQ;SACR,SAAS;SACT,eAAe;SACf,gBAAgB;SAChB,YAAY;SACZ,UAAU;QACZ;QATF,UAAA,CAYE,kBAAC,OAAD;SACE,OAAO;UACL,UAAU;UACV,MAAM;UACN,OAAO;UACP,QAAQ,GAAG,IAAI/W,EAAM;UACrB,cAAc,gBAAgB+lB,EAAW;UACzC,SAAS;UACT,YAAY;SACd;SAEA,UAAA,kBAAC,QAAD;UAAM,OAAO;WAAE,UAAU,GAAG,KAAK,IAAI,GAAG,KAAK/lB,CAAK,EAAE;WAAK,OAAO+lB;WAAY,YAAY;UAAO;UAAG,UAAA;SAAO,CAAA;QACtG,CAAA,GAEL,kBAAC,OAAD;SACE,OAAO;UACL,SAAS;UACT,YAAY;UACZ,KAAK,GAAG,IAAI/lB,EAAM;UAClB,OAAOqmB,IAAoB,YAAYN;UACvC,UAAU,GAAG,KAAK,IAAI,KAAK,KAAK/lB,CAAK,EAAE;UACvC,YAAY;UACZ,QAAQ;SACV;SATF,UAAA,CAWG+W,EAAM,SAAS,sBACd,kBAACtQ,IAAD,EAAa,MAAM,KAAK,IAAI,IAAI,KAAKzG,CAAK,EAAI,CAAA,IAE9C,kBAAC8c,IAAD,EAAS,MAAM,KAAK,IAAI,IAAI,KAAK9c,CAAK,EAAI,CAAA,GAE5C,kBAAC,QAAD,EAAA,UAAA,CACGqmB,IACG,eAAexO,IAAOA,EAAK,OAAO,iBAClC,iBAAiBd,EAAM,SAAS,sBAAsB,cAAc,oBACvEA,EAAM,SAAS,kBAAC,QAAD;UAAM,OAAO;WAAE,SAAS;WAAM,YAAY;UAAI;UAA9C,UAAA;WAAiD;WAAGA,EAAM;WAAM;UAAO;SACnF,CAAA,CAAA,EAAA,CAAA,CACH;QACF,CAAA,CAAA;;MAEJ,CAAA;KAEJ;IAvqBE,GAAAA,EAAM,EAuqBR;GAET,CAAC;GAGA2L,KACC,kBAAC,OAAD;IAAK,OAAO,EAAE,eAAe,OAAO;IAClC,UAAA,kBAAC3J,IAAD;KACE,OAAO2J;KACA;KACP,YAAY,MAAYV,EAAY,QAAQtF,CAAO;KACnD,SAAS,MAAY;MAEnB,AADAsF,EAAY,YAAYU,EAAa,IAAIrL,CAAO,GAChDsL,GAAgB,IAAI;KACtB;KACA,eAAeA,GAAgB,IAAI;IACpC,CAAA;GACE,CAAA;GAINC,MACC,kBAAC,OAAD;IAAK,OAAO,EAAE,eAAe,OAAO;IAClC,UAAA,kBAACjF,IAAD;KACE,OAAOiF;KACP,MAAMjL,EAAM,MAAM,MAAM5H,EAAE,OAAO6S,GAAa,MAAM;KACpD,aAAaZ,EAAY,eAAe;KACxC,cAAcC,EAAOW,GAAa;KAClC,mBAAmBZ,EAAY,uBAAuB,KAAK;KAC3D,SAAS,MAAQ;MAEf,AADAA,EAAY,SAASY,GAAa,MAAMnK,CAAG,GAC3CoK,EAAgB,IAAI;KACtB;KACA,eAAe;MAEb,AADAb,EAAY,SAASY,GAAa,MAAM,IAAI,GAC5CC,EAAgB,IAAI;KACtB;KACA,eAAeA,EAAgB,IAAI;IACpC,CAAA;GACE,CAAA;EAEJ;;AAET;;;ACv9CA,SAAS8E,GAAsB,EAC7B,YAAS,WAAQ,UAAO,aAAU,gBAAgBC,GAAiB,iBAAiBC,GACpF,WAAWC,GAAY,YAAYC,GAAa,YAAS,cAAW,GAAG,kBAAe,mBACtF,cAAW,eAAY,gBAAa,yBAAsB,uBAAoB,wBAC9E,gBAAa,gBAAa,eAAW,sBAAmB,4BAAyB,kBAAe,gBAChG,2BAAwB,sBACxB,cAAW,mBAAe,eAAY,wBAAoB,eAC1D,sCAAmC,IAAM,iBACzC,gBAAa,oBAAiB,UAAU,uBAAmB,mBAAe,IAC1E,oBAAgB,IAAM,wBAAqB,QACvB;CACpB,IAAMC,IAAgBlpB,EAAOmpB,CAAU;CACvC,QAAgB;EACd,EAAc,UAAUA;CAC1B,GAAG,CAACA,CAAU,CAAC;CACf,IAAMC,KAAmBppB,EAAuB,IAAI,GAC9CyU,IAAYzU,EAA0B,IAAI,GAC1CqpB,KAAerpB,EAAuB,IAAI,GAC1CspB,IAAgBtpB,EAAY,IAAI,GAChCupB,KAAevpB,EAAqC,IAAI,GACxDwpB,KAAqBxpB,EAAO,EAAK,GACjC,CAACypB,IAAkBC,MAAuBhmB,EAAS,EAAK,GACxD,CAACimB,IAAaC,MAAkBlmB,EAAc,IAAI,GAGlD,CAACmmB,IAAcC,KAAmBpmB,QAC/B,OAAO,uBAAyB,OAAeoN,MAAY,CACnE;CA8BD,AA5BA5Q,QAAgB;EACd,IAAI,OAAO,uBAAyB,KAAa;GAC/C,EAAgB,EAAI;GACpB;EACF;EACA,IAAM6kB,IAAKqE,GAAiB;EAC5B,IAAI,CAACrE,GAAI;EAET,IAAMjQ,IAAW,IAAI,sBAClB,MAAY;GACX,IAAMiV,IAAQhV,EAAQ;GACtB,AAAIgV,KACFD,EAAgBC,EAAM,cAAc;EAExC,GACA;GACE,YAAY;GACZ,WAAW;EACb,CACF;EAGA,OADAjV,EAAS,QAAQiQ,CAAE,SACN;GACX,EAAS,WAAW;EACtB;CACF,GAAG,CAACjU,CAAO,CAAC,GAGZ5Q,QAAgB;EACd,IAAI,CAAC2pB,IAAc;GACjB,IAAIP,EAAc,SAAS;IACzB,IAAI;KAAE,EAAc,QAAQ,OAAO;IAAG,QAAQ,CAAC;IAC/C,EAAc,UAAU;GAC1B;GACA,IAAMlU,IAASX,EAAU;GAOzB,AANIW,KAAUoU,GAAmB,YAC/B,EAAO,QAAQ,GACf,EAAO,SAAS,GAChB,GAAmB,UAAU,IAC7BE,GAAoB,EAAK,IAEvBL,GAAa,YACf,GAAa,QAAQ,YAAY;EAErC;CACF,GAAG,CAACQ,EAAY,CAAC;CAEjB,IAAMG,KAAc7F,IAAgBjjB,GAC9B+oB,KAAe7F,IAAiBljB,GAEhC,CAACgpB,IAAgBC,MAAqBzmB,EAAS;EAAE;EAAQ;EAAS;CAAS,CAAC;CAgPlF,CA/OIwmB,GAAe,WAAWja,KAAUia,GAAe,YAAYpZ,KAAWoZ,GAAe,aAAalkB,OACxGmkB,GAAkB;EAAE;EAAQ;EAAS;CAAS,CAAC,GAC/CT,GAAoB,EAAK,IAG3BxpB,QAAgB;EACd,GAAmB,UAAU;CAC/B,GAAG;EAAC+P;EAAQa;EAAS9K;CAAQ,CAAC,GAG9B9F,QAAgB;EACd,IAAI+U,IAAc,IACdzB,IAAa,MAEX4W,IAAe,YAAY;GAC/B,IAAI,CAAC3V,EAAU,WAAW,CAACxE,KAAU,CAAC4Z,IAAc;GACpD,IAAIP,EAAc,SAAS;IACzB,IAAI;KAAE,EAAc,QAAQ,OAAO;IAAG,QAAQ,CAAC;IAC/C,EAAc,UAAU;GAC1B;GAEA,IAAIe,IAA4C;GAChD,IAAI;IACF,IAAMpf,IAAO,MAAMgF,EAAO,QAAQa,CAAO;IACzC,IAAImE,GAAa;KACf,IAAI;MAAE,EAAK,UAAU;KAAG,QAAQ,CAAC;KACjC;IACF;IAEA,AADA,IAAchK,GACd,GAAa,UAAUA;IAEvB,IAAMxJ,IAAc,KAAK,IAAI,OAAO,oBAAoB,GAAG,CAAC,GACtD6oB,IAAgBtT,GAAkB/L,EAAK,SAASjF,CAAQ,GACxDukB,IAAmBtf,EAAK,YAAY;KAAE,OAAO;KAAK,UAAUqf;IAAc,CAAC,GAE7E9oB,IAAcD,GAChBL,GACAO,GACA8oB,EAAiB,OACjBA,EAAiB,MACnB,GAEIpV,IAAWlK,EAAK,YAAY;KAAE,OAAOzJ;KAAa,UAAU8oB;IAAc,CAAC,GAEzEE,IAAa,SAAS,cAAc,QAAQ;IAElD,AADA,EAAW,QAAQ,KAAK,MAAMrV,EAAS,KAAK,GAC5C,EAAW,SAAS,KAAK,MAAMA,EAAS,MAAM;IAC9C,IAAIE,IAAMmV,EAAW,WAAW,IAAI;IASpC,IARA,AAMEnV,OAJA,KAA4B,IAC5B,IAAWpK,EAAK,YAAY;KAAE,OAAOzJ;KAAa,UAAU8oB;IAAc,CAAC,GAC3E,EAAW,QAAQ,KAAK,MAAMnV,EAAS,KAAK,GAC5C,EAAW,SAAS,KAAK,MAAMA,EAAS,MAAM,GACxCqV,EAAW,WAAW,IAAI,IAE9B,CAACnV,KAAOJ,GAAa;KAEvB,AADA,EAAW,QAAQ,GACnB,EAAW,SAAS;KACpB;IACF;IAEA,IAAMD,IAAa/J,EAAK,OAAO;KAC7B,eAAeoK;KACf,QAAQmV;KACE;IACZ,CAAC;IAMD,IALA,EAAc,UAAUxV,GACxB,MAAMA,EAAW,SACjB,EAAc,UAAU,MAGpBjE,KAAcA,EAAW,SAAS,GAAG;KAEvC,AADAsE,EAAI,KAAK,GACTA,EAAI,aAAa,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;KACjC,IAAMqB,IAAM1Q,IAAW,OAAQ,IAAIme,IAAgBC,GAC7C5N,IAAMxQ,IAAW,OAAQ,IAAIoe,IAAiBD;KAEpD,KAAK,IAAMsG,KAAa1Z,GACtB,IAAI0Z,EAAU,cAAc3Z,GAAS;MACnC,IAAM4Z,IAAU5T,GAAqB2T,EAAU,GAAGA,EAAU,GAAGA,EAAU,OAAOA,EAAU,QAAQzkB,GAAU0Q,GAAKF,CAAG,GAC9GmU,IAAKD,EAAQ,IAAIlpB,GACjBopB,IAAKF,EAAQ,IAAIlpB,GACjBqpB,IAAKH,EAAQ,QAAQlpB,GACrBspB,IAAKJ,EAAQ,SAASlpB;MAE5B,AAAIipB,EAAU,WAAW,aAAaA,EAAU,WAAW,KAAA,KACzD,EAAI,YAAY,WAChBpV,EAAI,SAAS,KAAK,MAAMsV,CAAE,GAAG,KAAK,MAAMC,CAAE,GAAG,KAAK,KAAKC,CAAE,GAAG,KAAK,KAAKC,CAAE,CAAC,MAEzE,EAAI,YAAY,uBAChBzV,EAAI,SAAS,KAAK,MAAMsV,CAAE,GAAG,KAAK,MAAMC,CAAE,GAAG,KAAK,KAAKC,CAAE,GAAG,KAAK,KAAKC,CAAE,CAAC,GACzE,EAAI,YAAY,KAAK,IAAI,GAAQtpB,KAAeN,KAAS,KAA7B,CAAgC,GAC5D,EAAI,cAAc,WAClBmU,EAAI,WAAW,KAAK,MAAMsV,CAAE,GAAG,KAAK,MAAMC,CAAE,GAAG,KAAK,KAAKC,CAAE,GAAG,KAAK,KAAKC,CAAE,CAAC;KAE/E;KAEF,EAAI,QAAQ;IACd;IAGA,IAAMC,IAAKC,MAAcC,KAAgB;KAAE,MAAMA;KAAe,SAAS;KAAM,MAAM;KAAI,MAAM;KAAS,OAAO;IAAU,IAAI,KAAA;IAC7H,IAAIF,KAAMA,EAAG,MAAM;KAEjB,AADA1V,EAAI,KAAK,GACTA,EAAI,aAAa,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;KAEjC,IAAM6V,IAAUH,EAAG,WAAW,KACxBI,IAAOJ,EAAG,QAAQ,SAClBK,IAAcD,MAAS,WAAW,KAAK,IACvCE,KAAQN,EAAG,QAAQK,KAAe5pB,GAClC8J,IAAOyf,EAAG;KAMhB,AAJA,EAAI,YAAYA,EAAG,SAAS,WAC5B,EAAI,cAAcG,GAClB,EAAI,OAAO,OAAOG,EAAK,gBACvB,EAAI,YAAY,UAChB,EAAI,eAAe;KAEnB,IAAMC,IAAUd,EAAW,OACrBe,IAAUf,EAAW;KAE3B,IAAIW,MAAS,UAGX,AAFA9V,EAAI,UAAUiW,IAAU,GAAGC,IAAU,CAAC,GACtClW,EAAI,OAAO,CAAC,KAAK,KAAK,CAAC,GACvBA,EAAI,SAAS/J,GAAM,GAAG,CAAC;UAClB;MACL,IAAMkgB,IAAQH,IAAO/f,EAAK,SAAS,KAAM,MAAM9J,GACzCiqB,IAAQ,MAAMjqB,GACdkqB,IAAO,KAAK,KAAKJ,IAAUA,IAAUC,IAAUA,CAAO;MAG5D,AADAlW,EAAI,UAAUiW,IAAU,GAAGC,IAAU,CAAC,GACtClW,EAAI,OAAO,CAAC,KAAK,KAAK,CAAC;MAEvB,KAAK,IAAI1S,IAAI,CAAC+oB,GAAM/oB,IAAI+oB,GAAM,KAAKD,GAAO;OACxC,IAAME,IAAa,KAAK,IAAIhpB,IAAI8oB,CAAK,IAAI,KAAMD,IAAQ;OACvD,KAAK,IAAI/oB,IAAI,CAACipB,GAAMjpB,IAAIipB,GAAM,KAAKF,GACjC,EAAI,SAASlgB,GAAM7I,IAAIkpB,GAAWhpB,CAAC;MAEvC;KACF;KACA,EAAI,QAAQ;IACd;IAGA,IAAMipB,IAAanX,EAAU;IAC7B,IAAImX,KAAc,CAAC3W,GAAa;KAE9B,AADA,EAAW,QAAQuV,EAAW,OAC9B,EAAW,SAASA,EAAW;KAC/B,IAAMqB,IAAUD,EAAW,WAAW,IAAI;KAM1C,AALIC,KACFA,EAAQ,UAAUrB,GAAY,GAAG,CAAC,GAEpC,GAAmB,UAAU,IAC7Bd,GAAoB,EAAI,GACxBR,EAAc,UAAUpY,CAAO;IACjC;IAGA,AADA,EAAW,QAAQ,GACnB,EAAW,SAAS;GACtB,SAAS4G,GAAU;IACjB,AAAIA,GAAK,SAAS,iCAChB,QAAQ,MAAM,QAAQ5G,EAAQ,kBAAkB4G,CAAG;GAEvD,UAAU;IACR,IAAI2S,GACF,IAAI;KAAE,EAAY,UAAU;IAAG,QAAQ,CAAC;IAE1C,AAAId,GAAa,YAAYc,MAC3B,GAAa,UAAU;GAE3B;EACF,GAKMyB,IAAQtC,GAAmB,UAAU,MAAM;EAGjD,OAFA,IAAQ,WAAWY,GAAc0B,CAAK,SAEzB;GAGX,IAFA,IAAc,IACVtY,KAAO,aAAaA,CAAK,GACzB8V,EAAc,SAAS;IACzB,IAAI;KAAE,EAAc,QAAQ,OAAO;IAAG,QAAQ,CAAC;IAC/C,EAAc,UAAU;GAC1B;GACA,IAAIC,GAAa,SAAS;IACxB,IAAI;KAAE,GAAa,QAAQ,UAAU;IAAG,QAAQ,CAAC;IACjD,GAAa,UAAU;GACzB;EACF;CACF,GAAG;EAACzY;EAASb;EAAQ/O;EAAO8E;EAAUme;EAAeC;EAAgB4G;EAAWC;EAAela;EAAY8Y;CAAY,CAAC,GAGxH3pB,QAAgB;EACd,IAAI+U,IAAc;EAuClB,QADA,YArC8B;GAC5B,IAAI;IAEF,IAAM3J,IAAO,OAAM,MADA2E,EAAO,QAAQa,CAAO,EAAA,CACjB,eAAe;IAGvC,IAAIC,KAAcA,EAAW,SAAS,GAAG;KACvC,IAAMC,IAAiBD,EAAW,QAAO,MAAKE,EAAE,cAAcH,CAAO;KACrE,AAAIE,EAAe,SAAS,MAE1B,EAAK,QAAQ1F,EAAK,MAAM,QAAQ,MAAc;MAC5C,IAAI+B,EAAK,IAAI,KAAK,MAAM,IAAI,OAAO;MAInC,IAAM8D,IAAQ9D,EAAK,UAAU,IACvB+D,IAAQ/D,EAAK,UAAU,IACvBgE,IAAQhE,EAAK,OACbiE,IAAQjE,EAAK;MAEnB,KAAK,IAAMmE,KAAOR,GAAgB;OAEhC,IAAMS,IAAa,KAAK,IAAIN,GAAOK,EAAI,CAAC,IAAI,KAAK,IAAIL,IAAQE,GAAOG,EAAI,IAAIA,EAAI,KAAK,GAC/EE,IAAa,KAAK,IAAIN,GAAOI,EAAI,CAAC,IAAI,KAAK,IAAIJ,IAAQE,GAAOE,EAAI,IAAIA,EAAI,MAAM;OAEtF,IAAIC,KAAcC,GAChB,OAAO;MAEX;MACA,OAAO;KACT,CAAC;IAEL;IAEA,AAAKuD,KAAa2U,GAAete,CAAI;GACvC,QAAQ,CAAC;EACX,EACA,CAAU,SACG;GAAE,IAAc;EAAM;CACrC,GAAG;EAAC2E;EAAQa;EAASC;CAAU,CAAC,GAGhC7Q,QAAgB;EACd,IAAM6rB,IAAY1C,GAAa;EAC/B,IAAI,CAACM,MAAe,CAACoC,KAAa,CAAClC,IAAc;EACjD,IAAI5U,IAAc;EAgDlB,QADA,YA7C+B;GAC7B,IAAI;IACF,IAAMhK,IAAO,MAAMgF,EAAO,QAAQa,CAAO;IACzC,IAAImE,GAAa;IACjB,IAAME,IAAWlK,EAAK,YAAY;KAAE,OAAO;KAAG,UAAU+L,GAAkB/L,EAAK,SAASjF,CAAQ;IAAE,CAAC,GAE/FgmB,IAAuBrC;IAC3B,IAAI5Y,KAAcA,EAAW,SAAS,GAAG;KACvC,IAAMC,IAAiBD,EAAW,QAAO,MAAKE,EAAE,cAAcH,CAAO;KACrE,IAAIE,EAAe,SAAS,GAAG;MAC7B,IAAMib,IAAgBtC,GAAY,MAAM,QAAQ,MAAc;OAC5D,IAAI,CAACtc,EAAK,OAAOA,EAAK,IAAI,KAAK,MAAM,IAAI,OAAO;OAChD,IAAM8D,IAAQ9D,EAAK,UAAU,IACvB+D,IAAQ/D,EAAK,UAAU,IACvBgE,IAAQhE,EAAK,OACbiE,IAAQjE,EAAK,UAAU,KAAK,IAAIA,EAAK,UAAU,EAAE,GACjDkE,IAAW4D,EAAS,SAAS/D,IAAQE;OAE3C,KAAK,IAAME,KAAOR,GAAgB;QAChC,IAAMS,IAAa,KAAK,IAAIN,GAAOK,EAAI,CAAC,IAAI,KAAK,IAAIL,IAAQE,GAAOG,EAAI,IAAIA,EAAI,KAAK,GAC/EE,IAAa,KAAK,IAAIH,GAAUC,EAAI,CAAC,IAAI,KAAK,IAAID,IAAWD,GAAOE,EAAI,IAAIA,EAAI,MAAM;QAC5F,IAAIC,KAAcC,GAChB,OAAO;OAEX;OACA,OAAO;MACT,CAAC;MACD,IAAuB;OAAE,GAAGiY;OAAa,OAAOsC;MAAc;KAChE;IACF;IAEA,IAAIhX,GAAa;IAOjB,AANA,EAAU,YAAY,IAMtB,MAAM,IALgBzV,GAAS,UAAU;KACvC,mBAAmBwsB;KACR;KACD;IACZ,CACM,CAAA,CAAU,OAAO;GACzB,SAAS,GAAG;IACV,AAAK/W,KACH,QAAQ,MAAM,4BAA4B,CAAC;GAE/C;EACF,EACA,CAAW,SACE;GACX,IAAc;EAChB;CACF,GAAG;EAAC0U;EAAa1Z;EAAQa;EAAS9K;EAAU+K;EAAY8Y;CAAY,CAAC;CAGrE,IAAM,CAACqC,GAAaC,MAAkBzoB,EAA6D,CAAC,CAAC;CACrG,QAAgB;EACd,IAAIuR,IAAc;EA6BlB,QADA,YA3BqC;GACnC,IAAI;IAEF,IAAMvB,IAAc,OAAM,MADPzD,EAAO,QAAQa,CAAO,EAAA,CACV,eAAe,EAAE,QAAQ,UAAU,CAAC;IACnE,IAAImE,GAAa;IACjB,IAAMmX,IAA4D,CAAC;IACnE,KAAK,IAAIve,IAAI,GAAGA,IAAI6F,EAAY,QAAQ,KAAK;KAC3C,IAAMlD,IAAIkD,EAAY7F;KACtB,IAAI2C,EAAE,YAAY,UAAU,MAAM,QAAQA,EAAE,IAAI,KAAKA,EAAE,KAAK,WAAW,GAAG;MACxE,IAAI6b,IAAY7b,EAAE;MAIlB,AAHI,CAAC6b,KAAa7b,EAAE,SAClB,IAAY,OAAOA,EAAE,QAAS,WAAW,IAAIA,EAAE,SAAS,MAAM,QAAQA,EAAE,IAAI,KAAK,OAAOA,EAAE,KAAK,MAAO,WAAW,SAASA,EAAE,KAAK,KAAK,MAAM,KAAA,IAE1I6b,KACFD,EAAM,KAAK;OACT,IAAI5b,EAAE,MAAM,eAAeM,EAAQ,GAAGjD;OACtC,MAAM2C,EAAE;OACR,KAAK6b;MACP,CAAC;KAEL;IACF;IACA,AAAKpX,KAAakX,GAAeC,CAAK;GACxC,QAAQ,CAER;EACF,EACA,CAAiB,SACJ;GACX,IAAc;EAChB;CACF,GAAG,CAACnc,GAAQa,CAAO,CAAC;CAEpB,IAAMwb,IAAkB5Y,EAAY,QAAO,MAAKlD,EAAE,cAAcM,CAAO,GACjEyb,IAAmB,CAACC,KAAoC/C;CAE9D,OACE,kBAAC,OAAD;EACE,KAAKL;EACL,IAAI,YAAYtY;EAChB,WAAU;EACV,eAAe;GAAE,CAAIqU,MAAe,QAAQA,MAAe,aAAUsH,GAAiB;EAAG;EACzF,OAAO;GACL,UAAU;GACV,KAAK,GAAGC,EAAQ;GAChB,MAAMC,MAAa,KAAA,IAA8B,QAAlB,GAAGA,EAAS;GAC3C,OAAO,GAAG3C,GAAY;GACtB,QAAQ,GAAGC,GAAa;GACxB,iBAAiB;GACjB,WAAW;GACX,cAAc;EAChB;EAdF,UAAA;GAgBE,kBAAC,UAAD;IAAQ,KAAKxV;IAAW,OAAO;KAAE,UAAU;KAAY,OAAO;KAAQ,QAAQ;KAAQ,MAAM;KAAG,KAAK;IAAE;GAAI,CAAA;GAE1G,kBAAC,OAAD;IACE,KAAK4U;IACL,WAAU;IACV,OAAO;KACL,UAAU;KACV,KAAK;KAAG,MAAM;KACd,WAAW,SAASnoB,EAAM;KAC1B,iBAAiB;KACjB,eAAgBqrB,KAAoBpH,MAAe,QAAS,SAAS;KACrE,SAAS;KACT,YAAYoH,IAAmB,YAAY;KAC3C,OAAO,GAAGpI,EAAc;KACxB,QAAQ,GAAGC,EAAe;KAC1B,QAAQ;IACV;GACD,CAAA;IAGEwI,KAAsBA,EAAmB,cAAc9b,KAAa+b,KAAuBA,EAAoB,SAAS,aAAc;IACvI,IAAMnW,IAAM1Q,IAAW,OAAQ,IAAIme,IAAgBC,GAC7C5N,IAAMxQ,IAAW,OAAQ,IAAIoe,IAAiBD;IAEpD,OACE,kBAAC,OAAD;KAAK,OAAO;MACV,UAAU;MAAY,KAAK;MAAG,MAAM;MAAG,OAAO;MAAQ,QAAQ;MAC9D,eAAe;MAAQ,QAAQ;MAC/B,YAAYoI,IAAmB,YAAY;MAC3C,SAAS;KACX;KALA,UAAA;MAME,kBAAC,SAAD,EAAA,UAAQ,qfAYC,CAAA;MAERK,KAAsBA,EAAmB,cAAc9b,KAAW8b,EAAmB,OAAO,KAAK,GAAG,MAAQ;OAC3G,IAAM9F,IAAMhQ,GAAqBrG,EAAE,GAAG+F,IAAM/F,EAAE,IAAIA,EAAE,QAAQA,EAAE,OAAOA,EAAE,QAAQzK,GAAU0Q,GAAKF,CAAG;OACjG,OACE,kBAAC,OAAD,EAA2B,OAAO;QAChC,UAAU;QACV,MAAM,GAAGsQ,EAAI,IAAI5lB,EAAM;QACvB,KAAK,GAAG4lB,EAAI,IAAI5lB,EAAM;QACtB,OAAO,GAAG4lB,EAAI,QAAQ5lB,EAAM;QAC5B,QAAQ,GAAG4lB,EAAI,SAAS5lB,EAAM;QAC9B,iBAAiB;QACjB,QAAQ;QACR,cAAc;QACd,WAAW;OACb,EAAI,GAVM,UAAUiX,GAUhB;MAER,CAAC;MAGA0U,KAAuBA,EAAoB,QAAO,MAAMC,EAAG,cAAchc,CAAO,CAAC,CAAC,KAAK,GAAI,MAC1F,kBAACzR,EAAM,UAAP,EAAA,UACGytB,EAAG,OAAO,KAAK,GAAG,MAAS;OAC1B,IAAMhG,IAAMhQ,GAAqBrG,EAAE,GAAG+F,IAAM/F,EAAE,IAAIA,EAAE,QAAQA,EAAE,OAAOA,EAAE,QAAQzK,GAAU0Q,GAAKF,CAAG,GAC3FuW,IAAKD,EAAG,SAAS,4BACjBE,IAASF,EAAG,eAAe;OACjC,OACE,kBAAC,OAAD;QAEE,OAAO;SACL,UAAU;SACV,MAAM,GAAGhG,EAAI,IAAI5lB,EAAM;SACvB,KAAK,GAAG4lB,EAAI,IAAI5lB,EAAM;SACtB,OAAO,GAAG4lB,EAAI,QAAQ5lB,EAAM;SAC5B,QAAQ,GAAG4lB,EAAI,SAAS5lB,EAAM;SAC9B,iBAAiB6rB;SACjB,QAAQ,eAAeC;SACvB,cAAc;SACd,WAAWF,EAAG,UAAU,KAA0D,SAAlD;SAChC,WAAW;SACX,QAAQ;QACV;QAEC,UAAAA,EAAG,WAAWG,MAAS,KACtB,kBAAC,OAAD;SAAK,OAAO;UACV,UAAU;UACV,QAAQ;UACR,MAAM;UACN,WAAW;UACX,cAAc;UACd,iBAAiB;UACjB,OAAO;UACP,UAAU;UACV,YAAY;UACZ,SAAS;UACT,cAAc;UACd,YAAY;UACZ,WAAW;UACX,QAAQ;UACR,eAAe;SACjB;SACG,UAAAH,EAAG,QAAQ,SAAS,KAAK,GAAGA,EAAG,QAAQ,MAAM,GAAG,EAAE,EAAE,OAAOA,EAAG;QAC5D,CAAA;OAEJ,GApCE,UAAUG,GAoCZ;MAET,CAAC,EACa,GA9CKH,EAAG,MAAM,MAAMI,GA8CpB,CACjB;KACE;;GAET,EAAA,CAAG;UAGK;IAGN,IAAMC,IAAepW,GAAqB/Q,GAF9BA,IAAW,OAAQ,IAAIme,IAAgBC,GACvCpe,IAAW,OAAQ,IAAIoe,IAAiBD,CACQ;IAC5D,OACE,kBAAC,OAAD;KACE,OAAO;MACL,UAAU;MAAY,KAAK;MAAG,MAAM;MAAG,OAAO;MAAQ,QAAQ;MAC9D,QAAQ,CAAC,YAAY,QAAQ,CAAC,CAAC,SAAS3c,CAAS,KAAK2d,IAAcA,MAAe,WAAW,SAAS,cAAe;MACtH,eAAgBA,MAAe,QAAQA,MAAe,SAASA,MAAe,YAAY,CAACoH,IAAoB,SAAS;MACxH,QAAQ;MACR,YAAYA,IAAmB,YAAY;MAC3C,SAAS;KACX;KACA,SAAS,OAAOpI,EAAc,GAAGC;KACjC,cAAc,MAAMgJ,EAAY,GAAGtc,CAAO;KAC1C,cAAc,MAAMuc,EAAY,GAAGvc,CAAO;KAC1C,YAAY,MAAMwc,GAAU,GAAGxc,CAAO;KACtC,eAAe,MAAMwc,GAAU,GAAGxc,CAAO;KAEzC,UAAA,kBAAC,KAAD;MAAG,WAAWqc;MAAd,UAAA,CAEGjB,EAAY,KAAK,MAAO;OACvB,IAAMzpB,IAAI8qB,EAAG,KAAK,IACZ5qB,IAAIyhB,IAAiBmJ,EAAG,KAAK,IAC7B5M,IAAI,KAAK,IAAI,GAAG4M,EAAG,KAAK,KAAKA,EAAG,KAAK,EAAE,GACvC3M,IAAI,KAAK,IAAI,GAAG2M,EAAG,KAAK,KAAKA,EAAG,KAAK,EAAE;OAC7C,OACE,kBAAC,QAAD;QAEK;QACA;QACH,OAAO5M;QACP,QAAQC;QACR,MAAK;QACL,OAAO;SAAE,eAAe;SAAO,QAAQ;QAAU;QACjD,UAAU,MAAM;SACd,AAAIpZ,MAAc,WAChB2M,EAAE,gBAAgB,GAClBC,KAAcmZ,EAAG,KAAK,KAAA,GAAWpZ,CAAC;QAEtC;QAEA,UAAA,kBAAC,SAAD,EAAA,UAAQoZ,EAAG,IAAW,CAAA;OAClB,GAfCA,EAAG,EAeJ;MAEV,CAAC,GACD,kBAACluB,EAAM,UAAP,EAAA,UAAA,CACGitB,EAAgB,KAAI,MAAO;OAClC,IAAMkB,IAAaC,EAAI,SAAS,UAAUA,EAAI,SAAS,YAAa,gBAAgB,GAAGA,EAAI,QAAQ,KAAK,MAAMA,EAAI,UAAU,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,GAAG,GAAG,KACvJC,IAAcD,EAAI,OAClB1G,IAAajT,MAAyB2Z,EAAI,IAC1CE,KAAaF,EAAI,SAAS,eAAeA,EAAI,UAAU,MAAM,CAAC;QAAC;QAAQ;QAAQ;QAAW;OAAW,CAAC,CAAC,SAASA,EAAI,IAAI,IAAI,aAAa,UAEzIG,IAAmB;QACvB,oBAAoBC,EAAuBJ,EAAI,EAAE;QACjD,UAAU,MAAwB;SAChC,EAAkBA,EAAI,IAAI,CAAC;QAC7B;QACA,gBAAgB,MAAwB;SACtC,IAA0BA,EAAI,IAAI,CAAC;QACrC;QACA,cAAc,MAAwB;SACpC,AAAI1G,KAAc+G,MAChB,EAAE,gBAAgB,GAClBA,EAAYL,EAAI,IAAI,GAAG3c,CAAO;QAElC;QACA,OAAO;SACL,eAAe;SACf,QAAQqU,MAAe,WAAW,YAAa4B,IAAa,SAAS;QACvE;OACF,GAEIgH,IAAQ;OAEZ,IAAIN,EAAI,SAAS,aACf,IAAQ,kBAAC,QAAD;QAAM,GAAGA,EAAI;QAAG,GAAGA,EAAI;QAAG,OAAOA,EAAI;QAAO,QAAQA,EAAI;QAAQ,MAAMD;QAAW,QAAQE;QAAa,aAAaD,EAAI;QAAa,OAAO,EAAE,cAAcE,EAAU;OAAI,CAAA;YAC5K,IAAIF,EAAI,SAAS,UAAUA,EAAI,MAAM;QAC1C,IAAMO,IAAOP,EAAI,SAASA,EAAI,QAAQ,IAAIA,EAAI,QAAQ,KAChDQ,IAAOR,EAAI,UAAUA,EAAI,SAAS,IAAIA,EAAI,SAAS;QACzD,IACE,kBAAC,KAAD,EAAA,UAAA,CACE,kBAAC,QAAD;SAAM,GAAGA,EAAI;SAAG,GAAGA,EAAI;SAAG,OAAOO;SAAM,QAAQC;SAAM,MAAK;SAAc,OAAO,EAAE,eAAe,MAAM;QAAI,CAAA,GAC1G,kBAAC,iBAAD;SAAe,GAAGR,EAAI;SAAG,GAAGA,EAAI;SAAG,OAAOO;SAAM,QAAQC;SAAM,OAAO;UAAE,UAAU;UAAW,eAAe;SAAO;SAChH,UAAA,kBAAC,OAAD;UACE,OAAO;WACL,OAAO,GAAGD,EAAK;WACf,WAAW,GAAGC,EAAK;WACnB,WAAW;WACX,cAAc;WACd,YAAY;WACZ,OAAOP;WACP,UAAU;WACV,YAAY;WACZ,YAAY;WACZ,YAAY;WACZ,WAAW;WACX,SAAS;UACX;UAEC,UAAAD,EAAI;SACF,CAAA;QACQ,CAAA,CACd,EAAA,CAAA;OAEP,OAAO,IAAIA,EAAI,SAAS,WACtB,IAAQ,kBAAC,WAAD;QAAS,IAAIA,EAAI,IAAIA,EAAI,QAAM;QAAG,IAAIA,EAAI,IAAIA,EAAI,SAAO;QAAG,IAAIA,EAAI,QAAM;QAAG,IAAIA,EAAI,SAAO;QAAG,MAAMD;QAAW,QAAQE;QAAa,aAAaD,EAAI;QAAa,OAAO,EAAE,cAAcE,EAAU;OAAI,CAAA;YAC3M,IAAIF,EAAI,SAAS,UAAUA,EAAI,QACpC,IACE,kBAAC,KAAD;QAAG,OAAO,EAAE,cAAcE,EAAU;QAApC,UAAA,CACE,kBAAC,QAAD;SAAM,IAAIF,EAAI,OAAO,EAAE,CAAC;SAAG,IAAIA,EAAI,OAAO,EAAE,CAAC;SAAG,IAAIA,EAAI,OAAO,EAAE,CAAC;SAAG,IAAIA,EAAI,OAAO,EAAE,CAAC;SAAG,QAAO;SAAc,aAAa,KAAK,IAAI,IAAIA,EAAI,cAAc,CAAC;QAAI,CAAA,GAChK,kBAAC,QAAD;SAAM,IAAIA,EAAI,OAAO,EAAE,CAAC;SAAG,IAAIA,EAAI,OAAO,EAAE,CAAC;SAAG,IAAIA,EAAI,OAAO,EAAE,CAAC;SAAG,IAAIA,EAAI,OAAO,EAAE,CAAC;SAAG,QAAQC;SAAa,aAAaD,EAAI;QAAc,CAAA,CAC7I;;YAEA,IAAIA,EAAI,SAAS,WAAWA,EAAI,QAAQ;QAC7C,IAAM,CAACS,GAAIC,KAAMV,EAAI,QACfW,IAAQ,KAAK,MAAMD,EAAG,IAAID,EAAG,GAAGC,EAAG,IAAID,EAAG,CAAC,GAC3CG,IAAU,KAAKZ,EAAI,aACnBa,IAAK;SAAE,GAAGH,EAAG,IAAIE,IAAU,KAAK,IAAID,IAAQ,KAAK,KAAK,CAAC;SAAG,GAAGD,EAAG,IAAIE,IAAU,KAAK,IAAID,IAAQ,KAAK,KAAK,CAAC;QAAE,GAC5GG,IAAK;SAAE,GAAGJ,EAAG,IAAIE,IAAU,KAAK,IAAID,IAAQ,KAAK,KAAK,CAAC;SAAG,GAAGD,EAAG,IAAIE,IAAU,KAAK,IAAID,IAAQ,KAAK,KAAK,CAAC;QAAE;QAClH,IACE,kBAAC,KAAD;SAAG,OAAO,EAAE,cAAcT,EAAU;SAApC,UAAA;UACE,kBAAC,QAAD;WAAM,IAAIO,EAAG;WAAG,IAAIA,EAAG;WAAG,IAAIC,EAAG;WAAG,IAAIA,EAAG;WAAG,QAAO;WAAc,aAAa,KAAK,IAAI,IAAIV,EAAI,cAAc,CAAC;UAAI,CAAA;UACpH,kBAAC,QAAD;WAAM,IAAIS,EAAG;WAAG,IAAIA,EAAG;WAAG,IAAIC,EAAG;WAAG,IAAIA,EAAG;WAAG,QAAQT;WAAa,aAAaD,EAAI;UAAc,CAAA;UAClG,kBAAC,QAAD;WAAM,GAAG,KAAKa,EAAG,EAAE,GAAGA,EAAG,EAAE,KAAKH,EAAG,EAAE,GAAGA,EAAG,EAAE,KAAKI,EAAG,EAAE,GAAGA,EAAG;WAAK,MAAK;WAAO,QAAQb;WAAa,aAAaD,EAAI;WAAa,eAAc;WAAQ,gBAAe;UAAS,CAAA;SAC9K;;OAEP,OAAO,IAAIA,EAAI,SAAS,eAAeA,EAAI,UAAU,KAAA,KAAaA,EAAI,WAAW,KAAA,GAAW;QAC1F,IAAMe,IAAUf,EAAI,SAASA,EAAI,MAAM,SAAS,IAAIA,EAAI,QAAQ,CAAC;SAAE,GAAGA,EAAI;SAAG,GAAGA,EAAI;SAAG,OAAOA,EAAI;SAAO,QAAQA,EAAI;QAAO,CAAC;QAC7H,IACE,kBAAC,KAAD;SAAG,OAAO,EAAE,cAAc,WAAW;SAClC,UAAAe,EAAQ,KAAK,GAAG,MACf,kBAAC,QAAD;UAAc,GAAGvd,EAAE;UAAG,GAAGA,EAAE;UAAG,OAAOA,EAAE;UAAO,QAAQA,EAAE;UAAQ,MAAMyc;UAAa,SAASD,EAAI;SAAU,GAA/F5f,CAA+F,CAC3G;QACA,CAAA;OAEP,OAAO,IAAI4f,EAAI,SAAS,aAAa;QACnC,IAAMgB,IAAUhB,EAAI,SAASA,EAAI,MAAM,SAAS,IAAIA,EAAI,QAAQ,CAAC;SAAE,GAAGA,EAAI;SAAG,GAAGA,EAAI;SAAG,OAAOA,EAAI;SAAO,QAAQA,EAAI;QAAO,CAAC,GACvHX,IAAKW,EAAI,eAAe;QAC9B,IACE,kBAAC,KAAD,EAAA,UACGgB,EAAQ,KAAK,GAAG,MACf,kBAACpvB,EAAM,UAAP,EAAA,UAAA,CACE,kBAAC,QAAD;SAAM,GAAG4R,EAAE;SAAG,GAAGA,EAAE;SAAG,OAAOA,EAAE;SAAO,QAAQA,EAAE;SAAQ,MAAK;QAAe,CAAA,GAC5E,kBAAC,QAAD;SACE,IAAIA,EAAE;SACN,IAAIA,EAAE,IAAIA,EAAE,SAAS6b,IAAK;SAC1B,IAAI7b,EAAE,IAAIA,EAAE;SACZ,IAAIA,EAAE,IAAIA,EAAE,SAAS6b,IAAK;SAC1B,QAAQY;SACR,aAAaZ;SACb,eAAc;QACf,CAAA,CACa,EAAA,GAXKjf,CAWL,CACjB,EACA,CAAA;OAEP,OAAO,IAAI4f,EAAI,SAAS,aAAa;QACnC,IAAMiB,IAAUjB,EAAI,SAASA,EAAI,MAAM,SAAS,IAAIA,EAAI,QAAQ,CAAC;SAAE,GAAGA,EAAI;SAAG,GAAGA,EAAI;SAAG,OAAOA,EAAI;SAAO,QAAQA,EAAI;QAAO,CAAC,GACvHX,IAAKW,EAAI,eAAe;QAC9B,IACE,kBAAC,KAAD,EAAA,UACGiB,EAAQ,KAAK,GAAG,MACf,kBAACrvB,EAAM,UAAP,EAAA,UAAA,CACE,kBAAC,QAAD;SAAM,GAAG4R,EAAE;SAAG,GAAGA,EAAE;SAAG,OAAOA,EAAE;SAAO,QAAQA,EAAE;SAAQ,MAAK;QAAe,CAAA,GAC5E,kBAAC,QAAD;SACE,IAAIA,EAAE;SACN,IAAIA,EAAE,IAAIA,EAAE,SAAS;SACrB,IAAIA,EAAE,IAAIA,EAAE;SACZ,IAAIA,EAAE,IAAIA,EAAE,SAAS;SACrB,QAAQyc;SACR,aAAaZ;SACb,eAAc;QACf,CAAA,CACa,EAAA,GAXKjf,CAWL,CACjB,EACA,CAAA;OAEP,OAAO,IAAI4f,EAAI,SAAS,YAAY;QAClC,IAAMkB,IAAUlB,EAAI,SAASA,EAAI,MAAM,SAAS,IAAIA,EAAI,QAAQ,CAAC;SAAE,GAAGA,EAAI;SAAG,GAAGA,EAAI;SAAG,OAAOA,EAAI;SAAO,QAAQA,EAAI;QAAO,CAAC,GACvHX,IAAKW,EAAI,eAAe,KACxBmB,KAAqB,GAAW,GAAW,MAAkB;SACjE,IAAIxqB,IAAI,KAAK3B,EAAE,GAAGE,KAEdksB,IAAK;SACT,KAAK,IAAIC,IAAKrsB,GAAGqsB,IAAKrsB,IAAIgN,GAAO,KAAM,GAAM;UAC3C,IAAMsf,IAAQ,KAAK,IAAID,IAAK,GAAMrsB,IAAIgN,CAAK,GACrCuf,IAAOF,KAAMC,IAAQD,KAAM;UAGjC,AADA,KAAK,MAAME,EAAK,GAAGrsB,KADRksB,IAAK,OAAO,KACG,IAAIE,EAAM,GAAGpsB,KACvC,IAAK,CAACksB;SACR;SACA,OAAOzqB;QACT;QACA,IACE,kBAAC,KAAD,EAAA,UACGuqB,EAAQ,KAAK,GAAG,MACf,kBAACtvB,EAAM,UAAP,EAAA,UAAA,CACE,kBAAC,QAAD;SAAM,GAAG4R,EAAE;SAAG,GAAGA,EAAE;SAAG,OAAOA,EAAE;SAAO,QAAQA,EAAE;SAAQ,MAAK;QAAe,CAAA,GAC5E,kBAAC,QAAD;SACE,GAAG2d,EAAkB3d,EAAE,GAAGA,EAAE,IAAIA,EAAE,SAAS,GAAGA,EAAE,KAAK;SACrD,MAAK;SACL,QAAQyc;SACR,aAAaZ;SACb,eAAc;SACd,gBAAe;QAChB,CAAA,CACa,EAAA,GAVKjf,CAUL,CACjB,EACA,CAAA;OAEP,OAAO,IAAI4f,EAAI,SAAS,UAEtB,IACE,kBAAC,KAAD,EAAA,UAAA,CACE,kBAAC,QAAD;QAAM,GAAGA,EAAI;QAAG,GAAGA,EAAI;QAAG,OAAOA,EAAI;QAAO,QAAQA,EAAI;QAAQ,MAAK;QAAO,QAAQC;QAAa,aAAY;QAAI,iBAAgB;QAAM,SAAS;OAAM,CAAA,GACrJD,EAAI,cAAcA,EAAI,QAAQ,MAC7B,kBAAC,QAAD;QAAM,GAAGA,EAAI,IAAI;QAAG,GAAGA,EAAI,IAAI;QAAG,MAAMC;QAAa,UAAS;QAAM,YAAW;QAAa,SAAS;QAAM,UAAAD,EAAI;OAAiB,CAAA,CAEjI,EAAA,CAAA;YAEA,IAAIA,EAAI,SAAS,UAAUA,EAAI,UAAU,KAAA,KAAaA,EAAI,WAAW,KAAA,GAAW;QACrF,IAAIA,EAAI,MAAM;SACZ,IAAMwB,IAAYxB,EAAI,SAASA,EAAI,UAAU,gBAAgBC,IAAc;SAC3E,IACE,kBAAC,QAAD;UAAM,GAAGD,EAAI;UAAG,GAAGA,EAAI,IAAI;UAAI,MAAMwB;UAAW,UAAS;UAAO,YAAW;UAAa,gBAAe;UAAY,OAAO,EAAE,QAAQ,UAAU;UAC3I,UAAAxB,EAAI;SACD,CAAA;QAEV,OAAO;SACL,IAAMrR,IAAcqR,EAAI,SAASA,EAAI,UAAU,gBAAgBC,IAAc;SAC7E,IAAQ,kBAAC,QAAD;UAAM,GAAGD,EAAI;UAAG,GAAGA,EAAI;UAAG,OAAOA,EAAI;UAAO,QAAQA,EAAI;UAAQ,MAAK;UAAc,QAAQ1G,IAAa3K,IAAc,GAAGA,EAAY;UAAK,aAAa2K,IAAa,MAAM;UAAK,iBAAiBA,IAAa,SAAS;SAAM,CAAA;QACtO;OACF,OAAO,IAAI0G,EAAI,SAAS,eAAeA,EAAI,SAAS,UAAUA,EAAI,SAAS;QACzE,IAAMyB,IAAUzB,EAAI,WAAWA,EAAI,QAAQ,SAAS,IAAIA,EAAI,UAAU,CAACA,EAAI,UAAU,CAAC,CAAC;QACvF,IACE,kBAAC,KAAD;SAAG,OAAO,EAAE,cAAcE,EAAU;SACjC,UAAAuB,EAAQ,QAAO,MAAMC,EAAG,SAAS,CAAC,CAAC,CAAC,KAAK,GAAI,MAAM;UAClD,IAAM/qB,IAAI,KAAK+qB,EAAG,KAAI,MAAK,GAAG9rB,EAAE,EAAE,GAAGA,EAAE,GAAG,CAAC,CAAC,KAAK,KAAK;UACtD,OACE,kBAAChE,EAAM,UAAP,EAAA,UAAA,CACE,kBAAC,QAAD;WAAS;WAAG,MAAK;WAAO,QAAO;WAAc,aAAa,KAAK,IAAI,IAAIouB,EAAI,cAAc,CAAC;WAAG,gBAAe;WAAQ,eAAc;UAAS,CAAA,GAC3I,kBAAC,QAAD;WAAS;WAAG,MAAK;WAAO,QAAQC;WAAa,aAAaD,EAAI;WAAa,gBAAe;WAAQ,eAAc;UAAS,CAAA,CAC3G,EAAA,GAHK5f,CAGL;SAEpB,CAAC;QACA,CAAA;OAEP,OAAO,IAAI4f,EAAI,SAAS,QACtB,IACE,kBAAC,KAAD;QAAG,WAAW,aAAaA,EAAI,EAAE,IAAIA,EAAI,EAAE;QAA3C,UAAA,CACE,kBAAC,QAAD;SAAM,OAAM;SAAK,QAAO;SAAK,IAAG;SAAI,MAAMD;SAAW,QAAQE;SAAa,aAAaD,EAAI;QAAc,CAAA,GACzG,kBAAC,QAAD;SAAM,GAAE;SAAyB,QAAO;SAAO,aAAY;SAAI,eAAc;QAAS,CAAA,CACrF;;YAEA,IAAIA,EAAI,SAAS,aAAaA,EAAI,QACvC,IACE,kBAAC,KAAD,EAAA,UAAA;QACE,kBAAC,QAAD;SAAM,IAAIA,EAAI,OAAO,EAAE,CAAC;SAAG,IAAIA,EAAI,OAAO,EAAE,CAAC;SAAG,IAAIA,EAAI,OAAO,EAAE,CAAC;SAAG,IAAIA,EAAI,OAAO,EAAE,CAAC;SAAG,QAAQC;SAAa,aAAaD,EAAI;SAAa,iBAAgB;QAAK,CAAA;QAClK,kBAAC,QAAD;SAAM,GAAGA,EAAI,OAAO,EAAE,CAAC;SAAG,GAAGA,EAAI,OAAO,EAAE,CAAC;SAAG,OAAOA,EAAI,OAAOA,EAAI,KAAK,SAAS,IAAI,KAAK;SAAK,QAAO;SAAK,MAAK;SAAO,QAAQC;SAAa,aAAaD,EAAI;QAAc,CAAA;QAC5K,kBAAC,QAAD;SAAM,GAAGA,EAAI,OAAO,EAAE,CAAC,IAAI;SAAI,GAAGA,EAAI,OAAO,EAAE,CAAC,IAAI;SAAI,MAAMC;SAAa,UAAS;SAAO,YAAW;SAAc,UAAAD,EAAI;QAAW,CAAA;OAClI,EAAA,CAAA;YAEA,IAAIA,EAAI,SAAS,eAAeA,EAAI,UAAU;QACnD,IAAM2B,IAAU3B,EAAI,YAAY,IAAI,KAAKA,EAAI,SAAS,CAAC,CAAC,mBAAmB,SAAS;SAAE,KAAK;SAAW,OAAO;SAAS,MAAM;QAAU,CAAC,IAAI,IACrI4B,IAAa5B,EAAI,SAAS,uBAAuBA,EAAI,OAAO,KAAK2B,MAAY;QAEnF,IACE,kBAAC,KAAD,EAAA,UAAA,CACE,kBAAC,SAAD;SAAO,MAAM3B,EAAI;SAAU,GAAGA,EAAI;SAAG,GAAGA,EAAI;SAAG,OAAOA,EAAI;SAAO,QAAQA,EAAI;SAAQ,qBAAoB;QAAiB,CAAA,GACzH4B,KACC,kBAAC,QAAD;SACE,IAAI5B,EAAI,KAAK,MAAMA,EAAI,SAAS,OAAO;SACvC,IAAIA,EAAI,KAAK,MAAMA,EAAI,UAAU,MAAM;SACvC,MAAK;SACL,UAAS;SACT,YAAW;SACX,YAAW;SAEV,UAAA4B;QACG,CAAA,CAEP,EAAA,CAAA;OAEP,OAAO,IAAI5B,EAAI,SAAS,iCAAiC;QACvD,IAAM2B,IAAU3B,EAAI,YAAY,IAAI,KAAKA,EAAI,SAAS,CAAC,CAAC,eAAe,OAAO,IAAI,IAC5E6B,IAAK7B,EAAI,KAAK,GACd8B,IAAK9B,EAAI,KAAK,GACd+B,IAAK/B,EAAI,SAAS,KAClBgC,IAAKhC,EAAI,UAAU,IACnBiC,IAAQF,IAAK;QAEnB,IACE,kBAAC,KAAD,EAAA,UAAA;SACE,kBAAC,QAAD;UAAM,GAAGF;UAAI,GAAGC;UAAI,OAAOC;UAAI,QAAQC;UAAI,MAAK;UAA2B,QAAO;UAAU,aAAY;SAAK,CAAA;SAC7G,kBAAC,QAAD;UAAM,IAAIH,IAAKI;UAAO,IAAIH;UAAI,IAAID,IAAKI;UAAO,IAAIH,IAAKE;UAAI,QAAO;UAAU,aAAY;SAAK,CAAA;SAG7F,kBAAC,KAAD;UAAG,WAAW,aAAaH,IAAKI,IAAM,IAAI,GAAG,IAAIH,IAAKE,IAAG,IAAI,GAAG;UAAhE,UAAA,CACE,kBAAC,QAAD;WAAM,GAAE;WAAoD,MAAK;WAAO,QAAO;WAAU,aAAY;WAAI,gBAAe;UAAS,CAAA,GACjI,kBAAC,QAAD;WAAM,GAAE;WAAqB,MAAK;WAAO,QAAO;WAAU,aAAY;WAAI,eAAc;WAAQ,gBAAe;UAAS,CAAA,CACvH;;SAEH,kBAAC,QAAD;UAAM,GAAGH,IAAKI,IAAQ;UAAI,GAAGH,IAAK;UAAI,MAAK;UAAU,UAAS;UAAS,YAAW;UAAO,YAAW;UAApG,UAAA,CAAiH,wBAC1F9B,EAAI,UAAU,uBAC/B;;SACN,kBAAC,QAAD;UAAM,GAAG6B,IAAKI,IAAQ;UAAI,GAAGH,IAAK;UAAI,MAAK;UAAU,UAAS;UAAO,YAAW;UAAhF,UAAA,CAA6F,UACpFH,CACH;;SACN,kBAAC,QAAD;UAAM,GAAGE,IAAKI,IAAQ;UAAI,GAAGH,IAAK;UAAI,MAAK;UAAU,UAAS;UAAO,YAAW;UAAa,UAAA;SAEvF,CAAA;QACL,EAAA,CAAA;OAEP;OAEA,OACE,kBAAC,KAAD;QAAgB,GAAI3B;QAApB,UAAA,CACGG,GACAhH,YAAqB;SACpB,IAAMpG,IAAI8M,EAAI,SAASA,EAAI,QAAQ,IAAIA,EAAI,QAAQ,IAC7C7M,IAAI6M,EAAI,UAAUA,EAAI,SAAS,IAAIA,EAAI,SAAS,IAChDkC,IAAc;UAAC;UAAQ;UAAa;UAAW;UAAa;UAAa;UAAa;SAAU,CAAC,CAAC,SAASlC,EAAI,IAAI,GACnHmC,IAAyE;UAC7E,IAAI;WAAE,GAAGnC,EAAI;WAAG,GAAGA,EAAI;WAAG,QAAQ;UAAc;UAChD,GAAG;WAAE,GAAGA,EAAI,IAAI9M,IAAI;WAAG,GAAG8M,EAAI;WAAG,QAAQ;UAAY;UACrD,IAAI;WAAE,GAAGA,EAAI,IAAI9M;WAAG,GAAG8M,EAAI;WAAG,QAAQ;UAAc;UACpD,GAAG;WAAE,GAAGA,EAAI,IAAI9M;WAAG,GAAG8M,EAAI,IAAI7M,IAAI;WAAG,QAAQ;UAAY;UACzD,IAAI;WAAE,GAAG6M,EAAI,IAAI9M;WAAG,GAAG8M,EAAI,IAAI7M;WAAG,QAAQ;UAAc;UACxD,GAAG;WAAE,GAAG6M,EAAI,IAAI9M,IAAI;WAAG,GAAG8M,EAAI,IAAI7M;WAAG,QAAQ;UAAY;UACzD,IAAI;WAAE,GAAG6M,EAAI;WAAG,GAAGA,EAAI,IAAI7M;WAAG,QAAQ;UAAc;UACpD,GAAG;WAAE,GAAG6M,EAAI;WAAG,GAAGA,EAAI,IAAI7M,IAAI;WAAG,QAAQ;UAAY;SACvD;SAEA,OACE,kBAAC,KAAD;UAAG,WAAU;UAAb,UAAA,CACE,kBAAC,QAAD;WACE,GAAG6M,EAAI,IAAI;WAAG,GAAGA,EAAI,IAAI;WACzB,OAAO9M,IAAI;WACX,QAAQC,IAAI;WACZ,MAAK;WAAO,QAAO;WAAiB,aAAY;WAAM,iBAAgB;WACtE,OAAO,EAAE,eAAe,OAAO;UAChC,CAAA,GACA,CAAC6M,EAAI,YAAYkC,KAAeE,KAAiB,OAAO,QAAQD,CAAY,CAAC,CAAC,KAAK,CAACE,GAAWC,OAC9F,kBAAC,QAAD;WAEE,GAAGA,EAAM,IAAI;WACb,GAAGA,EAAM,IAAI;WACb,OAAO;WACP,QAAQ;WACR,MAAK;WACL,QAAO;WACP,aAAY;WACZ,IAAI;WACJ,OAAO;YAAE,QAAQA,EAAM;YAAQ,eAAe;WAAM;WACpD,cAAc,MAAM;YAElB,AADA5b,EAAE,gBAAgB,GAClB0b,EAAcpC,EAAI,IAAIqC,GAAW3b,GAAGrD,CAAO;WAC7C;UACD,GAdMgf,CAcN,CACF,CACA;;QAEP,EAAA,CAAG,CACF;OA/CK,GAAArC,EAAI,EA+CT;MAEP,CAAC,GAEA1c,KAAcA,EAAW,QAAO,MAAKE,EAAE,cAAcH,KAAWG,EAAE,WAAW,SAAS,CAAC,CAAC,KAAK,GAAG,MAC/F,kBAAC,KAAD;OAEE,OAAO,EAAE,QAAQ,UAAU;OAC3B,UAAU,MAAM;QAEd,AADAkD,EAAE,gBAAgB,GAClB6b,KAAqB/e,CAAC;OACxB;OANF,UAAA;QAQE,kBAAC,SAAD,EAAA,UAAO,kCAAsC,CAAA;QAC7C,kBAAC,QAAD;SACE,GAAGA,EAAE;SACL,GAAGA,EAAE;SACL,OAAOA,EAAE;SACT,QAAQA,EAAE;SACV,MAAK;SACL,QAAO;SACP,aAAa;SACb,iBAAgB;QACjB,CAAA;QACD,kBAAC,QAAD;SACE,GAAGA,EAAE,IAAI;SACT,GAAGA,EAAE,IAAI,KAAK,IAAIA,EAAE,SAAS,GAAG,EAAE;SAClC,MAAK;SACL,UAAS;SACT,YAAW;SACX,eAAc;SACf,UAAA;QAEK,CAAA;QAELA,EAAE,QAAQ,MAAMA,EAAE,SAAS,MAC1B,kBAAC,KAAD;SAAG,WAAW,aAAaA,EAAE,IAAIA,EAAE,QAAQ,GAAG,IAAIA,EAAE,IAAI,EAAE;SAA1D,UAAA,CACE,kBAAC,QAAD;UAAM,OAAM;UAAK,QAAO;UAAK,IAAG;UAAI,MAAK;SAAW,CAAA,GACpD,kBAAC,QAAD;UAAM,GAAE;UAA0C,QAAO;UAAU,aAAY;UAAI,eAAc;SAAS,CAAA,CACzG;;OAEJ;MAnCI,GAAAA,EAAE,MAAM,WAAWkH,GAmCvB,CACJ,CACa,EAAA,CAAA,CACf;;IACQ,CAAA;GAET,EAAA,CAAG;GAGF+K,KACC,kBAACF,IAAD;IACW;IACF;IACG;IACK;IACC;IACL;IACX,YAAYiN,KAAkB;IAC9B,eAAeC,aAA4B,CAAC;IAC/B;IACC;IACC;IACK;GACrB,CAAA;EAEA;;AAET;AAEA,IAAMC,KAAe9wB,EAAM,KAAKwpB,KAAwB,GAAW,MAC1DuH,EAAU,YAAYC,EAAU,WAChCD,EAAU,WAAWC,EAAU,UAC/BD,EAAU,UAAUC,EAAU,SAC9BD,EAAU,aAAaC,EAAU,YACjCD,EAAU,kBAAkBC,EAAU,iBACtCD,EAAU,mBAAmBC,EAAU,kBACvCD,EAAU,YAAYC,EAAU,WAChCD,EAAU,aAAaC,EAAU,YACjCD,EAAU,cAAcC,EAAU,aAClCD,EAAU,eAAeC,EAAU,cACnCD,EAAU,mBAAmBC,EAAU,kBACvCD,EAAU,kBAAkBC,EAAU,iBACtCD,EAAU,uBAAuBC,EAAU,sBAC3CD,EAAU,gBAAgBC,EAAU,eACpCD,EAAU,iBAAiBC,EAAU,gBACrCD,EAAU,yBAAyBC,EAAU,wBAC7CD,EAAU,uBAAuBC,EAAU,sBAC3CD,EAAU,cAAcC,EAAU,aAClCD,EAAU,kBAAkBC,EAAU,iBACtCD,EAAU,eAAeC,EAAU,cACnCD,EAAU,gBAAgBC,EAAU,eACpCD,EAAU,wBAAwBC,EAAU,uBAC5CD,EAAU,qCAAqCC,EAAU,gCACjE;;;AC5iCD,SAAgBC,KAA0B;CACxC,IAAI,OAAO,SAAW,OAAe,OAAO,OAAO,cAAe,YAChE,OAAO,OAAO,WAAW;CAG3B,IAAMC,IAAM,MAAM,KAAK,EAAE,QAAQ,GAAG,SAAS,KAAK,MAAM,KAAK,OAAO,IAAI,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE;CACjG,OAAO,GAAGA,EAAI,MAAM,GAAG,CAAC,EAAE,GAAGA,EAAI,MAAM,GAAG,EAAE,EAAE,IAAIA,EAAI,MAAM,IAAI,EAAE,EAAE,IAAIA,EAAI,MAAM,IAAI,EAAE,EAAE,GAAGA,EAAI,MAAM,IAAI,EAAE;AAC/G;;;ACPA,eAAsBC,GAAoB,GAAgC;CACxE,IAAI,CAACllB,GAAM,OAAO;CAGlB,IAAI,OAAO,YAAc,OAAe,UAAU,aAAa,OAAO,UAAU,UAAU,aAAc,YACtG,IAAI;EAEF,OADA,MAAM,UAAU,UAAU,UAAUA,CAAI,GACjC;CACT,QAAQ,CAER;CAIF,IAAI,OAAO,WAAa,KACtB,IAAI;EACF,IAAMmlB,IAAW,SAAS,cAAc,UAAU;EAUlD,AATA,EAAS,QAAQnlB,GACjBmlB,EAAS,aAAa,YAAY,EAAE,GACpC,EAAS,MAAM,UAAU,UACzB,EAAS,MAAM,WAAW,SAC1B,EAAS,MAAM,OAAO,WACtB,EAAS,MAAM,MAAM,WACrB,EAAS,MAAM,UAAU,KACzB,SAAS,KAAK,YAAYA,CAAQ,GAClCA,EAAS,OAAO,GAChBA,EAAS,kBAAkB,GAAGnlB,EAAK,MAAM;EACzC,IAAMolB,IAAa,SAAS,YAAY,MAAM;EAE9C,OADA,SAAS,KAAK,YAAYD,CAAQ,GAC3BC;CACT,SAAShZ,GAAK;EAEZ,OADA,QAAQ,MAAM,8CAA8CA,CAAG,GACxD;CACT;CAGF,OAAO;AACT;;;AC5BA,IAAaiZ,MAA6D,EAAE,iBAAc,WAAQ,6BAA0B;CAC1H,IAAM,CAACC,GAAcC,KAAmBntB,EAAiB,EAAE,GACrD,CAACqF,GAAU+nB,KAAeptB,EAA+C,IAAI,GAC7E,CAACqtB,GAAQC,KAAattB,EAAkB,EAAK,GAC7CutB,IAAajxB,EAA6C,IAAI,GAE9DkxB,IAAiBlkB,QAAkB;EACvC,IAAI,OAAO,SAAW,KAAa;EACnC,IAAMmkB,IAAY,OAAO,aAAa;EAEtC,IAAI,CAACA,KAAaA,EAAU,eAAe,CAACA,EAAU,cAAc,CAAC3c,EAAa,SAAS;GAEzF,AADAsc,EAAY,IAAI,GAChBD,EAAgB,EAAE;GAClB;EACF;EAEA,IAAMO,IAAQD,EAAU,WAAW,CAAC,GAC9BE,IAAiBD,EAAM;EAG7B,IAAI,CAAC5c,EAAa,QAAQ,SAAS6c,CAAc,GAAG;GAElD,AADAP,EAAY,IAAI,GAChBD,EAAgB,EAAE;GAClB;EACF;EAEA,IAAMvlB,IAAO6lB,EAAU,SAAS,CAAC,CAAC,KAAK;EACvC,IAAI,CAAC7lB,GAAM;GAET,AADAwlB,EAAY,IAAI,GAChBD,EAAgB,EAAE;GAClB;EACF;EAEA,IAAMS,IAAYF,EAAM,sBAAsB;EAC9C,IAAIE,EAAU,UAAU,KAAKA,EAAU,WAAW,GAAG;GAEnD,AADAR,EAAY,IAAI,GAChBD,EAAgB,EAAE;GAClB;EACF;EAEA,IAAMU,IAAgB/c,EAAa,QAAQ,sBAAsB,GAE3Dgd,IADUF,EAAU,OAAOA,EAAU,QAAQ,IACzBC,EAAc,OAAO/c,EAAa,QAAQ,YAGhEid,IAASH,EAAU,MAAMC,EAAc,MAAM/c,EAAa,QAAQ,YAAY;EAMlF,AALIid,IAASjd,EAAa,QAAQ,YAAY,MAC5C,IAAS8c,EAAU,SAASC,EAAc,MAAM/c,EAAa,QAAQ,YAAY,IAGnFqc,EAAgBvlB,CAAI,GACpBwlB,EAAY;GAAE,KAAKW;GAAQ,MAAMD;EAAQ,CAAC;CAC5C,GAAG,CAAChd,CAAY,CAAC;CA+CjB,OA7CAtU,QAAgB;EACd,IAAMwxB,UAA8B;GAElC,sBAAsBR,CAAc;EACtC;EAEA,SAAS,iBAAiB,mBAAmBQ,CAAqB;EAClE,IAAM3F,IAAYvX,EAAa;EAK/B,OAJIuX,KACFA,EAAU,iBAAiB,UAAUmF,GAAgB,EAAE,SAAS,GAAK,CAAC,SAG3D;GAKX,AAJA,SAAS,oBAAoB,mBAAmBQ,CAAqB,GACjE3F,KACFA,EAAU,oBAAoB,UAAUmF,CAAc,GAEpDD,EAAW,WACb,aAAaA,EAAW,OAAO;EAEnC;CACF,GAAG,CAACzc,GAAc0c,CAAc,CAAC,GAoB7B,CAACnoB,KAAY,CAAC6nB,IACT,OAIP,kBAAC,OAAD;EACE,MAAK;EACL,cAAW;EACX,OAAO;GACL,UAAU;GACV,KAAK,GAAG7nB,EAAS,IAAI;GACrB,MAAM,GAAGA,EAAS,KAAK;GACvB,WAAW;GACX,QAAQ;GACR,SAAS;GACT,YAAY;GACZ,iBAAiB;GACjB,cAAc;GACd,SAAS;GACT,WAAW;GACX,eAAe;GACf,YAAY;GACZ,YAAY;GACZ,WAAW;EACb;EACA,cAAc,MAAM;GAGlB,AADA,EAAE,eAAe,GACjB,EAAE,gBAAgB;EACpB;EAxBF,UAAA;GA0BE,kBAAC,SAAD,EAAA,UAAQ,wLAKC,CAAA;GACT,kBAAC,UAAD;IACE,SAAS,OAxDW,MAAwB;KAIhD,AAHA,EAAE,eAAe,GACjB,EAAE,gBAAgB,GAEb6nB,KAGD,MADkBJ,GAAoBI,CAAY,MAEpDI,EAAU,EAAI,GACd9nB,IAAS0nB,CAAY,GAEjBK,EAAW,WAAS,aAAaA,EAAW,OAAO,GACvD,EAAW,UAAU,iBAAiB;MACpC,EAAU,EAAK;KACjB,GAAG,IAAI;IAEX;IAyCM,OAAO;KACL,SAAS;KACT,YAAY;KACZ,KAAK;KACL,YAAY;KACZ,QAAQ;KACR,OAAOF,IAAS,YAAY;KAC5B,QAAQ;KACR,UAAU;KACV,YAAY;KACZ,SAAS;KACT,cAAc;KACd,YAAY;IACd;IACA,eAAe,MAAM;KACnB,EAAE,cAAc,MAAM,kBAAkB;IAC1C;IACA,eAAe,MAAM;KACnB,EAAE,cAAc,MAAM,kBAAkB;IAC1C;IACA,OAAM;IAtBR,UAAA,CAwBGA,IAAS,kBAAClO,GAAD;KAAO,MAAM;KAAI,OAAM;IAAW,CAAA,IAAI,kBAACzc,GAAD;KAAM,MAAM;KAAI,OAAM;IAAW,CAAA,GACjF,kBAAC,QAAD,EAAA,UAAO2qB,IAAS,YAAY,OAAa,CAAA,CACnC;;GAEPY,KACC,kBAAA9yB,IAAA,EAAA,UAAA;IACE,kBAAC,OAAD,EAAK,OAAO;KAAE,OAAO;KAAO,QAAQ;KAAQ,iBAAiB;KAA4B,QAAQ;IAAQ,EAAI,CAAA;IAC7G,kBAAC,UAAD;KACE,UAAU,MAAM;MAA2C,AAAzC,EAAE,eAAe,GAAG,EAAE,gBAAgB,GAAG8yB,EAAoB,WAAW;KAAG;KAC7F,OAAO;MACL,SAAS;MAAQ,YAAY;MAAU,gBAAgB;MACvD,OAAO;MAAQ,QAAQ;MAAQ,YAAY;MAAe,QAAQ;MAClE,cAAc;MAAO,QAAQ;MAAW,SAAS;KACnD;KACA,eAAe,MAAM;MAAE,EAAE,cAAc,MAAM,kBAAkB;KAA6B;KAC5F,eAAe,MAAM;MAAE,EAAE,cAAc,MAAM,kBAAkB;KAAe;KAC9E,OAAM;KAEN,UAAA,kBAACC,GAAD;MAAa,MAAM;MAAI,OAAM;KAAW,CAAA;IAClC,CAAA;IACR,kBAAC,UAAD;KACE,UAAU,MAAM;MAA2C,AAAzC,EAAE,eAAe,GAAG,EAAE,gBAAgB,GAAGD,EAAoB,WAAW;KAAG;KAC7F,OAAO;MACL,SAAS;MAAQ,YAAY;MAAU,gBAAgB;MACvD,OAAO;MAAQ,QAAQ;MAAQ,YAAY;MAAe,QAAQ;MAClE,cAAc;MAAO,QAAQ;MAAW,SAAS;KACnD;KACA,eAAe,MAAM;MAAE,EAAE,cAAc,MAAM,kBAAkB;KAA6B;KAC5F,eAAe,MAAM;MAAE,EAAE,cAAc,MAAM,kBAAkB;KAAe;KAC9E,OAAM;KAEN,UAAA,kBAACE,IAAD;MAAW,MAAM;MAAI,OAAM;KAAW,CAAA;IAChC,CAAA;IACR,kBAAC,UAAD;KACE,UAAU,MAAM;MAA2C,AAAzC,EAAE,eAAe,GAAG,EAAE,gBAAgB,GAAGF,EAAoB,WAAW;KAAG;KAC7F,OAAO;MACL,SAAS;MAAQ,YAAY;MAAU,gBAAgB;MACvD,OAAO;MAAQ,QAAQ;MAAQ,YAAY;MAAe,QAAQ;MAClE,cAAc;MAAO,QAAQ;MAAW,SAAS;KACnD;KACA,eAAe,MAAM;MAAE,EAAE,cAAc,MAAM,kBAAkB;KAA6B;KAC5F,eAAe,MAAM;MAAE,EAAE,cAAc,MAAM,kBAAkB;KAAe;KAC9E,OAAM;KAEN,UAAA,kBAACG,IAAD;MAAe,MAAM;MAAI,OAAM;KAAW,CAAA;IACpC,CAAA;IACR,kBAAC,UAAD;KACE,UAAU,MAAM;MAA2C,AAAzC,EAAE,eAAe,GAAG,EAAE,gBAAgB,GAAGH,EAAoB,UAAU;KAAG;KAC5F,OAAO;MACL,SAAS;MAAQ,YAAY;MAAU,gBAAgB;MACvD,OAAO;MAAQ,QAAQ;MAAQ,YAAY;MAAe,QAAQ;MAClE,cAAc;MAAO,QAAQ;MAAW,SAAS;KACnD;KACA,eAAe,MAAM;MAAE,EAAE,cAAc,MAAM,kBAAkB;KAA6B;KAC5F,eAAe,MAAM;MAAE,EAAE,cAAc,MAAM,kBAAkB;KAAe;KAC9E,OAAM;KAEN,UAAA,kBAAC,OAAD;MAAK,OAAO;MAAI,QAAQ;MAAI,SAAQ;MAAY,MAAK;MAAO,QAAO;MAAU,aAAY;MAAM,eAAc;MAAQ,gBAAe;MAClI,UAAA,kBAAC,QAAD,EAAM,GAAE,sDAAuD,CAAA;KAC5D,CAAA;IACC,CAAA;GACR,EAAA,CAAA;EAED;;AAET;;;ACpOA,eAAsBI,GACpB,GACA,GACsB;CACtB,IAAMhhB,IAA0B,CAAC;CACjC,IAAI,CAACd,KAAU,CAAC+hB,KAAWA,EAAQ,WAAW,GAAG,OAAOjhB;CAExD,IAAMV,IAAWJ,EAAO,UAElBgiB,IAAgBD,EAAQ,KAAI,MAAK,IAAI,OAAO/gB,GAAGA,EAAE,MAAM,SAAS,GAAG,IAAIA,EAAE,QAAQA,EAAE,QAAQ,GAAG,CAAC,GAC/FihB,oBAAkB,IAAI,IAAY;CAExC,KAAK,IAAIphB,IAAU,GAAGA,KAAWT,GAAU,KACzC,IAAI;EACF,IAAMpF,IAAO,MAAMgF,EAAO,QAAQa,CAAO,GACnCqE,IAAWlK,EAAK,YAAY,EAAE,OAAO,EAAE,CAAC,GAExCsE,KAAQ,MADYtE,EAAK,eAAe,EAAA,CACpB,OAEpB,EAAE,aAAU,gBAAa,mBAAgBmD,GAAcmB,CAAK;EAGlE,KAAK,IAAM4iB,KAAeF,GAAe;GACvC,IAAIC,EAAgB,IAAIC,CAAW,GAAG;GAEtC,EAAY,YAAY;GAGxB,IAAMC,IAAY,OAAO,cAAgB,MAAc,YAAY,IAAI,IAAI,KAAK,IAAI,GAC9EC,IAAU,CAAC,GAAGhkB,EAAS,SAAS8jB,CAAW,CAAC,GAC5CG,KAAW,OAAO,cAAgB,MAAc,YAAY,IAAI,IAAI,KAAK,IAAI,KAAKF;GAExF,AAAIE,IAAU,QACZ,QAAQ,KACN,+CAA+CA,EAAQ,QAAQ,CAAC,EAAE,aAAaxhB,EAAQ,4CACvFqhB,EAAY,MACd,GACAD,EAAgB,IAAIC,CAAW;GAGjC,KAAK,IAAMriB,KAASuiB,GAAS;IAC3B,IAAIviB,EAAM,UAAU,KAAA,GAAW;IAE/B,IAAMyiB,IAAaziB,EAAM,OACnB0iB,IAAc1iB,EAAM,EAAE,CAAC,QAGvBd,oBAAc,IAAI,IAA0C;IAClE,KAAK,IAAInB,IAAI0kB,GAAY1kB,IAAI0kB,IAAaC,GAAa,KAAK;KAC1D,IAAMrjB,IAAUb,EAAYT,IACtBuB,IAAUb,EAAYV;KAC5B,IAAIsB,MAAY,KAAA,KAAaA,MAAY,IAAI;MAC3C,IAAME,IAAWL,EAAY,IAAIG,CAAO;MACxC,AAAIE,KACF,EAAS,MAAM,KAAK,IAAIA,EAAS,KAAKD,CAAO,GAC7C,EAAS,MAAM,KAAK,IAAIC,EAAS,KAAKD,CAAO,KAE7CJ,EAAY,IAAIG,GAAS;OAAE,KAAKC;OAAS,KAAKA;MAAQ,CAAC;KAE3D;IACF;IAGA,EAAY,SAAS,GAAW,MAAc;KAC5C,IAAM/B,IAAOkC,EAAMC;KACnB,IAAI,CAACnC,KAAQ,CAACA,EAAK,WAAW;KAI9B,IAAMolB,IAAKplB,EAAK,UAAU,IACpBqlB,IAAKrlB,EAAK,UAAU,IACpBslB,IAAS,KAAK,IAAItlB,EAAK,UAAU,EAAE,GAEnCsC,KAAUtC,EAAK,OAAO,GAAA,CAAI,QAC1BuC,IAAYD,IAAS,IAAItC,EAAK,QAAQsC,IAAStC,EAAK,OAEpDwC,IAAS4iB,IAAMG,EAAU,MAAMhjB,GAC/BG,KAAe6iB,EAAU,MAAMA,EAAU,MAAO,KAAKhjB,GACrDijB,IAAcxlB,EAAK,UAAUslB,GAG7BG,IAAO3d,EAAS,SAASud,IAAKG;KAEpC,EAAW,KAAK;MACd,IAAI,SAAS/hB,EAAQ,GAAG,KAAK,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,OAAO,GAAG,CAAC;MAC9D,WAAWA;MACX,GAAGjB,IAAS;MACZ,GAAGijB,IAAO;MACV,OAAO/iB,IAAc;MACrB,QAAQ8iB,IAAe;MACvB,QAAQ;KACV,CAAC;IACH,CAAC;GACH;EACF;EAMA,AAHA5nB,EAAK,QAAQ,GAGT6F,IAAU,KAAM,KAClB,MAAM,IAAI,SAAQ,MAAW,WAAWmB,GAAS,CAAC,CAAC;CAEvD,SAAS,GAAG;EACV,QAAQ,MAAM,0BAA0BnB,EAAQ,uBAAuB,CAAC;CAC1E;CAGF,OAAOC;AACT;;;ACpGA,IAAagiB,KAAuC;CAAE,OAAO;CAAK,QAAQ;AAAI;AAM9E,SAAgBC,GACd,GACA,IAA2BD,IACV;CACjB,IAAI1iB,KAAY,GAAG,OAAO,CAAC;CAC3B,IAAM4iB,IAAM;EAAE,OAAOC,EAAU;EAAO,QAAQA,EAAU;CAAO;CAC/D,OAAO,MAAM,KAAK,EAAE,QAAQ7iB,EAAS,UAAU,EAAE,GAAG4iB,EAAI,EAAE;AAC5D;AAMA,SAAgBE,GACd,GACA,GACA,GACA,IAAM,IACK;CACX,IAAMC,IAAUC,EAAK,KAAK,MACpBC,EAAI,WAAW,IAAUC,IACX,KAAK,IAAI,GAAGD,EAAI,KAAK,MAAME,EAAQnwB,CAAC,CAAC,CAAC,MAAM,CACvD,IAAYnC,IAAQqyB,CAC5B,GAEKE,IAAiB,CAAC,GACpBC,IAAM;CACV,KAAK,IAAM9S,KAAKwS,GAEd,AADAK,EAAK,KAAKC,CAAG,GACb,KAAO9S;CAGT,OAAO;EAAE;EAAS;EAAM,OAAO8S;CAAI;AACrC;AAKA,SAAgBC,GACd,GACA,GACA,IAAY,IACH;CACT,IAAIC,EAAM,WAAWC,EAAM,QAAQ,OAAO;CAC1C,KAAK,IAAIhmB,IAAI,GAAGA,IAAI+lB,EAAM,QAAQ,KAAK;EACrC,IAAMpjB,IAAIojB,EAAM/lB,IACV4C,IAAIojB,EAAMhmB;EAChB,IACE,KAAK,IAAI2C,EAAE,QAAQC,EAAE,KAAK,IAAIqjB,KAC9B,KAAK,IAAItjB,EAAE,SAASC,EAAE,MAAM,IAAIqjB,GAEhC,OAAO;CAEX;CACA,OAAO;AACT;;;ACzCA,IAAIC,KAA4B,CAAC;AAEjC,SAAgBC,GAAmB,GAA4B;CAE7D,AADA,KAAa;EAAE,GAAGD;EAAY,GAAGE;CAAM,GACnCA,EAAM,cACR,GAAS,oBAAoB,YAAYA,EAAM;AAEnD;AAEA,SAAgBC,IAA4C;CAC1D,OAAOH;AACT;AAGA,SAAgBI,IAA8B;CAC5C,OAAO,GAAQJ,GAAW,aAAav0B,GAAS,oBAAoB;AACtE;AAOA,SAAgB40B,KAA+B;CAC7C,IAAI,GAAmB,GACvB,MAAU,MACR,0OAGF;AACF;AAGA,SAAgBC,KAAqD;CACnE,IAAMnyB,IAA0C,CAAC;CAQjD,OAPI6xB,GAAW,YACb,EAAO,UAAUA,GAAW,SAC5B,EAAO,aAAa,KAElBA,GAAW,wBAAqB,EAAO,sBAAsBA,GAAW,sBACxEA,GAAW,YAAS,EAAO,UAAUA,GAAW,UAChDA,GAAW,WAAQ,EAAO,SAASA,GAAW,SAC3C7xB;AACT;AAGA,IAAaoyB,KAAuB90B,GAAS;;;ACnE7C,SAAwB+0B,GAAqB,EAC3C,UACA,UACA,iBAAc,OACd,mBACA,mBAC4B;CAC5B,IAAM,CAACC,GAAWC,KAAgB/wB,EAAwB,IAAI;CAE9D,IAAI,CAACgxB,KAASA,EAAM,WAAW,GAAG,OAAO;CAEzC,IAAMC,IAAgBD,EAAM,QAAO,MAC7BE,MAAgB,cAAoBnkB,EAAE,SAAS,cAAcA,EAAE,SAAS,iBACxEmkB,MAAgB,eAAoBnkB,EAAE,SAAS,cAAcA,EAAE,SAAS,cAE7E;CAED,OACE,kBAAC,OAAD;EACE,WAAU;EACV,OAAO;GACL,UAAU;GACV,KAAK;GACL,MAAM;GACN,OAAO;GACP,QAAQ;GACR,eAAe;GACf,QAAQ;EACV;EAVF,UAAA,CAYE,kBAAC,SAAD,EAAA,UAAQ,waAYC,CAAA,GACRkkB,EAAc,KAAK,MAAQ;GAC1B,IAAM5N,IAAa8N,MAAmBC,EAAI,IACpCC,IAAYP,MAAcM,EAAI,IAEhC/H,IAAK,4BACLC,IAAS,uBACTgI,IAAa,WACbC,IAAc;GAElB,AAAIH,EAAI,SAAS,cACf,IAAK/N,IAAa,4BAA4B,2BAC9C,IAASA,IAAa,sBAAsB,uBAC5C,IAAa,WACb,IAAc,aACL+N,EAAI,SAAS,eACtB,IAAK/N,IAAa,6BAA6B,4BAC/C,IAASA,IAAa,sBAAsB,uBAC5C,IAAa,WACb,IAAc;GAGhB,IAAMtkB,IAAIqyB,EAAI,IAAI5zB,GACZyB,IAAImyB,EAAI,IAAI5zB,GACZyf,IAAImU,EAAI,QAAQ5zB,GAChB,IAAI4zB,EAAI,SAAS5zB;GAEvB,OACE,kBAAC,OAAD;IAEE,IAAI,kBAAkB4zB,EAAI;IAC1B,UAAU,MAAM;KAEd,AADA3gB,EAAE,gBAAgB,GAClB+gB,IAAeJ,EAAI,EAAE;IACvB;IACA,oBAAoBL,EAAaK,EAAI,EAAE;IACvC,oBAAoBL,EAAa,IAAI;IACrC,OAAO;KACL,UAAU;KACV,MAAM,GAAGhyB,EAAE;KACX,KAAK,GAAGE,EAAE;KACV,OAAO,GAAGge,EAAE;KACZ,QAAQ,GAAG,EAAE;KACb,iBAAiBoM;KACT;KACR,cAAc;KACd,QAAQ;KACR,eAAe;KACf,WAAWhG,IAAa,+CAA+C;KACvE,WAAWA,IACP,yDACAgO,IACA,+BACA;KACJ,YAAY;KACZ,QAAQhO,IAAa,KAAKgO,IAAY,KAAK;IAC7C;IACA,OAAO,GAAGE,EAAY,IAAIH,EAAI;IAE5B,WAAAC,KAAahO,MACb,kBAAC,OAAD;KACE,OAAO;MACL,UAAU;MACV,QAAQ;MACR,MAAM;MACN,WAAW;MACX,cAAc;MACd,iBAAiB;MACjB,OAAO;MACP,UAAU;MACV,YAAY;MACZ,SAAS;MACT,cAAc;MACd,YAAY;MACZ,WAAW;MACX,QAAQ;MACR,SAAS;MACT,YAAY;MACZ,KAAK;MACL,eAAe;KACjB;KApBF,UAAA;MAsBE,kBAAC,QAAD;OAAM,OAAO;QAAE,OAAOiO;QAAY,YAAY;QAAK,eAAe;QAAa,UAAU;OAAO;OAC7F,UAAAC;MACG,CAAA;MACN,kBAAC,QAAD;OAAM,OAAO;QAAE,UAAU;QAAS,UAAU;QAAU,cAAc;OAAW;OAA/E,UAAA;QAAkF;QAC9EH,EAAI;QAAK;OACP;;MACN,kBAAC,OAAD,EAAK,OAAO;OACV,UAAU;OACV,KAAK;OACL,MAAM;OACN,WAAW;OACX,OAAO;OACP,QAAQ;OACR,YAAY;OACZ,aAAa;OACb,WAAW;MACb,EAAI,CAAA;KACD;;GAEJ,GAxEEA,EAAI,EAwEN;EAET,CAAC,CACE;;AAET;;;AC5HA,SAAwBK,GAAiB,EACvC,YACA,YACA,YACA,UACA,aACA,iBACA,cACA,eACA,gBACA,cACA,kBACA,eACA,YAAS,CAAC,GACV,YAAS,CAAC,GACV,mBACA,iBACA,sCAAmC,IACnC,aAAU,IACV,oBAAiB,GACjB,aACA,iBACwB;CACxB,IAAMC,IAAap1B,EAAuB,IAAI,GACxCq1B,IAAgBr1B,EAAuB,IAAI,GAC3Cs1B,IAAgBt1B,EAAuB,IAAI,GAC3Cu1B,IAAev1B,EAAO,EAAK,GAG3B,CAACw1B,GAAcC,MAAmB/xB,EAAiB,EAAE,GACrD,CAACgyB,GAAqBC,MAA0BjyB,EAAkB,EAAK,GAGvE,CAACkyB,GAAWC,MAAgBnyB,EAAkB,EAAK,GACnDoyB,IAAc91B,EAOV,IAAI,GAGR,CAAC+1B,GAAWC,MAAgBtyB,EAA4C;EAAE,OAAO;EAAG,QAAQ;CAAE,CAAC,GAC/F,CAACuyB,GAAWC,KAAgBxyB,EAA4C;EAAE,OAAO;EAAG,QAAQ;CAAE,CAAC,GAE/FyyB,KAAwBnpB,QAAkB;EAO9C,AANIqoB,EAAc,WAChBW,GAAa;GACX,OAAOX,EAAc,QAAQ;GAC7B,QAAQA,EAAc,QAAQ;EAChC,CAAC,GAECC,EAAc,WAChBY,EAAa;GACX,OAAOZ,EAAc,QAAQ;GAC7B,QAAQA,EAAc,QAAQ;EAChC,CAAC;CAEL,GAAG,CAAC,CAAC;CAyBL,AAvBAp1B,QAAgB;EACd,GAAsB;EAEtB,IAAMk2B,IAAMf,EAAc,WAAW,OAAO,iBAAmB,MAC3D,IAAI,eAAec,EAAqB,IACxC,MACEE,IAAMf,EAAc,WAAW,OAAO,iBAAmB,MAC3D,IAAI,eAAea,EAAqB,IACxC;EAOJ,OALIC,KAAOf,EAAc,WAASe,EAAI,QAAQf,EAAc,OAAO,GAC/DgB,KAAOf,EAAc,WAASe,EAAI,QAAQf,EAAc,OAAO,GAEnE,OAAO,iBAAiB,UAAUa,EAAqB,SAE1C;GAGX,AAFAC,GAAK,WAAW,GAChBC,GAAK,WAAW,GAChB,OAAO,oBAAoB,UAAUF,EAAqB;EAC5D;CACF,GAAG,CAACA,IAAuBX,CAAY,CAAC,GAGxCt1B,QAAgB;EACd,IAAMo2B,IAAMjB,EAAc,SACpBkB,IAAMjB,EAAc;EAC1B,IAAI,CAACgB,KAAO,CAACC,GAAK;EAElB,IAAMC,UAAiB;GACrB,IAAIjB,EAAa,WAAWK,GAAW;GACvC,EAAa,UAAU;GACvB,IAAMa,IAAgBH,EAAI,eAAeA,EAAI,cACvCI,IAAgBH,EAAI,eAAeA,EAAI;GAC7C,AAAIE,IAAgB,KAAKC,IAAgB,IACvC,EAAI,YAAaJ,EAAI,YAAYG,IAAiBC,IAElD,EAAI,YAAYJ,EAAI;GAGtB,IAAMK,IAAiBL,EAAI,cAAcA,EAAI,aACvCM,IAAiBL,EAAI,cAAcA,EAAI;GAM7C,AALII,IAAiB,KAAKC,IAAiB,IACzC,EAAI,aAAcN,EAAI,aAAaK,IAAkBC,IAErD,EAAI,aAAaN,EAAI,YAEvB,iBAAiB;IAAE,EAAa,UAAU;GAAO,GAAG,EAAE;EACxD,GAEMO,UAAiB;GACrB,IAAItB,EAAa,WAAWK,GAAW;GACvC,EAAa,UAAU;GACvB,IAAMa,IAAgBH,EAAI,eAAeA,EAAI,cACvCI,IAAgBH,EAAI,eAAeA,EAAI;GAC7C,AAAIE,IAAgB,KAAKC,IAAgB,IACvC,EAAI,YAAaH,EAAI,YAAYG,IAAiBD,IAElD,EAAI,YAAYF,EAAI;GAGtB,IAAMI,IAAiBL,EAAI,cAAcA,EAAI,aACvCM,IAAiBL,EAAI,cAAcA,EAAI;GAM7C,AALII,IAAiB,KAAKC,IAAiB,IACzC,EAAI,aAAcL,EAAI,aAAaK,IAAkBD,IAErD,EAAI,aAAaJ,EAAI,YAEvB,iBAAiB;IAAE,EAAa,UAAU;GAAO,GAAG,EAAE;EACxD;EAKA,OAHAD,EAAI,iBAAiB,UAAUE,CAAQ,GACvCD,EAAI,iBAAiB,UAAUM,CAAQ,SAE1B;GAEX,AADAP,EAAI,oBAAoB,UAAUE,CAAQ,GAC1CD,EAAI,oBAAoB,UAAUM,CAAQ;EAC5C;CACF,GAAG,CAACjB,CAAS,CAAC;CAGd,IAAMkB,MAA4B,MAAwB;EAExD,AADA,EAAE,eAAe,GACjBnB,GAAuB,EAAI;CAC7B,GAEMoB,MAA6B,MAAyB;EAC1D,GAAuB,EAAI;CAC7B,GAEMC,UAAmC;EACvC,GAAgB,EAAE;CACpB;CAEA,QAAgB;EACd,IAAI,CAACtB,GAAqB;EAE1B,IAAMrI,KAAe,MAAkB;GACrC,IAAI,CAAC+H,EAAW,SAAS;GACzB,IAAM1U,IAAO0U,EAAW,QAAQ,sBAAsB;GACtD,IAAI1U,EAAK,SAAS,GAAG;GAErB,IAAMuW,KADU,EAAE,UAAUvW,EAAK,QACVA,EAAK,QAAS;GACrC,GAAgB,KAAK,IAAI,IAAI,KAAK,IAAI,IAAIuW,CAAG,CAAC,CAAC;EACjD,GAEMC,KAAe,MAAkB;GACrC,IAAI,CAAC9B,EAAW,WAAW,CAAC,EAAE,QAAQ,IAAI;GAC1C,IAAM1U,IAAO0U,EAAW,QAAQ,sBAAsB;GACtD,IAAI1U,EAAK,SAAS,GAAG;GAErB,IAAMuW,KADU,EAAE,QAAQ,EAAE,CAAC,UAAUvW,EAAK,QACrBA,EAAK,QAAS;GACrC,GAAgB,KAAK,IAAI,IAAI,KAAK,IAAI,IAAIuW,CAAG,CAAC,CAAC;EACjD,GAEME,UAAkB;GACtB,GAAuB,EAAK;EAC9B;EAUA,OARA,OAAO,iBAAiB,aAAa9J,CAAW,GAChD,OAAO,iBAAiB,WAAW8J,CAAS,GAC5C,OAAO,iBAAiB,aAAaD,CAAW,GAChD,OAAO,iBAAiB,YAAYC,CAAS,GAE7C,SAAS,KAAK,MAAM,aAAa,QACjC,SAAS,KAAK,MAAM,SAAS,oBAEhB;GAMX,AALA,OAAO,oBAAoB,aAAa9J,CAAW,GACnD,OAAO,oBAAoB,WAAW8J,CAAS,GAC/C,OAAO,oBAAoB,aAAaD,CAAW,GACnD,OAAO,oBAAoB,YAAYC,CAAS,GAChD,SAAS,KAAK,MAAM,aAAa,IACjC,SAAS,KAAK,MAAM,SAAS;EAC/B;CACF,GAAG,CAACzB,CAAmB,CAAC;CAGxB,IAAM0B,KAAwB,MAAwB;EACpD,AAAIjS,MAAe,SAAS,EAAE,WAAW,MACvC,EAAE,eAAe,GACjB0Q,GAAa,EAAI,GACjB,EAAY,UAAU;GACpB,GAAG,EAAE;GACL,GAAG,EAAE;GACL,aAAaR,EAAc,SAAS,cAAc;GAClD,YAAYA,EAAc,SAAS,aAAa;GAChD,aAAaC,EAAc,SAAS,cAAc;GAClD,YAAYA,EAAc,SAAS,aAAa;EAClD;CAEJ;CAuCA,AArCAp1B,QAAgB;EACd,IAAI,CAAC01B,GAAW;EAEhB,IAAMvI,KAAe,MAAkB;GACrC,IAAI,CAACyI,EAAY,SAAS;GAC1B,IAAMxQ,IAAK,EAAE,UAAUwQ,EAAY,QAAQ,GACrCvQ,IAAK,EAAE,UAAUuQ,EAAY,QAAQ;GAM3C,AAJIT,EAAc,YAChB,EAAc,QAAQ,aAAaS,EAAY,QAAQ,cAAcxQ,GACrE,EAAc,QAAQ,YAAYwQ,EAAY,QAAQ,aAAavQ,IAEjE+P,EAAc,YAChB,EAAc,QAAQ,aAAaQ,EAAY,QAAQ,cAAcxQ,GACrE,EAAc,QAAQ,YAAYwQ,EAAY,QAAQ,aAAavQ;EAEvE,GAEM+H,UAAkB;GAEtB,AADAuI,GAAa,EAAK,GAClB,EAAY,UAAU;EACxB;EAOA,OALA,OAAO,iBAAiB,aAAaxI,CAAW,GAChD,OAAO,iBAAiB,WAAWC,CAAS,GAC5C,SAAS,KAAK,MAAM,aAAa,QACjC,SAAS,KAAK,MAAM,SAAS,kBAEhB;GAIX,AAHA,OAAO,oBAAoB,aAAaD,CAAW,GACnD,OAAO,oBAAoB,WAAWC,CAAS,GAC/C,SAAS,KAAK,MAAM,aAAa,IACjC,SAAS,KAAK,MAAM,SAAS;EAC/B;CACF,GAAG,CAACsI,CAAS,CAAC,GAGd11B,QAAgB;EACd,IAAM6kB,IAAKqQ,EAAW;EACtB,IAAI,CAACrQ,GAAI;EACT,IAAMsS,KAAe,MAAkB;GACrC,CAAI,EAAE,WAAW,EAAE,aACjB,EAAE,eAAe,GACb,EAAE,SAAS,IACbpwB,IAAW,IAEXF,KAAY;EAGlB;EAEA,OADAge,EAAG,iBAAiB,SAASsS,GAAa,EAAE,SAAS,GAAM,CAAC,SAC/C;GACX,EAAG,oBAAoB,SAASA,CAAW;EAC7C;CACF,GAAG,CAACpwB,GAAUF,EAAS,CAAC;CAGxB,IAAM,CAAC6sB,IAAO0D,MAAY5zB,EAA4C6zB,CAAY,GAC5E,CAAC1D,GAAO2D,MAAY9zB,EAA4C6zB,CAAY;CAWlF,AATAr3B,QAAgB;EACd,AAAIu3B,KACFA,EAAQ,QAAQ3mB,CAAO,CAAC,CAAC,MAAK,MAAQ;GACpC,IAAMI,IAAKjG,EAAK,YAAY;IAAE,OAAO;IAAG,WAAWA,EAAK,SAASjF,KAAY;GAAI,CAAC;GAClF,GAAS;IAAE,OAAOkL,EAAG;IAAO,QAAQA,EAAG;GAAO,CAAC;EACjD,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;CAErB,GAAG;EAACumB;EAAS3mB;EAAS9K;CAAQ,CAAC,GAE/B9F,QAAgB;EACd,AAAIw3B,KACFA,EAAQ,QAAQ5mB,CAAO,CAAC,CAAC,MAAK,MAAQ;GACpC,IAAMI,IAAKjG,EAAK,YAAY;IAAE,OAAO;IAAG,WAAWA,EAAK,SAASjF,KAAY;GAAI,CAAC;GAClF,GAAS;IAAE,OAAOkL,EAAG;IAAO,QAAQA,EAAG;GAAO,CAAC;EACjD,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;CAErB,GAAG;EAACwmB;EAAS5mB;EAAS9K;CAAQ,CAAC;CAI/B,IAAM2xB,KAAW5B,EAAU,UAAUX,EAAW,SAAS,cAAcA,EAAW,QAAQ,eAAeI,IAAe,OAAO,MACzHoC,KAAW7B,EAAU,UAAWX,EAAW,SAAS,gBAAgB,KACpEyC,KAAkBF,KAAW,IAC7BG,KAAmB,KAAK,IAAI,KAAKF,KAAW,EAAE,IAAI,IAClDG,KAAY,KAAK,IACrBF,MAAmBjE,GAAM,SAAS,MAClCkE,MAAoBlE,GAAM,UAAU,IACtC,GAEMoE,KAAW/B,EAAU,UAAUb,EAAW,SAAS,cAAcA,EAAW,QAAQ,gBAAgB,MAAMI,KAAgB,OAAO,MACjIyC,IAAWhC,EAAU,UAAWb,EAAW,SAAS,gBAAgB,KACpE8C,KAAkBF,KAAW,IAC7BG,KAAmB,KAAK,IAAI,KAAKF,IAAW,EAAE,IAAI,IAClDG,KAAY,KAAK,IACrBF,MAAmBrE,EAAM,SAAS,MAClCsE,MAAoBtE,EAAM,UAAU,IACtC,GAGMwE,KAAkBp3B,GAAWq3B,IAAUP,KAAYQ,IAAiBr3B,IAAQq3B,CAAc,GAC1FC,IAAkBv3B,GAAWq3B,IAAUF,KAAYG,IAAiBr3B,IAAQq3B,CAAc,GAE1FE,MAAgB7E,GAAM,SAAS,OAAOyE,IACtCK,KAAiB9E,GAAM,UAAU,OAAOyE,IAExCM,KAAgB9E,EAAM,SAAS,OAAO2E,GACtCI,MAAiB/E,EAAM,UAAU,OAAO2E;CAkB9C,OAfAt4B,QAAgB;EACd,IAAI,CAAC20B,GAAgB;EAErB,IAAMgE,IAAY,CADA,GAAIC,KAAU,CAAC,GAAI,GAAIC,KAAU,CAAC,CAClC,CAAA,CAAS,MAAK,MAAK30B,EAAE,OAAOywB,CAAc;EAC5D,IAAIgE,KAAaxD,EAAc,SAAS;GACtC,IAAM2D,IAAQ3D,EAAc,QAAQ,gBAAgB,KAC9C4D,IAAUJ,EAAU,IAAIR,IACxBa,IAAY,KAAK,IAAI,GAAGD,IAAUD,IAAQ,CAAC;GACjD,EAAc,QAAQ,SAAS;IAC7B,KAAKE;IACL,UAAU;GACZ,CAAC;EACH;CACF,GAAG;EAACrE;EAAgBiE;EAAQC;EAAQV;CAAe,CAAC,GAGlD,kBAAC,OAAD;EACE,KAAKjD;EACL,OAAO;GACL,MAAM;GACN,SAAS;GACT,eAAe;GACf,WAAW;GACX,OAAO;GACP,QAAQ;GACR,UAAU;GACV,UAAU;EACZ;EAXF,UAAA;GAcE,kBAAC,OAAD;IACE,KAAKC;IACL,aAAa+B;IACb,OAAO;KACL,OAAO,GAAG5B,EAAa;KACvB,YAAY;KACZ,UAAU;KACV,QAAQ;KACR,UAAU;KACV,iBAAiB;KACjB,SAAS;KACT,eAAe;KACf,YAAY;KACZ,SAAS;KACT,WAAW;KACX,QAAQI,IAAY,aAAazQ,MAAe,QAAQ,SAAS;IACnE;IAhBF,UAAA,CAkBE,kBAAC,OAAD;KAAK,OAAO;MACV,cAAc;MAAO,SAAS;MAAY,cAAc;MACxD,iBAAiB;MAAW,OAAO;MAAW,UAAU;MAAQ,YAAY;MAC5E,YAAY;KACd;KAJA,UAAA,CAIG,6BACyBrU,CACvB;IACL,CAAA,GAAA,kBAAC,OAAD;KAAK,OAAO;MACV,UAAU;MACV,OAAO,GAAG2nB,GAAa;MACvB,QAAQ,GAAGC,EAAc;MACzB,WAAW;MACX,iBAAiB;MACjB,YAAYhD,IAAsB,SAAS;KAC7C;KAPA,UAAA,CAQG+B,KACC,kBAACtH,IAAD;MACW;MACT,QAAQsH;MACR,OAAOY;MACG;MACV,WAAW;MACX,YAAY;MACZ,SAAS;MACT,eAAezE,GAAM;MACrB,gBAAgBA,GAAM;MACtB,gBAAgB6E;MAChB,iBAAiBC;MACN;MACC;MACC;MACb,sBAAsB;MACtB,oBAAoB;MACpB,mBAAmB,CAAC;MACpB,mBAAmB,CAAC;MACpB,iBAAiB,CAAC;MAClB,8BAA8B,CAAC;MAC/B,yBAAyB,CAAC;MAC1B,wBAAwB,CAAC;MACd;MACI;MACH;MACsB;KACnC,CAAA,GAEH,kBAACnE,IAAD;MACE,OAAOuE;MACP,OAAOT;MACP,aAAY;MACI;MACF;KACf,CAAA,CACE;IACF,CAAA,CAAA;;GAGL,kBAAC,OAAD;IACE,aAAavB;IACb,cAAcC;IACd,eAAeC;IACf,OAAO;KACL,OAAO;KACP,QAAQ;KACR,QAAQ;KACR,QAAQ;KACR,SAAS;KACT,YAAY;KACZ,gBAAgB;KAChB,UAAU;KACV,YAAY;IACd;IACA,OAAM;IAfR,UAAA,CAkBE,kBAAC,OAAD,EACE,OAAO;KACL,OAAO;KACP,QAAQ;KACR,iBAAiBtB,IAAsB,YAAY;KACnD,WAAWA,IAAsB,mCAAmC;KACpE,YAAY;IACd,EACD,CAAA,GAGD,kBAAC,OAAD;KACE,OAAO;MACL,UAAU;MACV,KAAK;MACL,WAAW;MACX,OAAO;MACP,QAAQ;MACR,cAAc;MACd,iBAAiBA,IAAsB,YAAY;MACnD,QAAQ,aAAaA,IAAsB,YAAY;MACvD,WAAW;MACX,SAAS;MACT,YAAY;MACZ,gBAAgB;MAChB,OAAOA,IAAsB,YAAY;MACzC,YAAY;KACd;KAEA,UAAA,kBAACyD,GAAD,EAAc,MAAM,GAAK,CAAA;IACtB,CAAA,CACF;;GAGL,kBAAC,OAAD;IACE,KAAK7D;IACL,aAAa8B;IACb,OAAO;KACL,MAAM;KACN,QAAQ;KACR,UAAU;KACV,iBAAiB;KACjB,SAAS;KACT,eAAe;KACf,YAAY;KACZ,SAAS;KACT,WAAW;KACX,QAAQxB,IAAY,aAAazQ,MAAe,QAAQ,SAAS;IACnE;IAdF,UAAA,CAgBE,kBAAC,OAAD;KAAK,OAAO;MACV,cAAc;MAAO,SAAS;MAAY,cAAc;MACxD,iBAAiB;MAAW,OAAO;MAAW,UAAU;MAAQ,YAAY;MAC5E,YAAY;KACd;KAJA,UAAA,CAIG,mCAC+BrU,CAC7B;IACL,CAAA,GAAA,kBAAC,OAAD;KAAK,OAAO;MACV,UAAU;MACV,OAAO,GAAG6nB,EAAa;MACvB,QAAQ,GAAGC,GAAc;MACzB,WAAW;MACX,iBAAiB;MACjB,YAAYlD,IAAsB,SAAS;KAC7C;KAPA,UAAA,CAQGgC,KACC,kBAACvH,IAAD;MACW;MACT,QAAQuH;MACR,OAAOc;MACG;MACV,WAAW;MACX,YAAY;MACZ,SAAS;MACT,eAAe3E,EAAM;MACrB,gBAAgBA,EAAM;MACtB,gBAAgB8E;MAChB,iBAAiBC;MACN;MACC;MACC;MACb,sBAAsB;MACtB,oBAAoB;MACpB,mBAAmB,CAAC;MACpB,mBAAmB,CAAC;MACpB,iBAAiB,CAAC;MAClB,8BAA8B,CAAC;MAC/B,yBAAyB,CAAC;MAC1B,wBAAwB,CAAC;MACd;MACI;MACH;MACsB;KACnC,CAAA,GAEH,kBAACrE,IAAD;MACE,OAAOwE;MACP,OAAOP;MACP,aAAY;MACI;MACF;KACf,CAAA,CACE;IACF,CAAA,CAAA;;EACF;;AAET;;;ACrjBA,SAAwBY,GAAe,EACrC,iBACA,cACA,gBACA,oBACA,eACA,eACA,WACA,aAAU,IACV,oBAAiB,GACjB,aACA,cACA,YACA,eACA,gBACsB;CACtB,IAAM,EAAE,SAAM,WAAQ,WAAQ,gBAAa,cAAW,wBAAqBC;CAE3E,OACE,kBAAC,OAAD;EAAK,OAAO;GACV,SAAS;GACT,YAAY;GACZ,KAAK;GACL,SAAS;GACT,iBAAiB;GACjB,OAAO;GACP,cAAc;GACd,QAAQ;GACR,UAAU;GACV,QAAQ;GACR,WAAW;GACX,YAAY;GACZ,YAAY;EACd;EAdA,UAAA;GAgBE,kBAAC,OAAD;IAAK,OAAO;KAAE,SAAS;KAAQ,YAAY;KAAU,KAAK;KAAO,YAAY;KAAK,OAAO;IAAU;IAAnG,UAAA,CACE,kBAACj0B,IAAD,EAAQ,MAAM,GAAK,CAAA,GACnB,kBAAC,QAAD,EAAA,UAAM,mBAAsB,CAAA,CACzB;;GAEL,kBAAC,OAAD,EAAK,OAAO;IAAE,OAAO;IAAO,QAAQ;IAAQ,iBAAiB;GAAU,EAAI,CAAA;GAG3E,kBAAC,OAAD;IAAK,OAAO;KAAE,SAAS;KAAQ,iBAAiB;KAAW,cAAc;KAAO,SAAS;IAAM;IAA/F,UAAA;KACE,kBAAC,UAAD;MACE,eAAek0B,EAAU,SAAS;MAClC,OAAO;OACL,SAAS;OAAQ,YAAY;OAAU,KAAK;OAC5C,SAAS;OAAY,cAAc;OAAO,QAAQ;OAClD,iBAAiBnO,MAAS,YAAY,YAAY;OAClD,OAAOA,MAAS,YAAY,YAAY;OACxC,QAAQ;OAAW,UAAU;OAAQ,YAAY;MACnD;MACA,OAAM;MATR,UAAA,CAWE,kBAAC/lB,IAAD,EAAQ,MAAM,GAAK,CAAA,GACnB,kBAAC,QAAD,EAAA,UAAM,eAAkB,CAAA,CAClB;;KAER,kBAAC,UAAD;MACE,eAAek0B,EAAU,cAAc;MACvC,OAAO;OACL,SAAS;OAAQ,YAAY;OAAU,KAAK;OAC5C,SAAS;OAAY,cAAc;OAAO,QAAQ;OAClD,iBAAiBnO,MAAS,iBAAiB,YAAY;OACvD,OAAOA,MAAS,iBAAiB,YAAY;OAC7C,QAAQ;OAAW,UAAU;OAAQ,YAAY;MACnD;MACA,OAAM;MATR,UAAA,CAWE,kBAACoO,IAAD,EAAS,MAAM,GAAK,CAAA,GACpB,kBAAC,QAAD,EAAA,UAAM,eAAkB,CAAA,CAClB;;KAER,kBAAC,UAAD;MACE,eAAeD,EAAU,UAAU;MACnC,OAAO;OACL,SAAS;OAAQ,YAAY;OAAU,KAAK;OAC5C,SAAS;OAAY,cAAc;OAAO,QAAQ;OAClD,iBAAiBnO,MAAS,aAAa,YAAY;OACnD,OAAOA,MAAS,aAAa,YAAY;OACzC,QAAQ;OAAW,UAAU;OAAQ,YAAY;MACnD;MACA,OAAM;MATR,UAAA,CAWE,kBAACzlB,GAAD,EAAU,MAAM,GAAK,CAAA,GACrB,kBAAC,QAAD,EAAA,UAAM,YAAe,CAAA,CACf;;IACL;;GAGJylB,MAAS,aACR,kBAAArsB,IAAA,EAAA,UAAA;IACE,kBAAC,OAAD,EAAK,OAAO;KAAE,OAAO;KAAO,QAAQ;KAAQ,iBAAiB;IAAU,EAAI,CAAA;IAG3E,kBAAC,OAAD;KAAK,OAAO;MAAE,SAAS;MAAQ,YAAY;MAAU,KAAK;KAAM;KAAhE,UAAA,CACE,kBAAC,OAAD;MAAK,OAAO;OAAE,SAAS;OAAQ,YAAY;OAAU,KAAK;MAAM;MAAhE,UAAA,CACE,kBAAC,QAAD;OAAM,OAAO;QAAE,UAAU;QAAQ,OAAO;OAAU;OAAG,UAAA;MAAY,CAAA,GACjE,kBAAC,SAAD;OACE,MAAK;OACL,OAAO06B;OACP,WAAW,MAAMC,EAAY,EAAE,OAAO,OAAOC,CAAM;OACnD,OAAO;QAAE,OAAO;QAAQ,QAAQ;QAAQ,QAAQ;QAAQ,cAAc;QAAO,QAAQ;QAAW,iBAAiB;OAAc;OAC/H,OAAM;MACP,CAAA,CACE;KACL,CAAA,GAAA,kBAAC,OAAD;MAAK,OAAO;OAAE,SAAS;OAAQ,YAAY;OAAU,KAAK;MAAM;MAAhE,UAAA,CACE,kBAAC,QAAD;OAAM,OAAO;QAAE,UAAU;QAAQ,OAAO;OAAU;OAAG,UAAA;MAAY,CAAA,GACjE,kBAAC,SAAD;OACE,MAAK;OACL,OAAOA;OACP,WAAW,MAAMD,EAAYD,GAAQ,EAAE,OAAO,KAAK;OACnD,OAAO;QAAE,OAAO;QAAQ,QAAQ;QAAQ,QAAQ;QAAQ,cAAc;QAAO,QAAQ;QAAW,iBAAiB;OAAc;OAC/H,OAAM;MACP,CAAA,CACE;KACF,CAAA,CAAA;;IAEL,kBAAC,UAAD;KACE,SAASG;KACT,OAAO;MACL,SAAS;MAAQ,YAAY;MAAU,KAAK;MAC5C,SAAS;MAAW,cAAc;MAAO,QAAQ;MACjD,iBAAiBC,IAAc,YAAY;MAC3C,OAAO;MAAW,QAAQ;MAAW,UAAU;KACjD;KACA,OAAM;KARR,UAAA,CAUE,kBAACC,IAAD,EAAmB,MAAM,GAAK,CAAA,GAC9B,kBAAC,QAAD,EAAA,UAAM,iBAAoB,CAAA,CACpB;;GACR,EAAA,CAAA;GAIH5yB,KAAYF,KACX,kBAAAjI,IAAA,EAAA,UAAA,CACE,kBAAC,OAAD,EAAK,OAAO;IAAE,OAAO;IAAO,QAAQ;IAAQ,iBAAiB;GAAU,EAAI,CAAA,GAC3E,kBAAC,OAAD;IAAK,OAAO;KAAE,SAAS;KAAQ,YAAY;KAAU,KAAK;KAAO,iBAAiB;KAAW,cAAc;KAAO,SAAS;IAAM;IAAjI,UAAA;KACE,kBAAC,UAAD;MACE,SAASiI;MACT,OAAO;OACL,SAAS;OAAQ,YAAY;OAAU,gBAAgB;OACvD,OAAO;OAAQ,QAAQ;OAAQ,cAAc;OAAO,QAAQ;OAC5D,iBAAiB;OAAe,OAAO;OAAW,QAAQ;MAC5D;MACA,OAAM;MACN,cAAW;MAEX,UAAA,kBAACD,GAAD,EAAa,MAAM,GAAK,CAAA;KAClB,CAAA;KAER,kBAAC,UAAD;MACE,SAASgzB;MACT,OAAO;OACL,SAAS;OAAQ,YAAY;OAAU,KAAK;OAC5C,SAAS;OAAW,QAAQ;OAAQ,cAAc;OAAO,QAAQ;OACjE,iBAAkBxB,KAAWC,MAAmB,IAAO,YAAY;OACnE,OAAQD,KAAWC,MAAmB,IAAO,YAAY;OACzD,QAAQ;OAAW,UAAU;OAAQ,YAAY;MACnD;MACA,OAAM;MACN,cAAW;MAVb,UAAA,CAYE,kBAAC7xB,IAAD,EAAW,MAAM,GAAK,CAAA,GACtB,kBAAC,QAAD,EAAA,UAAO4xB,KAAWC,MAAmB,IAAM,YAAY,GAAG,KAAK,MAAMA,IAAiB,GAAG,EAAE,GAAS,CAAA,CAC9F;;KAER,kBAAC,UAAD;MACE,SAAStxB;MACT,OAAO;OACL,SAAS;OAAQ,YAAY;OAAU,gBAAgB;OACvD,OAAO;OAAQ,QAAQ;OAAQ,cAAc;OAAO,QAAQ;OAC5D,iBAAiB;OAAe,OAAO;OAAW,QAAQ;MAC5D;MACA,OAAM;MACN,cAAW;MAEX,UAAA,kBAACD,GAAD,EAAY,MAAM,GAAK,CAAA;KACjB,CAAA;IACL;GACL,CAAA,CAAA,EAAA,CAAA;GAIH+yB,KACC,kBAAAj7B,IAAA,EAAA,UACE,kBAAC,OAAD;IAAK,OAAO;KAAE,SAAS;KAAQ,YAAY;KAAU,KAAK;KAAO,iBAAiB;KAAW,cAAc;KAAO,SAAS;IAAM;IAAjI,UAAA,CACE,kBAAC,UAAD;KACE,eAAei7B,EAAU,QAAQ;KACjC,OAAO;MACL,SAAS;MAAQ,YAAY;MAAU,KAAK;MAC5C,SAAS;MAAW,QAAQ;MAAQ,cAAc;MAAO,QAAQ;MACjE,iBAAiB5U,MAAe,QAAoB,gBAAZ;MACxC,OAAOA,MAAe,QAAoB,YAAZ;MAC9B,QAAQ;MAAW,UAAU;MAAQ,YAAY;KACnD;KACA,OAAM;KACN,cAAW;KAVb,UAAA,CAYE,kBAACje,GAAD,EAAc,MAAM,GAAK,CAAA,GACzB,kBAAC,QAAD,EAAA,UAAM,SAAY,CAAA,CACZ;IAER,CAAA,GAAA,kBAAC,UAAD;KACE,eAAe6yB,EAAU5U,MAAe,QAAQ,WAAW,KAAK;KAChE,OAAO;MACL,SAAS;MAAQ,YAAY;MAAU,KAAK;MAC5C,SAAS;MAAW,QAAQ;MAAQ,cAAc;MAAO,QAAQ;MACjE,iBAAiBA,MAAe,QAAQ,YAAY;MACpD,OAAOA,MAAe,QAAQ,YAAY;MAC1C,QAAQ;MAAW,UAAU;MAAQ,YAAY;KACnD;KACA,OAAM;KACN,cAAW;KAVb,UAAA,CAYE,kBAAChe,IAAD,EAAM,MAAM,GAAK,CAAA,GACjB,kBAAC,QAAD,EAAA,UAAM,MAAS,CAAA,CACT;IACL,CAAA,CAAA;GACL,CAAA,EAAA,CAAA;GAIH6yB,EAAU,SAAS,KAClB,kBAAAl7B,IAAA,EAAA,UAAA,CACE,kBAAC,OAAD,EAAK,OAAO;IAAE,OAAO;IAAO,QAAQ;IAAQ,iBAAiB;GAAU,EAAI,CAAA,GAC3E,kBAAC,OAAD;IAAK,OAAO;KAAE,SAAS;KAAQ,YAAY;KAAU,KAAK;IAAM;IAAhE,UAAA;KACE,kBAAC,UAAD;MACE,SAASm7B;MACT,OAAO;OAAE,SAAS;OAAW,cAAc;OAAO,QAAQ;OAAQ,iBAAiB;OAAW,OAAO;OAAW,QAAQ;MAAU;MAClI,OAAM;MAEN,UAAA,kBAACC,GAAD,EAAa,MAAM,GAAK,CAAA;KAClB,CAAA;KACR,kBAAC,QAAD;MAAM,OAAO;OAAE,UAAU;OAAQ,OAAO;OAAW,UAAU;OAAQ,WAAW;MAAS;MAAzF,UAAA;OACGC,IAAmB;OAAE;OAAKH,EAAU;OAAO;MACxC;;KACN,kBAAC,UAAD;MACE,SAASI;MACT,OAAO;OAAE,SAAS;OAAW,cAAc;OAAO,QAAQ;OAAQ,iBAAiB;OAAW,OAAO;OAAW,QAAQ;MAAU;MAClI,OAAM;MAEN,UAAA,kBAACC,GAAD,EAAc,MAAM,GAAK,CAAA;KACnB,CAAA;IACL;GACL,CAAA,CAAA,EAAA,CAAA;GAGJ,kBAAC,OAAD,EAAK,OAAO,EAAE,MAAM,EAAE,EAAI,CAAA;GAG1B,kBAAC,UAAD;IACE,SAASC;IACT,OAAO;KACL,SAAS;KAAQ,YAAY;KAAU,KAAK;KAC5C,SAAS;KAAY,cAAc;KAAO,QAAQ;KAClD,iBAAiB;KAAW,OAAO;KACnC,QAAQ;KAAW,UAAU;KAAQ,YAAY;IACnD;IACA,OAAM;IARR,UAAA,CAUE,kBAACvuB,IAAD,EAAG,MAAM,GAAK,CAAA,GACd,kBAAC,QAAD,EAAA,UAAM,eAAkB,CAAA,CAClB;;EACL;;AAET;;;ACnRA,SAAwBwuB,GAAmB,EACzC,WACA,cACA,cACA,qBACA,iBACA,mBAC0B;CAG1B,OAFKhnB,IAGH,kBAAC,OAAD;EAAK,OAAO;GACV,OAAO;GACP,QAAQ;GACR,iBAAiB;GACjB,YAAY;GACZ,SAAS;GACT,eAAe;GACf,YAAY;GACZ,QAAQ;EACV;EATA,UAAA,CAWE,kBAAC,OAAD;GAAK,OAAO;IACV,SAAS;IACT,cAAc;IACd,SAAS;IACT,YAAY;IACZ,gBAAgB;IAChB,iBAAiB;GACnB;GAPA,UAAA,CAQE,kBAAC,OAAD;IAAK,OAAO;KAAE,SAAS;KAAQ,YAAY;KAAU,KAAK;KAAO,YAAY;KAAK,UAAU;KAAQ,OAAO;IAAU;IAArH,UAAA,CACE,kBAACnO,IAAD;KAAQ,MAAM;KAAI,OAAM;IAAW,CAAA,GACnC,kBAAC,QAAD,EAAA,UAAM,kBAAqB,CAAA,CACxB;GACL,CAAA,GAAA,kBAAC,QAAD;IAAM,OAAO;KACX,UAAU;KAAQ,SAAS;KAAW,cAAc;KACpD,iBAAiB;KAAW,OAAO;KAAW,YAAY;IAC5D;IAHA,UAAA,CAIG40B,EAAU,QAAO,cACd;GACH,CAAA,CAAA;EAGL,CAAA,GAAA,kBAAC,OAAD;GAAK,OAAO;IAAE,MAAM;IAAG,WAAW;IAAQ,SAAS;GAAO;GAA1D,UAAA;IACGA,EAAU,SAAS,KAClB,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,OAAD;KAAK,OAAO;MAAE,UAAU;MAAQ,YAAY;MAAK,OAAO;MAAW,cAAc;MAAO,SAAS;MAAQ,YAAY;MAAU,KAAK;KAAM;KAA1I,UAAA,CACE,kBAAC50B,IAAD,EAAQ,MAAM,GAAK,CAAA,GACnB,kBAAC,QAAD,EAAA,UAAA;MAAM;MAAsB40B,EAAU;MAAO;KAAO,EAAA,CAAA,CACjD;IAEJ,CAAA,GAAAA,EAAU,KAAK,GAAM,MAAQ;KAC5B,IAAMjT,IAAa5O,MAAQgiB,GACrBK,IAAQntB,EAAK,SAAS,YACtBotB,IAAQptB,EAAK,SAAS,YAExBqtB,IAAaF,IAAQ,YAAYC,IAAQ,YAAY,WACrDE,IAAUH,IAAQ,YAAYC,IAAQ,YAAY,WAClDG,IAAaJ,IAAQ,YAAYC,IAAQ,UAAU;KAEvD,OACE,kBAAC,OAAD;MAEE,eAAe;OAEb,AADAvF,EAAa/c,GAAK9K,CAAI,GAClBA,EAAK,aAAWwtB,EAAaxtB,EAAK,SAAS;MACjD;MACA,OAAO;OACL,SAAS;OACT,cAAc;OACd,iBAAiB0Z,IAAa,YAAY;OAC1C,QAAQA,IAAa,sBAAsB;OAC3C,YAAYA,IAAa,sBAAsB,aAAa2T;OAC5D,cAAc;OACd,QAAQ;OACR,UAAU;OACV,WAAW3T,IAAa,sCAAsC;OAC9D,YAAY;MACd;MAjBF,UAAA,CAmBE,kBAAC,OAAD;OAAK,OAAO;QAAE,SAAS;QAAQ,YAAY;QAAU,gBAAgB;QAAiB,cAAc;OAAM;OAA1G,UAAA,CACE,kBAAC,OAAD;QAAK,OAAO;SAAE,SAAS;SAAQ,YAAY;SAAU,KAAK;QAAM;QAAhE,UAAA;SACGyT,KAAS,kBAAC1zB,GAAD;UAAa,MAAM;UAAI,OAAM;SAAW,CAAA;SACjD2zB,KAAS,kBAACzzB,GAAD;UAAY,MAAM;UAAI,OAAM;SAAW,CAAA;SAChD,CAACwzB,KAAS,CAACC,KAAS,kBAACK,GAAD;UAAa,MAAM;UAAI,OAAM;SAAW,CAAA;SAC7D,kBAAC,QAAD;UAAM,OAAO;WACX,UAAU;WACV,YAAY;WACZ,eAAe;WACf,SAAS;WACT,cAAc;WACd,iBAAiBH;WACjB,OAAOD;UACT;UACG,UAAAE;SACG,CAAA;QACH;OACL,CAAA,GAAA,kBAAC,QAAD;QAAM,OAAO;SAAE,UAAU;SAAQ,OAAO;SAAW,YAAY;QAAI;QAAnE,UAAA,CAAsE,SAC9DvtB,EAAK,SACP;OACH,CAAA,CAAA;MACL,CAAA,GAAA,kBAAC,OAAD;OAAK,OAAO;QACV,UAAU;QACV,OAAO0Z,IAAa,YAAY;QAChC,YAAYA,IAAa,MAAM;QAC/B,YAAY;QACZ,WAAW;OACb;OACG,UAAA1Z,EAAK;MACH,CAAA,CACF;KAhDE,GAAAA,EAAK,EAgDP;IAET,CAAC,CACE,EAAA,CAAA;IAGN0tB,EAAU,SAAS,KAAKf,EAAU,WAAW,KAC5C,kBAAC,OAAD;KAAK,OAAO,EAAE,cAAc,OAAO;KAAnC,UAAA,CACE,kBAAC,OAAD;MAAK,OAAO;OAAE,UAAU;OAAQ,YAAY;OAAK,OAAO;OAAW,cAAc;OAAO,SAAS;OAAQ,YAAY;OAAU,KAAK;MAAM;MAA1I,UAAA,CACE,kBAACt0B,GAAD,EAAU,MAAM,GAAK,CAAA,GACrB,kBAAC,QAAD,EAAA,UAAM,mBAAsB,CAAA,CACzB;KAEJ,CAAA,GAAAq1B,EAAU,QAAO,MAAKC,EAAE,SAAS,OAAO,CAAC,CAAC,KAAK,GAAK,MACnD,kBAAC,OAAD;MAEE,eAAeH,EAAaI,EAAI,SAAS;MACzC,OAAO;OACL,SAAS;OACT,cAAc;OACd,iBAAiBA,EAAI,SAAS,QAAQ,YAAY;OAClD,QAAQ,aAAaA,EAAI,SAAS,QAAQ,YAAY;OACtD,cAAc;OACd,QAAQ;OACR,UAAU;OACV,YAAY;MACd;MAZF,UAAA,CAcE,kBAAC,OAAD;OAAK,OAAO;QAAE,SAAS;QAAQ,gBAAgB;QAAiB,cAAc;QAAO,UAAU;QAAQ,OAAO;QAAW,YAAY;OAAI;OAAzI,UAAA,CACE,kBAAC,QAAD,EAAA,UAAA,CAAM,SAAMA,EAAI,SAAgB,EAAA,CAAA,GAChC,kBAAC,QAAD;QAAM,OAAO;SAAE,OAAOA,EAAI,SAAS,QAAQ,YAAY;SAAW,eAAe;QAAY;QAC1F,UAAAA,EAAI,SAAS,QAAQ,eAAe;OACjC,CAAA,CACH;MACL,CAAA,GAAA,kBAAC,OAAD;OAAK,OAAO;QACV,OAAOA,EAAI,SAAS,QAAQ,YAAY;QACxC,gBAAgBA,EAAI,SAAS,WAAW,iBAAiB;QACzD,YAAY;QACZ,WAAW;OACb;OACG,UAAAA,EAAI,KAAK,SAAS,MAAM,GAAGA,EAAI,KAAK,UAAU,GAAG,GAAG,EAAE,OAAOA,EAAI;MAC/D,CAAA,CACF;KA3BE,GAAA,aAAaptB,GA2Bf,CACN,CACE;;IAGNmsB,EAAU,WAAW,KAAKe,EAAU,QAAO,MAAKC,EAAE,SAAS,OAAO,CAAC,CAAC,WAAW,KAC9E,kBAAC,OAAD;KAAK,OAAO;MAAE,SAAS;MAAa,WAAW;MAAU,OAAO;KAAU;KAA1E,UAAA;MACE,kBAACE,GAAD;OAAc,MAAM;OAAI,OAAM;OAAU,OAAO,EAAE,QAAQ,kBAAkB;MAAI,CAAA;MAC/E,kBAAC,OAAD;OAAK,OAAO;QAAE,YAAY;QAAK,UAAU;QAAQ,OAAO;OAAU;OAAG,UAAA;MAAoB,CAAA;MACzF,kBAAC,OAAD;OAAK,OAAO;QAAE,UAAU;QAAQ,WAAW;OAAM;OAAG,UAAA;MAAgF,CAAA;KACjI;;GAEJ;EACF,CAAA,CAAA;MA7Ja;AA+JtB;;;AC5KA,SAAwBC,GAAqB,EAC3C,oBACA,qBACA,mBAC4B;CAC5B,IAAM,CAACC,GAAYC,KAAiB33B,EAAS,EAAK,GAC5C43B,IAAYt7B,EAAuB,IAAI;CA4B7C,OA1BAE,QAAgB;EACd,IAAMgT,KAAmB,MAAkB;GACzC,IAAI,CAACkoB,KAAc,CAAC5mB,EAAa,SAAS;GAC1C,IAAMkM,IAAOlM,EAAa,QAAQ,sBAAsB,GAClD+mB,IAAY,EAAE,UAAU7a,EAAK;GAEnC,EADmB,KAAK,IAAI,GAAG,KAAK,IAAI,KAAM6a,IAAY7a,EAAK,QAAS,GAAG,CAC1D,CAAU;EAC7B,GAEMtN,UAAsB;GAC1B,AAAIgoB,KACFC,EAAc,EAAK;EAEvB;EAOA,OALID,MACF,OAAO,iBAAiB,aAAaloB,CAAe,GACpD,OAAO,iBAAiB,WAAWE,CAAa,UAGrC;GAEX,AADA,OAAO,oBAAoB,aAAaF,CAAe,GACvD,OAAO,oBAAoB,WAAWE,CAAa;EACrD;CACF,GAAG;EAACgoB;EAAY5mB;EAAcgnB;CAAgB,CAAC,GAG7C,kBAAC,OAAD;EACE,KAAKF;EACL,OAAO;GACL,UAAU;GACV,KAAK;GACL,QAAQ;GACR,MAAM,GAAGG,EAAgB;GACzB,OAAO;GACP,iBAAiB;GACjB,WAAW;GACX,QAAQ;GACR,QAAQ;GACR,WAAW;EACb;EACA,cAAc,MAAM;GAElB,AADA,EAAE,eAAe,GACjBJ,EAAc,EAAI;EACpB;EAGA,UAAA,kBAAC,OAAD;GAAK,OAAO;IACV,UAAU;IACV,KAAK;IACL,MAAM;IACN,WAAW;IACX,OAAO;IACP,QAAQ;IACR,iBAAiB;IACjB,OAAO;IACP,cAAc;IACd,SAAS;IACT,YAAY;IACZ,gBAAgB;IAChB,WAAW;IACX,QAAQ;GACV;GACE,UAAA,kBAAClC,GAAD,EAAc,MAAM,GAAK,CAAA;EACtB,CAAA;CACF,CAAA;AAET;;;AChEA,eAAsBuC,GAAqB,GAAmD;CAC5F,IAAMxqB,IAAKjG,EAAK,YAAY;EAAE,OAAO;EAAG,UAAUA,EAAK;CAAO,CAAC,GACzD0e,IAAc,MAAM1e,EAAK,eAAe,GACxC0wB,IAA0B,CAAC;CAEjC,KAAK,IAAMtuB,KAAQsc,EAAY,OAAgB;EAC7C,IAAI,CAACtc,EAAK,OAAO,OAAOA,EAAK,OAAQ,UAAU;EAC/C,IAAMmB,IAAMnB,EAAK;EACjB,IAAImB,EAAI,KAAK,CAAC,CAAC,WAAW,GAAG;EAE7B,IAAMikB,IAAKplB,EAAK,UAAU,IACpBqlB,IAAKrlB,EAAK,UAAU,IACpBuuB,IAAYvuB,EAAK,SAAS,GAC1BuP,IAAW,KAAK,MAAMvP,EAAK,UAAU,MAAM,MAAM,KAAKA,EAAK,UAAU,MAAM,MAAM,CAAC,KAAK,IACvFwuB,IAAaxuB,EAAK,UAAUuP,GAE5B,CAACkf,GAAKC,KAAO7qB,EAAG,uBAAuBuhB,GAAIC,IAAKmJ,CAAU,GAC1D,CAACG,GAAKC,KAAO/qB,EAAG,uBAAuBuhB,IAAKmJ,GAAWlJ,CAAE,GAEzDvhB,IAAQ,KAAK,IAAI2qB,GAAKE,CAAG,GACzB5qB,IAAQ,KAAK,IAAI2qB,GAAKE,CAAG,GACzB5qB,IAAQ,KAAK,IAAI,KAAK,IAAI2qB,IAAMF,CAAG,GAAG,CAAC,GACvCxqB,IAAQ,KAAK,IAAI,KAAK,IAAI2qB,IAAMF,CAAG,GAAG,CAAC,GAEvCG,IAAQ1tB,EAAI,MAAM,OAAO,GAC3B2tB,IAAS,GACPC,IAAa5tB,EAAI,UAAU;EAEjC,KAAK,IAAMnL,KAAK64B,GAAO;GAErB,IAAMG,IAAShrB,KADGhO,EAAE,SAAS+4B,IAEvBE,IAAKnrB,IAASgrB,IAASC,IAAc/qB;GAG3C,AAFA,KAAUhO,EAAE,QAERA,EAAE,KAAK,CAAC,CAAC,SAAS,KACpBs4B,EAAW,KAAK;IACd,MAAMt4B,EAAE,KAAK;IACb,GAAGi5B;IACH,GAAGlrB;IACH,OAAO,KAAK,IAAIirB,GAAQ,CAAC;IACzB,QAAQ/qB;GACV,CAAC;EAEL;CACF;CAEA,OAAOqqB;AACT;AAKA,eAAsBY,GACpB,GACA,GACA,GACyB;CACzB,IAAIC,IAAsC,MACtCC,IAAsC,MACtCC,GACAC;CAEJ,IAAI;EAMF,AALA,CAACH,GAAOC,KAAS,MAAM,QAAQ,IAAI,CACjChF,EAAQ,QAAQviB,CAAS,GACzBwiB,EAAQ,QAAQ,KAAK,IAAIxiB,GAAWwiB,EAAQ,QAAQ,CAAC,CACvD,CAAC,GAED,CAACgF,GAAQC,KAAU,MAAM,QAAQ,IAAI,CACnCjB,GAAqBc,CAAK,GAC1Bd,GAAqBe,CAAK,CAC5B,CAAC;CACH,UAAU;EACR,IAAI;GAAE,GAAO,UAAU;EAAG,QAAQ,CAAC;EACnC,IAAI;GAAE,GAAO,UAAU;EAAG,QAAQ,CAAC;CACrC;CAEA,IAAMG,IAAWF,EAAO,KAAI,MAAK/b,EAAE,IAAI,GACjCkc,IAAWF,EAAO,KAAI,MAAKhc,EAAE,IAAI,GAGjC/O,IAAIgrB,EAAS,QACbE,IAAID,EAAS,QAGbE,IAAM,KAAK,IAAInrB,IAAIkrB,GAAG,IAAc,GACpCE,IAAI,IAAI,WAAW,IAAID,IAAM,CAAC;CACpC,EAAE,KAAK;CACP,IAAME,IAAsB,CAAC,GACzBC,IAAa;CAEjB,KAAK,IAAI94B,IAAI,GAAGA,KAAK24B,GAAK,KAAK;EAC7B,EAAM,KAAKC,EAAE,MAAM,CAAC;EACpB,KAAK,IAAIG,IAAI,CAAC/4B,GAAG+4B,KAAK/4B,GAAG,KAAK,GAAG;GAC/B,IAAI3B;GACJ,AAGEA,IAHE06B,MAAM,CAAC/4B,KAAM+4B,MAAM/4B,KAAK44B,EAAEG,IAAI,IAAIJ,KAAOC,EAAEG,IAAI,IAAIJ,KACjDC,EAAEG,IAAI,IAAIJ,KAEVC,EAAEG,IAAI,IAAIJ,KAAO;GAEvB,IAAIp6B,IAAIF,IAAI06B;GACZ,OAAO16B,IAAImP,KAAKjP,IAAIm6B,KAAKF,EAASn6B,OAAOo6B,EAASl6B,KAEhD,AADA,KACA;GAGF,IADA,EAAEw6B,IAAIJ,KAAOt6B,GACTA,KAAKmP,KAAKjP,KAAKm6B,GAAG;IACpB,IAAa;IACb;GACF;EACF;EACA,IAAII,KAAeF,EAAEprB,IAAIkrB,IAAIC,MAAQnrB,KAAMorB,EAAEprB,IAAIkrB,IAAIC,MAAQnrB,IAAIkrB,MAAOA,GAAI;GAC1E,IAAa;GACb;EACF;CACF;CAGA,IAAIr6B,IAAImP,GACJjP,IAAIm6B,GACFM,IAAwB,CAAC,GACzBC,IAAwB,CAAC;CAE/B,IAAIH,GACF,KAAK,IAAI94B,IAAI64B,EAAM,SAAS,GAAG74B,KAAK,GAAG,KAAK;EAC1C,IAAMk5B,IAAOL,EAAM74B,IACb+4B,IAAI16B,IAAIE,GACV46B;EACJ,AAGEA,IAHEJ,MAAM,CAAC/4B,KAAM+4B,MAAM/4B,KAAKk5B,EAAKH,IAAI,IAAIJ,KAAOO,EAAKH,IAAI,IAAIJ,KACnDI,IAAI,IAEJA,IAAI;EAEd,IAAMK,IAAQF,EAAKC,IAAQR,IACrBU,IAAQD,IAAQD;EAEtB,OAAO96B,IAAI+6B,KAAS76B,IAAI86B,IAEtB,AADA,KACA;EAGF,AAAIr5B,IAAI,MACF3B,MAAM+6B,KACRH,EAAY,KAAK16B,IAAI,CAAC,GACtB,OACSA,MAAM86B,MACfL,EAAY,KAAK36B,IAAI,CAAC,GACtB;CAGN;MACK;EAEL,KAAK,IAAIoL,IAAI,GAAGA,IAAI+D,GAAG,KAAK,EAAY,KAAK/D,CAAC;EAC9C,KAAK,IAAI6vB,IAAI,GAAGA,IAAIZ,GAAG,KAAK,EAAY,KAAKY,CAAC;CAChD;CAGA,AADAN,EAAY,QAAQ,GACpBC,EAAY,QAAQ;CAEpB,IAAMvE,IAAS6E,GAAoBP,EAAY,KAAI,MAAKV,EAAO7uB,EAAE,GAAGqH,GAAW,UAAU,GACnF6jB,IAAS4E,GAAoBN,EAAY,KAAI,MAAKV,EAAO9uB,EAAE,GAAGqH,GAAW,UAAU,GAEnF0oB,IAAsB,CAAC;CAC7B,KAAK,IAAMx5B,KAAK00B,GACd,EAAQ,KAAK;EACX,IAAI10B,EAAE;EACN;EACA,MAAM;EACN,aAAa,YAAYA,EAAE,KAAK,SAAS,KAAKA,EAAE,KAAK,MAAM,GAAG,EAAE,IAAI,QAAQA,EAAE,KAAK;EACnF,GAAGA,EAAE;EACL,GAAGA,EAAE;EACL,OAAOA,EAAE;EACT,QAAQA,EAAE;CACZ,CAAC;CAEH,KAAK,IAAMoM,KAAKuoB,GACd,EAAQ,KAAK;EACX,IAAIvoB,EAAE;EACN;EACA,MAAM;EACN,aAAa,UAAUA,EAAE,KAAK,SAAS,KAAKA,EAAE,KAAK,MAAM,GAAG,EAAE,IAAI,QAAQA,EAAE,KAAK;EACjF,GAAGA,EAAE;EACL,GAAGA,EAAE;EACL,OAAOA,EAAE;EACT,QAAQA,EAAE;CACZ,CAAC;CAGH,OAAO;EAAE;EAAQ;EAAQ;CAAQ;AACnC;AAEA,SAASmtB,GAAoB,GAAoB,GAAmB,GAAmE;CACrI,IAAIE,EAAM,WAAW,GAAG,OAAO,CAAC;CAChC,IAAMnJ,IAA2B,CAAC,GAE9BoJ,IAA4B,CAACD,EAAM,EAAE;CAEzC,KAAK,IAAIhwB,IAAI,GAAGA,IAAIgwB,EAAM,QAAQ,KAAK;EACrC,IAAMjmB,IAAOkmB,EAAaA,EAAa,SAAS,IAC1CnZ,IAAOkZ,EAAMhwB,IAEbkwB,IAAW,KAAK,IAAIpZ,EAAK,IAAI/M,EAAK,CAAC,IAAI,KAAK,IAAIA,EAAK,QAAQ+M,EAAK,MAAM,IAAI,IAC5EqZ,IAASrZ,EAAK,KAAK/M,EAAK,IAAIA,EAAK,SAAS;EAEhD,AAAImmB,KAAYC,IACdF,EAAa,KAAKnZ,CAAI,KAEtB+P,EAAM,KAAKuJ,GAAoBH,GAAc5oB,GAAW/U,GAAMu0B,EAAM,SAAS,CAAC,CAAC,GAC/E,IAAe,CAAC/P,CAAI;CAExB;CAMA,OAJImZ,EAAa,SAAS,KACxBpJ,EAAM,KAAKuJ,GAAoBH,GAAc5oB,GAAW/U,GAAMu0B,EAAM,SAAS,CAAC,CAAC,GAG1EA;AACT;AAEA,SAASuJ,GAAoB,GAAqB,GAAmB,GAAgD,GAA8B;CACjJ,IAAMnY,IAAO,KAAK,IAAI,GAAGoY,EAAO,KAAI,MAAKlD,EAAE,CAAC,CAAC,GACvCjV,IAAO,KAAK,IAAI,GAAGmY,EAAO,KAAI,MAAKlD,EAAE,CAAC,CAAC,GACvCmD,IAAO,KAAK,IAAI,GAAGD,EAAO,KAAI,MAAKlD,EAAE,IAAIA,EAAE,KAAK,CAAC,GACjDoD,IAAO,KAAK,IAAI,GAAGF,EAAO,KAAI,MAAKlD,EAAE,IAAIA,EAAE,MAAM,CAAC,GAClD1vB,IAAO4yB,EAAO,KAAI,MAAKlD,EAAE,IAAI,CAAC,CAAC,KAAK,GAAG;CAE7C,OAAO;EACL,IAAI,YAAY9lB,EAAU,GAAG/U,EAAK,GAAGk+B,EAAI,GAAG,KAAK,MAAMvY,CAAI,EAAE,GAAG,KAAK,MAAMC,CAAI;EAC/E;EACA;EACA;EACA,GAAG,KAAK,IAAI,GAAGD,IAAO,CAAC;EACvB,GAAG,KAAK,IAAI,GAAGC,IAAO,CAAC;EACvB,OAAOoY,IAAOrY,IAAO;EACrB,QAAQsY,IAAOrY,IAAO;CACxB;AACF;AAKA,SAAgBuY,GAAgB,GAAe,GAAe,GAAsC;CAClG,IAAM5B,IAAS6B,EAAM,MAAM,OAAO,GAC5B5B,IAAS6B,EAAM,MAAM,OAAO,GAE5B5sB,IAAI8qB,EAAO,QACXI,IAAIH,EAAO,QACXI,IAAMnrB,IAAIkrB,GACVE,IAAI,IAAI,WAAW,IAAID,IAAM,CAAC;CACpC,EAAE,KAAK;CAEP,IAAME,IAAsB,CAAC;CAE7B,KAAK,IAAI74B,IAAI,GAAGA,KAAK24B,GAAK,KAAK;EAC7B,EAAM,KAAKC,EAAE,MAAM,CAAC;EACpB,KAAK,IAAIG,IAAI,CAAC/4B,GAAG+4B,KAAK/4B,GAAG,KAAK,GAAG;GAC/B,IAAI3B;GACJ,AAGEA,IAHE06B,MAAM,CAAC/4B,KAAM+4B,MAAM/4B,KAAK44B,EAAEG,IAAI,IAAIJ,KAAOC,EAAEG,IAAI,IAAIJ,KACjDC,EAAEG,IAAI,IAAIJ,KAEVC,EAAEG,IAAI,IAAIJ,KAAO;GAEvB,IAAIp6B,IAAIF,IAAI06B;GACZ,OAAO16B,IAAImP,KAAKjP,IAAIm6B,KAAKJ,EAAOj6B,OAAOk6B,EAAOh6B,KAE5C,AADA,KACA;GAGF,IADA,EAAEw6B,IAAIJ,KAAOt6B,GACTA,KAAKmP,KAAKjP,KAAKm6B,GACjB,OAAO2B,GAAgBxB,GAAOP,GAAQC,GAAQznB,CAAS;EAE3D;CACF;CAEA,OAAO,CACL;EAAE,MAAM;EAAU,MAAMqpB;EAAO;CAAU,GACzC;EAAE,MAAM;EAAO,MAAMC;EAAO;CAAU,CACxC;AACF;AAEA,SAASC,GAAgB,GAAqB,GAAkB,GAAkB,GAAsC;CACtH,IAAIh8B,IAAIi6B,EAAO,QACX/5B,IAAIg6B,EAAO,QACTI,IAAML,EAAO,SAASC,EAAO,QAC7B+B,IAAkE,CAAC;CAEzE,KAAK,IAAIt6B,IAAI64B,EAAM,SAAS,GAAG74B,KAAK,GAAG,KAAK;EAC1C,IAAM44B,IAAIC,EAAM74B,IACV+4B,IAAI16B,IAAIE,GAEV46B;EACJ,AAGEA,IAHEJ,MAAM,CAAC/4B,KAAM+4B,MAAM/4B,KAAK44B,EAAEG,IAAI,IAAIJ,KAAOC,EAAEG,IAAI,IAAIJ,KAC7CI,IAAI,IAEJA,IAAI;EAGd,IAAMK,IAAQR,EAAEO,IAAQR,IAClBU,IAAQD,IAAQD;EAEtB,OAAO96B,IAAI+6B,KAAS76B,IAAI86B,IAGtB,AAFAiB,EAAU,KAAK;GAAE,MAAM;GAAS,MAAMhC,EAAOj6B,IAAI;EAAG,CAAC,GACrD,KACA;EAGF,AAAI2B,IAAI,MACF3B,MAAM+6B,KACRkB,EAAU,KAAK;GAAE,MAAM;GAAO,MAAM/B,EAAOh6B,IAAI;EAAG,CAAC,GACnD,OACSA,MAAM86B,MACfiB,EAAU,KAAK;GAAE,MAAM;GAAU,MAAMhC,EAAOj6B,IAAI;EAAG,CAAC,GACtD;CAGN;CAEA,EAAU,QAAQ;CAElB,IAAMk8B,IAAkC,CAAC;CACzC,KAAK,IAAMtxB,KAAQqxB,GACjB,AAAIC,EAAa,SAAS,KAAKA,EAAaA,EAAa,SAAS,EAAE,CAAC,SAAStxB,EAAK,OACjF,EAAasxB,EAAa,SAAS,EAAE,CAAC,QAAQtxB,EAAK,OAEnDsxB,EAAa,KAAK;EAAE,GAAGtxB;EAAM;CAAU,CAAC;CAI5C,OAAOsxB;AACT;AAKA,SAAgBC,GAAW,GAA+B,GAAe,GAAgB,GAAkB,IAAkB,KAAM;CAMjI,AALAvpB,EAAI,KAAK,GACT,EAAI,2BAA2B,eAC/B,EAAI,YAAYwpB,GAChB,EAAI,cAAc3T,GAClB7V,EAAI,SAAS,GAAG,GAAG5F,GAAOC,CAAM,GAChC2F,EAAI,QAAQ;AACd;AAKA,SAAgBypB,GACd,GACA,GACA,GACA,GACY;CACZ,IAAMrvB,IAAQ,KAAK,IAAIsvB,EAAQ,OAAOC,EAAQ,KAAK,GAC7CtvB,IAAS,KAAK,IAAIqvB,EAAQ,QAAQC,EAAQ,MAAM;CACtD,IAAIvvB,MAAU,KAAKC,MAAW,GAAG,OAAO,CAAC;CAEzC,IAAMuvB,IAAOF,EAAQ,WAAW,IAAI,GAC9BG,IAAOF,EAAQ,WAAW,IAAI;CACpC,IAAI,CAACC,KAAQ,CAACC,GAAM,OAAO,CAAC;CAE5B,IAAMC,IAAWF,EAAK,aAAa,GAAG,GAAGxvB,GAAOC,CAAM,GAChD0vB,IAAWF,EAAK,aAAa,GAAG,GAAGzvB,GAAOC,CAAM,GAChD2vB,IAAQF,EAAS,MACjBG,IAAQF,EAAS,MAEjBpF,IAAwB,CAAC;CAI/B,KAAK,IAAIuF,IAAK,GAAGA,IAAK7vB,GAAQ,KAAM,IAClC,KAAK,IAAI8vB,IAAK,GAAGA,IAAK/vB,GAAO,KAAM,IAAW;EAC5C,IAAIgwB,IAAa,GACXC,IAAQ,KAAK,IAAI,IAAWjwB,IAAQ+vB,CAAE,GACtCG,IAAQ,KAAK,IAAI,IAAWjwB,IAAS6vB,CAAE;EAE7C,KAAK,IAAI58B,IAAI48B,GAAI58B,IAAI48B,IAAKI,GAAO,KAAK,GACpC,KAAK,IAAIl9B,IAAI+8B,GAAI/8B,IAAI+8B,IAAKE,GAAO,KAAK,GAAG;GACvC,IAAMvnB,KAAOxV,IAAI8M,IAAQhN,KAAK,GACxBm9B,IAAK,KAAK,IAAIP,EAAMlnB,KAAOmnB,EAAMnnB,EAAI,GACrC0nB,IAAK,KAAK,IAAIR,EAAMlnB,IAAM,KAAKmnB,EAAMnnB,IAAM,EAAE,GAC7C2nB,IAAK,KAAK,IAAIT,EAAMlnB,IAAM,KAAKmnB,EAAMnnB,IAAM,EAAE;GAEnD,AAAIynB,IAAKC,IAAKC,IAAK,MACjB;EAEJ;EAGF,AAAIL,IAAa,KACfzF,EAAU,KAAK;GACb,IAAI,QAAQ9kB,EAAU,GAAGsqB,EAAG,GAAGD;GAC/B;GACA,MAAM;GACN,aAAa,sCAAsCrqB,EAAU,IAAI,KAAK,MAAMsqB,IAAKt+B,CAAK,EAAE,MAAM,KAAK,MAAMq+B,IAAKr+B,CAAK,EAAE;GACrH,GAAGs+B,IAAKt+B;GACR,GAAGq+B,IAAKr+B;GACR,OAAOw+B,IAAQx+B;GACf,QAAQy+B,IAAQz+B;EAClB,CAAC;CAEL;CAGF,OAAO84B;AACT;;;AC5ZA,IAAM+F,KAAqB;CACzB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,GAEMC,KAAyF;CAC7F;EACE,MAAM;EACN,OAAO,CACL;GAAE,MAAM;GAAwB,OAAO;EAAU,GACjD;GAAE,MAAM;GAAiC,OAAO;EAAU,CAC5D;CACF;CACA;EACE,MAAM;EACN,OAAO;GACL;IAAE,MAAM;IAAa,OAAO;GAAU;GACtC;IAAE,MAAM;IAAsB,OAAO;GAAU;GAC/C;IAAE,MAAM;IAAsB,OAAO;GAAU;EACjD;CACF;CACA;EACE,MAAM;EACN,OAAO;GACL;IAAE,MAAM;IAAkB,OAAO;GAAU;GAC3C;IAAE,MAAM;IAAqB,OAAO;GAAU;GAC9C;IAAE,MAAM;IAAkB,OAAO;GAAU;GAC3C;IAAE,MAAM;IAAoB,OAAO;GAAU;EAC/C;CACF;AACF,GAEaC,MAAiD,EAC5D,gBACA,YACA,gBACA,qBACI;CACJ,IAAM,CAACpnB,GAAOwK,KAAY3f,QAA2Bwf,EAAY,SAAS,CAAC,GACrE,CAACgd,GAAaC,KAAkBz8B,EAAS,EAAE,GAC3C,CAAC08B,GAAcC,KAAmB38B,EAASq8B,GAAmB,EAAE,GAChE,CAACO,GAAUC,KAAe78B,EAAwB,IAAI;CAG5D,QACgBwf,EAAY,eAAe,MAAYG,EAASpW,CAAO,CAC9D,GACN,CAACiW,CAAW,CAAC;CAEhB,IAAMlL,IAASkL,EAAY,UAAU,GAE/Bsd,UAAsB;EAC1B,IAAM32B,IAAUq2B,EAAY,KAAK;EACjC,IAAI,CAACr2B,GAAS;GACZ,EAAY,2BAA2B;GACvC;EACF;EAEA,IAAIgP,EAAM,MAAM,MAAM5H,EAAE,KAAK,YAAY,MAAMpH,EAAQ,YAAY,CAAC,GAAG;GACrE,EAAY,yBAAyBA,EAAQ,kBAAkB;GAC/D;EACF;EAGA,IAAM+T,IAAoB;GACxB,IAAA,QAFiB,KAAK,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC;GAGpE,MAAM/T;GACN,OAAOu2B;EACT;EAMA,AAJAld,EAAY,QAAQtF,CAAO,GAC3B6iB,IAAc7iB,CAAO,GACrB8iB,IAAc9iB,CAAO,GAErBuiB,EAAe,EAAE;EAEjB,IAAMQ,KAAgBZ,GAAmB,QAAQK,CAAY,IAAI,KAAKL,GAAmB;EAEzF,AADAM,EAAgBN,GAAmBY,EAAa,GAChDJ,EAAY,IAAI;CAClB,GAEMK,KAAoB,GAAY,MAAiB;EACrD,IAAMC,IAAgB7oB,EAAO,QAAQ,MAAMF,EAAE,WAAWjE,CAAE,CAAC,CAAC;EAC5D,AAAIgtB,IAAgB,KAId,CAHkB,OAAO,QAC3B,IAAI9oB,EAAK,QAAQ8oB,EAAc,iGAE5B,KAEP3d,EAAY,WAAWrP,CAAE;CAC3B,GAEMitB,KAAuB,MAAuC;EAElE,IADqB9oB,EAAO,SAEX,KACf,CAAC,OAAO,QACN,mCAAmC+oB,EAAS,KAAK,2EACnD,GAEA;EAGF,IAAMtc,IAAuBsc,EAAS,MAAM,KAAK,GAAG,OAAS;GAC3D,IAAI,QAAQ5oB,IAAM,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC;GAC5D,MAAM6oB,EAAE;GACR,OAAOA,EAAE;EACX,EAAE;EAEF,EAAY,SAASvc,CAAQ;CAC/B;CAEA,OACE,kBAAC,OAAD;EACE,OAAO;GACL,UAAU;GACV,KAAK;GACL,MAAM;GACN,OAAO;GACP,QAAQ;GACR,iBAAiB;GACjB,SAAS;GACT,YAAY;GACZ,gBAAgB;GAChB,QAAQ;EACV;EACA,SAAS3Y;EAET,UAAA,kBAAC,OAAD;GACE,OAAO;IACL,iBAAiB;IACjB,cAAc;IACd,OAAO;IACP,UAAU;IACV,WAAW;IACX,SAAS;IACT,eAAe;IACf,WAAW;IACX,UAAU;IACV,YAAY;GACd;GACA,UAAU,MAAM,EAAE,gBAAgB;GAbpC,UAAA;IAgBE,kBAAC,OAAD;KACE,OAAO;MACL,SAAS;MACT,cAAc;MACd,SAAS;MACT,YAAY;MACZ,gBAAgB;MAChB,iBAAiB;KACnB;KARF,UAAA,CAUE,kBAAC,OAAD;MAAK,OAAO;OAAE,SAAS;OAAQ,YAAY;OAAU,KAAK;MAAM;MAAhE,UAAA,CACE,kBAAC,OAAD;OACE,OAAO;QACL,OAAO;QACP,QAAQ;QACR,cAAc;QACd,iBAAiB;QACjB,SAAS;QACT,YAAY;QACZ,gBAAgB;QAChB,OAAO;OACT;OAEA,UAAA,kBAACm1B,IAAD,EAAO,MAAM,GAAK,CAAA;MACf,CAAA,GACL,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;OAAI,OAAO;QAAE,QAAQ;QAAG,UAAU;QAAQ,YAAY;QAAK,OAAO;OAAU;OAAG,UAAA;MAE3E,CAAA,GACJ,kBAAC,KAAD;OAAG,OAAO;QAAE,QAAQ;QAAG,UAAU;QAAQ,OAAO;OAAU;OAAG,UAAA;MAE1D,CAAA,CACA,EAAA,CAAA,CACF;KACL,CAAA,GAAA,kBAAC,UAAD;MACE,MAAK;MACL,SAASn1B;MACT,OAAO;OACL,YAAY;OACZ,QAAQ;OACR,QAAQ;OACR,OAAO;OACP,SAAS;OACT,cAAc;MAChB;MAEA,UAAA,kBAACC,IAAD,EAAG,MAAM,GAAK,CAAA;KACR,CAAA,CACL;;IAGL,kBAAC,OAAD;KAAK,OAAO;MAAE,SAAS;MAAQ,WAAW;MAAQ,SAAS;MAAQ,eAAe;MAAU,KAAK;KAAO;KAAxG,UAAA;MAEE,kBAAC,OAAD;OACE,OAAO;QACL,iBAAiB;QACjB,QAAQ;QACR,cAAc;QACd,SAAS;QACT,SAAS;QACT,eAAe;QACf,KAAK;OACP;OATF,UAAA;QAWE,kBAAC,QAAD;SAAM,OAAO;UAAE,UAAU;UAAQ,YAAY;UAAK,OAAO;SAAU;SAAG,UAAA;QAEhE,CAAA;QAEN,kBAAC,OAAD;SAAK,OAAO;UAAE,SAAS;UAAQ,KAAK;UAAO,YAAY;SAAS;SAAhE,UAAA,CACE,kBAAC,SAAD;UACE,MAAK;UACL,OAAOm0B;UACP,WAAW,MAAM;WAEf,AADAC,EAAe,EAAE,OAAO,KAAK,GACzBG,KAAUC,EAAY,IAAI;UAChC;UACA,YAAY,MAAM;WAChB,AAAI,EAAE,QAAQ,YACZ,EAAE,eAAe,GACjBC,EAAc;UAElB;UACA,aAAY;UACZ,OAAO;WACL,MAAM;WACN,SAAS;WACT,cAAc;WACd,QAAQ;WACR,UAAU;WACV,SAAS;UACX;SACD,CAAA,GAED,kBAAC,UAAD;UACE,MAAK;UACL,SAASA;UACT,OAAO;WACL,SAAS;WACT,YAAY;WACZ,KAAK;WACL,SAAS;WACT,iBAAiB;WACjB,OAAO;WACP,QAAQ;WACR,cAAc;WACd,UAAU;WACV,YAAY;WACZ,QAAQ;WACR,YAAY;UACd;UAhBF,UAAA,CAkBE,kBAACtqB,IAAD,EAAM,MAAM,GAAK,CAAA,GAAC,WACZ;SACL,CAAA,CAAA;;QAGL,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,QAAD;SAAM,OAAO;UAAE,UAAU;UAAQ,OAAO;UAAW,SAAS;UAAS,cAAc;SAAM;SAAG,UAAA;QAEtF,CAAA,GACN,kBAAC,OAAD;SAAK,OAAO;UAAE,SAAS;UAAQ,YAAY;UAAU,KAAK;UAAO,UAAU;SAAO;SAAlF,UAAA,CACG6pB,GAAmB,KAAK,MACvB,kBAAC,UAAD;UAEE,MAAK;UACL,eAAeM,EAAgBj3B,CAAC;UAChC,OAAO;WACL,OAAO;WACP,QAAQ;WACR,cAAc;WACd,iBAAiBA;WACjB,QAAQg3B,MAAiBh3B,IAAI,wBAAwB;WACrD,QAAQ;WACR,SAAS;WACT,YAAY;WACZ,gBAAgB;WAChB,SAAS;UACX;UAEC,UAAAg3B,MAAiBh3B,KAAK,kBAACyZ,GAAD;WAAO,MAAM;WAAI,OAAM;WAAU,aAAa;UAAI,CAAA;SACnE,GAjBDzZ,CAiBC,CACT,GACD,kBAAC,OAAD;UAAK,OAAO;WAAE,SAAS;WAAQ,YAAY;WAAU,KAAK;WAAO,YAAY;UAAM;UAAnF,UAAA,CACE,kBAAC,SAAD;WACE,MAAK;WACL,OAAOg3B;WACP,WAAW,MAAMC,EAAgB,EAAE,OAAO,KAAK;WAC/C,OAAO;YACL,OAAO;YACP,QAAQ;YACR,SAAS;YACT,QAAQ;YACR,cAAc;YACd,QAAQ;WACV;WACA,OAAM;UACP,CAAA,GACD,kBAAC,QAAD;WAAM,OAAO;YAAE,UAAU;YAAQ,OAAO;WAAU;WAAG,UAAA;UAAY,CAAA,CAC9D;SACF,CAAA,CAAA;QACF,CAAA,CAAA,EAAA,CAAA;QAEJC,KACC,kBAAC,QAAD;SAAM,OAAO;UAAE,UAAU;UAAQ,OAAO;UAAW,YAAY;SAAI;SAChE,UAAAA;QACG,CAAA;OAEL;;MAGL,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,OAAD;OAAK,OAAO;QAAE,SAAS;QAAQ,YAAY;QAAU,gBAAgB;QAAiB,cAAc;OAAM;OAA1G,UAAA,CACE,kBAAC,QAAD;QAAM,OAAO;SAAE,UAAU;SAAQ,YAAY;SAAK,OAAO;QAAU;QAAnE,UAAA;SAAsE;SACpDznB,EAAM;SAAO;QACzB;OACN,CAAA,GAAA,kBAAC,QAAD;QAAM,OAAO;SAAE,UAAU;SAAQ,OAAO;QAAU;QAAG,UAAA;OAE/C,CAAA,CACH;MAEJ,CAAA,GAAAA,EAAM,WAAW,IAChB,kBAAC,OAAD;OACE,OAAO;QACL,SAAS;QACT,WAAW;QACX,iBAAiB;QACjB,QAAQ;QACR,cAAc;QACd,OAAO;QACP,UAAU;OACZ;OACD,UAAA;MAEI,CAAA,IAEL,kBAAC,OAAD;OAAK,OAAO;QAAE,SAAS;QAAQ,eAAe;QAAU,KAAK;OAAM;OAChE,UAAAA,EAAM,KAAK,MAAS;QACnB,IAAMgoB,IAAgB7oB,EAAO,QAAQ,MAAMF,EAAE,WAAWoB,EAAK,EAAE,CAAC,CAAC;QAEjE,OACE,kBAAC,OAAD;SAEE,WAAU;SACV,kBAAgBA,EAAK;SACrB,OAAO;UACL,SAAS;UACT,YAAY;UACZ,gBAAgB;UAChB,SAAS;UACT,iBAAiB;UACjB,QAAQ;UACR,cAAc;UACd,KAAK;SACP;SAbF,UAAA,CAgBE,kBAAC,OAAD;UAAK,OAAO;WAAE,SAAS;WAAQ,YAAY;WAAU,KAAK;WAAQ,MAAM;UAAE;UAA1E,UAAA,CACE,kBAAC,OAAD;WAAK,OAAO,EAAE,UAAU,WAAW;WAAnC,UAAA,CACE,kBAAC,SAAD;YACE,MAAK;YACL,OAAOA,EAAK;YACZ,WAAW,MAAMgK,EAAY,WAAWhK,EAAK,IAAI,EAAE,OAAO/E,EAAE,OAAO,MAAM,CAAC;YAC1E,OAAO;aACL,UAAU;aACV,SAAS;aACT,OAAO;aACP,QAAQ;aACR,QAAQ;YACV;YACA,OAAM;WACP,CAAA,GACD,kBAAC,OAAD,EACE,OAAO;YACL,OAAO;YACP,QAAQ;YACR,cAAc;YACd,iBAAiB+E,EAAK;YACtB,QAAQ;YACR,QAAQ;WACV,EACD,CAAA,CACE;UAEL,CAAA,GAAA,kBAAC,QAAD;WAAM,OAAO;YAAE,UAAU;YAAQ,YAAY;YAAK,OAAO;WAAU;WAChE,UAAAA,EAAK;UACF,CAAA,CACH;SAGL,CAAA,GAAA,kBAAC,OAAD;UAAK,OAAO;WAAE,SAAS;WAAQ,YAAY;WAAU,KAAK;UAAM;UAAhE,UAAA,CACE,kBAAC,QAAD;WACE,OAAO;YACL,UAAU;YACV,SAAS;YACT,cAAc;YACd,iBAAiB,GAAGA,EAAK,MAAM;YAC/B,OAAOA,EAAK;YACZ,YAAY;YACZ,YAAY;WACd;WATF,UAAA;YAWG2nB;YAAc;YAAEA,MAAkB,IAAI,UAAU;WAC7C;UAEN,CAAA,GAAA,kBAAC,UAAD;WACE,MAAK;WACL,eAAeD,EAAiB1nB,EAAK,IAAIA,EAAK,IAAI;WAClD,OAAO,UAAUA,EAAK;WACtB,OAAO;YACL,YAAY;YACZ,QAAQ;YACR,QAAQ;YACR,OAAO;YACP,SAAS;YACT,cAAc;YACd,SAAS;YACT,YAAY;WACd;WACA,eAAe,MAAO,EAAE,cAAc,MAAM,QAAQ;WACpD,eAAe,MAAO,EAAE,cAAc,MAAM,QAAQ;WAEpD,UAAA,kBAACzP,IAAD,EAAQ,MAAM,GAAK,CAAA;UACb,CAAA,CACL;SACF,CAAA,CAAA;QAnFE,GAAAyP,EAAK,EAmFP;OAET,CAAC;MACE,CAAA,CAEJ,EAAA,CAAA;MAGL,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,OAAD;OAAK,OAAO;QAAE,SAAS;QAAQ,YAAY;QAAU,KAAK;QAAO,cAAc;OAAM;OAArF,UAAA,CACE,kBAACgoB,IAAD;QAAU,MAAM;QAAI,OAAM;OAAW,CAAA,GACrC,kBAAC,QAAD;QAAM,OAAO;SAAE,UAAU;SAAQ,YAAY;SAAK,OAAO;QAAU;QAAG,UAAA;OAEhE,CAAA,CACH;MACL,CAAA,GAAA,kBAAC,OAAD;OAAK,OAAO;QAAE,SAAS;QAAQ,KAAK;QAAO,UAAU;OAAO;OACzD,UAAAlB,GAAe,KAAK,MACnB,kBAAC,UAAD;QAEE,MAAK;QACL,eAAec,EAAoBK,CAAI;QACvC,OAAO;SACL,UAAU;SACV,SAAS;SACT,cAAc;SACd,QAAQ;SACR,iBAAiB;SACjB,OAAO;SACP,QAAQ;SACR,YAAY;QACd;QAbF,UAAA,CAcC,MACIA,EAAK,IACF;OAfD,GAAAA,EAAK,IAeJ,CACT;MACE,CAAA,CACF,EAAA,CAAA;KACF;;IAGL,kBAAC,OAAD;KACE,OAAO;MACL,SAAS;MACT,WAAW;MACX,SAAS;MACT,gBAAgB;MAChB,iBAAiB;KACnB;KAEA,UAAA,kBAAC,UAAD;MACE,MAAK;MACL,SAASr1B;MACT,OAAO;OACL,SAAS;OACT,iBAAiB;OACjB,QAAQ;OACR,cAAc;OACd,UAAU;OACV,YAAY;OACZ,OAAO;OACP,QAAQ;MACV;MACD,UAAA;KAEO,CAAA;IACL,CAAA;GACF;;CACF,CAAA;AAET,GCjeas1B,MAA6C,EACxD,eACA,kBACA,gBACA,mBACA,mBAAgB,IAChB,qBACA,wBAAqB,MACrB,+BACI;CACJ,IAAMC,IAAerhC,EAAyB,IAAI,GAC5C,CAACshC,GAAkBC,KAAuB79B,EAAS,EAAK,GACxD,CAACmV,GAAOwK,KAAY3f,QAA2Bwf,EAAY,SAAS,CAAC;CAyC3E,OAvCAhjB,QACgBgjB,EAAY,eAAe,MAAYG,EAASpW,CAAO,CAC9D,GACN,CAACiW,CAAW,CAAC,GAqCd,kBAAC,OAAD;EACE,OAAO;GACL,SAAS;GACT,YAAY;GACZ,gBAAgB;GAChB,SAAS;GACT,iBAAiB;GACjB,cAAc;GACd,QAAQ;GACR,YAAY;GACZ,UAAU;EACZ;EAXF,UAAA;GAcE,kBAAC,OAAD;IAAK,OAAO;KAAE,SAAS;KAAQ,YAAY;KAAU,KAAK;IAAM;IAAhE,UAAA;KAEE,kBAACnkB,IAAD;MACE,MAAM,kBAAC0iC,IAAD,EAAO,MAAM,GAAK,CAAA;MACxB,OAAM;MACN,UAAU,CAACve,EAAY;MACvB,eAAeA,EAAY,KAAK;KACjC,CAAA;KACD,kBAACnkB,IAAD;MACE,MAAM,kBAAC2iC,IAAD,EAAO,MAAM,GAAK,CAAA;MACxB,OAAM;MACN,UAAU,CAACxe,EAAY;MACvB,eAAeA,EAAY,KAAK;KACjC,CAAA;KAED,kBAAC,OAAD,EAAK,OAAO;MAAE,OAAO;MAAO,QAAQ;MAAQ,iBAAiB;MAAW,QAAQ;KAAQ,EAAI,CAAA;KAG5F,kBAACnkB,IAAD;MACE,MAAM,kBAACmI,GAAD,EAAc,MAAM,GAAK,CAAA;MAC/B,OAAM;MACN,QAAQie,MAAe,YAAYA,MAAe;MAClD,eAAemB,EAAc,QAAQ;KACtC,CAAA;KAED,kBAAC,OAAD,EAAK,OAAO;MAAE,OAAO;MAAO,QAAQ;MAAQ,iBAAiB;MAAW,QAAQ;KAAQ,EAAI,CAAA;KAG5F,kBAACvnB,IAAD;MACE,MAAM,kBAACmV,IAAD,EAAM,MAAM,GAAK,CAAA;MACvB,OAAM;MACN,QAAQiR,MAAe;MACvB,eAAemB,EAAc,SAAS;KACvC,CAAA;KACD,kBAACvnB,IAAD;MACE,MAAM,kBAACyf,GAAD,EAAW,MAAM,GAAK,CAAA;MAC5B,OAAM;MACN,QAAQ2G,MAAe;MACvB,eAAemB,EAAc,UAAU;KACxC,CAAA;KACD,kBAACvnB,IAAD;MACE,MAAM,kBAAC4iC,GAAD,EAAU,MAAM,GAAK,CAAA;MAC3B,OAAM;MACN,QAAQxc,MAAe;MACvB,eAAemB,EAAc,UAAU;KACxC,CAAA;KACD,kBAACvnB,IAAD;MACE,MAAM,kBAAC6iC,IAAD,EAAY,MAAM,GAAK,CAAA;MAC7B,OAAM;MACN,QAAQzc,MAAe;MACvB,eAAemB,EAAc,WAAW;KACzC,CAAA;KACD,kBAACvnB,IAAD;MACE,MAAM,kBAAC8iC,GAAD,EAAmB,MAAM,GAAK,CAAA;MACpC,OAAM;MACN,QAAQ1c,MAAe;MACvB,eAAemB,EAAc,UAAU;KACxC,CAAA;KACD,kBAACvnB,IAAD;MACE,MAAM,kBAAC+iC,GAAD,EAAW,MAAM,GAAK,CAAA;MAC5B,OAAM;MACN,QAAQ3c,MAAe;MACvB,eAAemB,EAAc,OAAO;KACrC,CAAA;KACD,kBAACvnB,IAAD;MACE,MAAM,kBAACgjC,IAAD,EAAS,MAAM,GAAK,CAAA;MAC1B,OAAM;MACN,QAAQ5c,MAAe;MACvB,eAAemB,EAAc,WAAW;KACzC,CAAA;KACD,kBAACvnB,IAAD;MACE,MAAM,kBAAC4I,IAAD,EAAa,MAAM,GAAK,CAAA;MAC9B,OAAM;MACN,QAAQwd,MAAe;MACvB,eAAemB,EAAc,mBAAmB;KACjD,CAAA;KAED,kBAAC,OAAD,EAAK,OAAO;MAAE,OAAO;MAAO,QAAQ;MAAQ,iBAAiB;MAAW,QAAQ;KAAQ,EAAI,CAAA;KAG3F0b,KACC,kBAACjjC,IAAD;MACE,MAAM,kBAACkjC,IAAD,EAAa,MAAM,GAAK,CAAA;MAC9B,OAAM;MACN,QAAQ9a;MACR,eAAe6a,EAAiB,CAAC7a,CAAa;KAC/C,CAAA;KAIH,kBAAC,UAAD;MACE,MAAK;MACL,eAAeoa,EAAoB,EAAI;MACvC,OAAM;MACN,OAAO;OACL,SAAS;OACT,YAAY;OACZ,KAAK;OACL,SAAS;OACT,iBAAiBD,IAAmB,YAAY;OAChD,QAAQA,IAAmB,sBAAsB;OACjD,cAAc;OACd,OAAO;OACP,QAAQ;OACR,UAAU;OACV,YAAY;OACZ,YAAY;MACd;MAjBF,UAAA,CAmBE,kBAACY,IAAD;OAAU,MAAM;OAAI,OAAM;MAAW,CAAA,GACrC,kBAAC,QAAD,EAAA,UAAA;OAAM;OAAQrpB,EAAM;OAAO;MAAO,EAAA,CAAA,CAC5B;;KAGPspB,KACC,kBAAC,OAAD;MAAK,OAAO;OAAE,SAAS;OAAQ,YAAY;OAAU,KAAK;OAAO,YAAY;MAAM;MAAnF,UAAA,CACE,kBAAClB,IAAD;OAAO,MAAM;OAAI,OAAM;MAAW,CAAA,GAClC,kBAAC,UAAD;OACE,OAAO9a,KAAsB;OAC7B,WAAW,MAAMgc,EAAsB,EAAE,OAAO,SAAS,IAAI;OAC7D,OAAO;QACL,UAAU;QACV,SAAS;QACT,QAAQ;QACR,cAAc;QACd,iBAAiB;QACjB,OAAO;QACP,QAAQ;OACV;OACA,OAAM;OAZR,UAAA,CAcE,kBAAC,UAAD;QAAQ,OAAM;QAAG,UAAA;OAA0B,CAAA,GAC1CtpB,EAAM,KAAK,MACV,kBAAC,UAAD;QAAmB,OAAO5H,EAAE;QAA5B,UAAA,CAAgC,YACrBA,EAAE,IACL;OAFK,GAAAA,EAAE,EAEP,CACT,CACK;MACL,CAAA,CAAA;;IAEJ;;GAGL,kBAAC,OAAD;IAAK,OAAO;KAAE,SAAS;KAAQ,YAAY;KAAU,KAAK;IAAM;IAAhE,UAAA;KACE,kBAAC,SAAD;MACE,KAAKowB;MACL,MAAK;MACL,QAAO;MACP,OAAO,EAAE,SAAS,OAAO;MACzB,WAzLoB,MAA2C;OACrE,IAAMlf,IAAO,EAAE,OAAO,QAAQ;OAC9B,IAAI,CAACA,GAAM;OACX,IAAMC,IAAS,IAAI,WAAW;OAQ9B,AAPA,EAAO,UAAU,MAAU;QACzB,IAAMggB,IAAU99B,EAAM,QAAQ;QAC9B,AAAI89B,KACFlf,EAAY,iBAAiBkf,CAAO;OAExC,GACAhgB,EAAO,WAAWD,CAAI,GAClBkf,EAAa,YAAS,EAAa,QAAQ,QAAQ;MACzD;KA8KO,CAAA;KAED,kBAAC,UAAD;MACE,MAAK;MACL,eAAeA,EAAa,SAAS,MAAM;MAC3C,OAAM;MACN,OAAO;OACL,SAAS;OACT,YAAY;OACZ,KAAK;OACL,SAAS;OACT,iBAAiB;OACjB,QAAQ;OACR,cAAc;OACd,OAAO;OACP,QAAQ;OACR,UAAU;MACZ;MAfF,UAAA,CAiBE,kBAAC3e,GAAD,EAAQ,MAAM,GAAK,CAAA,GAAC,SACd;;KAER,kBAAC,UAAD;MACE,MAAK;MACL,eA/NyB;OAC/B,IAAM7I,IAAOqJ,EAAY,iBAAiB,GACpCmf,IAAO,IAAI,KAAK,CAACxoB,CAAI,GAAG,EAAE,MAAM,mBAAmB,CAAC,GACpDjQ,IAAM,IAAI,gBAAgBy4B,CAAI,GAC9B7xB,IAAI,SAAS,cAAc,GAAG;OAMpC,AALA,EAAE,OAAO5G,GACT,EAAE,WAAW,oBACb,SAAS,KAAK,YAAY4G,CAAC,GAC3BA,EAAE,MAAM,GACR,SAAS,KAAK,YAAYA,CAAC,GAC3B,IAAI,gBAAgB5G,CAAG;MACzB;MAqNQ,OAAM;MACN,OAAO;OACL,SAAS;OACT,YAAY;OACZ,KAAK;OACL,SAAS;OACT,iBAAiB;OACjB,QAAQ;OACR,cAAc;OACd,OAAO;OACP,QAAQ;OACR,UAAU;MACZ;MAfF,UAAA,CAiBE,kBAAChF,IAAD,EAAU,MAAM,GAAK,CAAA,GAAC,SAChB;;KAER,kBAAC,UAAD;MACE,MAAK;MACL,eAxNqB;OAC3B,AAAIse,EAAY,UAAU,CAAC,CAAC,WAAW,KACnC,OAAO,QAAQ,qEAAqE,KACtFA,EAAY,YAAY;MAE5B;MAoNQ,OAAM;MACN,OAAO;OACL,SAAS;OACT,YAAY;OACZ,KAAK;OACL,SAAS;OACT,iBAAiB;OACjB,QAAQ;OACR,cAAc;OACd,OAAO;OACP,QAAQ;OACR,UAAU;MACZ;MAfF,UAAA,CAiBE,kBAACzZ,IAAD,EAAQ,MAAM,GAAK,CAAA,GAAC,YACd;;KAEP64B,KACC,kBAAC,UAAD;MACE,MAAK;MACL,SAASA;MACT,OAAM;MACN,OAAO;OACL,SAAS;OACT,YAAY;OACZ,KAAK;OACL,SAAS;OACT,iBAAiB;OACjB,QAAQ;OACR,cAAc;OACd,OAAO;OACP,QAAQ;OACR,UAAU;OACV,YAAY;MACd;MAhBF,UAAA,CAkBE,kBAACC,GAAD,EAAK,MAAM,GAAK,CAAA,GAAC,YACX;;IAEP;;GAGJjB,KACC,kBAACrB,IAAD;IACe;IACb,eAAesB,EAAoB,EAAK;GACzC,CAAA;EAEA;;AAET,GAUMxiC,MAAyC,EAAE,SAAM,UAAO,YAAS,IAAO,cAAW,IAAO,iBAE5F,kBAAC,UAAD;CACE,MAAK;CACL,OAAO2J;CACG;CACV,SAASP,IAAW,KAAA,IAAYC;CAChC,OAAO;EACL,SAAS;EACT,YAAY;EACZ,KAAK;EACL,SAAS;EACT,iBAAiBC,IAAS,YAAY;EACtC,QAAQA,IAAS,sCAAsC;EACvD,cAAc;EACd,OAAOA,IAAS,4BAA4BF,IAAW,YAAY;EACnE,QAAQA,IAAW,gBAAgB;EACnC,YAAYE,IAAS,MAAM;EAC3B,UAAU;EACV,YAAY;CACd;CAlBF,UAAA,CAoBGC,GACD,kBAAC,QAAD,EAAA,UAAOI,EAAY,CAAA,CACb;IC1WC85B,MAAuD,EAClE,gBACA,6BACI;CACJ,IAAM,CAACxqB,GAAQiL,KAAavf,QAA4Bwf,EAAY,UAAU,CAAC,GACzE,CAACC,GAAQC,KAAa1f,QAA+Bwf,EAAY,UAAU,CAAC,GAC5E,CAACrK,GAAOwK,KAAY3f,QAA2Bwf,EAAY,SAAS,CAAC,GACrE,CAACI,GAAeC,KAAoB7f,QAA8Bwf,EAAY,eAAe,CAAC,GAC9F,CAACM,GAAeC,KAAoB/f,QAA8Bwf,EAAY,iBAAiB,CAAC,GAChG,CAAC9H,GAASC,KAAc3X,QAAmCwf,EAAY,WAAW,CAAC,GACnF,CAAC/D,GAAasjB,KAAkB/+B,QAAkCwf,EAAY,eAAe,CAAC,GAC9F,CAACwf,GAAeC,KAAoBj/B,EAA6D,IAAI;CAsB3G,IApBAxD,QAAgB;EACd,IAAMmkB,IAAcnB,EAAY,qBAAqBD,EAAUC,EAAY,UAAU,CAAC,CAAC,GACjFoB,IAAYpB,EAAY,cAAc,MAAcE,EAAU1K,CAAS,CAAC,GACxE8L,IAAatB,EAAY,eAAe,MAAaG,EAASoB,CAAQ,CAAC,GACvEC,IAAexB,EAAY,qBAAqB,MAASK,EAAiBoB,CAAI,CAAC,GAC/EC,IAAc1B,EAAY,qBAAqB,MAAQO,EAAiBmf,CAAG,CAAC,GAC5E9d,IAAe5B,EAAY,iBAAiB,MAAS7H,EAAWlC,CAAI,CAAC,GACrE0pB,IAAY3f,EAAY,qBAAqB,MAAMuf,EAAezB,CAAC,CAAC;EAE1E,aAAa;GAOX,AANA3c,EAAY,GACZC,EAAU,GACVE,EAAW,GACXE,EAAa,GACbE,EAAY,GACZE,EAAa,GACb+d,EAAU;EACZ;CACF,GAAG,CAAC3f,CAAW,CAAC,GAEZ9H,EAAQ,eAAepD,EAAO,WAAW,GAAG,OAAO;CAEvD,IAAM8qB,IAAcjqB,EAAM,MAAM,MAAM5H,EAAE,OAAOqS,CAAa,GACtDyf,IAAa7f,EAAY,cAAcI,CAAa,GACpD0f,KAAmBxf,IAAgBuf,EAAW,WAAW,MAAMjrB,EAAE,OAAO0L,CAAa,IAAI,IAGzFyf,IAAe3f,IAAgBtL,EAAO,QAAQ,MAAMF,EAAE,WAAWwL,CAAa,IAAItL,GAClFkrB,IAAsBD,EAAa,QAAQ,MAAMnrB,EAAE,QAAQ,CAAC,CAAC,QAC7DqrB,IAAoBF,EAAa,QAAQ,MAAM;EACnD,IAAMtpB,IAAMwJ,EAAOrL,EAAE;EAGrB,OADA,EADI6B,KAA6B,QAAQA,MAAQ,MAC7C,MAAM,QAAQA,CAAG,KAAKA,EAAI,WAAW;CAE3C,CAAC,CAAC,CAAC;CAkCH,OACE,kBAAC,OAAD;EACE,OAAO;GACL,SAAS;GACT,YAAY;GACZ,gBAAgB;GAChB,SAAS;GACT,iBAAiB;GACjB,cAAc;GACd,UAAU;GACV,YAAY;GACZ,UAAU;GACV,KAAK;EACP;EAZF,UAAA,CAeE,kBAAC,OAAD;GAAK,OAAO;IAAE,SAAS;IAAQ,YAAY;IAAU,KAAK;IAAQ,UAAU;GAAO;GAAnF,UAAA;IACE,kBAAC,QAAD;KACE,OAAO;MACL,SAAS;MACT,YAAY;MACZ,KAAK;MACL,iBAAiB;MACjB,OAAO;MACP,SAAS;MACT,cAAc;MACd,YAAY;MACZ,UAAU;KACZ;KAXF,UAAA,CAaE,kBAACypB,GAAD,EAAiB,MAAM,GAAK,CAAA,GAAC,YACzB;;IAGLhoB,EAAQ,qBAAqB,MAC5B,kBAAC,OAAD;KACE,OAAO;MACL,SAAS;MACT,YAAY;MACZ,KAAK;MACL,iBAAiB;MACjB,QAAQ;MACR,cAAc;MACd,SAAS;KACX;KATF,UAAA;MAWE,kBAAC6lB,IAAD;OAAO,MAAM;OAAI,OAAO6B,GAAa,SAAS;MAAY,CAAA;MAC1D,kBAAC,QAAD;OAAM,OAAO;QAAE,UAAU;QAAQ,OAAO;QAAW,YAAY;OAAI;OAAG,UAAA;MAAiB,CAAA;MAGtF3jB,GAAa,QACZ,kBAAC,QAAD;OACE,OAAO;QACL,UAAU;QACV,YAAY;QACZ,OAAO;OACT;OACA,OAAOA,EAAY,QAAQ,GAAGA,EAAY,KAAK,IAAIA,EAAY,MAAM,KAAKA,EAAY;OAErF,UAAAA,EAAY;MACT,CAAA;MAGP/D,EAAQ,uBAAuB,KAC9B,kBAAC,QAAD;OACE,OAAO;QACL,UAAU;QACV,YAAY;QACZ,OAAO0nB,GAAa,SAAS;QAC7B,iBAAiBA,GAAa,QAAQ,GAAGA,EAAY,MAAM,MAAM;QACjE,SAAS;QACT,cAAc;OAChB;OACA,OACE3jB,GAAa,OACT,kBAAkB2jB,GAAa,QAAQ,OAAO,OAAO3jB,EAAY,SACjE;OAGL,UAAAA,GAAa,OAAO,IAAI2jB,GAAa,QAAQ,OAAO,KAAMA,GAAa,QAAQ;MAC5E,CAAA,IAEN,kBAAC,UAAD;OACE,OAAOxf,KAAiB;OACxB,WAAW,MAAMJ,EAAY,eAAe/O,EAAE,OAAO,SAAS,IAAI;OAClE,OAAO;QACL,UAAU;QACV,YAAY;QACZ,QAAQ;QACR,iBAAiB;QACjB,OAAO2uB,GAAa,SAAS;QAC7B,QAAQ;QACR,SAAS;OACX;OAXF,UAAA,CAaE,kBAAC,UAAD;QAAQ,OAAM;QAAG,UAAA;OAA0B,CAAA,GAC1CjqB,EAAM,KAAK,MAAM;QAChB,IAAMwqB,IAAiBrrB,EAAO,QAAQ,MAAMF,EAAE,WAAW7G,EAAE,EAAE,CAAC,CAAC;QAC/D,OACE,kBAAC,UAAD;SAAmB,OAAOA,EAAE;SAA5B,UAAA;UACGA,EAAE;UAAK;UAAGoyB;UAAe;UAAEA,MAAmB,IAAI,UAAU;UAAS;SAChE;QAFK,GAAApyB,EAAE,EAEP;OAEZ,CAAC,CACK;;KAEP;;IAINmK,EAAQ,uBAAuB,MAC9B,kBAAC,OAAD;KACE,OAAO;MACL,SAAS;MACT,YAAY;MACZ,KAAK;MACL,iBAAiB;MACjB,QAAQ;MACR,cAAc;MACd,SAAS;KACX;KATF,UAAA;MAWE,kBAAC,UAAD;OACE,MAAK;OACL,eAAe8H,EAAY,kBAAkB;OAC7C,UAAU6f,EAAW,WAAW;OAChC,OAAM;OACN,OAAO;QACL,SAAS;QACT,YAAY;QACZ,gBAAgB;QAChB,YAAY;QACZ,QAAQ;QACR,SAAS;QACT,QAAQA,EAAW,SAAS,IAAI,YAAY;QAC5C,OAAOA,EAAW,SAAS,IAAI,YAAY;QAC3C,cAAc;OAChB;OAEA,UAAA,kBAAC7I,GAAD,EAAa,MAAM,GAAK,CAAA;MAClB,CAAA;MAER,kBAAC,QAAD;OACE,OAAO;QACL,UAAU;QACV,YAAY;QACZ,OAAO4I,GAAa,SAAS;QAC7B,SAAS;QACT,UAAU;QACV,WAAW;OACb;OAEC,UAAAE,MAAoB,IAAI,QAAQA,KAAmB,EAAE,MAAMD,EAAW,WAAW,GAAGA,EAAW,OAAO;MACnG,CAAA;MAEN,kBAAC,UAAD;OACE,MAAK;OACL,eAAe7f,EAAY,cAAc;OACzC,UAAU6f,EAAW,WAAW;OAChC,OAAM;OACN,OAAO;QACL,SAAS;QACT,YAAY;QACZ,gBAAgB;QAChB,YAAY;QACZ,QAAQ;QACR,SAAS;QACT,QAAQA,EAAW,SAAS,IAAI,YAAY;QAC5C,OAAOA,EAAW,SAAS,IAAI,YAAY;QAC3C,cAAc;OAChB;OAEA,UAAA,kBAAC1I,GAAD,EAAc,MAAM,GAAK,CAAA;MACnB,CAAA;KACL;;IAIP,kBAAC,QAAD;KAAM,OAAO;MAAE,OAAO;MAAW,UAAU;KAAO;KAAlD,UAAA;MACG8I;MAAkB;MAAEF,EAAa;MAAO;MACxCC,IAAsB,KAAK,KAAKA,EAAoB;KACjD;;IAELR,KACC,kBAAC,QAAD;KACE,OAAO;MACL,SAAS;MACT,YAAY;MACZ,KAAK;MACL,SAAS;MACT,cAAc;MACd,UAAU;MACV,YAAY;MACZ,iBAAiBA,EAAc,SAAS,YAAY,YAAY;MAChE,OAAOA,EAAc,SAAS,YAAY,YAAY;KACxD;KAXF,UAAA,CAaGA,EAAc,SAAS,YAAY,kBAACxH,GAAD,EAAc,MAAM,GAAK,CAAA,IAAI,kBAACJ,GAAD,EAAa,MAAM,GAAK,CAAA,GACxF4H,EAAc,IACX;;GAEL;EAGL,CAAA,GAAA,kBAAC,OAAD;GAAK,OAAO;IAAE,SAAS;IAAQ,YAAY;IAAU,KAAK;GAAM;GAAhE,UAAA;IACGtnB,EAAQ,mBAAmB,MAC1B,kBAAC,UAAD;KACE,MAAK;KACL,eAnOmB;MAC3B,IAAMkoB,IAAMpgB,EAAY,SAAS;MACjC,IAAIogB,EAAI,OAAO;OACb,IAAMC,IAAaT,IAAc,GAAGA,EAAY,KAAK,sBAAsB;OAC3E,EAAiB;QAAE,MAAM;QAAW,MAAM,GAAGS,EAAW;OAAa,CAAC;MACxE,OAAO;OACL,IAAMC,IAAc,OAAO,KAAKF,EAAI,MAAM,CAAC,CAAC,KAAK,IAAI;OACrD,EAAiB;QAAE,MAAM;QAAS,MAAM,qBAAqBE;OAAc,CAAC;MAC9E;MACA,iBAAiBb,EAAiB,IAAI,GAAG,GAAI;KAC/C;KA0NU,OAAM;KACN,OAAO;MACL,SAAS;MACT,YAAY;MACZ,KAAK;MACL,SAAS;MACT,iBAAiB;MACjB,QAAQ;MACR,cAAc;MACd,OAAO;MACP,QAAQ;MACR,UAAU;MACV,YAAY;KACd;KAhBF,UAAA,CAkBE,kBAACzH,GAAD;MAAc,MAAM;MAAI,OAAM;KAAW,CAAA,GAAC,WACpC;;IAGT9f,EAAQ,eAAe,MACtB,kBAAC,UAAD;KACE,MAAK;KACL,eAvQqB;MAC7B,IAAMvB,IAAOqJ,EAAY,eAAe,GAClCmf,IAAO,IAAI,KAAK,CAACxoB,CAAI,GAAG,EAAE,MAAM,mBAAmB,CAAC,GACpDjQ,IAAM,IAAI,gBAAgBy4B,CAAI,GAC9B7xB,IAAI,SAAS,cAAc,GAAG;MAMpC,AALA,EAAE,OAAO5G,GACT,EAAE,WAAW,kBACb,SAAS,KAAK,YAAY4G,CAAC,GAC3BA,EAAE,MAAM,GACR,SAAS,KAAK,YAAYA,CAAC,GAC3B,IAAI,gBAAgB5G,CAAG;KACzB;KA6PU,OAAM;KACN,OAAO;MACL,SAAS;MACT,YAAY;MACZ,KAAK;MACL,SAAS;MACT,iBAAiB;MACjB,QAAQ;MACR,cAAc;MACd,OAAO;MACP,QAAQ;MACR,UAAU;MACV,YAAY;KACd;KAhBF,UAAA,CAkBE,kBAAChF,IAAD,EAAU,MAAM,GAAK,CAAA,GAAC,cAChB;;IAGTwW,EAAQ,eAAe,MAASqoB,KAC/B,kBAAC,UAAD;KACE,MAAK;KACL,SAASA;KACT,OAAM;KACN,OAAO;MACL,SAAS;MACT,YAAY;MACZ,KAAK;MACL,SAAS;MACT,iBAAiB;MACjB,QAAQ;MACR,cAAc;MACd,OAAO;MACP,QAAQ;MACR,UAAU;MACV,YAAY;KACd;KAhBF,UAAA,CAkBE,kBAAC7+B,IAAD,EAAU,MAAM,GAAK,CAAA,GAAC,eAChB;;IAGTwW,EAAQ,cAAc,MACrB,kBAAC,UAAD;KACE,MAAK;KACL,eA5RgB;MACxB,AAAI,OAAO,QAAQ,gCAAgC,MACjD8H,EAAY,YAAY,GACxByf,EAAiB,IAAI;KAEzB;KAwRU,OAAM;KACN,OAAO;MACL,SAAS;MACT,YAAY;MACZ,KAAK;MACL,SAAS;MACT,iBAAiB;MACjB,QAAQ;MACR,OAAO;MACP,QAAQ;MACR,UAAU;KACZ;KAdF,UAAA,CAgBE,kBAAC18B,IAAD,EAAW,MAAM,GAAK,CAAA,GAAC,QACjB;;GAEP;EACF,CAAA,CAAA;;AAET,GC1Xay9B,MAA2D,EACtE,gBACA,cACA,sBACI;CACJ,IAAM,CAAC1rB,GAAQiL,KAAavf,QAA4Bwf,EAAY,UAAU,CAAC,GACzE,CAACC,GAAQC,KAAa1f,QAA+Bwf,EAAY,UAAU,CAAC,GAC5E,CAACrK,GAAOwK,KAAY3f,QAA2Bwf,EAAY,SAAS,CAAC,GACrE,CAACI,GAAeC,KAAoB7f,QACxCwf,EAAY,eAAe,CAC7B,GACM,CAACM,GAAeC,KAAoB/f,QACxCwf,EAAY,iBAAiB,CAC/B,GACM,CAAC9H,GAASC,KAAc3X,QAAmCwf,EAAY,WAAW,CAAC,GACnF,CAAC/D,GAAasjB,KAAkB/+B,QAAkCwf,EAAY,eAAe,CAAC,GAC9F,CAACygB,GAAaC,KAAkBlgC,EAAkB,EAAK,GACvD,CAACmgC,IAAgBC,KAAqBpgC,EAAwB,IAAI;CAExE,QAAgB;EACd,IAAM2gB,IAAcnB,EAAY,qBAAqBD,EAAUC,EAAY,UAAU,CAAC,CAAC,GACjFoB,IAAYpB,EAAY,cAAc,MAAYE,EAAU2gB,CAAO,CAAC,GACpEvf,IAAatB,EAAY,eAAe,MAC5CG,EAASoB,CAAQ,CACnB,GACMC,IAAexB,EAAY,qBAAqB,MACpDK,EAAiBoB,CAAI,CACvB,GACMC,IAAc1B,EAAY,qBAAqB,MAAQO,EAAiBmf,CAAG,CAAC,GAC5E9d,IAAe5B,EAAY,iBAAiB,MAAS7H,EAAWlC,CAAI,CAAC,GACrE0pB,IAAY3f,EAAY,qBAAqB,MAAMuf,EAAezB,CAAC,CAAC;EAE1E,aAAa;GAOX,AANA3c,EAAY,GACZC,EAAU,GACVE,EAAW,GACXE,EAAa,GACbE,EAAY,GACZE,EAAa,GACb+d,EAAU;EACZ;CACF,GAAG,CAAC3f,CAAW,CAAC;CAGhB,IAAM8gB,IAAkBC,QACfjsB,EAAO,QACX,MAAMF,EAAE,SAAS,eAAeA,EAAE,SAAS,mBAC9C,GACC,CAACE,CAAM,CAAC,GAKLksB,IAAqBD,QACrB3gB,IACK0gB,EAAgB,QACpB,MAAMlsB,EAAE,WAAWwL,KAAiB,CAACxL,EAAE,MAC1C,IAEKksB,GACN,CAACA,GAAiB1gB,CAAa,CAAC,GAE7Bwf,KAAcmB,QACb3gB,KACEzK,EAAM,MAAM,MAAM5H,EAAE,OAAOqS,CAAa,KADpB,MAE1B,CAACzK,GAAOyK,CAAa,CAAC,GAEnB6gB,IAAgBn3B,GACnB,MAA8B;EAC7B,IAAM2M,IAAMwJ,EAAOlL,EAAM;EACzB,IAAI,CAAC0B,GAAK,OAAO;EACjB,IAAI,OAAOA,KAAQ,YAAYA,EAAI,KAAK,CAAC,CAAC,SAAS,GAAG,OAAO;EAC7D,IAAI,OAAOA,KAAQ,YAAYA,GAAc;GAC3C,IAAMyqB,IAAMzqB;GACZ,OAAO,GAAQyqB,EAAI,WAAWA,EAAI,cAAeA,EAAY;EAC/D;EACA,OAAO;CACT,GACA,CAACjhB,CAAM,CACT,GAMMkhB,KAJoBJ,QACjBC,EAAmB,QAAQ,MAAM,CAACC,EAAcrsB,CAAC,CAAC,GACxD,CAACosB,GAAoBC,CAAa,CAEhB,CAAA,CAAkB,QAEjCG,IAAwBt3B,GAC3B,MAAqB;EAIpB,AAHAkW,EAAY,iBAAiBjL,EAAM,EAAE,GAGjC,OAAOA,EAAM,aAAc,aACzB4iB,IACFA,EAAa5iB,EAAM,SAAS,IACnB,OAAO,SAAW,OAC3B,OAAO,cACL,IAAI,YAAY,qBAAqB,EAAE,QAAQ;GAAE,MAAMA,EAAM;GAAW,QAAQ;EAAK,EAAE,CAAC,CAC1F;EAKJ,IAAMssB,KAAmB,IAAU,IAAI,IAAQ,QAAQ;GACrD,IAAMC,IAAU,SAAS,eAAe,eAAevsB,EAAM,IAAI;GACjE,IAAIusB,GAAS;IACX,IAAI;KACF,EAAQ,eAAe;MAAE,UAAU;MAAU,OAAO;KAAS,CAAC;IAChE,QAAQ,CAAC;IAKT,AAJAA,EAAQ,MAAM,GACdA,EAAQ,MAAM,GAGd,EAAQ,MAAM,aAAa;IAC3B,IAAMC,IAAoBD,EAAQ,MAAM;IAExC,AADA,EAAQ,MAAM,YAAY,uDAC1B,iBAAiB;KACf,EAAQ,MAAM,YAAYC;IAC5B,GAAG,IAAI;GACT,OAAO,AAAIC,IAAU,KACnB,iBAAiBH,EAAgBG,IAAU,GAAG5Y,CAAK,GAAGA,CAAK;EAE/D;EAEA,EAAgB;CAClB,GACA,CAAC5I,GAAa2X,CAAY,CAC5B;CAaA,IAVIrzB,MAAc,UAAUA,MAAc,WAKtC4T,EAAQ,uBAAuB,MAK/B8oB,EAAmB,WAAW,GAChC,OAAO;CAIT,IAAIP,GAAa;EACf,IAAMlhB,IAAc4hB,KAAe,IAAKvB,IAAa,SAAS,YAAa;EAC3E,OACE,kBAAC,OAAD;GACE,WAAU;GACV,OAAO;IACL,UAAU;IACV,OAAO;IACP,KAAK;IACL,QAAQ;IACR,eAAe;IACf,YAAY;GACd;GAEA,UAAA,kBAAC,UAAD;IACE,eAAec,EAAe,EAAK;IACnC,OAAO,2BAA2BS,GAAa;IAC/C,OAAO;KACL,SAAS;KACT,YAAY;KACZ,KAAK;KACL,iBAAiB5hB;KACjB,OAAO;KACP,QAAQ;KACR,cAAc;KACd,SAAS;KACT,QAAQ;KACR,WAAW;KACX,UAAU;KACV,YAAY;KACZ,eAAe;KACf,YAAY;IACd;IACA,eAAe,MAAM;KACnB,EAAE,cAAc,MAAM,YAAY;IACpC;IACA,eAAe,MAAM;KACnB,EAAE,cAAc,MAAM,YAAY;IACpC;IAxBF,UAAA,CA0BE,kBAACyX,GAAD,EAAa,MAAM,GAAK,CAAA,GACvBmK,KAAe,IACd,kBAAArlC,IAAA,EAAA,UAAA,CACE,kBAAC,QAAD,EAAA,UAAM,KAAQ,CAAA,GACd,kBAAC,QAAD,EAAA,UAAA,CAAOqlC,IAAa,UAAc,EAAA,CAAA,CAClC,EAAA,CAAA,IAEF,kBAAArlC,IAAA,EAAA,UAAA,CACE,kBAAC6jB,GAAD;KAAO,MAAM;KAAI,aAAa;IAAI,CAAA,GAClC,kBAAC,QAAD,EAAA,UAAM,aAAgB,CAAA,CACtB,EAAA,CAAA,CAEE;;EACL,CAAA;CAET;CAEA,OACE,kBAAC,SAAD;EACE,WAAU;EACV,cAAW;EACX,OAAO;GACL,UAAU;GACV,OAAO;GACP,KAAK;GACL,WAAW;GACX,QAAQ;GACR,eAAe;GACf,YAAY;GACZ,SAAS;GACT,eAAe;GACf,YAAY;GACZ,KAAK;EACP;EAfF,UAAA,CAkBE,kBAAC,OAAD;GACE,OAAO;IACL,SAAS;IACT,YAAY;IACZ,KAAK;IACL,iBAAiB;IACjB,OAAO;IACP,SAAS;IACT,cAAc;IACd,WAAW;IACX,UAAU;IACV,YAAY;GACd;GAZF,UAAA,CAcE,kBAAC,OAAD;IAAK,OAAO;KAAE,SAAS;KAAQ,YAAY;KAAU,KAAK;IAAM;IAAhE,UAAA;KACE,kBAAC7E,IAAD;MAAS,MAAM;MAAI,OAAO,EAAE,OAAO8kB,IAAa,SAAS,UAAU;KAAI,CAAA;KACvE,kBAAC,QAAD,EAAA,UACG3jB,GAAa,OACV,GAAGA,EAAY,OAAO2jB,KAAc,KAAKA,GAAY,KAAK,KAAK,OAC/DA,KACA,GAAGA,GAAY,KAAK,iBACpB,kBACA,CAAA;KACN,kBAAC,QAAD;MACE,OAAO;OACL,iBAAiBuB,KAAe,IAAI,YAAY;OAChD,OAAO;OACP,UAAU;OACV,SAAS;OACT,cAAc;OACd,YAAY;MACd;MAEC,UAAAA,KAAe,IAAI,GAAGA,GAAa,QAAQ;KACxC,CAAA;IACH;GACL,CAAA,GAAA,kBAAC,UAAD;IACE,eAAeT,EAAe,EAAI;IAClC,OAAM;IACN,OAAO;KACL,YAAY;KACZ,QAAQ;KACR,OAAO;KACP,QAAQ;KACR,SAAS;KACT,SAAS;KACT,YAAY;KACZ,cAAc;KACd,YAAY;IACd;IACA,eAAe,MAAM;KACnB,EAAE,cAAc,MAAM,QAAQ;IAChC;IACA,eAAe,MAAM;KACnB,EAAE,cAAc,MAAM,QAAQ;IAChC;IAEA,UAAA,kBAACvJ,GAAD,EAAc,MAAM,GAAK,CAAA;GACnB,CAAA,CACL;EAGL,CAAA,GAAA,kBAAC,OAAD;GACE,OAAO;IACL,SAAS;IACT,eAAe;IACf,YAAY;IACZ,KAAK;IACL,WAAW;IACX,WAAW;IACX,cAAc;IACd,eAAe;GACjB;GAEC,UAAA6J,EAAmB,KAAK,MAAU;IACjC,IAAM5b,IAAW6b,EAAclsB,CAAK,GAC9Bc,IAAOF,EAAM,MAAM,MAAM5H,EAAE,OAAOgH,EAAM,MAAM,GAE9C0sB,IAAYrc,IAAW,YAAYvP,GAAM,SAAS,WAClDgc,IAAY8O,OAAmB5rB,EAAM,IACrCzC,IAAWgO,MAAkBvL,EAAM,IACnC2sB,IAAa3sB,EAAM,SAASA,EAAM,QAAQ;IAEhD,OACE,kBAAC,OAAD;KAEE,WAAU;KACV,eAAeqsB,EAAsBrsB,CAAK;KAC1C,oBAAoB6rB,EAAkB7rB,EAAM,EAAE;KAC9C,oBAAoB6rB,EAAkB,IAAI;KAC1C,OAAO;MACL,SAAS;MACT,YAAY;MACZ,QAAQ;MACR,QAAQ/O,KAAavf,IACjB,kDACA;MACJ,WAAWuf,KAAavf,IAAW,qBAAqB;MACxD,YAAY;KACd;KACA,OAAO,QAAQyC,EAAM,UAAU,IAAI2sB,EAAW,IAC5Ctc,IAAW,WAAW,iCACvB;KAlBH,UAAA,CAqBE,kBAAC,OAAD,EACE,OAAO;MACL,OAAO;MACP,QAAQ;MACR,WAAW;MACX,cAAc;MACd,aAAa,cAAcqc;MAC3B,YAAY;KACd,EACD,CAAA,GAGD,kBAAC,OAAD;MACE,OAAO;OACL,iBAAiBA;OACjB,OAAO;OACP,SAAS;OACT,cAAc;OACd,SAAS;OACT,YAAY;OACZ,KAAK;OACL,UAAU;OACV,YAAY;OACZ,eAAe;OACf,YAAY;OACZ,WAAW;OACX,UAAU5P,IAAY,UAAU;OAChC,UAAU;OACV,gBAAgB;OAChB,YAAY;MACd;MAlBF,UAAA,CAoBE,kBAAC,OAAD;OAAK,OAAO;QAAE,SAAS;QAAQ,YAAY;QAAU,KAAK;QAAO,UAAU;OAAS;OAApF,UAAA;QACGzM,IACC,kBAACzF,GAAD;SAAO,MAAM;SAAI,aAAa;SAAG,OAAO,EAAE,YAAY,EAAE;QAAI,CAAA,IAC1D5K,EAAM,SAAS,sBACjB,kBAACtQ,IAAD;SAAa,MAAM;SAAI,OAAO,EAAE,YAAY,EAAE;QAAI,CAAA,IAElD,kBAACqW,IAAD;SAAS,MAAM;SAAI,OAAO,EAAE,YAAY,EAAE;QAAI,CAAA;QAIhD,kBAAC,QAAD;SACE,OAAO;UACL,iBAAiB;UACjB,SAAS;UACT,cAAc;UACd,UAAU;UACV,YAAY;UACZ,YAAY;SACd;SARF,UAAA,CASC,MACI/F,EAAM,SACL;;QAGLA,EAAM,cAAc,KAAA,KACnB,kBAAC,QAAD;SACE,OAAO;UACL,iBAAiB;UACjB,SAAS;UACT,cAAc;UACd,UAAU;UACV,YAAY;UACZ,YAAY;SACd;SARF,UAAA,CASC,KACGA,EAAM,SACJ;;QAIR,kBAAC,QAAD;SACE,OAAO;UACL,UAAU;UACV,cAAc;UACd,YAAY;SACd;SAEC,UAAAqQ,IAAW,WAAWrQ,EAAM,eAAe2sB,KAAc;QACtD,CAAA;OACH;MAGL,CAAA,GAAA,kBAAC,OAAD;OAAK,OAAO;QAAE,YAAY;QAAG,YAAY;OAAM;OAC5C,UAAA7rB,IACC,kBAAC,QAAD;QACE,OAAO;SACL,iBAAiB;SACjB,SAAS;SACT,cAAc;SACd,UAAU;SACV,YAAY;QACd;QAEC,UAAAA,EAAK;OACF,CAAA,IAEN,kBAAC,QAAD;QACE,OAAO;SACL,iBAAiB;SACjB,SAAS;SACT,cAAc;SACd,UAAU;SACV,YAAY;QACd;QACD,UAAA;OAEK,CAAA;MAEL,CAAA,CACF;KACF,CAAA,CAAA;IApIE,GAAAd,EAAM,EAoIR;GAET,CAAC;EACE,CAAA,CACA;;AAEX;;;ACxVA,SAAwB4sB,GAAe,EACrC,oBAAiB,qBAAkB,cAAW,sBAAmB,eAAY,eAAY,GACzF,qBAAkB,IAAO,gBAAa,kBAAe,mBAAgB,kBAAe,qBAAkB,iBAAc,aACpH,WAAQ,eAAW,IACnB,eAAY,oBAAiB,UAAO,aAAU,gBAAY,kBAAe,yBAAqB,uBAAoB,yBAClH,qBAAkB,gBAAa,yBAAqB,oBAAgB,iBACpE,mBAAgB,gBAAY,aAAU,iBAAa,eAAW,mBAAe,mBAAmBC,IAAoB,iBAAa,UAAM,yBAAqB,gBAC5J,uCAAmC,IACnC,0BAAsB,IACtB,kBAAc,UACd,2BAAuB,IACvB,iBACA,sBACA,iBAAa,IACb,aACA,kBACA,oBACA,iBACA,iBACA,kBACA,2BACsB;CACtB,IAAMtwB,IAAexU,EAAuB,IAAI,GAC1CJ,KAAMD,GAAa,GACnB,CAACswB,IAAgBC,MAAqBxsB,EAAuB,QAAQ,GACrE,CAACyjB,IAAe6a,MAAoBt+B,EAAkB,EAAI,GAC1D,CAACyiB,IAAoBgc,MAAyBz+B,EAAwB,IAAI,GAC1E,CAACuM,GAAQ80B,MAAarhC,EAA2C,IAAI,GACrE,CAACshC,IAAWC,MAAgBvhC,EAAuB,IAAI,GACvD,CAACoN,GAASqF,MAAczS,EAAS,CAAC,GAClC,CAACwhC,IAAkBC,MAAuBzhC,EAAsB,CAAC,CAAC,GAClE,EAAE,mBAAekJ,GAAa,GAG9B,CAAC8qB,IAAS0N,MAAc1hC,EAA2C,IAAI,GACvE,CAAC21B,GAAcgM,MAAmB3hC,EAAuB;EAC7D,UAAU;EACV,MAAM;EACN,QAAQ;EACR,QAAQ;EACR,UAAU;EACV,UAAU;EACV,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,WAAW,CAAC;EACZ,kBAAkB;CACpB,CAAC,GACK,CAACq3B,GAAWuK,MAAgB5hC,EAA4B,CAAC,CAAC,GAC1D,CAAC6hC,IAAmBC,MAAwB9hC,EAAS,EAAK,GAC1D,CAAC+hC,IAAgBC,MAAqBhiC,EAAkB,EAAI,GAC5D,CAACiiC,IAAuBC,MAA4BliC,EAAiB,CAAG,GAExEmiC,KAAsB74B,QAAkB;EAC5C,IAAyB,MAAQ,KAAK,IAAI,QAAQ4K,IAAO,IAAA,CAAM,QAAQ,CAAC,CAAC,GAAG,CAAG,CAAC;CAClF,GAAG,CAAC,CAAC,GAECkuB,KAAuB94B,QAAkB;EAC7C,IAAyB,MAAQ,KAAK,IAAI,QAAQ4K,IAAO,IAAA,CAAM,QAAQ,CAAC,CAAC,GAAG,EAAG,CAAC;CAClF,GAAG,CAAC,CAAC,GAECmuB,KAAqB/4B,QAAkB;EAE3C,AADA04B,GAAkB,EAAI,GACtBE,GAAyB,CAAG;CAC9B,GAAG,CAAC,CAAC,GAGCI,KAAehmC,EAAO;EAAE;EAAoB;EAAqB;EAAkB;EAAa;EAAqB;EAAgB;CAAa,CAAC;CACzJ,GAAa,UAAU;EAAE;EAAoB;EAAqB;EAAkB;EAAa;EAAqB;EAAgB;CAAa;CACnJ,IAAMimC,KAAYjmC,EAAOkmC,CAAM;CAC/B,GAAU,UAAUA;CAEpB,IAAMC,KAAiBnmC,EAAOomC,CAAW;CACzC,GAAe,UAAUA;CACzB,IAAMC,KAAmBrmC,EAAOsmC,CAAa;CAC7C,GAAiB,UAAUA;CAC3B,IAAMC,KAAoBvmC,EAAOwmC,CAAc;CAC/C,GAAkB,UAAUA;CAC5B,IAAMC,KAAmBzmC,EAAO0mC,CAAa;CAC7C,GAAiB,UAAUA;CAC3B,IAAMC,KAAsB3mC,EAAO4mC,CAAgB;CACnD,GAAoB,UAAUA;CAC9B,IAAMC,KAAkB7mC,EAAO8mC,CAAY;CAC3C,GAAgB,UAAUA;CAC1B,IAAMC,KAAc/mC,EAAOgnC,CAAQ;CACnC,GAAY,UAAUA;CAEtB,IAAMC,KAAuBj6B,QAAkB;EAC7C,IAAMk6B,IAAU;GAAE,GAAIb,GAAiB,WAAW,CAAC;GAAI,GAAIF,GAAe,WAAW,CAAC;EAAG,GACnFjkC,IAA8B,CAAC;EAuBrC,OAtBI,OAAO,KAAKglC,CAAO,CAAC,CAAC,SAAS,MAChC,EAAO,cAAcA,IAEnB,OAAOX,GAAkB,WAAY,YAAYA,GAAkB,UAAU,MAC/E,EAAO,iBAAiBA,GAAkB,UAExC,OAAOE,GAAiB,WAAY,cACtC,EAAO,gBAAgBA,GAAiB,UAEtC,OAAOE,GAAoB,WAAY,cACzC,EAAO,mBAAmBA,GAAoB,SAE1CzkC,EAAO,kBAAkB,KAAA,KAAaykC,GAAoB,YAC5D,EAAO,gBAAgB,MAGvB,OAAOE,GAAgB,WAAY,cACrC,EAAO,eAAeA,GAAgB,UAEpCE,GAAY,YACd,EAAO,WAAWA,GAAY,UAEzB7kC;CACT,GAAG,CAAC,CAAC,GAECilC,KAAWn6B,EAAY,OAAO,MAAiD;EACnF,IAAI;GAEF,AADAonB,GAAuB,GACnB6R,GAAU,WAASjS,GAAmBiS,GAAU,OAAO;GAC3D,IAAM/jC,IAAc,OAAOklC,KAAc,WAAW,EAAE,KAAKA,EAAU,IAAI,EAAE,MAAMA,EAAU;GAE3F,AADIC,MAAiB,EAAO,kBAAkB,KAC9C,OAAO,OAAOnlC,GAAQ+kC,GAAqB,GAAG5S,GAAkB,CAAC;GAEjE,IAAMiT,IAAa,MADC9nC,GAAS,YAAY0C,CAChB,CAAA,CAAY;GAErC,AADA6iC,GAAUuC,CAAU,GACpBtB,GAAa,QAAQ,mBAAmBsB,GAAY,OAAOF,KAAc,WAAWA,IAAY,eAAe;EACjH,SAAS1vB,GAAU;GACjB,QAAQ,MAAM,yCAAyCA,CAAG;EAC5D;CACF,GAAG,CAAC2vB,GAAiBJ,EAAoB,CAAC,GAEpCM,KAAiBv6B,EAAY,OAAO,MAAiD;EACzF,IAAI;GAEF,AADAonB,GAAuB,GACnB6R,GAAU,WAASjS,GAAmBiS,GAAU,OAAO;GAC3D,IAAM/jC,IAAc,OAAOklC,KAAc,WAAW,EAAE,KAAKA,EAAU,IAAI,EAAE,MAAMA,EAAU;GAE3F,AADIC,MAAiB,EAAO,kBAAkB,KAC9C,OAAO,OAAOnlC,GAAQ+kC,GAAqB,GAAG5S,GAAkB,CAAC;GAEjE,IAAMmT,IAAa,MADChoC,GAAS,YAAY0C,CAChB,CAAA,CAAY;GASrC,AARAkjC,GAAWoC,CAAU,GACrBnC,IAAgB,OAAS;IACvB,GAAGztB;IACH,UAAU;IACV,WAAW,CACT;KAAE,IAAI;KAAU,WAAW;KAAG,MAAM;KAAgB,aAAa;IAA8B,CACjG;GACF,EAAE,GACF4tB,GAAqB,EAAI;EAC3B,SAAS9tB,GAAU;GACjB,QAAQ,MAAM,yCAAyCA,CAAG;EAC5D;CACF,GAAG,CAAC2vB,CAAe,CAAC;CAiDpB,AA/CAnnC,QAAgB;EACd,IAAIm5B,EAAa,YAAYppB,KAAUynB,IAAS;GAC9C,IAAI+P,IAAY;GAwChB,QADA,YAtCoC;IAClC,IAAI;KACF,IAAMC,IAAa,KAAK,IAAIz3B,EAAO,UAAUynB,GAAQ,QAAQ,GACzDiQ,IAAyB,CAAC,GACxBC,IAA0C,CAAC,GAC3CC,IAA0C,CAAC;KAEjD,KAAK,IAAIxkC,IAAI,GAAGA,KAAKqkC,GAAY,KAAK;MACpC,IAAM,EAAE,WAAQ,WAAQ,eAAY,MAAMnL,GAAqBtsB,GAAQynB,IAASr0B,CAAC;MACjF,IAAIokC,GAAW;MAGf,AAFA,EAAKpkC,KAAKy1B,GACV,EAAKz1B,KAAK01B,GACV,IAAa4O,EAAW,OAAO/J,CAAO;KACxC;KAEA,AAAK6J,KACHpC,IAAgB,OAAS;MACvB,GAAGztB;MACH,WAAW+vB;MACX,YAAYC;MACZ,YAAYC;KACd,EAAE;KAGJ,IAAMC,IAAK,MAAM73B,EAAO,QAAQa,CAAO,GACjCi3B,IAAK,MAAMrQ,GAAQ,QAAQ,KAAK,IAAI5mB,GAAS4mB,GAAQ,QAAQ,CAAC,GAC9DsQ,IAAe,MAAMF,EAAG,eAAe,GACvCG,IAAe,MAAMF,EAAG,eAAe,GAKvCG,IAAQ5J,GAHD0J,EAAa,MAAM,KAAK,MAAWn6B,EAAE,GAAG,CAAC,CAAC,KAAK,GAG9B,GAFjBo6B,EAAa,MAAM,KAAK,MAAWp6B,EAAE,GAAG,CAAC,CAAC,KAAK,GAExB,GAAMiD,CAAO;KACjD,AAAK22B,KAAWnC,GAAa4C,CAAK;IACpC,SAAS,GAAG;KACV,QAAQ,MAAM,mCAAmC,CAAC;IACpD;GACF,EACA,CAAgB,SACH;IAAE,IAAY;GAAM;EACnC;CACF,GAAG;EAAC7O,EAAa;EAAUppB;EAAQynB;EAAS5mB;CAAO,CAAC,GAGpD5Q,QAAgB;EACd,IAAMioC,KAAsB,MAAc;GACxC,IAAM,EAAE,SAAM,SAAM,eAAYxwB,KAAQ,CAAC;GAgBzC,AAfA+tB,GAAkB,EAAI,GACtBE,GAAyB,CAAG,GAC5BP,IAAgB,OAAS;IACvB,GAAGztB;IACH,UAAU;IACV,MAAMwD,GAAS,QAAQ;IACvB,QAAQA,GAAS,UAAUxD,EAAK;IAChC,QAAQwD,GAAS,UAAUxD,EAAK;IAChC,UAAUwD,GAAS,YAAYxD,EAAK;IACpC,UAAUwD,GAAS,YAAYxD,EAAK;IACpC,WAAWwD,GAAS,aAAaxD,EAAK;GACxC,EAAE,GACEwwB,KACFjB,GAASiB,CAAI,GAEXC,KACFd,GAAec,CAAI;EAEvB,GAEMC,UAA0B;GAK9B,AAJAjD,IAAgB,OAAS;IAAE,GAAGztB;IAAM,UAAU;GAAM,EAAE,GACtDwtB,GAAW,IAAI,GACfE,GAAa,CAAC,CAAC,GACfI,GAAkB,EAAI,GACtBE,GAAyB,CAAG;EAC9B,GAEM2C,KAAwB,MAAiB;GAC7C,AAAIpd,KAAMka,IAAgB,OAAS;IAAE,GAAGztB;IAAY;GAAY,EAAE;EACpE,GAEM4wB,KAA0B,GAAgB,MAAmB;GACjE,AAAIhP,KAAUE,KAAQ2L,IAAgB,OAAS;IAAE,GAAGztB;IAAM;IAAQ;GAAO,EAAE;EAC7E,GAEM6wB,IAAW7oC,GAAI,GAAG,wBAAwBuoC,CAAkB,GAC5DO,IAAU9oC,GAAI,GAAG,uBAAuB0oC,CAAiB,GACzDK,IAAU/oC,GAAI,GAAqB,4BAA4B,MAAMwE,KAAKmkC,EAAqBnkC,EAAE,IAAI,CAAC,GACtGwkC,IAAYhpC,GAAI,GAAuC,8BAA8B,MAAMwE,KAAKokC,EAAuBpkC,EAAE,QAAQA,EAAE,MAAM,CAAC,GAE1IykC,KAAe,MAAWV,EAAmBh0B,EAAE,MAAM,GACrD20B,UAAmBR,EAAkB,GACrCS,KAAc,MAAWR,EAAqB,EAAE,QAAQ,IAAI,GAC5DS,KAAgB,MAAWR,EAAuB,EAAE,QAAQ,QAAQ,EAAE,QAAQ,MAAM;EAO1F,OALA,OAAO,iBAAiB,wBAAwBK,CAAW,GAC3D,OAAO,iBAAiB,uBAAuBC,CAAU,GACzD,OAAO,iBAAiB,2BAA2BC,CAAU,GAC7D,OAAO,iBAAiB,6BAA6BC,CAAY,SAEpD;GAKX,AAJAP,EAAS,GAAGC,EAAQ,GAAGC,EAAQ,GAAGC,EAAU,GAC5C,OAAO,oBAAoB,wBAAwBC,CAAW,GAC9D,OAAO,oBAAoB,uBAAuBC,CAAU,GAC5D,OAAO,oBAAoB,2BAA2BC,CAAU,GAChE,OAAO,oBAAoB,6BAA6BC,CAAY;EACtE;CACF,GAAG;EAACppC;EAAKunC;EAAUI;CAAc,CAAC;CAMlC,IAAM,CAAC3a,IAAoBqc,MAAyBvlC,EAA8B,IAAI,GAIhF,CAACwlC,IAAUC,MAAezlC,EAAmD,CAAC,CAAC,GAC/E0lC,KAAeF,GAAS,MAAMnW,IAC9BS,KAAUxmB,GACb,MAAck8B,GAAS7lC,IAAI,MAAM+lC,IAElC;EAACF;EAAUE,GAAa;EAAOA,GAAa;CAAM,CACpD,GACM,CAACC,IAAWC,MAAgB5lC,EAAS;EAAE,KAAK;EAAG,MAAM;CAAE,CAAC,GACxD,CAAC6lC,IAAqBC,MAA0B9lC,EAA4C;EAChG,OAAO;EACP,QAAQ;CACV,CAAC;CAED,QAAgB;EACd,IAAI8Q,EAAa,SAAS;GACxB,IAAMpL,IAAIoL,EAAa;GACvB,GAAuB;IAAE,OAAOpL,EAAE;IAAa,QAAQA,EAAE;GAAa,CAAC;EACzE;CACF,GAAG,CAAC,CAAC;CACL,IAAM,CAACwsB,IAAWC,MAAgBnyB,EAAS,EAAK,GAC1CoyB,KAAc91B,EAA+E,IAAI,GAKjGqzB,KAAO4Q,QAAc;EACzB,IAAMhzB,IAAgB,CAAC;EACvB,IAAI,CAAChB,GAAQ,OAAOgB;EACpB,IAAI/K,OAAe,UACjB,KAAK,IAAI2H,IAAI,GAAGA,KAAKoC,EAAO,UAAU,KAAK,EAAE,KAAK,CAACpC,CAAC,CAAC;OAChD,IAAI3H,OAAe,UACxB,KAAK,IAAI2H,IAAI,GAAGA,KAAKoC,EAAO,UAAU,KAAK,GACzC,EAAE,KAAK,CAACpC,GAAGA,IAAI,CAAC,CAAC,CAAC,QAAO,MAAKxK,KAAK4M,EAAO,QAAQ,CAAC;OAEhD,IAAI/J,OAAe,gBAAgB;GACxC,EAAE,KAAK,CAAC,CAAC,CAAC;GACV,KAAK,IAAI2H,IAAI,GAAGA,KAAKoC,EAAO,UAAU,KAAK,GACzC,EAAE,KAAK,CAACpC,GAAGA,IAAI,CAAC,CAAC,CAAC,QAAO,MAAKxK,KAAK4M,EAAO,QAAQ,CAAC;EAEvD;EACA,OAAOgB;CACT,GAAG,CAAChB,GAAQ/J,EAAU,CAAC,GAGjBujC,KAAYxF,QACT9Q,GAAiBE,IAAMG,IAAStyB,GAAO,EAAG,GAChD;EAACmyB;EAAMnyB;EAAOsyB;CAAO,CAAC,GAEnBkW,KAAU1pC,EAAOqzB,EAAI;CAC3B,GAAQ,UAAUA;CAClB,IAAMsW,KAAW3pC,EAAOkB,CAAK;CAC7B,GAAS,UAAUA;CACnB,IAAM0oC,KAAe5pC,EAAOypC,EAAS;CACrC,GAAa,UAAUA;CACvB,IAAMI,KAAoB7pC,EAAO4F,CAAc;CAC/C,GAAkB,UAAUA;CAC5B,IAAMkkC,KAAgB9pC,EAAO,CAAC,GAExB+pC,KAAiB/8B,GAAa,MAAcqmB,GAAK,WAAU,MAAOC,EAAI,SAASjwB,CAAC,CAAC,GAAG,CAACgwB,EAAI,CAAC,GAE1F2W,KAAmBh9B,GAAa,MAAc;EAClD,IAAMymB,IAAOgW,GAAU;EACvB,IAAIhW,EAAK,WAAW,GAAG,OAAO;EAC9B,IAAIwW,IAAK,GAAGC,IAAKzW,EAAK,SAAS;EAC/B,OAAOwW,IAAKC,IAAI;GACd,IAAMC,IAAOF,IAAKC,IAAK,KAAM;GAC7B,AAAIzW,EAAK0W,MAAQxnC,IAAG,IAAKwnC,IAAU,IAAKA,IAAM;EAChD;EACA,OAAOF;CACT,GAAG,CAACR,EAAS,CAAC,GAERW,KAAep9B,GAAa,GAAW,IAAgC,CAAC,MAAM;EAClF,IAAMq9B,IAAcp6B,IAAS,KAAK,IAAI,GAAG,KAAK,IAAI5M,GAAG4M,EAAO,QAAQ,CAAC,IAAI,KAAK,IAAI,GAAG5M,CAAC;EACtF,GAAWgnC,CAAW;EACtB,IAAMx8B,IAAIk8B,GAAeM,CAAW;EACpC,AAAIx8B,KAAK,KAAK2G,EAAa,YACrB4G,EAAQ,SACV5G,EAAa,QAAQ,SAAS;GAAE,KAAKi1B,GAAU,KAAK57B;GAAI,UAAU;EAAS,CAAC,IAE5E,EAAa,QAAQ,YAAY47B,GAAU,KAAK57B;CAGtD,GAAG;EAACoC;EAAQ85B;EAAgBN;CAAS,CAAC;CAEtC,QAAgB;EACd,IAAMa,KAAkB,MAAgD;GACtE,AAAIlqC,GAAQ,QACVgqC,GAAahqC,EAAO,MAAM,EAAE,QAAQA,EAAO,UAAU,GAAK,CAAC;EAE/D,GACMmqC,IAAc3qC,GAAI,GAAuC,sBAAsB,MAAM0qC,EAAelmC,CAAC,CAAC,GACtGomC,KAAkB,MAAWF,EAAen2B,EAAE,MAAM;EAG1D,OAFA,OAAO,iBAAiB,qBAAqBq2B,CAAc,SAE9C;GAEX,AADAD,EAAY,GACZ,OAAO,oBAAoB,qBAAqBC,CAAc;EAChE;CACF,GAAG,CAAC5qC,IAAKwqC,EAAY,CAAC;CAEtB,IAAMK,MAA2B,MAAyB;EAGxD,AAFAt0B,GAAW7B,EAAO,SAAS,GAC3B20B,GAAsB30B,CAAM,GAC5B81B,GAAa91B,EAAO,SAAS;CAC/B,GAEMo2B,KAAmB19B,GAAa,GAAa,MAAoB;EACrE,IAAM29B,IAAWt9B,KAAQgsB,EAAa,UAAUlhB;EAGhD,IAFAktB,IAAgB,OAAS;GAAE,GAAGztB;GAAM,kBAAkBO;EAAI,EAAE,GAExD,CAACwyB,GAAU;EAEf,AAAIA,EAAS,aAAaA,EAAS,cAAc75B,KAC/CqF,GAAWw0B,EAAS,SAAS;EAG/B,IAAM1R,KAAW0R,EAAS,KAAK,KAAKzpC,GAC9B0pC,KAAWD,EAAS,KAAK,KAAKzpC;EAEpC,IAAIsT,EAAa,SAAS;GACxB,IAAMnR,IAAIsnC,EAAS,aAAa75B,GAC1B+5B,IAAOd,GAAe1mC,CAAC,GACvBynC,IAASllC,MAAmB,gBAAgBilC,KAAQ,IAAKpB,GAAU,KAAKoB,MAAS,IAAK,GACtFE,IAAav2B,EAAa,QAAQ,gBAAgB,KAClDw2B,IAAYx2B,EAAa,QAAQ,eAAe,KAEhD0kB,IAAY,KAAK,IAAI,GAAG4R,IAAS7R,IAAU8R,IAAa,CAAC,GACzDE,IAAY,KAAK,IAAI,GAAGL,IAAUI,IAAY,CAAC;GAErD,EAAa,QAAQ,SAAS;IAC5B,KAAK9R;IACL,MAAM+R;IACN,UAAU;GACZ,CAAC;EACH;CACF,GAAG;EAAC5R,EAAa;EAAWvoB;EAAS5P;EAAO0E;EAAgBmkC;EAAgBN,GAAU;CAAI,CAAC;CAG3F,QAAgB;EACd,IAAKvmB,IA8BL,OA7BcA,GAAY,qBAAqB,MAAY;GACzD,IAAI,CAAC9J,GAAS;GACd,IAAM8xB,IAAShoB,GAAY,UAAU,CAAC,CAAC,MAAM,MAAMpL,EAAE,OAAOsB,CAAO;GACnE,IAAK8xB,MAEDtlC,MAAmB,gBAAgBslC,EAAO,cAAcp6B,KAC1DqF,GAAW+0B,EAAO,SAAS,GAGzB12B,EAAa,UAAS;IACxB,IAAMnR,IAAI6nC,EAAO,WACXL,IAAOd,GAAe1mC,CAAC,GACvBynC,IAASllC,MAAmB,gBAAgBilC,KAAQ,IAAKpB,GAAU,KAAKoB,MAAS,IAAK,GACtFE,IAAav2B,EAAa,QAAQ,gBAAgB,KAClDw2B,IAAYx2B,EAAa,QAAQ,eAAe,KAEhDykB,IAAUiS,EAAO,IAAIhqC,GACrB0pC,IAAUM,EAAO,IAAIhqC,GAErBg4B,IAAY,KAAK,IAAI,GAAG4R,IAAS7R,IAAU8R,IAAa,CAAC,GACzDE,IAAY,KAAK,IAAI,GAAGL,IAAUI,IAAY,CAAC;IAErD,EAAa,QAAQ,SAAS;KAC5B,KAAK9R;KACL,MAAM+R;KACN,UAAU;IACZ,CAAC;GACH;EACF,CACO;CACT,GAAG;EAAC/nB;EAAatd;EAAgBkL;EAASi5B;EAAgBN,GAAU;EAAMvoC;CAAK,CAAC;CAGhF,IAAMwS,IAAcy3B,EAAqBC,EAAkB,WAAWA,EAAkB,aAAaA,EAAkB,WAAW,GAC5H,CAACjmB,GAAYmB,MAAiB5iB,EAAmB2nC,EAAW;CAoBlE,AAjBAnrC,QAAgB;EACd,AAAIsH,MAAc,cAChB8e,GAAc,WAAW,GACzBglB,GAAgB,SAAS,GACzBC,GAAkB,EAAG,GACrBC,GAAsB,EAAE,KACfhkC,MAAc,YACvB8e,GAAc,WAAW,GACzBilB,GAAkB,CAAC,GACnBC,GAAsB,CAAC,KACdhkC,MAAc,kBACvB8e,GAAc,WAAW,IAChB9e,MAAc,UACvB8e,GAAc+kB,EAAW;CAE7B,GAAG,CAAC7jC,GAAW6jC,EAAW,CAAC,GAE3BnrC,QAAgB;EACd,GAAI,KAAK,uBAAuB,EAAE,MAAMilB,EAAW,CAAC;CACtD,GAAG,CAACA,GAAYvlB,EAAG,CAAC;CAKpB,IAAM,CAAC6rC,IAAcH,MAAmB5nC,EAAS,SAAS,GACpD,CAACgoC,IAAoBF,MAAyB9nC,EAAS,CAAC,GACxD,CAACioC,IAAgBJ,MAAqB7nC,EAAS,EAAG,GAElD,CAACkoC,IAAWC,MAAgBnoC,EAAS,EAAK,GAC1C,CAACooC,IAAsBC,MAA2BroC,EAAwB,IAAI,GAC9E,CAACsoC,IAAUC,MAAevoC,EAAS;EAAE,GAAG;EAAG,GAAG;CAAE,CAAC,GACjD,CAACwoC,IAAYC,MAAiBzoC,EAAS;EAAE,GAAG;EAAG,GAAG;CAAE,CAAC,GACrD,CAAC0oC,IAAgBC,MAAqB3oC,EAAqC,CAAC,CAAC,GAG7E,CAAC4oC,IAAkBC,MAAuB7oC,EAA4J,IAAI,GAC1M,CAAC8oC,IAAaC,MAAkB/oC,EAAS,EAAE,GAC3CgpC,KAAc1sC,EAA4B,IAAI,GAE9C,CAAC8T,GAAsBC,MAA2BrQ,EAAwB,IAAI,GAC9E,CAACipC,IAAgBC,MAAqBlpC,EAA+C,IAAI,GACzF,CAACmpC,IAAiBC,MAAsBppC,EAAS,EAAK,GACtDqpC,KAAqB/sC,EAAO,EAAK,GACjCgtC,KAAyBhtC,EAA0B,IAAI;CAK7D,AAFAF,GAAgC,oBAAoB,MAAMwmB,GAAcliB,GAAG,QAAQ,IAAI,CAAC,GAExFlE,QAAgB;EACd,IAAM+sC,UAAwB;GAC5B,IAAM3hC,IAAO,OAAO,SAAW,MAAc,OAAO,aAAa,CAAC,EAAE,SAAS,KAAK,KAAK;GACvF,GAAI,KAAK,wBAAwB,EAAE,QAAK,CAAC;EAC3C;EAEA,OADA,SAAS,iBAAiB,mBAAmB2hC,CAAe,SAC/C,SAAS,oBAAoB,mBAAmBA,CAAe;CAC9E,GAAG,CAACrtC,EAAG,CAAC;CAER,IAAMstC,KAAeltC,EAA+C;EAAE,IAAI;EAAM,IAAI;CAAK,CAAC,GACpFmtC,KAAentC,EAAOkB,CAAK,GAC3BksC,KAAyBptC,EAAO,EAAK,GACrCqtC,KAAoBrtC,EAAO,EAAK,GAIhCstC,KAAyB,OAAOC,KAAsB,YAAY,OAAO,SAASA,CAAiB,KAAKA,IAAoB,IAC9HA,IACC,OAAOC,KAAiB,YAAYA,KAAyBA,EAAa,SAAS,eAAe,OAAOA,EAAa,SAAU,YAAYA,EAAa,QAAQ,IAChKA,EAAa,QACb,KAAA,GAEAC,KAAmBztC,EACvB,OAAOstC,MAA2B,WAC9B;EAAE,MAAM;EAAa,OAAOA;CAAuB,IAClDE,MAAiB,eAAeA,MAAiB,KAAA,IAClD;EAAE,MAAM;EAAa,OAAO;CAAI,IAChCA,MAAiB,aACjB,EAAE,MAAM,WAAW,IACnB,IACN;CA6DA,AA3DAttC,QAAgB;EAEd,AADA,GAAkB,UAAU,IACxB,OAAOotC,MAA2B,WACpC,GAAiB,UAAU;GAAE,MAAM;GAAa,OAAOA;EAAuB,IACrEE,MAAiB,eAAeA,MAAiB,KAAA,IAC1D,GAAiB,UAAU;GAAE,MAAM;GAAa,OAAO;EAAI,IAClDA,MAAiB,aAC1B,GAAiB,UAAU,EAAE,MAAM,WAAW,IAE9C,GAAiB,UAAU;CAE/B,GAAG;EAACv9B;EAAQu9B;EAAcF;CAAsB,CAAC,GAGjDptC,QAAgB;EACd,IAAIitC,GAAa,YAAYjsC,GAAO;GAClC,IAAMgM,IAAIigC,GAAa,SACjBpqC,IAAW7B;GACjB,GAAa,UAAUA;GAEvB,IAAM6qB,IAAYvX,EAAa;GAC/B,IAAI,CAACuX,GAAW;GAEhB,IAAM5pB,IAAiBirC,GAAuB,WAAW,CAACC,GAAkB,WAAWK,GAAqB,YAAYz9B;GAMxH,AALK9N,MAEH,GAAiB,UAAU,OAE7B,GAAkB,UAAU,IAC5B,GAAuB,UAAU;GAEjC,IAAMwrC,IAAS7rC,GAA4B;IACzC,WAAWoL;IACX;IACA,gBAAgB6e,EAAU;IAC1B,iBAAiBA,EAAU;IAC3B,mBAAmBA,EAAU;IAC7B,kBAAkBA,EAAU;IAC5B,eAAeyH,GAAQ1iB,CAAO,CAAC,CAAC;IAChC,YAAYo8B,GAAa;IACzB;GACF,CAAC;GAID,IAFA,GAAa,UAAU;IAAE,IAAI;IAAM,IAAI;GAAK,GAExC/qC,KAAkB2O,IAAU,KAAKlL,MAAmB,cAAc;IACpE,IAAMilC,IAAOd,GAAej5B,CAAO;IAInC,AAHI+5B,KAAQ,MACV,EAAU,YAAYpB,GAAU,KAAKoB,MAAS,IAEhD,EAAU,aAAa;GACzB,OAEE,AADA,EAAU,aAAa8C,EAAO,YAC9B,EAAU,YAAYA,EAAO;EAEjC;CAEF,GAAG,CAACzsC,CAAK,CAAC,GAEVhB,QAAgB;EACd,IAAM6rB,IAAYvX,EAAa;EAC/B,IAAI,CAACuX,GAAW;EAEhB,IAAMsL,KAAe,MAAkB;GACrC,IAAIljB,EAAE,WAAWA,EAAE,SAAS;IAC1B,EAAE,eAAe;IAEjB,IAAMuM,IAAOqL,EAAU,sBAAsB,GACvC6hB,IAAUz5B,EAAE,SACZ05B,IAAU15B,EAAE,SAEZ25B,IAAa,KAAK,IAAI,CAAC35B,EAAE,SAAS,IAAK;IAE7C,GAAS,MAAK;KACZ,IAAM45B,IAAe9sC,GAAWiM,IAAI4gC,CAAU;KAO9C,OANIC,MAAiB7gC,MACnB,GAAa,UAAU;MACrB,IAAI0gC,IAAUltB,EAAK;MACnB,IAAImtB,IAAUntB,EAAK;KACrB,IAEKqtB;IACT,CAAC;GACH;EACF;EAGA,OADAhiB,EAAU,iBAAiB,SAASsL,GAAa,EAAE,SAAS,GAAM,CAAC,SACtDtL,EAAU,oBAAoB,SAASsL,CAAW;CACjE,GAAG,CAAC2W,CAAQ,CAAC;CAGb,IAAMC,KAAoBjhC,GAAa,MAA0B;EAC/D,EAAkB,OAAOkhC,CAAO;CAClC,GAAG,CAAC9C,CAAiB,CAAC;CAEtB,GAAqC,0CAA0C,MAAM;EACnF,AAAIhnC,GAAG,WAAS6pC,GAAkB,CAAC,GAAGv6B,GAAatP,EAAE,OAAO,CAAC;CAC/D,CAAC;CAED,IAAM+pC,KAAanhC,QAAkB;EAAE,EAAkB,KAAK;CAAG,GAAG,CAACo+B,CAAiB,CAAC,GACjFgD,KAAaphC,QAAkB;EAAE,EAAkB,KAAK;CAAG,GAAG,CAACo+B,CAAiB,CAAC,GAGjF,CAACiD,IAAiBC,MAAsB5qC,EAA4B,IAAI,GACxE,CAAC6qC,IAAeC,MAAoB9qC,EAA4B,IAAI,GACpE+qC,KAAczuC,EAOV,IAAI,GACR0uC,KAAY1uC,EAMR,IAAI,GAER2uC,KAAuB3uC,EAA0B,IAAI;CAC3D,GAAqB,UAAUquC;CAC/B,IAAMO,KAAqB5uC,EAA0B,IAAI;CACzD,GAAmB,UAAUuuC;CAE7B,IAAM/nB,KAAoBxZ,GAAa,GAAY,GAAgB,GAAqB,MAAoB;EAC1G,IAAMygB,IAAM/Z,EAAY,MAAK,MAAKlD,EAAE,OAAOqD,CAAE;EAC7C,IAAI,CAAC4Z,KAAOnmB,GAAa,uBAAuB,MAAS,CAAC8jC,EAAkB,QAAQ3d,CAAG,GAAG;EAC1F,IAAMohB,IAAa;GACjB,GAAGphB;GACH,OAAOA,EAAI,SAASA,EAAI,QAAQ,IAAIA,EAAI,QAAQ;GAChD,QAAQA,EAAI,UAAUA,EAAI,SAAS,IAAIA,EAAI,SAAS;EACtD;EASA,AARA,GAAY,UAAU;GACpB,OAAO5Z;GACP;GACA,QAAQM,EAAE;GACV,QAAQA,EAAE;GACV;GACA,WAAWrD;EACb,GACAw9B,GAAmBO,CAAU;CAC/B,GAAG;EAACn7B;EAAa03B;EAAmB9jC;CAAW,CAAC,GAE1Cif,KAAkBvZ,GAAa,GAAY,GAAqB,MAAoB;EACxF,IAAMygB,IAAM/Z,EAAY,MAAK,MAAKlD,EAAE,OAAOqD,CAAE;EAC7C,AAAK4Z,KAAOnmB,GAAa,uBAAuB,MAAU8jC,EAAkB,QAAQ3d,CAAG,MACvF,GAAU,UAAU;GAClB,OAAO5Z;GACP,QAAQM,EAAE;GACV,QAAQA,EAAE;GACV,YAAY,EAAE,GAAGsZ,EAAI;GACrB,WAAW3c;EACb,GACA09B,GAAiB,EAAE,GAAG/gB,EAAI,CAAC;CAC7B,GAAG;EAAC/Z;EAAa03B;EAAmB9jC;CAAW,CAAC,GAE1CwnC,KAA8B9hC,GAAa,GAAY,MAAwB;EACnF,EAAE,gBAAgB;EAClB,IAAMygB,IAAM/Z,EAAY,MAAK,MAAKlD,EAAE,OAAOqD,CAAE;EAC7C,IAAI4Z,MAAQA,EAAI,SAAS,UAAUA,EAAI,SAAS,UAAUA,EAAI,SAAS,YAAY;GACjF,IAAInmB,GAAa,uBAAuB,MAAS,CAAC8jC,EAAkB,QAAQ3d,CAAG,GAAG;IAChF,GAAwB5Z,CAAE;IAC1B;GACF;GAWA,AAVA04B,GAAoB;IAClB,GAAG9e,EAAI;IACP,GAAGA,EAAI;IACP,MAAMA,EAAI;IACV,OAAOA,EAAI;IACX,QAAQA,EAAI;IACZ,WAAWA,EAAI;GACjB,CAAC,GACDgf,GAAehf,EAAI,QAAQ,EAAE,GACzBA,EAAI,SAAO6d,GAAgB7d,EAAI,KAAK,GACxC1Z,GAAwBF,CAAE;EAC5B;CACF,GAAG;EAACH;EAAa03B;EAAmB9jC;CAAW,CAAC;CAEhD,QAAgB;EACd,IAAMynC,KAAyB,MAAkB;GAC/C,IAAIN,GAAY,SAAS;IACvB,IAAM,EAAE,WAAQ,WAAQ,WAAQ,kBAAeA,GAAY,SACvDnpB,KAAM,EAAE,UAAUzV,KAAU3O,GAC5BqkB,KAAM,EAAE,UAAUC,KAAUtkB;IAChC,IAAI8E,MAAa,IAAI;KACnB,IAAMgpC,IAAM1pB;KAAa,AAAT,IAAKC,GAAI,IAAK,CAACypB;IACjC,OAAO,IAAIhpC,MAAa,KACZ,AAAV,IAAK,CAACsf,GAAI,IAAK,CAACC;SACX,IAAIvf,MAAa,KAAK;KAC3B,IAAMgpC,IAAM1pB;KAAc,AAAV,IAAK,CAACC,GAAI,IAAKypB;IACjC;IAEA,IAAIC,IAAOJ,EAAW,OAClBK,IAAOL,EAAW,QAClB/rC,IAAO+rC,EAAW,GAClBnpB,IAAOmpB,EAAW;IAiBtB,AAfIlpB,EAAO,SAAS,GAAG,MACrB,IAAO,KAAK,IAAI,IAAIkpB,EAAW,QAAQvpB,CAAE,IAEvCK,EAAO,SAAS,GAAG,MACrB,IAAO,KAAK,IAAI,IAAIkpB,EAAW,SAAStpB,CAAE,IAExCI,EAAO,SAAS,GAAG,MACrB,IAAO,KAAK,IAAI,IAAIkpB,EAAW,QAAQvpB,CAAE,GACzC,IAAOupB,EAAW,KAAKA,EAAW,QAAQI,KAExCtpB,EAAO,SAAS,GAAG,MACrB,IAAO,KAAK,IAAI,IAAIkpB,EAAW,SAAStpB,CAAE,GAC1C,IAAOspB,EAAW,KAAKA,EAAW,SAASK,KAG7CZ,GAAmB;KACjB,GAAGO;KACH,GAAG/rC;KACH,GAAG4iB;KACH,OAAOupB;KACP,QAAQC;IACV,CAAC;GACH,OAAO,IAAIR,GAAU,SAAS;IAC5B,IAAM,EAAE,WAAQ,WAAQ,kBAAeA,GAAU,SAC7CppB,KAAM,EAAE,UAAUzV,KAAU3O,GAC5BqkB,KAAM,EAAE,UAAUC,KAAUtkB;IAChC,IAAI8E,MAAa,IAAI;KACnB,IAAMgpC,IAAM1pB;KAAa,AAAT,IAAKC,GAAI,IAAK,CAACypB;IACjC,OAAO,IAAIhpC,MAAa,KACZ,AAAV,IAAK,CAACsf,GAAI,IAAK,CAACC;SACX,IAAIvf,MAAa,KAAK;KAC3B,IAAMgpC,IAAM1pB;KAAc,AAAV,IAAK,CAACC,GAAI,IAAKypB;IACjC;IAEA,GAAiB;KACf,GAAGH;KACH,GAAG,KAAK,IAAI,GAAGA,EAAW,IAAIvpB,CAAE;KAChC,GAAG,KAAK,IAAI,GAAGupB,EAAW,IAAItpB,CAAE;IAClC,CAAC;GACH;EACF,GAEM4pB,UAA4B;GAChC,IAAIV,GAAY,SAAS;IACvB,IAAIE,GAAqB,SAAS;KAChC,IAAMS,IAAWT,GAAqB;KACtC,GAAkBj7B,EAAY,KAAI,MAAKlD,EAAE,OAAO4+B,EAAS,KAAKA,IAAW5+B,CAAC,CAAC;IAC7E;IAEA,AADA,GAAY,UAAU,MACtB89B,GAAmB,IAAI;GACzB;GACA,IAAII,GAAU,SAAS;IACrB,IAAIE,GAAmB,SAAS;KAC9B,IAAMQ,IAAWR,GAAmB;KACpC,GAAkBl7B,EAAY,KAAI,MAAKlD,EAAE,OAAO4+B,EAAS,KAAKA,IAAW5+B,CAAC,CAAC;IAC7E;IAEA,AADA,GAAU,UAAU,MACpBg+B,GAAiB,IAAI;GACvB;EACF;EAIA,OAFA,OAAO,iBAAiB,aAAaO,CAAqB,GAC1D,OAAO,iBAAiB,WAAWI,CAAmB,SACzC;GAEX,AADA,OAAO,oBAAoB,aAAaJ,CAAqB,GAC7D,OAAO,oBAAoB,WAAWI,CAAmB;EAC3D;CACF,GAAG;EAACjuC;EAAO8E;EAAU0N;EAAau6B;CAAiB,CAAC;CAEpD,IAAMoB,KAA0BriC,GAAa,MAA+D;EAE1G,IADI1F,GAAa,sBAAsB,MACnC,OAAO,SAAW,KAAa;EACnC,IAAMgoC,IAAM,OAAO,aAAa;EAChC,IAAI,CAACA,KAAOA,EAAI,eAAe,CAACA,EAAI,YAAY;EAChD,IAAMle,IAAQke,EAAI,WAAW,CAAC,GACxBC,IAAc,MAAM,KAAKne,EAAM,eAAe,CAAC;EACrD,IAAIme,EAAY,WAAW,GAAG;EAE9B,IAAIC,IAAoBpe,EAAM;EAC9B,OAAOoe,KAAQ,EAAEA,aAAgB,eAAeA,EAAK,UAAU,SAAS,oBAAoB,KAC1F,IAAOA,EAAK;EAEd,IAAI,CAACA,KAAQ,EAAEA,aAAgB,cAAc;EAE7C,IAAMC,IAAcD,EAAK,aAAa,kBAAkB,KAAKA,EAAK,GAAG,QAAQ,aAAa,EAAE,GACtFE,IAAa,SAASD,GAAa,EAAE;EAC3C,IAAI,CAACC,GAAY;EAEjB,IAAMC,IAAWH,EAAK,sBAAsB,GACtCI,IAAOpc,GAAQkc,CAAU,GACzBh5B,IAAM1Q,IAAW,OAAQ,IAAI4pC,EAAK,QAAQA,EAAK,QAC/Cp5B,IAAMxQ,IAAW,OAAQ,IAAI4pC,EAAK,SAASA,EAAK,OAEhDC,IAAQN,EAAY,KAAI,MAAK;GACjC,IAAM94B,KAAQxF,EAAE,OAAO0+B,EAAS,QAAQzuC,GAClCqV,KAAQtF,EAAE,MAAM0+B,EAAS,OAAOzuC,GAChC4uC,IAAO7+B,EAAE,QAAQ/P,GACjB6uC,IAAO9+B,EAAE,SAAS/P,GAClBgtB,IAAK7X,GAAmBI,GAAMF,GAAMvQ,GAAU0Q,GAAKF,CAAG,GACtD2X,IAAK9X,GAAmBI,IAAOq5B,GAAMv5B,IAAOw5B,GAAM/pC,GAAU0Q,GAAKF,CAAG;GAC1E,OAAO;IACL,GAAG,KAAK,IAAI0X,EAAG,GAAGC,EAAG,CAAC;IACtB,GAAG,KAAK,IAAID,EAAG,GAAGC,EAAG,CAAC;IACtB,OAAO,KAAK,IAAIA,EAAG,IAAID,EAAG,CAAC;IAC3B,QAAQ,KAAK,IAAIC,EAAG,IAAID,EAAG,CAAC;GAC9B;EACF,CAAC,CAAC,CAAC,QAAO,MAAKjd,EAAE,QAAQ,KAAKA,EAAE,SAAS,CAAC;EAE1C,IAAI4+B,EAAM,WAAW,GAAG;EAExB,IAAM/pB,IAAO,KAAK,IAAI,GAAG+pB,EAAM,KAAI,MAAK5+B,EAAE,CAAC,CAAC,GACtC8U,IAAO,KAAK,IAAI,GAAG8pB,EAAM,KAAI,MAAK5+B,EAAE,CAAC,CAAC,GACtCktB,IAAO,KAAK,IAAI,GAAG0R,EAAM,KAAI,MAAK5+B,EAAE,IAAIA,EAAE,KAAK,CAAC,GAChDmtB,IAAO,KAAK,IAAI,GAAGyR,EAAM,KAAI,MAAK5+B,EAAE,IAAIA,EAAE,MAAM,CAAC,GAEjD++B,IAAQ7vC,MAAS,cAAc,YAAYA,MAAS,aAAa,YAAYsrC,MAAgB,WAC7FvgB,IAAU/qB,MAAS,cAAc,KAAM,GACvC8vC,IAAc9vC,MAAS,aAAa,MAAM,GAE1C+vC,IAAQ5f,GAAgB;EAe9B,AAdA2d,GAAkB,CAAC,GAAGv6B,GAAa;GACjC,IAAIw8B;GACJ;GACA,WAAWR;GACX,GAAG5pB;GACH,GAAGC;GACH,OAAOoY,IAAOrY;GACd,QAAQsY,IAAOrY;GACf,OAAO8pB,EAAM,SAAS,IAAIA,IAAQ,KAAA;GAClC;GACA;GACA;EACF,CAAC,CAAC,GAEFP,EAAI,gBAAgB;CACtB,GAAG;EAAC57B;EAAau6B;EAAmBxC;EAAcjY;EAASlsB;EAAatB;EAAU9E;CAAK,CAAC;CA6GxF,AAzGApB,GAA2B,mBAAmB,MAAM;EAClD,IAAMqwC,IAAU,SAAS,eAAe,YAAY,cAAc,SAAS,eAAe,YAAY;EAEtG,IAAIpiC,GAAc,GAAGqiC,GAAW,WAAW,CAAC,GAAG;GAE7C,AADA,EAAE,eAAe,GACjBrqC,IAAY,OAAMkL,IAAI,MAAM,GAAG;GAC/B;EACF;EACA,IAAIlD,GAAc,GAAGqiC,GAAW,YAAY,CAAC,GAAG;GAE9C,AADA,EAAE,eAAe,GACjBrqC,IAAY,OAAMkL,IAAI,MAAM,GAAG;GAC/B;EACF;EACA,IAAIlD,GAAc,GAAGqiC,GAAW,MAAM,CAAC,GAAG;GAExC,AADA,EAAE,eAAe,GACjBjC,GAAW;GACX;EACF;EACA,IAAIpgC,GAAc,GAAGqiC,GAAW,MAAM,CAAC,GAAG;GAExC,AADA,EAAE,eAAe,GACjBhC,GAAW;GACX;EACF;EACA,IAAIrgC,GAAc,GAAGqiC,GAAW,QAAQ,CAAC,GAAG;GAE1C,AADA,EAAE,eAAe,GACjBxwC,GAAI,KAAK,oBAAoB;GAC7B;EACF;EACA,IAAImO,GAAc,GAAGqiC,GAAW,aAAa,CAAC,GAAG;GAE/C,AADA,EAAE,eAAe,GACjBxwC,GAAI,KAAK,yBAAyB;GAClC;EACF;EAGA,IAAI,CAACuwC,KAAW,CAAC7D,IAAkB;GACjC,IAAIv+B,GAAc,GAAGqiC,GAAW,MAAM,CAAC,GAAG;IACxC,IAAMxf,IAAe,OAAO,SAAW,MAAc,OAAO,aAAa,CAAC,EAAE,SAAS,IAAI;IACzF,IAAIA,KAAgBA,EAAa,SAAS,GAAG;KAC3C,GAAI,KAAK,sBAAsB,EAAE,MAAMA,EAAa,CAAC;KACrD;IACF;IACA,IAAI9c,GAAsB;KACxB,IAAMu8B,IAAY38B,EAAY,MAAK,MAAKlD,EAAE,OAAOsD,CAAoB;KACrE,AAAIu8B,MACF,EAAE,eAAe,GACjB,GAAuB,UAAUA;KAEnC;IACF;GACF;GACA,IAAItiC,GAAc,GAAGqiC,GAAW,OAAO,CAAC,KAAKpD,GAAuB,SAAS;IAC3E,EAAE,eAAe;IACjB,IAAMsD,IAAOtD,GAAuB,SAC9BuD,IAAqB;KACzB,GAAGD;KACH,IAAIhgB,GAAgB;KACpB,WAAWxf;KACX,GAAGw/B,EAAK,IAAI;KACZ,GAAGA,EAAK,IAAI;KACZ,QAAQ,KAAA;KACR,UAAU,KAAA;KACV,WAAW,KAAA;KACX,YAAY,KAAA;KACZ,UAAU,KAAA;KACV,YAAY,KAAA;IACd;IAEA,AADArC,GAAkB,CAAC,GAAGv6B,GAAa68B,CAAM,CAAC,GAC1Cx8B,GAAwBw8B,EAAO,EAAE;IACjC;GACF;GACA,IAAIxiC,GAAc,GAAGqiC,GAAW,QAAQ,CAAC,KAAKt8B,GAAsB;IAGlE,AAFA,EAAE,eAAe,GACjBm6B,GAAkBv6B,EAAY,QAAO,MAAKlD,EAAE,OAAOsD,CAAoB,CAAC,GACxEC,GAAwB,IAAI;IAC5B;GACF;GACA,IAAI,EAAE,QAAQ,WAAWD,KAAwB,CAACw4B,IAAkB;IAClE,IAAM7e,IAAM/Z,EAAY,MAAK,MAAKlD,EAAE,OAAOsD,CAAoB;IAC/D,IAAI2Z,MAAQA,EAAI,SAAS,UAAUA,EAAI,SAAS,UAAUA,EAAI,SAAS,YAAY;KAWjF,AAVA,EAAE,eAAe,GACjB8e,GAAoB;MAClB,GAAG9e,EAAI;MACP,GAAGA,EAAI;MACP,MAAMA,EAAI;MACV,OAAOA,EAAI;MACX,QAAQA,EAAI;MACZ,WAAWA,EAAI;KACjB,CAAC,GACDgf,GAAehf,EAAI,QAAQ,EAAE,GACzBA,EAAI,SAAO6d,GAAgB7d,EAAI,KAAK;KACxC;IACF;GACF;EACF;CACF,CAAC,GAEDvtB,QAAgB;EACd,AAAIosC,MAAoBI,GAAY,WAClC,iBAAiB;GACf,GAAY,SAAS,MAAM;EAC7B,GAAG,EAAE;CAET,GAAG,CAACJ,EAAgB,CAAC,GAErBpsC,QAAgB;EACd,AAAIswC,MACFA,GAAoB98B,CAAW;CAEnC,GAAG,CAACA,GAAa88B,EAAmB,CAAC;CAGrC,IAAM,CAACC,IAAgBC,MAAqBhtC,EAAsB,CAAC,CAAC;CAEpE,QAAgB;EACd,IAAIuM,KAAU0gC,KAAmBA,EAAgB,SAAS,GAAG;GAC3D,IAAIlJ,IAAY;GAIhB,OAHA1V,GAAoB9hB,GAAQ0gC,CAAe,CAAC,CAAC,MAAK,MAAW;IAC3D,AAAKlJ,KAAWiJ,GAAkBvgC,CAAO;GAC3C,CAAC,SACY;IAAE,IAAY;GAAM;EACnC;EACE,GAAkB,CAAC,CAAC;CAExB,GAAG,CAACF,GAAQ0gC,CAAe,CAAC;CAE5B,IAAM,CAACC,IAAmBC,MAAwBntC,EAAS,EAAK,GAE1DotC,KAAqB7M,QAClB;EAAC,GAAIlzB,KAAc,CAAC;EAAI,GAAG0/B;EAAgB,GAAGvL;CAAgB,GACpE;EAACn0B;EAAY0/B;EAAgBvL;CAAgB,CAAC;CAGjD,QAAgB;EACd,GAAa,QAAQ,qBAAqB4L,EAAkB;CAC9D,GAAG,CAACA,EAAkB,CAAC;CAEvB,IAAMC,KAAyB9M,QACtB6M,GAAmB,QAAO,MAAK7/B,EAAE,WAAW,SAAS,CAAC,CAAC,QAC7D,CAAC6/B,EAAkB,CAAC,GAEjBE,KAA6BhkC,QAAkB;EAEnD,AADAm4B,IAAoB,MAAQvtB,EAAK,QAAO,MAAK3G,EAAE,WAAW,SAAS,CAAC,GACpEy/B,IAAkB,MAAQ94B,EAAK,QAAO,MAAK3G,EAAE,WAAW,SAAS,CAAC;CACpE,GAAG,CAAC,CAAC,GAECggC,KAAyBjkC,GAAa,MAAmB;EAE7D,AADAm4B,IAAoB,MAAQvtB,EAAK,QAAO,MAAK3G,MAAMO,KAAOP,EAAE,OAAOO,EAAI,EAAE,CAAC,GAC1Ek/B,IAAkB,MAAQ94B,EAAK,QAAO,MAAK3G,MAAMO,KAAOP,EAAE,OAAOO,EAAI,EAAE,CAAC;CAC1E,GAAG,CAAC,CAAC,GAEC,EAAE,YAAQ,mBAAe,iBAAa,uBAAmBU,GAAajC,GAAQ6gC,EAAkB;CAEtG,QAAgB;EACd,AAAIz+B,GAAc,WAAW,KAC3B42B,GAAsB,IAAI;CAE9B,GAAG,CAAC52B,EAAa,CAAC;CAIlB,IAAM6+B,KAAuBlxC,EAAO,EAAK;CACzC,QAAgB;EAMd,IALA+kC,GAAU,IAAI,GACdE,GAAa,IAAI,GACjB9uB,GAAW,CAAC,GACZgzB,GAAY,CAAC,CAAC,GACd,GAAqB,UAAU,IAC3B,CAACgI,GAAY;EAEjB,IAAMvnC,IAAMunC,GACR1J,IAAY,IACZ2J,IAAsD;EAqC1D,QAFA,YAjC4B;GAC1B,IAAI;IAGF,AAFInL,GAAU,WAASjS,GAAmBiS,GAAU,OAAO,GAC3D7R,GAAuB,GACvB,IAAc50B,GAAS,YAAY;KACjC;KACA;KACA,GAAGynC,GAAqB;KACxB,GAAG5S,GAAkB;IACvB,CAAC;IACD,IAAMgd,IAAM,MAAMD,EAAY;IAG9B,IAAI3J,GAAW;IACf,IAAI;KACF,IAAMvZ,IAAK,MAAMmjB,EAAI,QAAQ,CAAC;KAC9B,IAAI,CAAC5J,GAAW;MACd,IAAM6J,IAAMpjB,EAAG,YAAY;OAAE,OAAO;OAAG,UAAUlX,GAAkBkX,EAAG,SAASloB,CAAQ;MAAE,CAAC;MAC1F,GAAYgtB,GAAuBqe,EAAI,UAAU;OAAE,OAAOC,EAAI;OAAO,QAAQA,EAAI;MAAO,CAAC,CAAC;KAC5F;IACF,QAAQ,CAAC;IACT,IAAI7J,GAAW;IAEf,AADA1C,GAAUsM,CAAG,GACbrL,GAAa,QAAQ,mBAAmBqL,GAAKznC,CAAG;GAClD,SAAS6I,GAAY;IACnB,IAAIg1B,GAAW;IACf,IAAM/vB,IAAMjF,aAAiB,QAAQA,IAAY,MAAM,OAAOA,GAAO,WAAWA,CAAK,CAAC,GAChF8+B,IAAmB9+B,GAAO,SAAS;IAGzC,AAFA,QAAQ,MAAM,4CAA4CiF,EAAI,SAASA,CAAG,GAC1EutB,GAAavtB,CAAG,GAChBsuB,GAAa,QAAQ,cAActuB,GAAK;KAAE;KAAK;IAAiB,CAAC;GACnE;EACF,EACA,CAAQ,SAEK;GAEX,AADA,IAAY,IACR05B,KACFA,EAAY,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC;EAExC;CACF,GAAG;EAACD;EAAYK;EAAWnK;EAAiBrhC;CAAQ,CAAC;CAErD,IAAMyrC,KAAqBzkC,GAAa,MAAyB;EAE/D,AADAg5B,GAAa,QAAQ,iBAAiB0L,CAAY,GAC9C,IAAqB,YACzB,GAAqB,UAAU,IAC/B1L,GAAa,QAAQ,sBAAsB0L,CAAY;CACzD,GAAG,CAAC,CAAC;CAEL,QAAgB;EACd,AAAIzhC,KAAQ+1B,GAAa,QAAQ,eAAel1B,GAASb,EAAO,QAAQ;CAC1E,GAAG,CAACa,GAASb,CAAM,CAAC;CAIpB,IAAMy9B,KAAuB1tC,EAAyC,IAAI,GACpE2xC,KAAoB3xC,EAA2B,KAAA,CAAS;CAe9D,AAdAE,QAAgB;EACd,IAAMgrC,IAASjgC,MAAQ2mC;EAGvB,IAFI,CAAC3hC,KAAU,CAACi7B,KACZwC,GAAqB,YAAYz9B,KAAU0hC,GAAkB,YAAYzG,KACzEhC,GAAS,SAAS,KAAK,IAAIgC,GAAQj7B,EAAO,QAAQ,GAAG;EAEzD,IAAM4hC,IAAYnE,GAAqB,YAAYz9B;EAEnD,AADA,GAAqB,UAAUA,GAC/B,GAAkB,UAAUi7B;EAC5B,IAAMlQ,IAAI,iBAAiBoP,GAAac,GAAQ,EAAE,QAAQ,CAAC2G,EAAU,CAAC,GAAG,EAAE;EAC3E,aAAa,aAAa7W,CAAC;CAC7B,GAAG;EAAC/qB;EAAQhF;EAAM2mC;EAAa1I,GAAS;EAAQkB;CAAY,CAAC,GAG7DlqC,QAAgB;EACd,IAAI,CAAC+P,GAAQ;EACb,IAAIw3B,IAAY,IACV4J,IAAMphC;EAmFZ,QAjFC,YAAY;GAEX,IAAIie;GACJ,IAAI;IACF,IAAK,MAAMmjB,EAAI,QAAQ,CAAC;GAC1B,QAAQ;IACN;GACF;GACA,IAAI5J,GAAW;GAEf,IAAM6J,IAAMpjB,EAAG,YAAY;IAAE,OAAO;IAAG,UAAUlX,GAAkBkX,EAAG,SAASloB,CAAQ;GAAE,CAAC,GACpF8rC,IAAQ;IAAE,OAAOR,EAAI;IAAO,QAAQA,EAAI;GAAO;GAcrD,IAXAnI,IAAa,MAETvxB,EAAK,WAAWy5B,EAAI,YACpB,KAAK,KAAKz5B,EAAK,EAAE,EAAE,SAAS,KAAKk6B,EAAM,KAAK,KAAK,MACjD,KAAK,KAAKl6B,EAAK,EAAE,EAAE,UAAU,KAAKk6B,EAAM,MAAM,KAAK,KAE5Cl6B,IAEFob,GAAuBqe,EAAI,UAAUS,CAAK,CAClD,GAEGT,EAAI,YAAY,GAAG;GAGvB,IAAMU,IAAU/e,GAAuBqe,EAAI,UAAUS,CAAK,GACtDE,IAAW;GAGf,KAAK,IAAIC,IAAQ,GAAGA,KAASZ,EAAI,UAAU,KAAS,IAAW;IAC7D,IAAI5J,GAAW;IACf,IAAMyK,IAAM,KAAK,IAAIb,EAAI,UAAUY,IAAQ,KAAY,CAAC,GAClDphC,IAAiC,CAAC;IAExC,KAAK,IAAIxN,IAAI4uC,GAAO5uC,KAAK6uC,GAAK,KAAK;KACjC,IAAMphC,IAAUzN;KAChB,EAAc,MAAM,YAAY;MAC9B,IAAI;OACF,IAAM4H,IAAO,MAAMomC,EAAI,QAAQvgC,CAAO;OACtC,IAAI22B,GAAW;OACf,IAAMv2B,IAAKjG,EAAK,YAAY;QAAE,OAAO;QAAG,UAAU+L,GAAkB/L,EAAK,SAASjF,CAAQ;OAAE,CAAC;OAI7F,CAHI,KAAK,IAAIkL,EAAG,QAAQ4gC,EAAM,KAAK,IAAI,MAAO,KAAK,IAAI5gC,EAAG,SAAS4gC,EAAM,MAAM,IAAI,QACjF,IAAW,KAEb,EAAQhhC,IAAU,KAAK;QAAE,OAAOI,EAAG;QAAO,QAAQA,EAAG;OAAO;MAC9D,QAAQ,CAER;KACF,EAAA,CAAG,CAAC;IACN;IAEA,MAAM,QAAQ,IAAIL,CAAa;GACjC;GAEA,IAAI,MAGAmhC,GAAU;IACZ,IAAMjmB,IAAYvX,EAAa;IAC/B,IAAIuX,KAAaA,EAAU,YAAY,KAAK8d,GAAkB,YAAY,cAAc;KACtF,IAAMsI,IAAOrI,GAAc,SACrBsI,IAAYjf,GAChBuW,GAAQ,UACP,MAAMqI,EAAQ1uC,IAAI,MAAMyuC,GACzBnI,GAAS,SACT,EACF,GACM0I,IAASzI,GAAa,QAAQ,KAAKuI,MAAS,GAE5CG,KADSF,EAAU,KAAKD,MAAS,KAChBE;KACvB,AAAIC,MAAU,MACZ,EAAU,aAAaA;IAE3B;IACA,GAAYP,CAAO;GACrB;EACF,EAAA,CAAG,SAEU;GACX,IAAY;EACd;CACF,GAAG,CAAC9hC,GAAQjK,CAAQ,CAAC;CAGrB,IAAMusC,KAAmBvlC,GACtB,MAAyC;EACxC,IAAM4iC,IAAOpc,GAAQ1iB,CAAO;EAC5B,IAAI,CAAC0D,EAAa,WAAW,CAACo7B,EAAK,OAAO;EAC1C,IAAMxuC,IAAiBoT,EAAa,QAAQ,cAAc,IACpDg+B,IAAW,OAAOpyC,KAAW,WAAWA,IAASA,GAAQ,OACzDqyC,IACJ,OAAOD,KAAa,YAAY,OAAO,SAASA,CAAQ,KAAKA,IAAW,IACpEA,IACC,OAAOlF,MAA2B,YAAY,CAACltC,IAASktC,KAAyB;EAIxF,IAFA,GAAiB,UAAU;GAAE,MAAM;GAAa,OAAOmF;EAAe,GAElErxC,IAAiB,KAAKwuC,EAAK,QAAQ,GAAG;GACxC,IAAM7sC,IAAW5B,GAAuBC,GAAgBwuC,EAAK,OAAO6C,CAAc;GAOlF,AANI1vC,MAAa7B,IAIf,GAAuB,UAAU,MAHjC,GAAuB,UAAU,IACjC8sC,EAASjrC,CAAQ,IAIfyR,EAAa,YAAY1D,MAAY,KAAK0D,EAAa,QAAQ,aAAa,OAC9E,EAAa,QAAQ,YAAY,GACjC,EAAa,QAAQ,aAAa;EAEtC;CACF,GACA;EAACgf;EAAS1iB;EAAS5P;EAAO8sC;EAAUV;CAAsB,CAC5D,GAGMoF,KAAkB1lC,QAAkB;EACxC,GAAiB,UAAU,EAAE,MAAM,WAAW;EAC9C,IAAM4iC,IAAOpc,GAAQ1iB,CAAO;EAC5B,IAAI,CAAC0D,EAAa,WAAW,CAACo7B,EAAK,SAAS,CAACA,EAAK,QAAQ;EAC1D,IAAMxuC,IAAiBoT,EAAa,QAAQ,cAAc,IACpDm+B,IAAkBn+B,EAAa,QAAQ,eAAe;EAC5D,IAAIpT,IAAiB,KAAKuxC,IAAkB,KAAK/C,EAAK,QAAQ,KAAKA,EAAK,SAAS,GAAG;GAClF,IAAMgD,IAASxxC,IAAiBwuC,EAAK,OAC/Bjd,IAASggB,IAAkB/C,EAAK,QAChC7sC,IAAW9B,GAAW,KAAK,IAAI2xC,GAAQjgB,CAAM,CAAC;GAOpD,AANI5vB,MAAa7B,IAIf,GAAuB,UAAU,MAHjC,GAAuB,UAAU,IACjC8sC,EAASjrC,CAAQ,IAIfyR,EAAa,YAAY1D,MAAY,KAAK0D,EAAa,QAAQ,aAAa,OAC9E,EAAa,QAAQ,YAAY,GACjC,EAAa,QAAQ,aAAa;EAEtC;CACF,GAAG;EAACgf;EAAS1iB;EAAS5P;EAAO8sC;CAAQ,CAAC;CAMtC,AAJAluC,GAAY,wBAAwB,MAAWyyC,GAAiBnyC,CAAiD,CAAC,GAClHN,GAAY,4BAA4B4yC,GAAgB,CAAC,GAGzDxyC,QAAgB;EACd,IAAI2yC,OAAe,IAAO;EAC1B,IAAM9mB,IAAYvX,EAAa;EAC/B,IAAI,CAACuX,KAAa,OAAO,iBAAmB,KAAa;EAEzD,IAAI+mB,IAAuB,MACvBC,IAAYhnB,EAAU,aACtBinB,IAAajnB,EAAU,cAErBknB,UAAqB;GACzB,IAAMC,IAAennB,EAAU,aACzBonB,IAAgBpnB,EAAU;GAEhC,AAAImnB,KAAgB,KAAKC,KAAiB,KACtC,KAAK,IAAID,IAAeH,CAAS,IAAI,KAAK,KAAK,IAAII,IAAgBH,CAAU,IAAI,MAErF,IAAYE,GACZ,IAAaC,GAEb3J,GAAuB;IAAE,OAAO0J;IAAc,QAAQC;GAAc,CAAC,GAEhE1F,GAAiB,YAElBqF,KAAO,qBAAqBA,CAAK,GACrC,IAAQ,4BAA4B;IAClC,IAAM3nB,IAAOsiB,GAAiB;IAC9B,AAAItiB,GAAM,SAAS,cACjBonB,GAAiB,EAAE,OAAOpnB,EAAK,MAAM,CAAC,IAC7BA,GAAM,SAAS,cACxBunB,GAAgB;GAEpB,CAAC;EACH,GAEM59B,IAAW,IAAI,eAAem+B,CAAY;EAIhD,OAHAn+B,EAAS,QAAQiX,CAAS,GAC1B,OAAO,iBAAiB,UAAUknB,CAAY,SAEjC;GAGX,AAFAn+B,EAAS,WAAW,GACpB,OAAO,oBAAoB,UAAUm+B,CAAY,GAC7CH,KAAO,qBAAqBA,CAAK;EACvC;CACF,GAAG;EAACD;EAAYN;EAAkBG;CAAe,CAAC;CAElD,IAAMU,MAAqB,GAA8B,MAAuB;EAC9E,IAAM1yB,IAAO,EAAE,cAAc,sBAAsB,GAC7CjK,KAAQ,EAAE,UAAUiK,EAAK,QAAQxf,GACjCqV,KAAQ,EAAE,UAAUmK,EAAK,OAAOxf,GAChC0uC,IAAOpc,GAAQrpB,CAAU;EAG/B,OAAOkM,GAAmBI,GAAMF,GAAMvQ,GAF1BA,IAAW,OAAQ,IAAI4pC,EAAK,QAAQA,EAAK,QACzC5pC,IAAW,OAAQ,IAAI4pC,EAAK,SAASA,EAAK,KACE;CAC1D,GAEMxqB,MAAmB,GAA8B,MAA0B;EAC/E,IAAI,CAACD,GAAY;EAEjB,IAAM,EAAE,MAAG,SAAMiuB,GAAkB,GAAGC,CAAa;EAEnD,IAAIluB,MAAe,UAAUA,MAAe,QAAQ;GAClD,EAAE,eAAe;GACjB;EACF;EAEA,IAAIA,MAAe,UAAU;GAC3B,GAAa,EAAI;GACjB;EACF;EAIA,AAFA8mB,GAAY;GAAE;GAAG;EAAE,CAAC,GACpBE,GAAc;GAAE;GAAG;EAAE,CAAC,GAClBhnB,MAAe,cACjB0mB,GAAa,EAAI,GACjBQ,GAAkB,CAAC;GAAE;GAAG;EAAE,CAAC,CAAC,GAC5BN,GAAwBsH,CAAa,MAC5B;GAAC;GAAa;GAAW;GAAQ;GAAS;GAAa;GAAa;GAAa;GAAY;EAAW,CAAC,CAAC,SAASluB,CAAU,KAG7H,CAAC,WAAW,MAAM,CAAC,CAAC,SAASA,CAAU,OAFhD0mB,GAAa,EAAI,GACjBE,GAAwBsH,CAAa;CAKzC,GAEMC,WAA6B;EACjC,IAAIhH,MAAoBE,GAAY,KAAK,GAAG;GAC1C,IAAIF,GAAiB,OACnB,GAAkB54B,EAAY,KAAI,MAChClD,EAAE,OAAO87B,GAAiB,QAAQ;IAAE,GAAG97B;IAAG,MAAMg8B;GAAY,IAAIh8B,CAClE,CAAC;QACI;IACL,IAAM0/B,IAAQ5f,GAAgB,GACxBijB,IAAe,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK/G,GAAY,SAAS,IAAI,EAAE,CAAC,GACvEgH,IAAYhH,GAAY,MAAM,IAAI,CAAC,CAAC,QACpCiH,IAAgB,KAAK,IAAI,IAAID,IAAY,EAAE;IACjD,GAAkB,CAAC,GAAG9/B,GAAa;KACjC,IAAIw8B;KACJ,MAAM5D,GAAiB;KACvB,WAAWA,GAAiB;KAC5B,GAAGA,GAAiB;KACpB,GAAGA,GAAiB;KACpB,OAAOiH;KACP,QAAQE;KACR,MAAMjH;KACN,QAAQF,GAAiB;KACzB,OAAOb;KAAc,aAAaC;KAAoB,SAASC;IACjE,CAAC,CAAC;GACJ;EACF;EAGA,AAFAY,GAAoB,IAAI,GACxBE,GAAe,EAAE,GACbtnB,MAAe,UACjBmB,GAAc,IAAI;CAEtB,GAEMpT,MAAmB,GAA8B,MAA0B;EAC/E,IAAI,CAAC04B,IAAW;EAEhB,IAAM,EAAE,MAAG,SAAMwH,GAAkB,GAAGC,CAAa;EAGnD,AAFAlH,GAAc;GAAE;GAAG;EAAE,CAAC,GAElBhnB,MAAe,cACjBknB,IAAkB,MAAQ,CAAC,GAAGz0B,GAAM;GAAE;GAAG;EAAE,CAAC,CAAC;CAEjD,GAEMxE,MAAiB,GAA8B,MAA0B;EAC7E,IAAI+R,MAAe,UAAUA,MAAe,UAAUA,MAAe,uBAAuBA,MAAe,QAAQ;GACjH,IAAIA,MAAe,QAAQ;IACzB,IAAM,EAAE,MAAG,SAAMiuB,GAAkB,GAAGC,CAAa;IACnD,IAAI/rC,GAAa,sBAAsB,IAAO;IAG9C,IAAMosC,IAASpjB,GAAgB,GACzBqjB,IAAkB;KACtB,IAAID;KACJ,MAAM;KACN,WAAWL;KACX;KACA;KACA,OAAO;KACP,QAAQ;KACR,MAAM;KACN,SAAS;KACT,OAAO;KACP,aAAa;KACb,SAAS;KACT,QAAQ,CAAC;IACX;IAIA,AAHApF,GAAkB,CAAC,GAAGv6B,GAAaigC,CAAU,CAAC,GAC9C5/B,GAAwB2/B,CAAM,GAC9B5G,GAAmB,EAAI,GACvBxmB,GAAc,IAAI;IAClB;GACF;GAAO,IAAInB,MAAe,UAAUA,MAAe,QAAQ;IACzD,IAAM,EAAE,MAAG,SAAMiuB,GAAkB,GAAGC,CAAa;IACnD,IAAI/rC,GAAa,sBAAsB,IAAO;IAK9C,AAJIglC,MACFgH,GAAqB,GAEvB/G,GAAoB;KAAE;KAAG;KAAG,MAAMpnB;KAAmB,WAAWkuB;IAAc,CAAC,GAC/E5G,GAAe,EAAE;GACnB;GACA;EACF;EAEA,IAAKb,OACLC,GAAa,EAAK,GAClBE,GAAwB,IAAI,GACvB5mB,IAEL;OAAIA,MAAe,YAAY;IAC7B,IAAIinB,GAAe,SAAS,GAAG;KAE7B,IAAMwH,IAAKxH,GAAe,KAAI,MAAK/oC,EAAE,CAAC,GAChCwwC,IAAKzH,GAAe,KAAI,MAAK/oC,EAAE,CAAC,GAChCyiB,IAAO,KAAK,IAAI,GAAG8tB,CAAE,GACrBzV,IAAO,KAAK,IAAI,GAAGyV,CAAE,GACrB7tB,IAAO,KAAK,IAAI,GAAG8tB,CAAE,GACrBzV,IAAO,KAAK,IAAI,GAAGyV,CAAE;KAE3B,GAAkB,CAAC,GAAGngC,GAAa;MACjC,IAAI4c,GAAgB;MAAG,MAAMnL;MAAmB,WAAWkuB;MAC3D,GAAGvtB;MAAM,GAAGC;MAAM,OAAOoY,IAAOrY;MAAM,QAAQsY,IAAOrY;MACrD,QAAQ,CAAC,GAAGqmB,EAAc;MAC1B,SAAS,CAAC,CAAC,GAAGA,EAAc,CAAC;MAC7B,OAAOX;MAAc,aAAaC;MAAoB,SAASC;KACjE,CAAC,CAAC;IACJ;IACA,GAAkB,CAAC,CAAC;GACtB,OAAO;IACL,IAAIl8B,IAAQ,KAAK,IAAIy8B,GAAW,IAAIF,GAAS,CAAC,GAC1Ct8B,IAAS,KAAK,IAAIw8B,GAAW,IAAIF,GAAS,CAAC;IAC/C,IAAIv8B,IAAQ,KAAKC,IAAS,GAAG;KAC3B,IAAIjN,IAAI,KAAK,IAAIupC,GAAS,GAAGE,GAAW,CAAC,GACrCvpC,IAAI,KAAK,IAAIqpC,GAAS,GAAGE,GAAW,CAAC,GACnC4H,IAAU3uB,MAAe,UAAUA,MAAe,WAAWA,MAAe,YAAa,CAAC6mB,IAAUE,EAAU,IAAI,KAAA;KAOxH,IALI;MAAC;MAAa;MAAa;MAAa;MAAY;KAAW,CAAC,CAAC,SAAS/mB,CAAU,KAAKzV,IAAS,OACpG,IAAS,KAAK,IAAI,IAAIA,CAAM,GAC5B,IAAIs8B,GAAS,IAAI,IAGf7mB,MAAe,WAAW;MAC5B,IAAI7d,GAAa,sBAAsB,IAAO;MAE9C,AADAilC,GAAoB;OAAE,GAAGL,GAAW;OAAG,GAAGA,GAAW;OAAG,MAAM;OAAW;OAAQ,WAAWmH;MAAc,CAAC,GAC3G5G,GAAe,EAAE;MACjB;KACF;KAEA,IAAItnB,MAAe,aAAa;MAC9B,IAAI7d,GAAa,cAAc,IAAO;MACtC,IAAoB,MAAQ,CAAC,GAAGsQ,GAAM;OACpC,IAAI,UAAU,KAAK,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,OAAO,GAAG,CAAC;OAClE,WAAWy7B;OACX;OACA;OACA;OACA;OACA,QAAQ;MACV,CAAC,CAAC;MACF;KACF;KAEA,IAAI/rC,GAAa,sBAAsB,IAAO;KAE9C,GAAkB,CAAC,GAAGoM,GAAa;MACjC,IAAI4c,GAAgB;MAAG,MAAMnL;MAAmB,WAAWkuB;MAAe;MAAG;MAAG;MAAO;MAAQ;MAC/F,OAAO5H;MAAc,aAAaC;MAAoB,SAASC;KACjE,CAAC,CAAC;IACJ;GACF;;CACF,GAEMoI,MAAoB,MAAe;EACvC,AAAI5uB,MAAe,YAAYymB,MAC7BqC,GAAkBv6B,EAAY,QAAO,MAAKlD,EAAE,OAAOqD,CAAE,CAAC;CAE1D,GAEMmgC,KAAkBhnC,EAAY,OAAO,GAAiB,GAAkB,MAAyB;EACrG,IAAMT,IAASxC,GAAgBE,CAAO,GAClCgqC,IAAmB,IAEjBC,IAA4B;GAChC,KAAKjqC;GACL,QAAQsC,EAAO;GACf,YAAYA,EAAO;GACnB,gBAAgBA,EAAO;GACvB,YAAYkhB;GACZ,eAAetZ;GACf,sBAAsB;IACpB,IAAmB;GACrB;GACA,IAAI,mBAAmB;IACrB,OAAO8/B;GACT;EACF;EAEA,GAAI,KAAK,eAAeC,CAAS;EACjC,IAAI;GAEF,AAAI,MADc9/B,KAAc8/B,CAAS,MAC7B,OACV,IAAmB;EAEvB,SAASx8B,GAAK;GACZ,QAAQ,MAAM,4CAA4CA,CAAG;EAC/D;EAEA,IAAIu8B,GAAkB;EAGtB,IAAI1nC,EAAO,kBAAkBA,EAAO,YAAY;GAC9C,GAAaA,EAAO,UAAU;GAC9B;EACF;EAGA,IAAI4nC,IAAkB5nC,EAAO,QACzB6nC,IAAgB7nC,EAAO;EAE3B,IAAI8nC,MAAkBC,GACpB,IAAI;GACF,IAAMC,IAAW,MAAMF,GAAepqC,GAAS;IAC7C,cAAcqqC;IACd,YAAY7mB;GACd,CAAC;GACD,IAAI8mB,GAAU;IACZ,IAAI,OAAOA,KAAa,UAAU;KAChC,IAAMC,IAAWzqC,GAAgBwqC,CAAQ;KAEzC,AADA,IAAkBC,EAAS,UAAUD,GACrC,IAAgBC,EAAS,cAAcJ;IACzC,OAEE,AADA,IAAkBG,EAAS,KAC3B,IAAgBA,EAAS,QAAQH;GAErC;EACF,SAAS18B,GAAK;GACZ,QAAQ,MAAM,+CAA+CA,CAAG;EAClE;EAIF,IAAMwzB,IAASoJ,GAAU,gBAAgB;EACzC,IAAIpJ,KAAUiJ,GACZ,IAAI;GACF,MAAMjJ,EAAO,eAAeiJ,GAAiB,EAAE,MAAMC,EAAc,CAAC;GACpE;EACF,SAAS18B,GAAK;GACZ,QAAQ,MAAM,kEAAkEA,CAAG;EACrF;EAIF,IAAI+8B,IAAWN,KAAmBlqC;EAKlC,AAJImqC,KAAiB,CAACK,EAAS,SAAS,QAAQ,MAC9C,IAAW,GAAGA,EAAS,QAAQL,MAG7BK,EAAS,WAAW,IAAI,IAC1B,IAAW,WAAWA,IACb,CAAC,gBAAgB,KAAKA,CAAQ,KAAK,CAACA,EAAS,WAAW,GAAG,KAAK,CAACA,EAAS,WAAW,IAAI,KAAK,CAACA,EAAS,WAAW,GAAG,MAC/H,IAAW,aAAaA;EAE1B,IAAMC,IAAM,OAAO,KAAKD,GAAU,UAAU,qBAAqB;EACjE,AAAIC,MAAK,EAAI,SAAS;CACxB,GAAG;EAAC90C;EAAK00C;EAAUlgC;EAAaigC;EAAgBjK;CAAY,CAAC;CAU7D,AAPAlqC,QAAgB;EACd,AAAIo0C,KAAYK,OAAiB,KAAA,KAC/BL,EAAS,gBAAgBK,EAAY;CAEzC,GAAG,CAACL,GAAUK,EAAY,CAAC,GAG3Bz0C,QACSN,GAAI,GAAG,qBAAqB,MAAc;EAC/C,AAAI+X,GAAM,OACRq8B,GAAgBr8B,EAAK,GAAG;CAE5B,CAAC,GACA,CAAC/X,IAAKo0C,EAAe,CAAC;CAEzB,IAAMY,MAAqB,GAAY,MAAwB;EAE7D,IADAzgC,EAAE,gBAAgB,GACdgR,MAAe,UAAU;GAC3B,IAAI7d,GAAa,yBAAyB,IAAO;GAEjD,AADA2mC,GAAkBv6B,EAAY,QAAO,MAAKlD,EAAE,OAAOqD,CAAE,CAAC,GAClDC,MAAyBD,MAC3BE,GAAwB,IAAI,GAC5B64B,GAAkB,IAAI;EAE1B,OAAO,IAAIznB,MAAe,QAAQA,MAAe,SAASA,MAAe,UAAU;GACjF,IAAMsI,IAAM/Z,EAAY,MAAK,MAAKlD,EAAE,OAAOqD,CAAE;GAC7C,IAAI4Z,KAAOA,EAAI,WAAWjmB,MAAc,QAAQ;IAC9C,GAAgBimB,EAAI,SAASA,GAAKtZ,CAAC;IACnC;GACF;GAAO,IAAIsZ,MAAQA,EAAI,SAAS,UAAUA,EAAI,SAAS,YAAY;IACjE,IAAInmB,GAAa,uBAAuB,MAAS,CAAC8jC,EAAkB,QAAQ3d,CAAG,GAAG;KAChF,GAAwB5Z,CAAE;KAC1B;IACF;IAIA,AAFA04B,GAAoB;KAAE,GAAG9e,EAAI;KAAG,GAAGA,EAAI;KAAG,MAAMA,EAAI;KAAa,OAAOA,EAAI;KAAI,QAAQA,EAAI;KAAQ,WAAWA,EAAI;IAAU,CAAC,GAC9Hgf,GAAehf,EAAI,QAAQ,EAAE,GACzBA,EAAI,SAAO6d,GAAgB7d,EAAI,KAAK;GAC1C,OAAO,IAAIA,KAAOA,EAAI,SAAS,QAC7B,GAAwB5Z,CAAE;QACrB,IAAI4Z,KAAOA,EAAI,SAAS,QAAQ;IACrC,IAAInmB,GAAa,uBAAuB,MAAS,CAAC8jC,EAAkB,QAAQ3d,CAAG,GAAG;KAChF,GAAwB5Z,CAAE;KAC1B;IACF;IACA,GAAmB,EAAI;GACzB;GACA,GAAwBA,CAAE;GAE1B,IAAMkY,IAAYvX,EAAa,SACzB+c,IAAgBxF,GAAW,sBAAsB;GACvD,AAAIwF,KAAiBxF,KACnB6gB,GAAkB;IAChB,KAAKz4B,EAAE,UAAUod,EAAc,MAAMxF,EAAU;IAC/C,MAAM5X,EAAE,UAAUod,EAAc,OAAOxF,EAAU;GACnD,CAAC;EAEL;CACF;CAqBA,OAXA7rB,QAAgB;EACd,IAAI+P,KAAUuE,EAAa,WAAW5O,MAAmB,cAAc;GACrE,IAAMivC,IAAWxL,GAAU,MAAM70B,EAAa,QAAQ,eAAe,GAC/DsgC,IAAY,KAAK,IAAI,GAAG,KAAK,IAAIzhB,GAAK,SAAS,GAAG2W,GAAiB6K,CAAQ,CAAC,CAAC,GAC7ExqB,IAAcgJ,GAAKyhB,KAAazhB,GAAKyhB,EAAU,CAAC,KAAK;GAC3D,AAAIzqB,MAAgBvZ,KAClBqF,GAAWkU,CAAW;EAE1B;CACF,GAAG;EAACgf,GAAU;EAAKnoC;EAAO+O;EAAQa;EAASk5B;EAAkBpkC;EAAgBytB;CAAI,CAAC,GAGhF,kBAAC,OAAD;EAAK,OAAO;GAAE,MAAM;GAAG,SAAS;GAAQ,WAAW;GAAG,iBAAiB;GAAmB,UAAU;EAAS;EAA7G,UAAA;GACG0hB,MACC,kBAACt/B,IAAD;IACE,QAAQjQ;IACA;IACC;IACT,aAAa,MAAM4kC,GAAa/mC,CAAC;GAClC,CAAA;GAEH,kBAAC,OAAD;IAAK,OAAO;KAAE,MAAM;KAAG,SAAS;KAAQ,eAAe;KAAU,UAAU;KAAG,WAAW;KAAG,iBAAiB;KAAmB,UAAU;IAAS;IAAnJ,UAAA;KAECg2B,EAAa,YACZ,kBAACD,IAAD;MACgB;MACd,SAASqM;MACT,gBAAgBE;MAChB,UAAUE;MACV,WAAWC;MACX,SAASC;MACG;MACZ,YAAY,MAASzf,GAAc0uB,CAAW;MAC9C,YAAY,MAAS3P,IAAgB,OAAS;OAAE,GAAGztB;OAAM;MAAK,EAAE;MAChE,cAAc,GAAQ,MAAWytB,IAAgB,OAAS;OAAE,GAAGztB;OAAM;OAAQ;MAAO,EAAE;MACtF,uBAAuBytB,IAAgB,OAAS;OAAE,GAAGztB;OAAM,aAAa,CAACA,EAAK;MAAY,EAAE;MAC5F,kBAAkB;OAChB,IAAIyhB,EAAa,UAAU,WAAW,GAAG;OACzC,IAAM4b,KAAU5b,EAAa,mBAAmB,IAAIA,EAAa,UAAU,UAAUA,EAAa,UAAU;OAC5G,GAAiB4b,CAAM;MACzB;MACA,kBAAkB;OAChB,IAAI5b,EAAa,UAAU,WAAW,GAAG;OACzC,IAAM4b,KAAU5b,EAAa,mBAAmB,KAAKA,EAAa,UAAU;OAC5E,GAAiB4b,CAAM;MACzB;MACA,cAAc;OAKZ,AAJA5P,IAAgB,OAAS;QAAE,GAAGztB;QAAM,UAAU;OAAM,EAAE,GACtDwtB,GAAW,IAAI,GACfE,GAAa,CAAC,CAAC,GACfI,GAAkB,EAAI,GACtBE,GAAyB,CAAG;MAC9B;KACD,CAAA;KAGFp+B,MAAc,cACb,kBAAC,OAAD;MAAK,OAAO;OAAE,SAAS;OAAQ,YAAY;OAAU,KAAK;OAAO,SAAS;OAAY,iBAAiB;OAAQ,cAAc;OAAiC,QAAQ;MAAO;MAA7K,UAAA;OACE,kBAAC0tC,IAAD;QAAY,MAAM,kBAACzT,IAAD,EAAO,MAAM,GAAK,CAAA;QAAG,UAAU,CAAC2J,EAAkB;QAAS,SAAS+C;QAAY,OAAM;OAAQ,CAAA;OAChH,kBAAC+G,IAAD;QAAY,MAAM,kBAACxT,IAAD,EAAO,MAAM,GAAK,CAAA;QAAG,UAAU,CAAC0J,EAAkB;QAAS,SAASgD;QAAY,OAAM;OAAQ,CAAA;OAChH,kBAAC,OAAD,EAAK,OAAO;QAAE,OAAO;QAAO,QAAQ;QAAQ,iBAAiB;QAAuB,QAAQ;OAAQ,EAAI,CAAA;OAExG,kBAAC8G,IAAD;QAAY,MAAM,kBAACtjB,GAAD,EAAa,MAAM,GAAK,CAAA;QAAG,QAAQzM,MAAe;QAAa,eAAe;SAAkF,AAAhFmB,GAAc,WAAW,GAAGglB,GAAgB,SAAS,GAAGC,GAAkB,EAAG,GAAGC,GAAsB,EAAE;QAAG;QAAG,OAAM;OAAkB,CAAA;OACxO,kBAAC0J,IAAD;QAAY,MAAM,kBAACrjB,IAAD,EAAW,MAAM,GAAK,CAAA;QAAG,QAAQ1M,MAAe;QAAa,eAAe;SAAgF,AAA9EmB,GAAc,WAAW,GAAGglB,GAAgB,SAAS,GAAGC,GAAkB,CAAC,GAAGC,GAAsB,CAAC;QAAG;QAAG,OAAM;OAAa,CAAA;OAC9N,kBAAC0J,IAAD;QAAY,MAAM,kBAACpjB,IAAD,EAAe,MAAM,GAAK,CAAA;QAAG,QAAQ3M,MAAe;QAAa,eAAe;SAAgF,AAA9EmB,GAAc,WAAW,GAAGglB,GAAgB,SAAS,GAAGC,GAAkB,CAAC,GAAGC,GAAsB,CAAC;QAAG;QAAG,OAAM;OAAa,CAAA;OAClO,kBAAC0J,IAAD;QAAY,MAAM,kBAACC,IAAD,EAAc,MAAM,GAAK,CAAA;QAAG,QAAQhwB,MAAe;QAAY,eAAe;SAA+E,AAA7EmB,GAAc,UAAU,GAAGglB,GAAgB,SAAS,GAAGC,GAAkB,CAAC,GAAGC,GAAsB,GAAG;QAAG;QAAG,OAAM;OAAY,CAAA;OAChO,kBAAC0J,IAAD;QAAY,MAAM,kBAACE,GAAD,EAAO,MAAM,GAAK,CAAA;QAAG,QAAQjwB,MAAe;QAAY,eAAe;SAA+E,AAA7EmB,GAAc,UAAU,GAAGglB,GAAgB,SAAS,GAAGC,GAAkB,CAAC,GAAGC,GAAsB,CAAC;QAAG;QAAG,OAAM;OAAU,CAAA;OACrN,kBAAC0J,IAAD;QAAY,MAAM,kBAAChhC,IAAD,EAAM,MAAM,GAAK,CAAA;QAAG,QAAQiR,MAAe;QAAQ,eAAe;SAAqD,AAAnDmB,GAAc,MAAM,GAAGglB,GAAgB,SAAS,GAAGC,GAAkB,CAAC;QAAG;QAAG,OAAM;OAAQ,CAAA;OAC/KjkC,GAAa,cAAc,MAC1B,kBAAC4tC,IAAD;QAAY,MAAM,kBAACG,IAAD,EAAQ,MAAM,GAAK,CAAA;QAAG,QAAQlwB,MAAe;QAAa,eAAe;SAA0D,AAAxDmB,GAAc,WAAW,GAAGglB,GAAgB,SAAS,GAAGC,GAAkB,CAAC;QAAG;QAAG,OAAM;OAAU,CAAA;OAGhM,kBAAC,OAAD,EAAK,OAAO;QAAE,OAAO;QAAO,QAAQ;QAAQ,iBAAiB;QAAuB,QAAQ;OAAQ,EAAI,CAAA;OAGxG,kBAAC,OAAD;QAAK,OAAO;SAAE,SAAS;SAAQ,KAAK;SAAO,aAAa;SAAiC,cAAc;QAAM;QAC3G,UAAA,kBAAC2J,IAAD;SAAY,MAAM,kBAACI,IAAD,EAAoB,MAAM,GAAK,CAAA;SAAG,QAAQnwB,MAAe;SAAW,eAAe;UAAkD,AAAhDmB,GAAc,SAAS,GAAGilB,GAAkB,CAAC,GAAGC,GAAsB,CAAC;SAAG;SAAG,OAAM;QAAW,CAAA;OAClM,CAAA;OACL,kBAAC,OAAD;QAAK,OAAO;SAAE,SAAS;SAAQ,KAAK;QAAM;QAA1C,UAAA,CACE,kBAAC0J,IAAD;SAAY,MAAM,kBAACztC,IAAD,EAAK,MAAM,GAAK,CAAA;SAAG,QAAQ0d,MAAe,cAAcwmB,OAAmB;SAAG,eAAe;UAAmD,AAAjDrlB,GAAc,UAAU,GAAGilB,GAAkB,CAAC,GAAGC,GAAsB,CAAC;SAAG;SAAG,OAAM;QAAY,CAAA,GAChNlkC,GAAa,yBAAyB,MACrC,kBAAC4tC,IAAD;SAAY,MAAM,kBAACK,GAAD,EAAQ,MAAM,GAAK,CAAA;SAAG,QAAQpwB,MAAe;SAAU,eAAemB,GAAc,QAAQ;SAAG,OAAM;QAAU,CAAA,CAEhI;;OAEL,kBAAC,OAAD,EAAK,OAAO;QAAE,OAAO;QAAO,QAAQ;QAAQ,iBAAiB;QAAuB,QAAQ;OAAQ,EAAI,CAAA;OAExG,kBAAC,OAAD;QAAK,OAAO;SAAE,SAAS;SAAQ,KAAK;QAAM;QAA1C,UAAA;SACE,kBAAC4uB,IAAD;UAAY,MAAM,kBAACj/B,GAAD,EAAO,MAAM,GAAK,CAAA;UAAG,QAAQkP,MAAe;UAAQ,eAAemB,GAAc,MAAM;UAAG,OAAM;SAAQ,CAAA;SAC1H,kBAAC4uB,IAAD;UAAY,MAAM,kBAACM,GAAD,EAAc,MAAM,GAAK,CAAA;UAAG,QAAQrwB,MAAe;UAAS,eAAemB,GAAc,OAAO;UAAG,OAAM;SAAS,CAAA;SACpI,kBAAC4uB,IAAD;UAAY,MAAM,kBAACO,IAAD,EAAQ,MAAM,GAAK,CAAA;UAAG,QAAQtwB,MAAe;UAAa,eAAemB,GAAc,WAAW;UAAG,OAAM;SAAa,CAAA;SAC1I,kBAAC4uB,IAAD;UAAY,MAAM,kBAACj2C,IAAD,EAAY,MAAM,GAAK,CAAA;UAAG,QAAQkmB,MAAe;UAAW,eAAemB,GAAc,SAAS;UAAG,OAAM;SAAW,CAAA;SACxI,kBAAC4uB,IAAD;UAAY,MAAM,kBAACh2C,IAAD,EAAU,MAAM,GAAK,CAAA;UAAG,QAAQimB,MAAe;UAAQ,eAAemB,GAAc,MAAM;UAAG,OAAM;SAAQ,CAAA;QAC1H;;OAEL,kBAAC,OAAD,EAAK,OAAO,EAAE,MAAM,EAAE,EAAI,CAAA;OAE1B,kBAAC,OAAD;QAAK,OAAO;SAAE,SAAS;SAAQ,YAAY;SAAU,KAAK;QAAO;QAAjE,UAAA;SACG;UAAC;UAAQ;UAAS;UAAa;UAAW;UAAY;UAAa;UAAa;UAAa;SAAU,CAAC,CAAC,SAASnB,KAAc,EAAE,KACjI,kBAAC,OAAD;UAAK,OAAO;WAAE,SAAS;WAAQ,YAAY;WAAU,KAAK;WAAO,aAAa;WAAiC,cAAc;UAAO;UAApI,UAAA,CACE,kBAAC,QAAD;WAAM,OAAO;YAAE,UAAU;YAAQ,OAAO;YAAQ,UAAU;WAAO;WAAjE,UAAA,CAAoE,eAAW,kBAAC,UAAD,EAAA,UAAA,CAASumB,IAAmB,IAAU,EAAA,CAAA,CAAO;UAC5H,CAAA,GAAA,kBAAC,SAAD;WACE,MAAK;WACL,KAAI;WACJ,KAAI;WACJ,OAAO,KAAK,IAAI,IAAI,KAAK,IAAI,GAAGA,EAAkB,CAAC;WACnD,cAAc,MAAM,EAAE,gBAAgB;WACtC,WAAW,MAAM;YACf,IAAM/xB,IAAM,SAAS,EAAE,OAAO,OAAO,EAAE;YAEvC,AADA6xB,GAAsB7xB,CAAG,GACrB7F,KAAwB,CAACw4B,MAC3B2B,GAAkBv6B,EAAY,KAAI,MAAKlD,EAAE,OAAOsD,IAAuB;aAAE,GAAGtD;aAAG,aAAamJ;YAAI,IAAInJ,CAAC,CAAC;WAE1G;WACA,OAAO;YAAE,OAAO;YAAQ,QAAQ;WAAU;UAC3C,CAAA,CACE;;SAEP,kBAAC,OAAD;UAAK,OAAO;WAAE,SAAS;WAAQ,KAAK;UAAM;UACvC,UAAA;WAAC;WAAW;WAAW;WAAW;WAAW;WAAW;WAAW;UAAS,CAAC,CAAC,KAAI,MACjF,kBAAC,UAAD;WAEE,cAAc,MAAM,EAAE,eAAe;WACrC,eAAe;YAGb,AAFA86B,GAAgB0E,CAAK,GAEjBl8B,KAAwB,CAACw4B,MAC3B2B,GAAkBv6B,EAAY,KAAI,MAAKlD,EAAE,OAAOsD,IAAuB;aAAE,GAAGtD;aAAG;YAAM,IAAIA,CAAC,CAAC;WAE/F;WACA,OAAO;YACL,OAAO;YAAQ,QAAQ;YAAQ,cAAc;YAAO,iBAAiBw/B;YACrE,QAAQvE,OAAiBuE,IAAQ,mBAAmB;YACpD,QAAQ;YAAW,SAAS;YAAQ,SAAS;WAC/C;UACD,GAdMA,CAcN,CACF;SACE,CAAA;SACJe,KAAyB,KACxB,kBAAC,OAAD;UAAK,OAAO;WAAE,SAAS;WAAQ,YAAY;WAAU,KAAK;WAAO,YAAY;UAAM;UAAnF,UAAA,CACE,kBAAC,UAAD;WACE,eAAeF,GAAqB,EAAI;WACxC,OAAO;YACL,SAAS;YACT,YAAY;YACZ,KAAK;YACL,iBAAiB;YACjB,OAAO;YACP,QAAQ;YACR,cAAc;YACd,SAAS;YACT,UAAU;YACV,YAAY;YACZ,QAAQ;YACR,WAAW;WACb;WACA,OAAM;WAhBR,UAAA;YAkBE,kBAAClpC,IAAD,EAAa,MAAM,GAAK,CAAA;YAAC;YACNopC;YAAuB;WACpC;UAER,CAAA,GAAA,kBAAC,UAAD;WACE,SAASC;WACT,OAAO;YACL,SAAS;YACT,YAAY;YACZ,KAAK;YACL,iBAAiB;YACjB,OAAO;YACP,QAAQ;YACR,cAAc;YACd,SAAS;YACT,UAAU;YACV,YAAY;YACZ,QAAQ;WACV;WACA,OAAM;WAfR,UAAA,CAiBE,kBAACvnC,IAAD;YAAQ,MAAM;YAAI,OAAM;WAAW,CAAA,GAAC,oBAE9B;UACL,CAAA,CAAA;;QAEJ;;MACF;;KAINjC,MAAc,WAAW0b,MACxB,kBAACke,IAAD;MACE,YAAYnR;MACZ,eAAeC;MACF;MACb,sBAAsB3oB,KAAe,MAAM;MAC5B;MACG;MACE;MACG;KACxB,CAAA;KAIFC,MAAc,UAAU0b,MACvB,kBAACsf,IAAD;MACe;MACQ;KACtB,CAAA;KAIFoO,MACC,kBAAC,OAAD;MAAK,OAAO;OACV,UAAU;OACV,KAAK;OAAG,MAAM;OAAG,OAAO;OAAG,QAAQ;OACnC,iBAAiB;OACjB,SAAS;OACT,YAAY;OACZ,gBAAgB;OAChB,QAAQ;MACV;MACE,UAAA,kBAAC,OAAD;OAAK,OAAO;QACV,iBAAiB;QACjB,cAAc;QACd,SAAS;QACT,OAAO;QACP,UAAU;QACV,WAAW;OACb;OAPA,UAAA;QAQE,kBAAC,OAAD;SAAK,OAAO;UAAE,SAAS;UAAQ,YAAY;UAAU,KAAK;UAAQ,cAAc;SAAO;SAAvF,UAAA,CACE,kBAAC,OAAD;UAAK,OAAO;WAAE,OAAO;WAAQ,QAAQ;WAAQ,cAAc;WAAO,iBAAiB;WAAW,SAAS;WAAQ,YAAY;WAAU,gBAAgB;WAAU,OAAO;UAAU;UAC9K,UAAA,kBAACjpC,IAAD,EAAa,MAAM,GAAK,CAAA;SACrB,CAAA,GACL,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;UAAI,OAAO;WAAE,QAAQ;WAAG,UAAU;WAAQ,YAAY;WAAK,OAAO;UAAU;UAAG,UAAA;SAAqB,CAAA,GACpG,kBAAC,KAAD;UAAG,OAAO;WAAE,QAAQ;WAAG,UAAU;WAAQ,OAAO;UAAU;UAAG,UAAA;SAA4B,CAAA,CACtF,EAAA,CAAA,CACF;;QACL,kBAAC,KAAD;SAAG,OAAO;UAAE,UAAU;UAAQ,OAAO;UAAW,YAAY;UAAO,cAAc;SAAO;SAAxF,UAAA;UAA2F;UACtD,kBAAC,UAAD,EAAA,UAAA,CAASopC,IAAuB,eAAqB,EAAA,CAAA;UAAC;SACxF;;QACH,kBAAC,OAAD;SAAK,OAAO;UAAE,SAAS;UAAQ,gBAAgB;UAAY,KAAK;SAAM;SAAtE,UAAA;UACE,kBAAC,UAAD;WACE,eAAeF,GAAqB,EAAK;WACzC,OAAO;YACL,SAAS;YACT,cAAc;YACd,QAAQ;YACR,iBAAiB;YACjB,OAAO;YACP,UAAU;YACV,YAAY;YACZ,QAAQ;WACV;WACD,UAAA;UAEO,CAAA;UACR,kBAAC,UAAD;WACE,eAAe;YAEb,AADAG,GAA2B,GAC3BH,GAAqB,EAAK;WAC5B;WACA,OAAO;YACL,SAAS;YACT,cAAc;YACd,QAAQ;YACR,iBAAiB;YACjB,OAAO;YACP,UAAU;YACV,YAAY;YACZ,QAAQ;WACV;WACD,UAAA;UAEO,CAAA;UACR,kBAAC,UAAD;WACE,eAAe;YACb,IAAM8E,IAA0BzQ,GAAiB,KAAI,OAAM;aAAE,GAAGj0B;aAAG,QAAQ;YAAU,EAAE,GACjF2kC,IAAwBnF,GAAe,KAAI,OAAM;aAAE,GAAGx/B;aAAG,QAAQ;YAAU,EAAE,GAE7E4kC,IAA2B;aAAC,IADH9kC,KAAc,CAAC,EAAA,CAAG,KAAI,OAAM;cAAE,GAAGE;cAAG,QAAQ;aAAU,EAChD;aAAU,GAAG2kC;aAAU,GAAGD;YAAU,CAAC,CAAC,QAAO,MAAK1kC,EAAE,WAAW,SAAS;YAI7G,AAHAk0B,GAAoBwQ,CAAU,GAC9BjF,GAAkBkF,CAAQ,GAC1B/E,GAAqB,EAAK,GAC1B7K,GAAa,QAAQ,sBAAsB6P,CAAW;WACxD;WACA,OAAO;YACL,SAAS;YACT,cAAc;YACd,QAAQ;YACR,iBAAiB;YACjB,OAAO;YACP,UAAU;YACV,YAAY;YACZ,QAAQ;WACV;WACD,UAAA;UAEO,CAAA;SACL;;OACF;;KACF,CAAA;KAMP,kBAAC,OAAD;MAAK,OAAO;OAAE,MAAM;OAAG,SAAS;OAAQ,eAAe;OAAO,UAAU;OAAG,WAAW;OAAG,OAAO;OAAQ,QAAQ;OAAQ,UAAU;OAAU,UAAU;MAAW;MAAjK,UAAA,CACGxc,EAAa,YAAYA,EAAa,SAAS,iBAC9C,kBAAClE,IAAD;OACE,SAASllB;OACA;OACA;OACF;OACG;OACV,cAAcujB,GAAQ1iB,CAAO;OAClB;OACC;OACC;OACA;OACF;OACI;OACf,YAAYggC;OACZ,QAAQzX,EAAa,aAAavoB,MAAY,CAAC;OAC/C,QAAQuoB,EAAa,aAAavoB,MAAY,CAAC;OAC/C,gBAAgBuoB,EAAa,UAAUA,EAAa,iBAAiB,EAAE;OACvE,eAAe,MAAO;QACpB,IAAMlhB,IAAMkhB,EAAa,UAAU,WAAU,MAAKj1B,EAAE,OAAOyP,CAAE;QAC7D,AAAIsE,MAAQ,MAAIuyB,GAAiBvyB,CAAG;OACtC;OACA,SAASstB;OACT,gBAAgBE;OAChB,UAAUE;OACV,WAAWC;MACZ,CAAA,IAED,kBAAA3mC,IAAA,EAAA,UAAA,CACGgmB,MAAe,eACd,kBAAC,SAAD,EAAA,UAAQ,8iBAIC,CAAA,GAEX,kBAAC,OAAD;OACE,WAAU;OACV,OAAO;QACL,MAAM;QACN,SAAS;QACT,eAAe;QACf,UAAU;QACV,WAAW;QACX,UAAU;QACV,UAAU;QACV,iBAAiB;QACjB,QAAQyQ,KAAY,aAAczQ,MAAe,QAAQ,SAAUA,MAAe,WAAW,SAAUA,MAAe,YAAYA,MAAe,OAAO,YAAY;OACtK;OACJ,cAAc,MAAM;QAClB,IAAIyQ,MAAaE,GAAY,WAAWthB,EAAa,SAAS;SAC5D,IAAM8Q,IAAK,EAAE,UAAUwQ,GAAY,QAAQ,GACrCvQ,IAAK,EAAE,UAAUuQ,GAAY,QAAQ;SAE3C,AADA,EAAa,QAAQ,aAAaA,GAAY,QAAQ,aAAaxQ,GACnE,EAAa,QAAQ,YAAYwQ,GAAY,QAAQ,YAAYvQ;QACnE;OACF;OACA,oBAAoB;QAClB,AAAIqQ,OACFC,GAAa,EAAK,GAClB,GAAY,UAAU;OAE1B;OA1BE,UAAA;QA4BF,kBAAC,OAAD;SACE,KAAKrhB;SACL,WA9XY,MAAqC;UAKzD,AAJA80B,GAAa;WACX,KAAK,EAAE,cAAc;WACrB,MAAM,EAAE,cAAc;UACxB,CAAC,GACD,GAAc,UAAUU,GAAiB,EAAE,cAAc,SAAS;SACpE;SAyXU,cAAc,MAAM;UAClB,AAAI7kB,MAAe,SACb,EAAE,WAAW,MACf0Q,GAAa,EAAI,GACjB,GAAY,UAAU;WACpB,GAAG,EAAE;WACL,GAAG,EAAE;WACL,YAAY,EAAE,cAAc;WAC5B,WAAW,EAAE,cAAc;UAC7B;SAGN;SACA,YAAY,MAAO;UACjB,AAAID,OACFC,GAAa,EAAK,GAClB,GAAY,UAAU;SAE1B;SACA,gBAAgB,MAAM;UAEpB,AADiC,OAAO,SAAW,OAAe,OAAO,aAAa,CAAC,EAAE,SAAS,CAAC,CAAC,KAAK,MAMzG,EAAE,eAAe,GACjB,EAAE,gBAAgB;SACpB;SACA,OAAO;UACL,OAAO;UACP,QAAQ;UACR,UAAU;UACV,UAAU;SACZ;SAEQ,iBAAA;UACN,IAAMigB,KAAa,GAAe,GAAgB,MAA0B;WAC1E,IAAMC,IAAOC,IAAgBvM,GAAU,KAAKwM,MAAW,IAAK;WAG5D,IAAID,KAAgBxhC,EAAa,SAAS;YAGxC,IAAM0hC,IAAeh1C,KAAS,IAAI,IAAIA,KAAS,IAAI,IAAI,GACjDi1C,IAAcj1C,KAAS,IAAI,IAAIA,KAAS,IAAI,IAAI;YACtD,IAAI+0C,IAASnM,GAAc,UAAUoM,KAAgBD,IAASnM,GAAc,UAAUqM,GACpF,OAAO;WAEX;WAGA,IAAMC,IAAWxK,MAAaE,MAAwB3mB,KAAcA,MAAe,kBAAmB;YACpG,IAAIA,MAAe,YACjB,OAAO;aACL,IAAI;aAAqB,MAAM;aAAqB,WAAW2mB;aAC/D,GAAG;aAAG,GAAG;aAAG,OAAO;aAAG,QAAQ;aAAG,QAAQM;aACzC,OAAOX;aAAc,aAAaC;aAAoB,SAASC;YACjE;YACK,IAAI;aAAC;aAAa;aAAa;aAAa;YAAU,CAAC,CAAC,SAASxmB,CAAU,GAAG;aACnF,IAAI1V,IAAQ,KAAK,IAAIy8B,GAAW,IAAIF,GAAS,CAAC,GAC1Ct8B,IAAS,KAAK,IAAIw8B,GAAW,IAAIF,GAAS,CAAC,GAC3CvpC,IAAI,KAAK,IAAIupC,GAAS,GAAGE,GAAW,CAAC,GACrCvpC,IAAI,KAAK,IAAIqpC,GAAS,GAAGE,GAAW,CAAC;aAKzC,OAJIx8B,IAAS,OACX,IAAS,KAAK,IAAI,IAAIA,CAAM,GAC5B,IAAIs8B,GAAS,IAAI,IAEZ;cACL,IAAI;cAAqB,MAAM7mB;cAAmB,WAAW2mB;cAC7D;cAAG;cAAG;cAAO;cACb,OAAOL;cAAc,aAAaC;cAAoB,SAASvmB,MAAe,cAAcwmB,KAAiB;aAC/G;YACF;YAAO,IAAIxmB,MAAe,aAAa;aACrC,IAAI1V,IAAQ,KAAK,IAAIy8B,GAAW,IAAIF,GAAS,CAAC,GAC1Ct8B,IAAS,KAAK,IAAIw8B,GAAW,IAAIF,GAAS,CAAC,GAC3CvpC,IAAI,KAAK,IAAIupC,GAAS,GAAGE,GAAW,CAAC,GACrCvpC,IAAI,KAAK,IAAIqpC,GAAS,GAAGE,GAAW,CAAC;aAKzC,OAJIx8B,IAAS,OACX,IAAS,KAAK,IAAI,IAAIA,CAAM,GAC5B,IAAIs8B,GAAS,IAAI,IAEZ;cACL,IAAI;cAAqB,MAAM;cAAsB,WAAWF;cAChE;cAAG;cAAG;cAAO;cACb,OAAO;cAAW,aAAa;cAAG,SAAS;aAC7C;YACF;YAAO,IAAI;aAAC;aAAQ;aAAS;aAAW;aAAa;aAAW;YAAM,CAAC,CAAC,SAAS3mB,CAAoB,GAAG;aACtG,IAAM1V,IAAQ,KAAK,IAAIy8B,GAAW,IAAIF,GAAS,CAAC,GAC1Ct8B,IAAS,KAAK,IAAIw8B,GAAW,IAAIF,GAAS,CAAC,GAC3CvpC,IAAI,KAAK,IAAIupC,GAAS,GAAGE,GAAW,CAAC,GACrCvpC,IAAI,KAAK,IAAIqpC,GAAS,GAAGE,GAAW,CAAC;aAE3C,OAAO;cACL,IAAI;cAAqB,MAAM/mB;cAAmB,WAAW2mB;cAC7D;cAAG;cAAG;cAAO;cAAQ,QAHP3mB,MAAe,UAAUA,MAAe,WAAWA,MAAe,YAAa,CAAC6mB,IAAUE,EAAU,IAAI,KAAA;cAItH,OAAOT;cAAc,aAAaC;cAAoB,SAASC;aACjE;YACF;WACF,EAAA,CAAG,IAAI;WAEP,OAAOrY,EAAI,KAAK,GAAG,MAAS;YAC1B,IAAI+iB,GACEt0C,IAAKwnC,GAAoB,SAAS/0B,EAAa,SAAS,eAAe,GACvExS,IAAKunC,GAAoB,UAAU/0B,EAAa,SAAS,gBAAgB,GACzE8hC,IAAU9iB,GAAQnwB,CAAC,GACnBkzC,IAAa/iB,GAAQF,EAAI,EAAE,CAAC,CAAC,QAAQpyB,GACrCs1C,IAAYF,EAAQ,QAAQp1C;YAClC,AAAIoyB,EAAI,WAAW,KACbmjB,MAAS,MAAG,IAAQ,KAAK,IAAI,GAAG10C,IAAK,IAAIw0C,CAAU,IACnDE,MAAS,MAAG,IAAQ,KAAK,IAAIF,GAAYx0C,IAAK,CAAC,MAEnD,IAAQ,KAAK,IAAI,GAAGA,IAAK,IAAIy0C,IAAY,CAAC;YAG5C,IAAME,IAAchjC,EAAY,KAAI,MAAM26B,MAAmB79B,EAAE,OAAO69B,GAAgB,KAAKA,KAAmBE,MAAiB/9B,EAAE,OAAO+9B,GAAc,KAAKA,KAAgB/9B,CAAG,GACxK8b,IAAmB8pB,KAAWA,EAAQ,cAAc/yC,IAAK,CAAC,GAAGqzC,GAAaN,CAAO,IAAIM;YAE3F,OACE,kBAACr3C,EAAM,UAAP,EAAA,UAAA;aACE,kBAAC8wB,IAAD;cACE,SAAS9sB;cACD;cACD;cACG;cACV,gBAAgBtB;cAChB,iBAAiBC;cACjB,WAAWqnC,GAAU;cACrB,YAAYA,GAAU;cACtB,SAAS0M;cACT,UAAUM;cACV,eAAeC,EAAQ;cACvB,gBAAgBA,EAAQ;cACb;cACC;cACZ,aAAahqB;cACb,qBAAqBO,IAAqB,QAAO,MAAKjM,EAAE,cAAcvd,CAAC,KAAK,CAAC;cACvD;cACF;cACpB,aAAa+hB;cACb,aAAalS;cACb,WAAWE;cACX,mBAAmBwhC;cACnB,yBAAyB9F;cACzB,eAAetoB;cACf,aAAaD;cACb,wBAAwBwtB;cACxB,wBAAwB;eACtB,IAAIhH,GAAmB,WAAWF,IAAiB;gBACjD,GAAmB,UAAU;gBAC7B;eACF;eAEA,AADA94B,GAAwB,IAAI,GAC5B64B,GAAkB,IAAI;cACxB;cACW;cACI;cACf,YAAYkE;cACZ,oBAAoBG;cACpB,YAAYQ;cACsB;cAClC,aAAauC;cACA;cACG;cACG;cACnB,cAAc1sC,GAAa,iBAAiB;cAC7B;cACK;aACrB,CAAA;aACA+xB,EAAa,YAAYA,EAAa,SAAS,aAAa3B,MAC3D,kBAAC,OAAD;cAAK,OAAO;eACV,UAAU;eACV,KAAK,GAAGqe,EAAK;eACb,MAAMM,MAAU,KAAA,IAA2B,QAAf,GAAGA,EAAM;eACrC,OAAO,GAAGC,EAAQ,QAAQp1C,EAAM;eAChC,QAAQ,GAAGo1C,EAAQ,SAASp1C,EAAM;eAClC,eAAe;eACf,cAAcm4B,EAAa;eAC3B,SAASA,EAAa;eACtB,QAAQ;eACR,QAAQ;cACV;cACE,UAAA,kBAAClJ,IAAD;eACE,SAAS9sB;eACT,QAAQq0B;eACD;eACG;eACV,gBAAgB31B;eAChB,iBAAiBC;eACjB,WAAWqnC,GAAU;eACrB,YAAYA,GAAU;eACtB,SAAS;eACT,UAAU;eACV,eAAeiN,EAAQ;eACvB,gBAAgBA,EAAQ;eACb;eACX,YAAY;eACZ,aAAa,CAAC;eACd,sBAAsB;eACtB,oBAAoB;eACpB,mBAAmB,CAAC;eACpB,mBAAmB,CAAC;eACpB,iBAAiB,CAAC;eAClB,yBAAyB,CAAC;eAC1B,8BAA8B,CAAC;eAC/B,wBAAwB,CAAC;cAC1B,CAAA;aACE,CAAA;aAENjd,EAAa,YACZ,kBAAC,OAAD;cAAK,OAAO;eACV,UAAU;eACV,KAAK,GAAG0c,EAAK;eACb,MAAMM,MAAU,KAAA,IAA2B,QAAf,GAAGA,EAAM;eACrC,OAAO,GAAGC,EAAQ,QAAQp1C,EAAM;eAChC,QAAQ,GAAGo1C,EAAQ,SAASp1C,EAAM;eAClC,eAAe;eACf,QAAQ;cACV;cACE,UAAA,kBAACqzB,IAAD;eACE,OAAO,CACL,GAAI8E,EAAa,aAAah2B,MAAM,CAAC,GACrC,GAAIg2B,EAAa,aAAah2B,MAAM,CAAC,CACvC;eACO;eACP,gBAAgBg2B,EAAa,UAAUA,EAAa,iBAAiB,EAAE;eACvE,eAAe,MAAO;gBACpB,IAAMlhB,IAAMkhB,EAAa,UAAU,WAAU,MAAKj1B,EAAE,OAAOyP,CAAE;gBAC7D,AAAIsE,MAAQ,MAAIuyB,GAAiBvyB,CAAG;eACtC;cACD,CAAA;aACE,CAAA;aAENm0B,MAAoBA,GAAiB,cAAcjpC,YAAY;cAC9D,IAAMqT,IAAM1Q,IAAW,OAAQ,IAAIswC,EAAQ,QAAQA,EAAQ,QACrD9/B,IAAMxQ,IAAW,OAAQ,IAAIswC,EAAQ,SAASA,EAAQ,OACtDK,IAAehgC,GAAiB21B,GAAiB,GAAGA,GAAiB,GAAGtmC,GAAU0Q,GAAKF,CAAG;cAChG,OACE,kBAAC,OAAD;eAAK,OAAO;gBACV,UAAU;gBACV,MAAM,IAAI6/B,KAAS,KAAKM,EAAa,IAAIz1C,EAAM;gBAC/C,KAAK,GAAG60C,IAAOY,EAAa,IAAIz1C,EAAM;gBACtC,QAAQ;gBACR,iBAAiB;gBACjB,WAAW;gBACX,cAAc;gBACd,SAAS;gBACT,eAAe;eACjB;eAVA,UAAA,CAWA,kBAAC,YAAD;gBACE,KAAKwrC;gBACL,OAAOF;gBACP,WAAU,MAAKC,GAAe,EAAE,OAAO,KAAK;gBAC5C,SAAS,MAAM;iBAEb,AAAK,EAAE,cAAc,eAAe,SAAS,EAAE,aAAqB,KAClE6G,GAAqB;gBAEzB;gBACA,YAAW,MAAK;iBAAE,AAAI,EAAE,QAAQ,WAAW,CAAC,EAAE,aAAY,EAAE,eAAe,GAAGA,GAAqB;gBAAK;gBACxG,OAAO;iBACL,iBAAiB;iBACjB,QAAQ;iBACR,OAAO7H;iBACP,UAAU;iBACV,YAAY;iBACZ,UAAU;iBACV,WAAW;iBACX,SAAS;iBACT,QAAQ;iBACR,SAAS;gBACX;gBACA,aAAaa,GAAiB,SAAS,SAAS,iBAAiB;gBACjE,WAAA;eACD,CAAA,GACD,kBAAC,OAAD;gBAAK,OAAO;iBAAE,SAAS;iBAAQ,gBAAgB;iBAAY,SAAS;iBAAW,WAAW;gBAAiB;gBACzG,UAAA,kBAAC,UAAD;iBACE,cAAc,MAAM;kBAAsB,AAApB,EAAE,eAAe,GAAGgH,GAAqB;iBAAG;iBAClE,OAAO;kBAAE,SAAS;kBAAY,YAAY;kBAAkB,OAAO;kBAAQ,QAAQ;kBAAQ,cAAc;kBAAO,QAAQ;kBAAW,UAAU;iBAAO;iBACrJ,UAAA;gBAEO,CAAA;eACL,CAAA,CACF;;aAET,EAAA,CAAG;YACa,EAAA,GAvKKjwC,CAuKL;WAEpB,CAAC;UACH;UAEA,IAAIuC,MAAmB,cACrB,OACE,kBAAC,OAAD;WAAK,OAAO;YACV,UAAU;YAAY,OAAO;YAAQ,QAAQ,GAAG6jC,GAAU,MAAM;WAClE;WACG,UAAApW,GAAK,KAAK,GAAK,MAAWyiB,EAAUxiB,GAAK2iB,GAAQ,EAAI,CAAC;UACpD,CAAA;UAEF;WACL,IAAMW,IAAkB,KAAK,IAAI,GAAGvjB,GAAK,WAAU,MAAOC,EAAI,SAASxiB,CAAO,CAAC,CAAC,GAC1E+lC,IAAaxjB,GAAKujB,MAAoB,CAAC;WAC7C,OACE,kBAAC,OAAD;YAAK,OAAO;aACV,UAAU;aAAY,OAAO;aAAQ,WAAW,GAAGnN,GAAU,QAAQmN,MAAoB,EAAE;YAC7F;YACG,UAAAd,EAAUe,GAAYD,GAAiB,EAAK;WAC1C,CAAA;UAET;SACF,EAAA,CAAG;QACA,CAAA;QAGJhxC,MAAmB,kBAAkBqK,KACpC,kBAAC,OAAD;SAAK,OAAO;UACV,UAAU;UACV,QAAQ;UACR,MAAM;UACN,WAAW;UACX,SAAS;UACT,YAAY;UACZ,KAAK;UACL,iBAAiB;UACjB,SAAS;UACT,cAAc;UACd,OAAO;UACP,QAAQ;UACR,WAAW;SACb;SAdA,UAAA;UAeE,kBAAC,UAAD;WACE,eAAekG,GAAW,KAAK,IAAI,GAAGrF,IAAU,CAAC,CAAC;WAClD,UAAUA,KAAW;WACrB,OAAO;YAAE,YAAY;YAAQ,QAAQ;YAAQ,OAAOA,KAAW,IAAI,SAAS;YAAQ,QAAQA,KAAW,IAAI,YAAY;YAAW,SAAS;YAAQ,YAAY;WAAS;WAExK,UAAA,kBAACopB,GAAD,EAAa,MAAM,GAAK,CAAA;UAClB,CAAA;UACR,kBAAC,QAAD;WAAM,OAAO;YAAE,UAAU;YAAQ,YAAY;WAAI;WAAjD,UAAA;YAAoD;YAC5CppB;YAAQ;YAAKb,EAAO;WACtB;;UACN,kBAAC,UAAD;WACE,eAAekG,GAAW,KAAK,IAAIlG,EAAO,UAAUa,IAAU,CAAC,CAAC;WAChE,UAAUA,KAAWb,EAAO;WAC5B,OAAO;YAAE,YAAY;YAAQ,QAAQ;YAAQ,OAAOa,KAAWb,EAAO,WAAW,SAAS;YAAQ,QAAQa,KAAWb,EAAO,WAAW,YAAY;YAAW,SAAS;YAAQ,YAAY;WAAS;WAEpM,UAAA,kBAACoqB,GAAD,EAAc,MAAM,GAAK,CAAA;UACnB,CAAA;SACL;;QAIJ,CAACpqB,KACA,kBAAC,OAAD;SAAK,OAAO;UACV,UAAU;UACV,KAAK;UAAG,MAAM;UAAG,OAAO;UAAG,QAAQ;UACnC,SAAS;UACT,eAAe;UACf,KAAK;UACL,YAAY;UACZ,gBAAgB;UAChB,OAAO;UACP,SAAS;UACT,WAAW;SACb;SACG,UAAA+0B,KACC,kBAAA7lC,IAAA,EAAA,UAAA,CACE,kBAAC,OAAD;UAAK,OAAO;WAAE,YAAY;WAAK,OAAO;UAAoB;UACvD,UAAA6lC,GAAU,SAAS,sBAAsB,yCAAyC;SAChF,CAAA,GACL,kBAAC,OAAD;UAAK,OAAO;WAAE,UAAU;WAAQ,UAAU;WAAS,WAAW;UAAa;UAAI,UAAAA,GAAU;SAAa,CAAA,CACtG,EAAA,CAAA,IACAmM,IAAa,sBAAsB;QACpC,CAAA;QAINlhC,KACC,kBAAC,OAAD;SAAK,OAAO;UACV,UAAU;UACV,QAAQ;UACR,MAAM;UACN,WAAW;UACX,iBAAiB;UACjB,OAAO;UACP,SAAS;UACT,cAAc;UACd,SAAS;UACT,YAAY;UACZ,KAAK;UACL,QAAQ;UACR,WAAW;UACX,gBAAgB;SAClB;SAfA,UAAA;UAgBE,kBAAC,UAAD;WACE,eAAem6B,GAAa,KAAK,IAAI,GAAGt5B,IAAU,CAAC,CAAC;WACpD,UAAUA,KAAW;WACrB,OAAO;YAAE,YAAY;YAAQ,QAAQ;YAAQ,OAAOA,KAAW,IAAI,0BAA0B;YAAS,QAAQA,KAAW,IAAI,YAAY;YAAW,SAAS;YAAQ,SAAS;WAAE;WAEhL,UAAA,kBAACopB,GAAD,EAAa,MAAM,GAAK,CAAA;UAClB,CAAA;UACR,kBAAC,QAAD;WAAM,OAAO;YAAE,UAAU;YAAQ,YAAY;YAAK,UAAU;YAAQ,WAAW;WAAS;WAAxF,UAAA;YAA2F;YACnFppB;YAAQ;YAAIb,EAAO;WACrB;;UACN,kBAAC,UAAD;WACE,eAAem6B,GAAa,KAAK,IAAIn6B,EAAO,UAAUa,IAAU,CAAC,CAAC;WAClE,UAAUA,KAAWb,EAAO;WAC5B,OAAO;YAAE,YAAY;YAAQ,QAAQ;YAAQ,OAAOa,KAAWb,EAAO,WAAW,0BAA0B;YAAS,QAAQa,KAAWb,EAAO,WAAW,YAAY;YAAW,SAAS;YAAQ,SAAS;WAAE;WAE5M,UAAA,kBAACoqB,GAAD,EAAc,MAAM,GAAK,CAAA;UACnB,CAAA;SACL;;QAINvmB,KAAwB64B,MACvB,kBAAChkC,IAAD;SACE,YAAY+K,EAAY,MAAK,MAAKlD,EAAE,OAAOsD,CAAoB;SAC/D,UAAU64B;SACV,cAAc;UACZ,IAAM0D,IAAY38B,EAAY,MAAK,MAAKlD,EAAE,OAAOsD,CAAoB;UACrE,IAAIu8B,GAAW;WACb,IAAME,IAAS;YAAE,GAAGF;YAAW,IAAI/f,GAAgB;YAAG,QAAQ,KAAA;YAAW,UAAU,KAAA;YAAW,WAAW,KAAA;YAAW,YAAY,KAAA;YAAW,UAAU,KAAA;YAAW,YAAY,KAAA;YAAW,GAAG+f,EAAU,IAAI;YAAI,GAAGA,EAAU,IAAI;WAAG;WAChO,GAAkB,CAAC,GAAG38B,GAAa68B,CAAM,CAAC;UAC5C;UAEA,AADAx8B,GAAwB,IAAI,GAC5B64B,GAAkB,IAAI;SACxB;SACA,gBAAgB;UAGd,AAFAqB,GAAkBv6B,EAAY,QAAO,MAAKlD,EAAE,OAAOsD,CAAoB,CAAC,GACxEC,GAAwB,IAAI,GAC5B64B,GAAkB,IAAI;SACxB;SACA,gBAAgB,MAAkB;UAChC,GAAkBl5B,EAAY,KAAI,MAAKlD,EAAE,OAAOsD,IAAuB;WAAE,GAAGtD;WAAG;UAAM,IAAIA,CAAC,CAAC;SAC7F;SACA,uBAAuB;UAErB,AADAs8B,GAAmB,EAAI,GACvBF,GAAkB,IAAI;SACxB;SACa;QACd,CAAA;QAEFvT,EAAa,YAAYA,EAAa,eACrC,kBAAC8B,IAAD;SACE,iBAAiB9B,EAAa;SAC9B,mBAAmB,MAAQgM,IAAgB,OAAS;UAAE,GAAGztB;UAAM,iBAAiByJ;SAAI,EAAE;SACxE;QACf,CAAA;QAEFy1B,OAAwB,MAASC,OAAyB,MACzD,kBAACpmB,IAAD;SACgB;SACd,SAAS,MAAS/wB,GAAI,KAAK,sBAAsB,EAAE,QAAK,CAAC;SACzD,qBAAqByvC;QACtB,CAAA;QAIFnsB,MACC,kBAACwgB,IAAD;SACe;SACF;SACX,eAAe,MAAM0G,GAAa/mC,GAAG,EAAE,QAAQ,GAAK,CAAC;QACtD,CAAA;OAEA;MACL,CAAA,CAAA,EAAA,CAAA,GAGHg2B,EAAa,YACZ,kBAACkB,IAAD;OACE,QAAQgL;OACR,eAAeC,GAAqB,EAAK;OACzC,WAAWnM,EAAa;OACb;OACX,kBAAkBA,EAAa;OAC/B,eAAe,GAAK,MAASqR,GAAiBvyB,GAAK9K,CAAI;OACvD,eAAe,MAAM+8B,GAAa/mC,CAAC;MACpC,CAAA,CAEE;;IACA;;GAEJwpC,MAAmB/4B,KAClB,kBAACnJ,IAAD;IACE,YAAY+I,EAAY,MAAK,MAAKlD,EAAE,OAAOsD,CAAoB,CAAC,EAAE,WAAW;IAC7E,aAAaJ,EAAY,MAAK,MAAKlD,EAAE,OAAOsD,CAAoB,CAAC,EAAE,QAAQ;IAC3E,eAAe,CAACJ,EAAY,MAAK,MAAKlD,EAAE,OAAOsD,CAAoB,CAAC,EAAE,SAASJ,EAAY,MAAK,MAAKlD,EAAE,OAAOsD,CAAoB,CAAC,EAAE,SAAS,MAAMJ,EAAY,MAAK,MAAKlD,EAAE,OAAOsD,CAAoB,CAAC,EAAE,SAAS,KAAA;IACnN,eAAe;KACb,IAAM2Z,IAAM/Z,EAAY,MAAK,MAAKlD,EAAE,OAAOsD,CAAoB;KAK/D,AAJI2Z,KAAO,CAACA,EAAI,WACbwgB,GAAkBv6B,EAAY,QAAO,MAAKlD,EAAE,OAAOsD,CAAoB,CAAC,GAE3Eg5B,GAAmB,EAAK,GACxB/4B,GAAwB,IAAI;IAC9B;IACA,SAAS,GAAK,MAAS;KAUrB,AATAk6B,GAAkBv6B,EAAY,KAAI,MAAK;MACrC,IAAIlD,EAAE,OAAOsD,GAAsB;OACjC,IAAMkjC,IAAU1rC,MAAS,KAAA,IAAmBkF,EAAE,OAATlF,GAC/B6H,IAAW6jC,IAAU,KAAK,IAAI,KAAKA,EAAQ,SAAS,IAAI,EAAE,IAAIxmC,EAAE;OACtE,OAAO;QAAE,GAAGA;QAAG,SAAS5G;QAAK,MAAMotC;QAAS,OAAO7jC;OAAS;MAC9D;MACA,OAAO3C;KACT,CAAC,CAAC,GACFs8B,GAAmB,EAAK,GACxB/4B,GAAwB,IAAI;IAC9B;GACD,CAAA;GAEFghC,MACC,kBAACriC,IAAD;IACE,QAAQ3K;IACR,WAAWC;IACX,cAAcivC;IACD;IACb,gBAAgBhJ;IACM;IACG;IACzB,UAAUiJ;IACK;IACF;IACG;IAChB,eAAezM;IACf,aAAauJ;GACd,CAAA;EAEA;;AAET;AAEA,SAASkB,GAAW,EAAE,SAAM,WAAQ,YAAS,UAAO,eAAiH;CACnK,OACE,kBAAC,UAAD;EACE,SAAS/sC,IAAW,KAAA,IAAYC;EAChC,OAAOM;EACG;EACV,OAAO;GACL,SAAS;GAAQ,YAAY;GAAU,gBAAgB;GACvD,OAAO;GAAQ,QAAQ;GAAQ,QAAQ;GAAQ,cAAc;GAC7D,iBAAiBL,IAAS,YAAY;GACtC,OAAOA,IAAS,mBAAmB;GACnC,QAAQF,IAAW,gBAAgB;GACnC,SAASA,IAAW,MAAO;GAC3B,eAAeA,IAAW,SAAS;EACrC;EACA,eAAc,MAAK;GAAE,AAAI,CAACE,KAAU,CAACF,MAAU,EAAE,cAAc,MAAM,kBAAkB;EAAW;EAClG,eAAc,MAAK;GAAE,AAAI,CAACE,KAAU,CAACF,MAAU,EAAE,cAAc,MAAM,kBAAkB;EAAe;EAErG,UAAAG;CACK,CAAA;AAEZ;AAEA,SAAS6sC,GAAa,EAAE,UAAO,MAAyB;CACtD,OACE,kBAAC,OAAD;EAAK,OAAO9pB;EAAM,QAAQA;EAAM,SAAQ;EAAY,MAAK;EAAO,QAAO;EAAe,aAAY;EAAI,eAAc;EAAQ,gBAAe;EAA3I,UAAA,CACE,kBAAC,QAAD,EAAM,GAAE,yBAA0B,CAAA,GAClC,kBAAC,QAAD,EAAM,GAAE,gEAAiE,CAAA,CACtE;;AAET;;;ACtpFA,SAAwB8rB,GAAc,EAAE,YAAS,kBAAe,uBAAwC;CACtG,IAAM,EAAE,cAAW,mBAAgB,sBAAmBvqC,GAAa,GAC7D,CAACpF,GAAWD,KAAgB7D,EAA2C,oBAAoB,GAC3F,CAAC0zC,GAAeC,KAAoB3zC,EAA4B,IAAI,GACpE,CAACiP,GAAaC,KAAkBlP,EAAS,EAAE,GAE3CshB,KAAiB,GAAwB,MAAuB;EAKpE,IAJA,EAAE,eAAe,GACjB,EAAE,gBAAgB,GAGd,EAAE,QAAQ,UAAU;GACtB,EAAiB,IAAI;GACrB;EACF;EAGA,IAAI;GAAC;GAAQ;GAAW;GAAS;EAAK,CAAC,CAAC,SAAS,EAAE,GAAG,GAAG;EAEzD,IAAMkX,IAAkB,CAAC;EAGzB,CAFI,EAAE,WAAW,EAAE,YAASA,EAAM,KAAK,MAAM,GACzC,EAAE,YAAUA,EAAM,KAAK,OAAO,GAC9B,EAAE,UAAQA,EAAM,KAAK,KAAK;EAE9B,IAAIob,IAAM,EAAE;EAYZ,AAXIA,MAAQ,QAAK,IAAM,UACnBA,MAAQ,eAAeA,MAAQ,WACjC,IAAM,WACG,EAAE,aAAaA,MAAQ,OAAO,EAAE,SAAS,WAClD,IAAM,MACG,EAAE,aAAaA,MAAQ,OAAO,EAAE,SAAS,WAClD,IAAM,MACGA,EAAI,WAAW,MACxB,IAAMA,EAAI,YAAY,IAGxBpb,EAAM,KAAKob,CAAG;EACd,IAAMC,IAAkBrb,EAAM,KAAK,GAAG;EAGtC,AADAsb,EAAerqC,GAAQoqC,CAAe,GACtCF,EAAiB,IAAI;CACvB,GAEMI,KAAuB,MAAgB;EAC3C,IAAI,CAACC,GAAK,OAAO,kBAAC,QAAD;GAAM,OAAO;IAAE,OAAO;IAAW,WAAW;IAAU,UAAU;GAAO;GAAG,UAAA;EAAU,CAAA;EACrG,IAAMnrC,IAASe,GAAmBoqC,CAAG,GAC/BC,IAAQ,OAAO,YAAc,OAAe,OAAO,KAAK,UAAU,YAAY,UAAU,aAAa,EAAE,GACvGzZ,IAAmB,CAAC;EAK1B,IAHI3xB,EAAO,QAAM2xB,EAAO,KAAKyZ,IAAQ,MAAM,MAAM,GAC7CprC,EAAO,OAAK2xB,EAAO,KAAKyZ,IAAQ,MAAM,KAAK,GAC3CprC,EAAO,SAAO2xB,EAAO,KAAKyZ,IAAQ,MAAM,OAAO,GAC/CprC,EAAO,KAAK;GACd,IAAI4wB,IAAI5wB,EAAO,IAAI,YAAY;GAE/B,AADI4wB,MAAM,aAAU,IAAIwa,IAAQ,aAAa,QAC7CzZ,EAAO,KAAKf,CAAC;EACf;EAEA,OACE,kBAAC,OAAD;GAAK,OAAO;IAAE,SAAS;IAAQ,KAAK;IAAO,YAAY;IAAU,UAAU;GAAO;GAC/E,UAAAe,EAAO,KAAK,GAAG,MACd,kBAAC,OAAD;IAEE,OAAO;KACL,SAAS;KACT,YAAY;KACZ,gBAAgB;KAChB,SAAS;KACT,UAAU;KACV,YAAY;KACZ,YAAY;KACZ,OAAO;KACP,iBAAiB;KACjB,QAAQ;KACR,cAAc;KACd,WAAW;KACX,UAAU;KACV,WAAW;IACb;IAEC,UAAAlD;GACE,GAnBE7iB,CAmBF,CACN;EACE,CAAA;CAET,GAEMjI,IAAQyC,EAAY,KAAK,CAAC,CAAC,YAAY,GAEvCilC,IAAoB3T,QACnB/zB,IACErD,EAAU,QAAQ,MAAgB;EACvC,IAAMgrC,IAAY3qC,EAAE,YAAY,YAAY,CAAC,CAAC,SAASgD,CAAK,GACtD4nC,IAAc5qC,EAAE,OAAO,YAAY,CAAC,CAAC,SAASgD,CAAK,GACnD6nC,IAAW7qC,EAAE,QAAQ,YAAY,CAAC,CAAC,SAASgD,CAAK;EACvD,OAAO2nC,KAAaC,KAAeC;CACrC,CAAC,IANkBlrC,GAOlB,CAACA,GAAWqD,CAAK,CAAC,GAEf8nC,IAAiB/T,QACrB,CAAK/zB,KACE,sDAAoE,SAASA,CAAK,KAClF,GAAQ+a,KAAiBA,EAAc,YAAY,CAAC,CAAC,SAAS/a,CAAK,IACzE,CAACA,GAAO+a,CAAa,CAAC;CAEzB,OACE,kBAAC,OAAD;EAAK,OAAO;GAAE,UAAU;GAAS,KAAK;GAAG,MAAM;GAAG,OAAO;GAAQ,QAAQ;GAAQ,iBAAiB;GAAmB,QAAQ;GAAM,SAAS;GAAQ,YAAY;GAAU,gBAAgB;EAAS;EACjM,UAAA,kBAAC,OAAD;GAAK,OAAO;IAAE,iBAAiB;IAAQ,cAAc;IAAO,OAAO;IAAS,QAAQ;IAAS,UAAU;IAAQ,WAAW;IAAQ,SAAS;IAAQ,eAAe;IAAU,WAAW;IAA+B,UAAU;GAAS;GAAzO,UAAA;IAGE,kBAAC,OAAD;KAAK,OAAO;MAAE,SAAS;MAAa,cAAc;MAAiC,SAAS;MAAQ,gBAAgB;MAAiB,YAAY;MAAU,iBAAiB;KAAO;KAAnL,UAAA,CACE,kBAAC,MAAD;MAAI,OAAO;OAAE,QAAQ;OAAG,UAAU;OAAQ,YAAY;OAAK,OAAO;MAAoB;MAAG,UAAA;KAAY,CAAA,GACrG,kBAAC,UAAD;MAAQ,SAASnf;MAAS,OAAO;OAAE,YAAY;OAAQ,QAAQ;OAAQ,QAAQ;OAAW,OAAO;OAAqB,SAAS;OAAQ,SAAS;MAAM;MACpJ,UAAA,kBAACC,IAAD,EAAG,MAAM,GAAK,CAAA;KACR,CAAA,CACL;;IAGL,kBAAC,OAAD;KAAK,OAAO;MAAE,SAAS;MAAa,cAAc;MAAiC,iBAAiB;KAAU;KAC5G,UAAA,kBAAC,OAAD;MAAK,OAAO,EAAE,UAAU,WAAW;MAAnC,UAAA;OACE,kBAACjE,IAAD;QAAQ,MAAM;QAAI,OAAM;QAAoB,OAAO;SAAE,UAAU;SAAY,MAAM;SAAQ,KAAK;SAAO,WAAW;QAAmB;OAAI,CAAA;OACvI,kBAAC,SAAD;QACE,MAAK;QACL,aAAY;QACZ,OAAO6K;QACP,WAAW,MAAMC,EAAe,EAAE,OAAO,KAAK;QAC9C,OAAO;SACL,OAAO;SACP,SAAS;SACT,QAAQ;SACR,cAAc;SACd,UAAU;SACV,WAAW;SACX,SAAS;SACT,iBAAiB;QACnB;OACD,CAAA;OACAD,KACC,kBAAC,UAAD;QACE,eAAeC,EAAe,EAAE;QAChC,OAAO;SACL,UAAU;SAAY,OAAO;SAAQ,KAAK;SAAO,WAAW;SAC5D,YAAY;SAAQ,QAAQ;SAAQ,QAAQ;SAAW,OAAO;SAAqB,SAAS;SAAQ,SAAS;QAC/G;QACA,OAAM;QAEN,UAAA,kBAAC7G,IAAD,EAAG,MAAM,GAAK,CAAA;OACR,CAAA;MAEP;;IACF,CAAA;IAGL,kBAAC,OAAD;KAAK,OAAO;MAAE,SAAS;MAAQ,MAAM;MAAG,UAAU;KAAS;KAA3D,UAAA,CAEE,kBAAC,OAAD;MAAK,OAAO;OAAE,OAAO;OAAS,aAAa;OAAiC,iBAAiB;OAAW,SAAS;OAAQ,eAAe;MAAS;MAC7I,UAAA,CAAC,WAAW,oBAAoB,CAAC,CAAW,KAAI,MAAO;OACvD,IAAMksC,IAAa7wC,MAAQ,uBAAwB8I,IAAQ0nC,EAAkB,SAAS,OAAS1nC,KAAS8nC,IAAiB,IAAI;OAC7H,OACE,kBAAC,OAAD;QAEE,eAAezwC,EAAaH,CAAG;QAC/B,OAAO;SACL,SAAS;SACT,QAAQ;SACR,iBAAiBI,MAAcJ,IAAM,YAAY;SACjD,OAAOI,MAAcJ,IAAM,mBAAmB;SAC9C,YAAYI,MAAcJ,IAAM,MAAM;SACtC,UAAU;SACV,YAAYI,MAAcJ,IAAM,6BAA6B;SAC7D,YAAY;SACZ,SAAS;SACT,gBAAgB;SAChB,YAAY;QACd;QAfF,UAAA,CAiBE,kBAAC,QAAD,EAAA,UAAOA,EAAU,CAAA,GAChB6wC,MAAe,QACd,kBAAC,QAAD;SAAM,OAAO;UACX,UAAU;UACV,SAAS;UACT,cAAc;UACd,iBAAiBzwC,MAAcJ,IAAM,mBAAmB;UACxD,OAAOI,MAAcJ,IAAM,SAAS;UACpC,YAAY;SACd;SACG,UAAA6wC;QACG,CAAA,CAEL;OA7BE,GAAA7wC,CA6BF;MAET,CAAC;KACE,CAAA,GAGL,kBAAC,OAAD;MAAK,OAAO;OAAE,MAAM;OAAG,WAAW;OAAQ,SAAS;MAAO;MAA1D,UAAA,CACGI,MAAc,wBACb,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,OAAD;OAAK,OAAO;QAAE,SAAS;QAAQ,gBAAgB;QAAiB,YAAY;QAAU,cAAc;OAAO;OAA3G,UAAA,CACE,kBAAC,QAAD;QAAM,OAAO;SAAE,UAAU;SAAQ,OAAO;QAAoB;QACzD,UAAA0I,IAAQ,GAAG0nC,EAAkB,OAAO,MAAM/qC,EAAU,OAAO,cAAc,GAAGA,EAAU,OAAO;OAC1F,CAAA,GACN,kBAAC,UAAD;QACE,SAASqrC;QACT,OAAO;SACL,SAAS;SACT,YAAY;SACZ,KAAK;SACL,YAAY;SACZ,QAAQ;SACR,cAAc;SACd,SAAS;SACT,UAAU;SACV,OAAO;SACP,QAAQ;QACV;QACA,OAAM;QAdR,UAAA,CAgBE,kBAACjyC,IAAD,EAAW,MAAM,GAAK,CAAA,GAAC,mBAEjB;OACL,CAAA,CAAA;MAEJ,CAAA,GAAA2xC,EAAkB,WAAW,IAC5B,kBAAC,OAAD;OAAK,OAAO;QAAE,WAAW;QAAU,SAAS;QAAa,OAAO;QAAqB,UAAU;OAAO;OAAtG,UAAA;QACE,kBAAC,OAAD,EAAA,UAAA;SAAK;SAA8BjlC;SAAY;QAAY,EAAA,CAAA;QAC1DqlC,KACC,kBAAC,OAAD;SAAK,OAAO,EAAE,WAAW,MAAM;SAC7B,UAAA,kBAAC,UAAD;UACE,eAAezwC,EAAa,SAAS;UACrC,OAAO;WAAE,YAAY;WAAQ,QAAQ;WAAQ,OAAO;WAAkB,QAAQ;WAAW,UAAU;WAAQ,YAAY;WAAK,gBAAgB;UAAY;UACzJ,UAAA;SAEO,CAAA;QACL,CAAA;QAEP,kBAAC,UAAD;SACE,eAAeqL,EAAe,EAAE;SAChC,OAAO;UAAE,WAAW;UAAO,YAAY;UAAQ,QAAQ;UAAQ,OAAO;UAAkB,QAAQ;UAAW,UAAU;UAAQ,YAAY;SAAI;SAC9I,UAAA;QAEO,CAAA;OACL;MAEL,CAAA,IAAA,kBAAC,SAAD;OAAO,OAAO;QAAE,OAAO;QAAQ,gBAAgB;QAAY,UAAU;OAAS;OAA9E,UAAA,CACE,kBAAC,SAAD,EAAA,UACE,kBAAC,MAAD;QAAI,OAAO;SAAE,cAAc;SAAiC,WAAW;SAAQ,OAAO;SAAqB,UAAU;QAAO;QAA5H,UAAA;SACE,kBAAC,MAAD;UAAI,OAAO;WAAE,SAAS;WAAY,YAAY;WAAK,OAAO;UAAQ;UAAG,UAAA;SAAY,CAAA;SACjF,kBAAC,MAAD;UAAI,OAAO;WAAE,SAAS;WAAY,YAAY;UAAI;UAAG,UAAA;SAAe,CAAA;SACpE,kBAAC,MAAD;UAAI,OAAO;WAAE,SAAS;WAAY,YAAY;WAAK,OAAO;WAAQ,WAAW;UAAS;UAAG,UAAA;SAAU,CAAA;QACjG;OACC,CAAA,EAAA,CAAA,GACP,kBAAC,SAAD,EAAA,UACGglC,EAAkB,KAAK,MACtB,kBAAC,MAAD;QAAmB,OAAO,EAAE,cAAc,oBAAoB;QAA9D,UAAA;SACE,kBAAC,MAAD;UAAI,OAAO,EAAE,SAAS,YAAY;UAC/B,UAAAR,MAAkBlqC,EAAE,SACnB,kBAAC,OAAD;WAAK,OAAO;YAAE,SAAS;YAAQ,YAAY;YAAU,KAAK;WAAM;WAAhE,UAAA,CACE,kBAAC,SAAD;YACE,WAAA;YACA,MAAK;YACL,aAAY;YACZ,YAAY,MAAM8X,EAAc7Q,GAAGjH,EAAE,MAAM;YAC3C,cAAcmqC,EAAiB,IAAI;YACnC,OAAO;aACL,SAAS;aACT,OAAO;aACP,QAAQ;aACR,cAAc;aACd,SAAS;aACT,UAAU;aACV,iBAAiB;YACnB;WACD,CAAA,GACD,kBAAC,UAAD;YACE,cAAc,MAAM;aAAsB,AAApB,EAAE,eAAe,GAAGA,EAAiB,IAAI;YAAG;YAClE,OAAO;aAAE,YAAY;aAAQ,QAAQ;aAAQ,QAAQ;aAAW,OAAO;aAAW,SAAS;aAAQ,SAAS;YAAM;YAClH,OAAM;YAEN,UAAA,kBAACtrC,IAAD,EAAG,MAAM,GAAK,CAAA;WACR,CAAA,CACL;UAEL,CAAA,IAAA0rC,EAAoBvqC,EAAE,OAAO;SAE7B,CAAA;SACJ,kBAAC,MAAD;UAAI,OAAO;WAAE,SAAS;WAAa,OAAO;UAAU;UAAI,UAAAA,EAAE;SAAgB,CAAA;SAC1E,kBAAC,MAAD;UAAI,OAAO;WAAE,SAAS;WAAa,WAAW;UAAS;UACpD,UAAAkqC,MAAkBlqC,EAAE,SACnB,kBAAC,QAAD;WAAM,OAAO;YAAE,UAAU;YAAQ,OAAO;YAAkB,YAAY;WAAI;WAAG,UAAA;UAAe,CAAA,IAE5F,kBAAC,UAAD;WACE,eAAemqC,EAAiBnqC,EAAE,MAAM;WACxC,OAAO;YACL,YAAY;YACZ,QAAQ;YACR,cAAc;YACd,QAAQ;YACR,OAAO;YACP,SAAS;YACT,SAAS;YACT,YAAY;YACZ,KAAK;YACL,UAAU;WACZ;WACA,OAAM;WAdR,UAAA,CAgBE,kBAAC3D,GAAD,EAAO,MAAM,GAAK,CAAA,GAAC,OACb;;SAER,CAAA;QACF;OAzDK,GAAA2D,EAAE,MAyDP,CACL,EACI,CAAA,CACF;MAEN,CAAA,CAAA,EAAA,CAAA,GAGN1F,MAAc,aACb,kBAAC,OAAD,EAAA,UACG0I,KAAS,CAAC8nC,IACT,kBAAC,OAAD;OAAK,OAAO;QAAE,WAAW;QAAU,SAAS;QAAa,OAAO;QAAqB,UAAU;OAAO;OAAtG,UAAA;QACE,kBAAC,OAAD,EAAA,UAAA;SAAK;SAAqCrlC;SAAY;QAAY,EAAA,CAAA;QACjEilC,EAAkB,SAAS,KAC1B,kBAAC,OAAD;SAAK,OAAO,EAAE,WAAW,MAAM;SAC7B,UAAA,kBAAC,UAAD;UACE,eAAerwC,EAAa,oBAAoB;UAChD,OAAO;WAAE,YAAY;WAAQ,QAAQ;WAAQ,OAAO;WAAkB,QAAQ;WAAW,UAAU;WAAQ,YAAY;WAAK,gBAAgB;UAAY;UAF1J,UAAA;WAIGqwC,EAAkB;WAAO;WAAmBA,EAAkB,SAAS,IAAI,MAAM;WAAG;UAC/E;;QACL,CAAA;QAEP,kBAAC,UAAD;SACE,eAAehlC,EAAe,EAAE;SAChC,OAAO;UAAE,WAAW;UAAO,YAAY;UAAQ,QAAQ;UAAQ,OAAO;UAAkB,QAAQ;UAAW,UAAU;UAAQ,YAAY;SAAI;SAC9I,UAAA;QAEO,CAAA;OACL;MAEL,CAAA,IAAA,kBAAC,OAAD;OAAK,OAAO,EAAE,WAAW,MAAM;OAA/B,UAAA;QACE,kBAAC,SAAD;SAAO,OAAO;UAAE,SAAS;UAAS,UAAU;UAAQ,YAAY;UAAK,OAAO;UAAW,cAAc;SAAM;SAAG,UAAA;QAEvG,CAAA;QACP,kBAAC,OAAD;SAAK,OAAO;UAAE,UAAU;UAAQ,OAAO;UAAqB,cAAc;SAAO;SAAG,UAAA;QAE/E,CAAA;QACL,kBAAC,SAAD;SACE,MAAK;SACL,OAAOqY;SACP,WAAW,MAAMktB,EAAiB,EAAE,OAAO,KAAK;SAChD,aAAY;SACZ,OAAO;UACL,OAAO;UACP,SAAS;UACT,QAAQ;UACR,cAAc;UACd,UAAU;UACV,SAAS;UACT,WAAW;SACb;QACD,CAAA;QACAltB,KACC,kBAAC,OAAD;SAAK,OAAO;UAAE,SAAS;UAAQ,YAAY;UAAU,KAAK;UAAO,WAAW;UAAO,OAAO;UAAW,UAAU;SAAS;SAAxH,UAAA;UACE,kBAACpI,GAAD,EAAO,MAAM,GAAK,CAAA;UAAC;UAA2BoI;UAAc;SACzD;;OAEJ;MAEJ,CAAA,EAAA,CAAA,CAEJ;KACF,CAAA,CAAA;;GAEF;;CACF,CAAA;AAET;;;AChYA,IAAamtB,KAAA;;;ACEb,SAAwBC,GAAW,EAAE,cAA4B;CAC/D,IAAM,CAACC,GAASC,KAAcl5C,EAAM,SAAiB+4C,EAAO,GACtD,CAACI,GAAYC,KAAiBp5C,EAAM,SACxC,oEAAoE+4C,IACtE;CAoCA,OAlCA/4C,EAAM,gBAAgB;EACpB,IAAIq5C,IAAY;EA6BhB,OA5BA,MAAM,cAAc,CAAC,CAClB,MAAM,MAAQ;GACb,IAAI,CAACpV,EAAI,IAAI,MAAU,MAAM,QAAQA,EAAI,QAAQ;GACjD,OAAOA,EAAI,KAAK;EAClB,CAAC,CAAC,CACD,YACQ,MAAM,8EAA8E,CAAC,CACzF,MAAM,MAAQ;GACb,IAAI,CAACA,EAAI,IAAI,MAAU,MAAM,QAAQA,EAAI,QAAQ;GACjD,OAAOA,EAAI,KAAK;EAClB,CAAC,CAAC,CACD,MAAM,OAAU;GACf,SAAS3rB,EAAK,WAAWA,EAAK,SAAS,QAAQ,MAAM,EAAE,IAAIygC;GAC3D,YAAYzgC,EAAK,YAAY;EAC/B,EAAE,CACL,CAAC,CACD,MAAM,MAAS;GACd,AAAI+gC,KAAa/gC,KAAQA,EAAK,YAC5B4gC,EAAW5gC,EAAK,OAAO,GACnBA,EAAK,cACP8gC,EAAc9gC,EAAK,UAAU;EAGnC,CAAC,CAAC,CACD,YAAY,CAEb,CAAC,SAEU;GACX,IAAY;EACd;CACF,GAAG,CAAC,CAAC,GAEH,kBAAC,OAAD;EAAK,OAAO;GACV,UAAU;GAAS,KAAK;GAAG,MAAM;GAAG,OAAO;GAAG,QAAQ;GACtD,iBAAiB;GAAmB,SAAS;GAAQ,YAAY;GAAU,gBAAgB;GAC3F,QAAQ;EACV;EACE,UAAA,kBAAC,OAAD;GAAK,OAAO;IACV,iBAAiB;IACjB,OAAO;IACP,cAAc;IACd,OAAO;IACP,UAAU;IACV,WAAW;IACX,YAAY;IACZ,UAAU;IACV,SAAS;IACT,eAAe;IACf,WAAW;GACb;GAZA,UAAA;IAcE,kBAAC,OAAD;KAAK,OAAO;MACV,SAAS;MAAa,cAAc;MACpC,SAAS;MAAQ,YAAY;MAAU,gBAAgB;MACvD,iBAAiB;KACnB;KAJA,UAAA,CAKE,kBAAC,OAAD;MAAK,OAAO;OAAE,SAAS;OAAQ,YAAY;OAAU,KAAK;MAAM;MAAhE,UAAA,CACE,kBAAC/P,IAAD;OAAM,MAAM;OAAI,OAAM;MAAW,CAAA,GACjC,kBAAC,MAAD;OAAI,OAAO;QAAE,QAAQ;QAAG,UAAU;QAAQ,YAAY;QAAK,OAAO;OAAU;OAAG,UAAA;MAAS,CAAA,CACrF;KACL,CAAA,GAAA,kBAAC,UAAD;MACE,SAASkE;MACT,OAAO;OAAE,YAAY;OAAQ,QAAQ;OAAQ,QAAQ;OAAW,OAAO;MAAU;MAEjF,UAAA,kBAACC,IAAD,EAAG,MAAM,GAAK,CAAA;KACR,CAAA,CACL;;IAGL,kBAAC,OAAD;KAAK,OAAO;MAAE,SAAS;MAAQ,WAAW;KAAO;KAAjD,UAAA;MACE,kBAAC,OAAD;OAAK,OAAO;QAAE,WAAW;QAAU,cAAc;OAAO;OAAxD,UAAA;QACE,kBAAC,MAAD;SAAI,OAAO;UAAE,QAAQ;UAAa,UAAU;UAAQ,OAAO;SAAU;SAAG,UAAA;QAAuB,CAAA;QAC/F,kBAAC,OAAD;SAAK,OAAO;UAAE,SAAS;UAAQ,YAAY;UAAU,gBAAgB;UAAU,KAAK;UAAO,QAAQ;SAAY;SAA/G,UAAA,CACE,kBAAC,QAAD;UAAM,OAAO;WAAE,UAAU;WAAQ,OAAO;UAAU;UAAlD,UAAA,CAAqD,YAASusC,CAAc;SAC5E,CAAA,GAAA,kBAAC,KAAD;UACE,MAAME;UACN,QAAO;UACP,KAAI;UACJ,OAAO;WACL,UAAU;WACV,OAAO;WACP,gBAAgB;WAChB,SAAS;WACT,YAAY;WACZ,KAAK;WACL,SAAS;WACT,cAAc;WACd,iBAAiB;WACjB,QAAQ;WACR,YAAY;UACd;UACA,OAAM;UAjBR,UAAA,CAmBE,kBAAC,QAAD,EAAA,UAAM,gBAAmB,CAAA,GACzB,kBAACG,GAAD,EAAc,MAAM,GAAK,CAAA,CACxB;SACA,CAAA,CAAA;;QACL,kBAAC,KAAD;SAAG,OAAO;UAAE,QAAQ;UAAa,UAAU;UAAQ,OAAO;SAAU;SAAG,UAAA;QAAmD,CAAA;QAC1H,kBAAC,KAAD;SAAG,MAAK;SAA2B,QAAO;SAAS,KAAI;SAAsB,OAAO;UAAE,SAAS;UAAgB,QAAQ;UAAa,UAAU;UAAQ,OAAO;UAAW,gBAAgB;UAAQ,YAAY;SAAI;SAAG,UAAA;QAAmB,CAAA;QACtO,kBAAC,KAAD;SAAG,OAAO;UAAE,QAAQ;UAAa,UAAU;UAAQ,OAAO;UAAW,WAAW;SAAS;SAAG,UAAA;QAEzF,CAAA;OACA;;MAEL,kBAAC,MAAD;OAAI,OAAO;QAAE,UAAU;QAAQ,YAAY;QAAK,OAAO;QAAW,cAAc;QAAqB,eAAe;QAAO,cAAc;OAAO;OAAG,UAAA;MAAkC,CAAA;MACrL,kBAAC,KAAD;OAAG,OAAO;QAAE,UAAU;QAAQ,OAAO;QAAW,YAAY;QAAK,cAAc;OAAO;OAAG,UAAA;MAEtF,CAAA;MAEH,kBAAC,MAAD;OAAI,OAAO;QAAE,aAAa;QAAQ,QAAQ;QAAG,UAAU;QAAQ,OAAO;QAAW,SAAS;QAAQ,eAAe;QAAU,KAAK;OAAM;OAAtI,UAAA;QACE,kBAAC,MAAD,EAAA,UAAA,CAAI,kBAAC,UAAD,EAAA,UAAQ,aAAkB,CAAA,GAAC,wEAA0E,EAAA,CAAA;QACzG,kBAAC,MAAD,EAAA,UAAA,CAAI,kBAAC,UAAD,EAAA,UAAQ,UAAe,CAAA,GAAC,4DAA8D,EAAA,CAAA;QAC1F,kBAAC,MAAD,EAAA,UAAA;SAAI,kBAAC,UAAD,EAAA,UAAQ,QAAa,CAAA;SAAC;SAAG,kBAAC,UAAD,EAAA,UAAQ,YAAiB,CAAA;SAAC;QAAoE,EAAA,CAAA;QAC3H,kBAAC,MAAD,EAAA,UAAA,CAAI,kBAAC,UAAD,EAAA,UAAQ,eAAoB,CAAA,GAAC,kEAAoE,EAAA,CAAA;QACrG,kBAAC,MAAD,EAAA,UAAA,CAAI,kBAAC,UAAD,EAAA,UAAQ,aAAkB,CAAA,GAAC,kFAAoF,EAAA,CAAA;QACnH,kBAAC,MAAD,EAAA,UAAA,CAAI,kBAAC,UAAD,EAAA,UAAQ,OAAY,CAAA,GAAC,6EAA+E,EAAA,CAAA;OACtG;;MAEJ,kBAAC,OAAD;OAAK,OAAO;QAAE,WAAW;QAAQ,UAAU;QAAQ,WAAW;OAAS;OACrE,UAAA,kBAAC,KAAD;QAAG,MAAK;QAAyB,QAAO;QAAS,KAAI;QAAsB,OAAO;SAAE,OAAO;SAAW,gBAAgB;SAAQ,YAAY;QAAI;QAAG,UAAA;OAE9I,CAAA;MACA,CAAA;KACF;;IAGL,kBAAC,OAAD;KAAK,OAAO;MAAE,SAAS;MAAa,iBAAiB;MAAW,WAAW;MAAqB,SAAS;MAAQ,gBAAgB;KAAW;KAC1I,UAAA,kBAAC,UAAD;MACE,SAAS7sC;MACT,OAAO;OACL,iBAAiB;OAAW,OAAO;OAAQ,QAAQ;OAAQ,cAAc;OACzE,SAAS;OAAY,UAAU;OAAQ,YAAY;OAAK,QAAQ;MAClE;MACD,UAAA;KAEO,CAAA;IACL,CAAA;GACF;;CACF,CAAA;AAET;;;ACrJA,IAAa8sC,KAAb,MAAuB;CACrB,4BAA6B,IAAI,IAAmC;CACpE,YAAoB;CAGpB,GAAgB,GAAc,GAAsC;EAClE,IAAI,KAAK,WAAW,aAAa,CAAC;EAClC,IAAIC,IAAM,KAAK,UAAU,IAAI14C,CAAI;EAMjC,OALK04C,MACH,oBAAM,IAAI,IAAI,GACd,KAAK,UAAU,IAAI14C,GAAM04C,CAAG,IAE9BA,EAAI,IAAI54C,CAAQ,SACH,KAAK,IAAIE,GAAMF,CAAQ;CACtC;CAGA,KAAkB,GAAc,GAAsC;EACpE,IAAM64C,IAAM,KAAK,GAAM34C,IAAO,MAAW;GAEvC,AADA24C,EAAI,GACJ74C,EAASG,CAAM;EACjB,CAAC;EACD,OAAO04C;CACT;CAEA,IAAiB,GAAc,GAAgC;EAC7D,IAAMD,IAAM,KAAK,UAAU,IAAI14C,CAAI;EACnC,AAAK04C,MACLA,EAAI,OAAO54C,CAAQ,GACf44C,EAAI,SAAS,KAAG,KAAK,UAAU,OAAO14C,CAAI;CAChD;CAGA,KAAkB,GAAc,GAAkB;EAChD,IAAI,KAAK,WAAW;EACpB,IAAM04C,IAAM,KAAK,UAAU,IAAI14C,CAAI;EACnC,IAAK04C,KAAOA,EAAI,SAAS,GACzB,KAAK,IAAM54C,KAAY,MAAM,KAAK44C,CAAG,GACnC,IAAI;GACF,EAASz4C,CAAW;EACtB,SAASsX,GAAK;GACZ,QAAQ,MAAM,uCAAuCvX,EAAK,UAAUuX,CAAG;EACzE;CAEJ;CAEA,cAAc,GAAuB;EACnC,IAAIvX,GAAM,OAAO,KAAK,UAAU,IAAIA,CAAI,CAAC,EAAE,QAAQ;EACnD,IAAIyR,IAAI;EACR,KAAK,IAAMinC,KAAO,KAAK,UAAU,OAAO,GAAG,KAAKA,EAAI;EACpD,OAAOjnC;CACT;CAEA,YAAkB;EAChB,KAAK,UAAU,MAAM;CACvB;CAGA,UAAgB;EAEd,AADA,KAAK,UAAU,GACf,KAAK,YAAY;CACnB;CAEA,IAAI,cAAuB;EACzB,OAAO,KAAK;CACd;AACF,GChCMmnC,MAAK,MAAuBnnC,MAAM,IAAI,IAAIA;AAEhD,SAASonC,GAAe,GAAU,GAAkB;CAClD,OAAO;EAAE,GAAGD,GAAE11C,EAAE,IAAIy5B,EAAE,KAAKz5B,EAAE,IAAIy5B,EAAE,KAAKA,EAAE,EAAE;EAAG,GAAGic,GAAE11C,EAAE,IAAIy5B,EAAE,KAAKz5B,EAAE,IAAIy5B,EAAE,KAAKA,EAAE,EAAE;CAAE;AACtF;AAEA,SAASmc,GAAsB,GAAU,GAAkB;CACzD,IAAM70C,IAAI04B,EAAE,KAAKA,EAAE,KAAKA,EAAE,KAAKA,EAAE;CACjC,OAAO;EACL,GAAGic,IAAG11C,EAAE,IAAIy5B,EAAE,KAAKz5B,EAAE,IAAIy5B,EAAE,KAAKA,EAAE,KAAKA,EAAE,KAAKA,EAAE,KAAKA,EAAE,MAAM14B,CAAC;EAC9D,GAAG20C,IAAG,CAAC11C,EAAE,IAAIy5B,EAAE,KAAKz5B,EAAE,IAAIy5B,EAAE,KAAKA,EAAE,KAAKA,EAAE,KAAKA,EAAE,KAAKA,EAAE,MAAM14B,CAAC;CACjE;AACF;AAGA,SAAgB80C,GAAmB,GAAoB,GAA2C,GAA8B;CAC9H,IAAMlzC,IAAWgR,GAAkBmiC,CAAM,GACnC,CAACC,GAAIC,GAAIC,GAAIC,KAAMC,GACnBC,KAAWH,IAAKF,KAAM,GACtBM,KAAWH,IAAKF,KAAM,GAExBM,GAAiBC,GAAiBC,GAAiBC;CACvD,QAAQ9zC,GAAR;EACE,KAAK;GAA6C,AAAxC,IAAU,IAAI,IAAU,GAAG,IAAU,GAAG,IAAU;GAAG;EAC/D,KAAK;GAA2C,AAAvC,IAAU,GAAG,IAAU,GAAG,IAAU,GAAG,IAAU;GAAG;EAC7D,KAAK;GAA8C,AAAzC,IAAU,GAAG,IAAU,IAAI,IAAU,IAAI,IAAU;GAAG;EAChE,SAAgD,AAAvC,IAAU,GAAG,IAAU,GAAG,IAAU,GAAG,IAAU;CAC5D;CAEA,IAAI+zC,GAAuBC,GAAuBvqC,GAAeC;CACjE,AAAIiqC,MAAY,KACd,IAAgB,KAAK,IAAID,IAAUL,CAAE,GACrC,IAAgB,KAAK,IAAII,IAAUL,CAAE,GACrC,IAAQ,KAAK,IAAIG,IAAKF,CAAE,GACxB,IAAS,KAAK,IAAIC,IAAKF,CAAE,MAEzB,IAAgB,KAAK,IAAIK,IAAUL,CAAE,GACrC,IAAgB,KAAK,IAAIM,IAAUL,CAAE,GACrC,IAAQC,IAAKF,GACb,IAASG,IAAKF;CAGhB,IAAMY,IAAoB;EACxBN;EAASC;EAASC;EAASC;EAC3BC,IAAgBJ,IAAUF,IAAUI,IAAUH;EAC9CM,IAAgBJ,IAAUH,IAAUK,IAAUJ;CAChD;CAEA,OAAO;EAAE;EAAY,SAAS;GAACN;GAAIC;GAAIC;GAAIC;EAAE;EAAG,QAAQvzC;EAAU;EAAO;EAAQ;CAAU;AAC7F;AAEA,SAAgBk0C,GAAiB,GAAkC;CACjE,IAAMC,IAAOlvC,EAAK;CAClB,OAAOiuC,GAAmBjuC,EAAK,YAAY;EAACkvC,EAAK;EAAIA,EAAK;EAAIA,EAAK;EAAIA,EAAK;CAAE,GAAGlvC,EAAK,MAAM;AAC9F;AAGA,SAAgBmvC,GAAuB,GAA0B;CAC/D,IAAMC,oBAAQ,IAAI,IAAmC;CACrD,QAAQ,MAA8C;EACpD,IAAMzoC,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI3B,EAAO,UAAU9F,CAAU,CAAC,GACvD9G,IAAIg3C,EAAM,IAAIzoC,CAAC;EAKnB,OAJKvO,MACH,IAAI4M,EAAO,QAAQ2B,CAAC,CAAC,CAAC,KAAKsoC,EAAgB,GAC3CG,EAAM,IAAIzoC,GAAGvO,CAAC,IAETA;CACT;AACF;AAMA,SAAgBi3C,EAAW,GAAiB,GAAiB;CAC3D,OAAOrB,GAAsB51C,GAAGk3C,EAAE,SAAS;AAC7C;AAEA,SAAgBC,GAAa,GAAiB,GAAiB;CAC7D,OAAOxB,GAAe31C,GAAGk3C,EAAE,SAAS;AACtC;AAGA,SAAgBE,GAAU,GAAiB,GAAkB;CAC3D,IAAMjqC,IAAI8pC,EAAWC,GAAG;EAAE,GAAGtpC,EAAE;EAAG,GAAGA,EAAE;CAAE,CAAC,GACpCR,IAAI6pC,EAAWC,GAAG;EAAE,GAAGtpC,EAAE,IAAIA,EAAE;EAAO,GAAGA,EAAE,IAAIA,EAAE;CAAO,CAAC;CAC/D,OAAO;EAAC,KAAK,IAAIT,EAAE,GAAGC,EAAE,CAAC;EAAG,KAAK,IAAID,EAAE,GAAGC,EAAE,CAAC;EAAG,KAAK,IAAID,EAAE,GAAGC,EAAE,CAAC;EAAG,KAAK,IAAID,EAAE,GAAGC,EAAE,CAAC;CAAC;AACxF;AAGA,SAAgBiqC,GAAY,GAAiB,GAAkB;CAC7D,IAAMlqC,IAAIgqC,GAAaD,GAAG;EAAE,GAAGtpC,EAAE;EAAI,GAAGA,EAAE;CAAG,CAAC,GACxCR,IAAI+pC,GAAaD,GAAG;EAAE,GAAGtpC,EAAE;EAAI,GAAGA,EAAE;CAAG,CAAC;CAG9C,OAAO;EAAE,GAFC,KAAK,IAAIT,EAAE,GAAGC,EAAE,CAEjB;EAAG,GADF,KAAK,IAAID,EAAE,GAAGC,EAAE,CACd;EAAG,OAAO,KAAK,IAAIA,EAAE,IAAID,EAAE,CAAC;EAAG,QAAQ,KAAK,IAAIC,EAAE,IAAID,EAAE,CAAC;CAAE;AACzE;AAEA,SAAgBmqC,GAAU,GAAiB,GAA0B;CACnE,OAAO7G,EAAO,KAAK,MAAMwG,EAAWC,GAAGl3C,CAAC,CAAC;AAC3C;AAEA,SAAgBu3C,GAAY,GAAiB,GAA0B;CACrE,OAAO9G,EAAO,KAAK,MAAM0G,GAAaD,GAAGl3C,CAAC,CAAC;AAC7C;AAMA,SAAgBw3C,GAAiB,GAAiB,GAAmB;CACnE,IAAM,CAACC,GAAKC,GAAKC,GAAKC,KAAOR,GAAUF,GAAGtpC,CAAC;CAC3C,OAAO;EAAC6pC;EAAKG;EAAKD;EAAKC;EAAKH;EAAKC;EAAKC;EAAKD;CAAG;AAChD;AAGA,SAAgBG,GAAkB,GAAiB,GAAyB;CAC1E,IAAMrL,IAAgB,CAAC;CACvB,KAAK,IAAIhiC,IAAI,GAAGA,IAAI,IAAIstC,EAAM,QAAQ,KAAK,GAAG;EAC5C,IAAMvH,IAAK;GAACuH,EAAMttC;GAAIstC,EAAMttC,IAAI;GAAIstC,EAAMttC,IAAI;GAAIstC,EAAMttC,IAAI;EAAE,GACxDgmC,IAAK;GAACsH,EAAMttC,IAAI;GAAIstC,EAAMttC,IAAI;GAAIstC,EAAMttC,IAAI;GAAIstC,EAAMttC,IAAI;EAAE;EAClE,EAAM,KAAK6sC,GAAYH,GAAG;GAAC,KAAK,IAAI,GAAG3G,CAAE;GAAG,KAAK,IAAI,GAAGC,CAAE;GAAG,KAAK,IAAI,GAAGD,CAAE;GAAG,KAAK,IAAI,GAAGC,CAAE;EAAC,CAAC,CAAC;CACjG;CACA,OAAOhE;AACT;AAEA,SAAgBuL,GAAW,GAAqB;CAC9C,IAAIvL,EAAM,WAAW,GAAG,OAAO;EAAE,GAAG;EAAG,GAAG;EAAG,OAAO;EAAG,QAAQ;CAAE;CACjE,IAAMuJ,IAAK,KAAK,IAAI,GAAGvJ,EAAM,KAAK,MAAM5+B,EAAE,CAAC,CAAC,GACtCooC,IAAK,KAAK,IAAI,GAAGxJ,EAAM,KAAK,MAAM5+B,EAAE,CAAC,CAAC,GACtCqoC,IAAK,KAAK,IAAI,GAAGzJ,EAAM,KAAK,MAAM5+B,EAAE,IAAIA,EAAE,KAAK,CAAC,GAChDsoC,IAAK,KAAK,IAAI,GAAG1J,EAAM,KAAK,MAAM5+B,EAAE,IAAIA,EAAE,MAAM,CAAC;CACvD,OAAO;EAAE,GAAGmoC;EAAI,GAAGC;EAAI,OAAOC,IAAKF;EAAI,QAAQG,IAAKF;CAAG;AACzD;AAGA,IAAagC,MAAO,OAAuB,KAAK,MAAMzpC,IAAI,GAAI,IAAI,IAAA,CAAM,SAAS,GC/JpE0pC,KAAmB,UAuB1BC,MAAY,MAA4B;CAC5C,IAAMC,IAAOjrB,KAAO,kBAAkB,KAAKA,CAAG,IAAIA,IAAM,WAClDtf,IAAI,SAASuqC,EAAK,MAAM,GAAG,CAAC,GAAG,EAAE,IAAI,KACrCjB,IAAI,SAASiB,EAAK,MAAM,GAAG,CAAC,GAAG,EAAE,IAAI,KACrC/qC,IAAI,SAAS+qC,EAAK,MAAM,GAAG,CAAC,GAAG,EAAE,IAAI;CAC3C,OAAOC,EAAIxqC,GAAGspC,GAAG9pC,CAAC;AACpB;AAMA,SAASirC,GAAoB,GAA6D;CACxF,IAAI,OAAOC,KAAY,YAAY,CAACA,EAAQ,WAAW,OAAO,GAAG,OAAO;CACxE,IAAM7rC,IAAQ6rC,EAAQ,MAAM,kDAAkD;CAC9E,IAAI,CAAC7rC,GAAO,OAAO;CACnB,IAAM8rC,IAAO9rC,EAAM,EAAE,CAAC,YAAY,GAC5B+rC,IAAa/rC,EAAM,EAAE,CAAC,KAAK;CACjC,IAAI;EACF,IAAMgsC,IAAgB,WAAmB;EACzC,IAAIA,KAAgB,OAAOA,EAAa,QAAS,YAAY;GAC3D,IAAMC,IAAMD,EAAa,KAAKD,GAAY,QAAQ;GAClD,OAAO;IAAE,OAAO,IAAI,WAAWE,EAAI,QAAQA,EAAI,YAAYA,EAAI,UAAU;IAAG;GAAK;EACnF;EAAO,IAAI,OAAO,OAAS,KAAa;GACtC,IAAMC,IAAS,KAAKH,CAAU,GACxBt7B,IAAQ,IAAI,WAAWy7B,EAAO,MAAM;GAC1C,KAAK,IAAInuC,IAAI,GAAGA,IAAImuC,EAAO,QAAQ,KACjC,EAAMnuC,KAAKmuC,EAAO,WAAWnuC,CAAC;GAEhC,OAAO;IAAE;IAAO;GAAK;EACvB;CACF,QAAQ;EACN,OAAO;CACT;CACA,OAAO;AACT;AAEA,SAASouC,GAAS,GAAc,GAAkB,GAA4B;CAC5E,IAAMC,IAAkBt/B,IAAW,KAC7Bu/B,IAAkB,KAAK,IAAI,GAAG,KAAK,MAAMC,IAAWF,CAAe,CAAC,GACpEG,IAAa/wC,EAAK,MAAM,IAAI,GAC5BgxC,IAAkB,CAAC;CAEzB,KAAK,IAAMj5C,KAAKg5C,GAAY;EAC1B,IAAI,CAACh5C,GAAG;GACN,EAAM,KAAK,EAAE;GACb;EACF;EACA,IAAMw6B,IAAQx6B,EAAE,MAAM,KAAK,GACvBk5C,IAAc;EAElB,KAAK,IAAMC,KAAQ3e,GACjB,AAAK0e,KAEOA,IAAc,MAAMC,EAAA,CAAM,UAAUL,IAC9C,KAAe,MAAMK,KAErBF,EAAM,KAAKC,CAAW,GACtB,IAAcC,KALd,IAAcA;EAQlB,AAAID,KACFD,EAAM,KAAKC,CAAW;CAE1B;CACA,OAAOD;AACT;AAEA,eAAeG,GAAe,GAAqB,GAAe,GAAiB,GAAiB,GAAoC;CACtI,IAAMzM,IAAQuL,GAAS9tB,EAAI,KAAK,GAC1BvC,IAAUuC,EAAI,WAAW,GACzBwiB,IAAcxiB,EAAI,eAAe,GAEjC,CAACqtB,GAAKC,GAAKC,GAAKC,KADTR,GAAUF,GAAG;EAAE,GAAG9sB,EAAI;EAAG,GAAGA,EAAI;EAAG,OAAOA,EAAI;EAAO,QAAQA,EAAI;CAAO,CACxD,GACvB9M,IAAIq6B,IAAMF,GACVl6B,IAAIq6B,IAAMF,GAGV2B,IAAaC,GAAQpC,EAAE,MAAM,GAC7BqC,KAAmB,GAAW,GAAW,MAAiBtC,EAAWC,GAAG;EAAE;EAAG,GAAG53C,IAAI0oB;CAAK,CAAC;CAEhG,QAAQoC,EAAI,MAAZ;EACE,KAAK;GACH,EAAK,cAAc;IAAE,GAAGqtB;IAAK,GAAGC;IAAK,OAAOp6B;IAAG,QAAQC;IAAG;IAAO;IAAS,aAAaovB;IAAO,aAAaC;IAAa,eAAe;GAAE,CAAC;GAC1I;EACF,KAAK;GACH,EAAK,YAAY;IAAE,GAAG6K,IAAMn6B,IAAI;IAAG,GAAGo6B,IAAMn6B,IAAI;IAAG,QAAQD,IAAI;IAAG,QAAQC,IAAI;IAAG;IAAO;IAAS,aAAaovB;IAAO,aAAaC;IAAa,eAAe;GAAE,CAAC;GACjK;EACF,KAAK,aAAa;GAChB,IAAMJ,IAAQpiB,EAAI,SAASA,EAAI,MAAM,SAAS,IAAIA,EAAI,QAAQ,CAAC;IAAE,GAAGA,EAAI;IAAG,GAAGA,EAAI;IAAG,OAAOA,EAAI;IAAO,QAAQA,EAAI;GAAO,CAAC;GAC3H,KAAK,IAAM,KAAKoiB,GAAO;IACrB,IAAM,CAACuJ,GAAIC,GAAIC,GAAIC,KAAMkB,GAAUF,GAAG,CAAC;IACvC,EAAK,cAAc;KAAE,GAAGnB;KAAI,GAAGC;KAAI,OAAOC,IAAKF;KAAI,QAAQG,IAAKF;KAAI;KAAO,SAASnuB,IAAU,IAAIA,IAAU;KAAK,WAAW2xB,GAAU;IAAS,CAAC;GAClJ;GACA;EACF;EACA,KAAK,aAAa;GAChB,IAAMhN,IAAQpiB,EAAI,SAASA,EAAI,MAAM,SAAS,IAAIA,EAAI,QAAQ,CAAC;IAAE,GAAGA,EAAI;IAAG,GAAGA,EAAI;IAAG,OAAOA,EAAI;IAAO,QAAQA,EAAI;GAAO,CAAC;GAC3H,KAAK,IAAM,KAAKoiB,GAAO;IACrB,IAAM,CAAC3iC,GAAGiH,KAAKwmC,GAAUJ,GAAG,CAC1B;KAAE,GAAG,EAAE;KAAG,GAAG,EAAE,IAAI,EAAE,SAAS;IAAI,GAClC;KAAE,GAAG,EAAE,IAAI,EAAE;KAAO,GAAG,EAAE,IAAI,EAAE,SAAS;IAAI,CAC9C,CAAC;IACD,EAAK,SAAS;KAAE,OAAOrtC;KAAG,KAAKiH;KAAG;KAAO;KAAS,WAAW87B,KAAe;IAAI,CAAC;GACnF;GACA;EACF;EACA,KAAK,aAAa;GAChB,IAAMJ,IAAQpiB,EAAI,SAASA,EAAI,MAAM,SAAS,IAAIA,EAAI,QAAQ,CAAC;IAAE,GAAGA,EAAI;IAAG,GAAGA,EAAI;IAAG,OAAOA,EAAI;IAAO,QAAQA,EAAI;GAAO,CAAC;GAC3H,KAAK,IAAM,KAAKoiB,GAAO;IACrB,IAAM,CAAC3iC,GAAGiH,KAAKwmC,GAAUJ,GAAG,CAC1B;KAAE,GAAG,EAAE;KAAG,GAAG,EAAE,IAAI,EAAE,SAAS;IAAE,GAChC;KAAE,GAAG,EAAE,IAAI,EAAE;KAAO,GAAG,EAAE,IAAI,EAAE,SAAS;IAAE,CAC5C,CAAC;IACD,EAAK,SAAS;KAAE,OAAOrtC;KAAG,KAAKiH;KAAG;KAAO;KAAS,WAAW87B,KAAe;IAAI,CAAC;GACnF;GACA;EACF;EACA,KAAK,YAAY;GACf,IAAMJ,IAAQpiB,EAAI,SAASA,EAAI,MAAM,SAAS,IAAIA,EAAI,QAAQ,CAAC;IAAE,GAAGA,EAAI;IAAG,GAAGA,EAAI;IAAG,OAAOA,EAAI;IAAO,QAAQA,EAAI;GAAO,CAAC;GAC3H,KAAK,IAAM,KAAKoiB,GAAO;IACrB,IAAMiN,IAAc,CAAC,GAEjBjuB,IAAK;IACT,KAAK,IAAIkuB,IAAO,EAAE,GAAGA,KAAQ,EAAE,IAAI,EAAE,OAAO,KAAQ,GAElD,AADAD,EAAY,KAAK;KAAE,GAAGC;KAAM,GAAG,EAAE,IAAI,EAAE,UAAUluB,IAAK,IAAI;IAAG,CAAC,GAC9D,IAAK,CAACA;IAER,IAAIiuB,EAAY,UAAU,GAAG;KAC3B,IAAME,IAASrC,GAAUJ,GAAGuC,CAAW;KACvC,KAAK,IAAIjvC,IAAI,GAAGA,IAAImvC,EAAO,QAAQ,KACjC,EAAK,SAAS;MAAE,OAAOA,EAAOnvC,IAAI;MAAI,KAAKmvC,EAAOnvC;MAAI;MAAO;MAAS,WAAWoiC,KAAe;KAAI,CAAC;IAEzG;GACF;GACA;EACF;EACA,KAAK;EACL,KAAK,SAAS;GACZ,IAAMgN,IAAMxvB,EAAI,UAAUA,EAAI,OAAO,UAAU,IAAIA,EAAI,SAAS,CAAC;IAAE,GAAGA,EAAI;IAAG,GAAGA,EAAI;GAAE,GAAG;IAAE,GAAGA,EAAI,IAAIA,EAAI;IAAO,GAAGA,EAAI,IAAIA,EAAI;GAAO,CAAC,GAClI,CAACvgB,GAAGiH,KAAKwmC,GAAUJ,GAAG,CAAC0C,EAAI,IAAIA,EAAI,EAAE,CAAC;GAE5C,IADAhyC,EAAK,SAAS;IAAE,OAAOiC;IAAG,KAAKiH;IAAG;IAAO;IAAS,WAAW87B;GAAY,CAAC,GACtExiB,EAAI,SAAS,SAAS;IAExB,IAAMS,IAAK+uB,EAAI,IAAI9uB,IAAK8uB,EAAI,IACtB7uB,IAAQ,KAAK,MAAMD,EAAG,IAAID,EAAG,GAAGC,EAAG,IAAID,EAAG,CAAC,GAC3CG,IAAU,KAAK4hB,GAGf,CAACiN,GAAKC,KAAOxC,GAAUJ,GAAG,CAAC;KAFpB,GAAGpsB,EAAG,IAAIE,IAAU,KAAK,IAAID,IAAQ,KAAK,KAAK,CAAC;KAAG,GAAGD,EAAG,IAAIE,IAAU,KAAK,IAAID,IAAQ,KAAK,KAAK,CAAC;IAE/E,GAAI;KADxB,GAAGD,EAAG,IAAIE,IAAU,KAAK,IAAID,IAAQ,KAAK,KAAK,CAAC;KAAG,GAAGD,EAAG,IAAIE,IAAU,KAAK,IAAID,IAAQ,KAAK,KAAK,CAAC;IAC3E,CAAE,CAAC;IAExC,AADAnjB,EAAK,SAAS;KAAE,OAAOiyC;KAAK,KAAK/oC;KAAG;KAAO;KAAS,WAAW87B;IAAY,CAAC,GAC5EhlC,EAAK,SAAS;KAAE,OAAOkyC;KAAK,KAAKhpC;KAAG;KAAO;KAAS,WAAW87B;IAAY,CAAC;GAC9E;GACA;EACF;EACA,KAAK,YAAY;GACf,IAAM/gB,IAAUzB,EAAI,WAAWA,EAAI,QAAQ,SAAS,IAAIA,EAAI,UAAUA,EAAI,SAAS,CAACA,EAAI,MAAM,IAAI,CAAC;GACnG,KAAK,IAAM0B,KAAMD,GAAS;IACxB,IAAM8tB,IAASrC,GAAUJ,GAAGprB,CAAE;IAC9B,KAAK,IAAIthB,IAAI,GAAGA,IAAImvC,EAAO,QAAQ,KACjC,EAAK,SAAS;KAAE,OAAOA,EAAOnvC,IAAI;KAAI,KAAKmvC,EAAOnvC;KAAI;KAAO;KAAS,WAAWoiC;KAAa,SAAS;IAAE,CAAC;GAE9G;GACA;EACF;EACA,KAAK,QAAQ;GACX,IAAI,CAACxiB,EAAI,MAAM;GACf,IAAM2vB,IAAW3vB,EAAI,SAASA,EAAI,QAAQ,IAAIA,EAAI,QAAQ,KACpD6uB,IAAQL,GAASxuB,EAAI,MAAM2vB,GAAU,EAAE;GAE7C,KAAK,IAAIvvC,IAAI,GAAGA,IAAIyuC,EAAM,QAAQ,KAAK;IACrC,IAAI,CAACA,EAAMzuC,IAAI;IACf,IAAM4C,IAAImsC,EAAgBnvB,EAAI,GAAGA,EAAI,IAAI5f,IAAI,IAAY,EAAE;IAC3D,EAAK,SAASyuC,EAAMzuC,IAAI;KAAE,GAAG4C,EAAE;KAAG,GAAGA,EAAE;KAAG,MAAM;KAAI;KAAO;KAAS,QAAQisC;IAAW,CAAC;GAC1F;GACA;EACF;EACA,KAAK,QAAQ;GACX,IAAM,CAACW,GAAKC,GAAKC,GAAKC,KAAO/C,GAAUF,GAAG;IAAE,GAAG9sB,EAAI;IAAG,GAAGA,EAAI;IAAG,OAAO;IAAI,QAAQ;GAAG,CAAC;GAEvF,IADAxiB,EAAK,cAAc;IAAE,GAAGoyC;IAAK,GAAGC;IAAK,OAAOC,IAAMF;IAAK,QAAQG,IAAMF;IAAK,OAAO7B,EAAI,GAAG,KAAM,EAAG;IAAG,aAAazL;IAAO,aAAaC;GAAY,CAAC,GAC9IxiB,EAAI,MAAM;IACZ,IAAMhd,IAAImsC,EAAgBnvB,EAAI,IAAI,IAAIA,EAAI,GAAG,EAAE;IAC/C,EAAK,SAASA,EAAI,MAAM;KAAE,GAAGhd,EAAE;KAAG,GAAGA,EAAE;KAAG,MAAM;KAAI;KAAO;KAAS,QAAQisC;IAAW,CAAC;GAC1F;GACA;EACF;EACA,KAAK,WAAW;GACd,IAAMO,IAAMxvB,EAAI,UAAUA,EAAI,OAAO,UAAU,IAAIA,EAAI,SAAS,CAAC;IAAE,GAAGA,EAAI;IAAG,GAAGA,EAAI;GAAE,GAAG;IAAE,GAAGA,EAAI;IAAG,GAAGA,EAAI;GAAE,CAAC,GACzG,CAACvgB,GAAGiH,KAAKwmC,GAAUJ,GAAG,CAAC0C,EAAI,IAAIA,EAAI,EAAE,CAAC;GAE5C,IADAhyC,EAAK,SAAS;IAAE,OAAOiC;IAAG,KAAKiH;IAAG;IAAO;IAAS,WAAW87B;GAAY,CAAC,GACtExiB,EAAI,MAAM;IACZ,IAAMO,IAAOP,EAAI,KAAK,SAAS,IAAI,IAC7B,CAACgwB,GAAKC,GAAKC,GAAKC,KAAOnD,GAAUF,GAAG;KAAE,GAAG0C,EAAI,EAAE,CAAC;KAAG,GAAGA,EAAI,EAAE,CAAC;KAAG,OAAOjvB;KAAM,QAAQ;IAAG,CAAC;IAC/F,EAAK,cAAc;KAAE,GAAGyvB;KAAK,GAAGC;KAAK,OAAOC,IAAMF;KAAK,QAAQG,IAAMF;KAAK,OAAOjC,EAAI,GAAG,GAAG,CAAC;KAAG,aAAazL;KAAO,aAAaC;IAAY,CAAC;IAC7I,IAAMx/B,IAAImsC,EAAgBK,EAAI,EAAE,CAAC,IAAI,IAAIA,EAAI,EAAE,CAAC,IAAI,GAAG,EAAE;IACzD,EAAK,SAASxvB,EAAI,MAAM;KAAE,GAAGhd,EAAE;KAAG,GAAGA,EAAE;KAAG,MAAM;KAAI;KAAO;KAAS,QAAQisC;IAAW,CAAC;GAC1F;GACA;EACF;EACA,KAAK,aAAa;GAChB,IAAI,CAACjvB,EAAI,UAAU;GACnB,IAAMowB,IAAa,MAAM,MAAMpwB,EAAI,QAAQ,CAAC,CAAC,MAAM,MAAQ6V,EAAI,YAAY,CAAC,GACtEwa,IAAQrwB,EAAI,SAAS,WAAW,iBAAiB,KAAKA,EAAI,SAAS,WAAW,gBAAgB,IAChG,MAAMxd,EAAO,SAAS4tC,CAAU,IAChC,MAAM5tC,EAAO,SAAS4tC,CAAU;GACpC,EAAK,UAAUC,GAAO;IAAE,GAAGhD;IAAK,GAAGC;IAAK,OAAOp6B;IAAG,QAAQC;IAAG,QAAQ87B;GAAW,CAAC;GACjF;EACF;EACA,KAAK,iCAAiC;GACpC,IAAMttB,IAAU3B,EAAI,YAAY,IAAI,KAAKA,EAAI,SAAS,CAAC,CAAC,eAAe,OAAO,qBAAI,IAAI,KAAK,EAAA,CAAE,eAAe,OAAO,GAC7GiC,IAAQ/O,IAAI;GAOlB,AANA1V,EAAK,cAAc;IAAE,GAAG6vC;IAAK,GAAGC;IAAK,OAAOp6B;IAAG,QAAQC;IAAG,OAAO66B,EAAI,GAAG,GAAG,CAAC;IAAG,aAAaA,EAAI,MAAM,KAAK,MAAM,KAAK,MAAM,GAAG;IAAG,aAAa;GAAE,CAAC,GAClJxwC,EAAK,SAAS;IAAE,OAAO;KAAE,GAAG6vC,IAAMprB;KAAO,GAAGqrB;IAAI;IAAG,KAAK;KAAE,GAAGD,IAAMprB;KAAO,GAAGqrB,IAAMn6B;IAAE;IAAG,OAAO66B,EAAI,MAAM,KAAK,MAAM,KAAK,MAAM,GAAG;IAAG,WAAW;GAAE,CAAC,GACnJxwC,EAAK,YAAY,qDAAqD;IAAE,GAAG6vC,IAAMprB,IAAQ,IAAI;IAAI,GAAGqrB,IAAMn6B,IAAI,IAAI;IAAI,aAAa66B,EAAI,IAAI,KAAK,MAAM,KAAK,MAAM,GAAG;IAAG,aAAa;IAAG,OAAO;GAAE,CAAC,GACjMxwC,EAAK,YAAY,sBAAsB;IAAE,GAAG6vC,IAAMprB,IAAQ,IAAI;IAAI,GAAGqrB,IAAMn6B,IAAI,IAAI;IAAI,aAAa66B,EAAI,IAAI,KAAK,MAAM,KAAK,MAAM,GAAG;IAAG,aAAa;IAAG,OAAO;GAAE,CAAC,GAClKxwC,EAAK,SAAS,uBAAuBwiB,EAAI,UAAUpO,KAAc,oBAAoB;IAAE,GAAGy7B,IAAMprB,IAAQ;IAAI,GAAGqrB,IAAMn6B,IAAI;IAAI,MAAM;IAAI,OAAO66B,EAAI,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;GAAE,CAAC,GACjLxwC,EAAK,SAAS,SAASmkB,KAAW;IAAE,GAAG0rB,IAAMprB,IAAQ;IAAI,GAAGqrB,IAAMn6B,IAAI;IAAI,MAAM;IAAG,OAAO66B,EAAI,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;GAAE,CAAC,GAC7HxwC,EAAK,SAAS,6BAA6B;IAAE,GAAG6vC,IAAMprB,IAAQ;IAAI,GAAGqrB,IAAMn6B,IAAI;IAAI,MAAM;IAAG,OAAO66B,EAAI,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;GAAE,CAAC;GACtI;EACF;EAGA,SACE;CACJ;AACF;AAEA,eAAesC,GAAc,GAAqB,GAAqC;CACrF,IAAMC,IAAUzC,GAASxwB,EAAG,SAAS,SAAS,GACxCkzB,IAAYlzB,EAAG,WAAW,KAC1BmzB,IAAgB,MAAMjuC,EAAO,UAAUkuC,EAAc,SAAS,GAC9D/vB,IAAQ,CAAC,KAAK,KAAK,GACnBgwB,IAAO,KAAK,IAAIhwB,CAAK,GACrBiwB,IAAO,KAAK,IAAIjwB,CAAK;CAE3B,KAAK,IAAMnjB,KAAQgF,EAAO,SAAS,GAAG;EACpC,IAAM,EAAE,UAAO,cAAWhF,EAAK,QAAQ;EACvC,IAAI8f,EAAG,SAAS,UAAU;GACxB,IAAMnO,IAAWmO,EAAG,QAAQ,IAEtBzF,IAAK,CADO44B,EAAc,kBAAkBnzB,EAAG,MAAMnO,CAC/C,IAAY,GAClB2I,IAAK,CAAC3I,IAAW;GACvB,EAAK,SAASmO,EAAG,MAAM;IACrB,GAAGtb,IAAQ,KAAK6V,IAAK84B,IAAO74B,IAAK84B;IACjC,GAAG3uC,IAAS,KAAK4V,IAAK+4B,IAAO94B,IAAK64B;IAClC,MAAMxhC;IAAU,MAAMshC;IAAe,OAAOF;IAAS,SAASC;IAAW,QAAQtB,GAAQ,GAAG;GAC9F,CAAC;EACH,OAAO;GACL,IAAM//B,IAAWmO,EAAG,QAAQ,IACtBuzB,IAAYJ,EAAc,kBAAkBnzB,EAAG,MAAMnO,CAAQ,GAC7D2hC,IAAQD,IAAY,KAEpBh5B,IAAK,CAACg5B,IAAY,GAClB/4B,IAAK,CAAC3I,IAAW,KACjB4hC,IAAYl5B,IAAK84B,IAAO74B,IAAK84B,GAC7BI,IAAYn5B,IAAK+4B,IAAO94B,IAAK64B;GACnC,KAAK,IAAIz7C,IAAI,CAAC+M,GAAQ/M,IAAI+M,IAAS,GAAG,KAAK,KAAO;IAChD,IAAMysB,IAAU,KAAK,IAAIx5B,IAAI,GAAK,IAAI,KAAM47C,IAAQ;IACpD,KAAK,IAAI97C,IAAI,CAACgN,GAAOhN,IAAIgN,IAAQ,GAAG,KAAK8uC,GACvC,EAAK,SAASxzB,EAAG,MAAM;KAAE,GAAGtoB,IAAI05B,IAASqiB;KAAW,GAAG77C,IAAI87C;KAAW,MAAM7hC;KAAU,MAAMshC;KAAe,OAAOF;KAAS,SAASC;KAAW,QAAQtB,GAAQ,GAAG;IAAE,CAAC;GAEzK;EACF;CACF;AACF;AAEA,eAAe+B,GAAoB,GAAqB,GAA+C;CACrG,IAAMC,IAAa,MAAM1uC,EAAO,KAAK,GAC/BmhC,IAAc5xC,GAAS,YAAY;EAAE,MAAMm/C;EAAY,GAAGtqB,GAAkB;CAAE,CAAC,GAC/EuqB,IAAY,MAAMxN,EAAY,SAC9ByN,IAAe,MAAMC,GAAY,OAAO;CAE9C,IAAI;EACF,KAAK,IAAIjxC,IAAI,GAAGA,KAAK+wC,EAAU,UAAU,KAAK;GAC5C,IAAM5tC,IAAiBD,EAAW,QAAQ,MAAME,EAAE,cAAcpD,CAAC;GACjE,IAAImD,EAAe,SAAS,GAAG;IAC7B,IAAM+tC,IAAa,MAAMH,EAAU,QAAQ/wC,CAAC,GAEtCsH,IAAW4pC,EAAW,YAAY,EAAE,OAAO,EAAY,CAAC,GACxD3pC,IAAS,SAAS,cAAc,QAAQ;IAE9C,AADA,EAAO,QAAQD,EAAS,OACxB,EAAO,SAASA,EAAS;IACzB,IAAME,IAAMD,EAAO,WAAW,IAAI;IAClC,IAAIC,GAAK;KAGP,AAFA,MAAM0pC,EAAW,OAAO;MAAE,eAAe1pC;MAAK;MAAQ;KAAS,CAAC,CAAC,CAAC,SAClEA,EAAI,KAAK,GACT,EAAI,YAAY;KAChB,KAAK,IAAMoV,KAAazZ,GACtB,EAAI,SACF,KAAK,MAAMyZ,EAAU,IAAI,CAAW,GACpC,KAAK,MAAMA,EAAU,IAAI,CAAW,GACpC,KAAK,KAAKA,EAAU,QAAQ,CAAW,GACvC,KAAK,KAAKA,EAAU,SAAS,CAAW,CAC1C;KAEF,EAAI,QAAQ;KACZ,IAAMu0B,IAAa5pC,EAAO,UAAU,cAAc,GAAI,GAChD6pC,IAAW,MAAM,MAAMD,CAAU,CAAC,CAAC,MAAM,MAAQ1b,EAAI,YAAY,CAAC,GAClE4b,IAAW,MAAML,EAAa,SAASI,CAAQ,GAC/CE,IAAaJ,EAAW,YAAY,EAAE,OAAO,EAAE,CAAC;KAItD,AAFAF,EAD6B,QAAQ,CAACM,EAAW,OAAOA,EAAW,MAAM,CACzE,CAAA,CAAQ,UAAUD,GAAU;MAAE,GAAG;MAAG,GAAG;MAAG,OAAOC,EAAW;MAAO,QAAQA,EAAW;KAAO,CAAC,GAC9F,EAAO,QAAQ,GACf,EAAO,SAAS;IAClB;IACA,EAAW,QAAQ;GACrB,OAAO;IACL,IAAM,CAACC,KAAc,MAAMP,EAAa,UAAU5uC,GAAQ,CAACpC,IAAI,CAAC,CAAC;IACjE,EAAa,QAAQuxC,CAAU;GACjC;GACA,AAAIvxC,IAAI,KAAM,KAAG,MAAM,IAAI,SAAS,MAAY,WAAWoE,GAAS,CAAC,CAAC;EACxE;CACF,UAAU;EACR,MAAMm/B,EAAY,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC;CAC5C;CACA,OAAOyN;AACT;AAEA,eAAsBQ,GAAc,GAAoB,IAAyB,CAAC,GAAwB;CACxG,AAAIjkC,EAAQ,cACV,QAAQ,KAAK,oIAAoI;CAGnJ,IAAMpR,IAAM,MAAMs1C,EAAM,eAAe,GACjCC,IAAcv1C,aAAe,aAAaA,IAAM,IAAI,WAAWA,CAAG;CACxE,IAAIu1C,EAAY,aAAA,UAA+B;EAC7C,IAAMC,KAAUD,EAAY,aAAc,QAAA,CAAc,QAAQ,CAAC;EACjE,MAAU,MACR,sBAAsBC,EAAO,mHAE/B;CACF;CAEA,IAAMvvC,IAAS,MAAM6uC,GAAY,KAAKS,GAAa,EAAE,kBAAkB,GAAK,CAAC,GACvEhvC,IAAQN,EAAO,SAAS,GACxBwvC,IAAOrkC,EAAQ,uBAAuBkkC,EAAM,aAG9CI,IAAkBJ,EAAM,iBACxBK,IAAuD;CAC3D,AAAI,CAACD,KAAmBD,EAAK,SAAS,MACpC,IAAejgD,GAAS,YAAY;EAAE,MAAM+/C,EAAY,MAAM;EAAG,GAAGlrB,GAAkB;CAAE,CAAC,GACzF,IAAkB+lB,GAAuB,MAAMuF,EAAa,OAAO;CAGrE,IAAI;EACF,KAAK,IAAMlyB,KAAOgyB,GAAM;GACtB,IAAMG,IAAU,KAAK,IAAI,GAAG,KAAK,KAAKnyB,EAAI,aAAa,KAAK,GAAGld,EAAM,SAAS,CAAC,CAAC,GAC1EgqC,IAAI,MAAMmF,EAAiBE,IAAU,CAAC;GAC5C,MAAMnD,GAAexsC,GAAQM,EAAMqvC,IAAUrF,GAAG9sB,GAAK6xB,EAAM,UAAU;EACvE;CACF,UAAU;EACR,AAAIK,KAAc,MAAMA,EAAa,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC;CAC/D;CAGA,IAAIL,EAAM,cAAcA,EAAM,WAAW,SAAS,GAAG;EACnD,IAAMO,IAAO5vC,EAAO,QAAQ,GACtBkT,IAASm8B,EAAM,YAAY,CAAC,GAC5BQ,oBAAiB,IAAI,IAAY,GAEjCC,KAAsB,MAA6B;GACvD,IAAIhoC,KAAQioC,KAAY,QAAA,CAAS,KAAK;GACtC,IAAI,CAACF,EAAe,IAAI/nC,CAAI,GAE1B,OADA+nC,EAAe,IAAI/nC,CAAI,GAChBA;GAET,IAAIkoC,IAAU;GACd,OAAOH,EAAe,IAAI,GAAG/nC,EAAK,GAAGkoC,GAAS,IAC5C;GAEF,IAAMC,IAAa,GAAGnoC,EAAK,GAAGkoC;GAE9B,OADAH,EAAe,IAAII,CAAU,GACtBA;EACT;EAEA,KAAK,IAAMjoC,KAASqnC,EAAM,YAAY;GACpC,IAAMM,IAAU,KAAK,IAAI,GAAG,KAAK,KAAK3nC,EAAM,aAAa,KAAK,GAAG1H,EAAM,SAAS,CAAC,CAAC,GAC5Em/B,IAAan/B,EAAMqvC,IAErBrF,IAAyB;GAC7B,IAAImF,GACF,IAAI;IACF,IAAI,MAAMA,EAAgBE,IAAU,CAAC;GACvC,QAAQ,CAAC;GAEX,IAAI,CAACrF,GAAG;IACN,IAAM,EAAE,UAAO,cAAW7K,EAAW,QAAQ;IAC7C,IAAIwJ,GAAmB0G,IAAU,GAAG;KAAC;KAAG;KAAGnwC;KAAOC;IAAM,GAAGggC,EAAW,YAAY,CAAC,CAAC,KAAK;GAC3F;GAGA,IAAM,CAACoL,GAAKC,GAAKC,GAAKC,KADTR,GAAUF,GAAG;IAAE,GAAGtiC,EAAM;IAAG,GAAGA,EAAM;IAAG,OAAOA,EAAM;IAAO,QAAQA,EAAM;GAAO,CAChE,GACvB0I,IAAI,KAAK,IAAI,IAAIq6B,IAAMF,CAAG,GAC1Bl6B,IAAI,KAAK,IAAI,IAAIq6B,IAAMF,CAAG,GAC1BoF,IAAYh9B,EAAOlL,EAAM,UAAU,KAAA,IAAiCA,EAAM,eAA3BkL,EAAOlL,EAAM,OAC5DmoC,IAAkBL,EAAmB9nC,EAAM,IAAI;GAErD,IAAI;IACF,IAAIA,EAAM,SAAS,UAAWA,EAAM,SAAoB,WAAW;KACjE,IAAMooC,IAAKR,EAAK,gBAAgBO,CAAe;KAE/C,IADAC,EAAG,UAAU3Q,GAAY;MAAE,GAAGoL;MAAK,GAAGC;MAAK,OAAOp6B;MAAG,QAAQC;KAAE,CAAC,GAC5D3I,EAAM,UACR,IAAI;MAAE,EAAG,YAAYA,EAAM,QAAQ;KAAG,QAAQ,CAAC;KAEjD,AAAIkoC,KAAyC,QAAQA,MAAc,MAAIE,EAAG,QAAQ,OAAOF,CAAS,CAAC;IACrG,OAAO,IAAIloC,EAAM,SAAS,YAAY;KACpC,IAAMooC,IAAKR,EAAK,gBAAgBO,CAAe;KAG/C,IAFAC,EAAG,gBAAgB,GACnBA,EAAG,UAAU3Q,GAAY;MAAE,GAAGoL;MAAK,GAAGC;MAAK,OAAOp6B;MAAG,QAAQC;KAAE,CAAC,GAC5D3I,EAAM,UACR,IAAI;MAAE,EAAG,YAAYA,EAAM,QAAQ;KAAG,QAAQ,CAAC;KAEjD,AAAIkoC,KAAyC,QAAQA,MAAc,MAAIE,EAAG,QAAQ,OAAOF,CAAS,CAAC;IACrG,OAAO,IAAIloC,EAAM,SAAS,YAAY;KACpC,IAAMooC,IAAKR,EAAK,gBAAgBO,CAAe;KAE/C,IADAC,EAAG,UAAU3Q,GAAY;MAAE,GAAGoL;MAAK,GAAGC;MAAK,OAAOp6B;MAAG,QAAQC;KAAE,CAAC,GAC5D3I,EAAM,UACR,IAAI;MAAE,EAAG,YAAYA,EAAM,QAAQ;KAAG,QAAQ,CAAC;KAEjD,AAAIkoC,KAAyC,QAAQA,MAAc,MAAIE,EAAG,QAAQ,OAAOF,CAAS,CAAC;IACrG,OAAO,IAAIloC,EAAM,SAAS,YAAY;KACpC,IAAMqoC,IAAKT,EAAK,eAAeO,CAAe;KAE9C,AADAE,EAAG,UAAU5Q,GAAY;MAAE,GAAGoL;MAAK,GAAGC;MAAK,OAAOp6B;MAAG,QAAQC;KAAE,CAAC,GACpDu/B,KAAYG,EAAG,MAAM;IACnC,OAAO,IAAIroC,EAAM,SAAS,YAAY;KACpC,IAAMsoC,IAAKV,EAAK,eAAeO,CAAe;KAG9C,AAFInoC,EAAM,WAAWA,EAAM,QAAQ,SAAS,KAAGsoC,EAAG,WAAWtoC,EAAM,OAAO,GAC1EsoC,EAAG,UAAU7Q,GAAY;MAAE,GAAGoL;MAAK,GAAGC;MAAK,OAAOp6B;MAAG,QAAQC;KAAE,CAAC,GAC5Du/B,KAAWI,EAAG,OAAO,OAAOJ,CAAS,CAAC;IAC5C,OAAO,IAAIloC,EAAM,SAAS,aAAa;KACrC,IAAMkB,IAAOlB,EAAM,WAAWA,EAAM,QAAQ,SAAS,IAAIA,EAAM,UAAU,CAAC,QAAQ,GAC5E3G,IAAQsP,IAAIzH,EAAK,QACjBqnC,IAAe,MAAM,QAAQL,CAAS,IAAIA,IAAY,CAAC;KAC7D,EAAK,SAAS,GAAK,MAAQ;MACzB,IAAMG,IAAKT,EAAK,eAAeE,EAAmB,GAAG9nC,EAAM,KAAK,GAAGE,GAAK,CAAC;MAOzE,AANAmoC,EAAG,UAAU5Q,GAAY;OACvB,GAAGoL;OACH,GAAGC,IAAMn6B,KAAKzI,IAAM,KAAK7G,IAAQ;OACjC,OAAO,KAAK,IAAIA,IAAQ,GAAG,EAAE;OAC7B,QAAQ,KAAK,IAAIA,IAAQ,GAAG,EAAE;MAChC,CAAC,GACGkvC,EAAa,SAAStiC,CAAG,KAAGoiC,EAAG,MAAM;KAC3C,CAAC;IACH,OAAO,IAAIroC,EAAM,SAAS,aAAa;KACrC,IAAM0jC,IAAU,OAAOwE,KAAc,YAAYA,IAAaA,EAAU,WAAYA,EAAkB,WAAa,OAAOA,KAAc,YAAYA,EAAU,WAAW,OAAO,IAAIA,IAAY,KAAA;KAChM,IAAIxE,GACF,IAAI;MACF,IAAM8E,IAAU/E,GAAoBC,CAAO,GACrCkC,IAAa4C,IAAUA,EAAQ,QAAQ,MAAM,MAAM9E,CAAO,CAAC,CAAC,MAAM,MAAQrY,EAAI,YAAY,CAAC,GAE3Fwa,IADS2C,MAAYA,EAAQ,SAAS,gBAAgBA,EAAQ,SAAS,gBAAiB9E,EAAQ,WAAW,iBAAiB,KAAKA,EAAQ,WAAW,gBAAgB,IAEtK,MAAM1rC,EAAO,SAAS4tC,CAAU,IAChC,MAAM5tC,EAAO,SAAS4tC,CAAU;MAEpC,IADAnO,EAAW,UAAUoO,GAAO;OAAE,GAAGhD;OAAK,GAAGC;OAAK,OAAOp6B;OAAG,QAAQC;MAAE,CAAC,GAC/D,OAAOu/B,KAAc,YAAYA,GAAW,YAC9C,IAAI;OACF,EAAW,SAAS,uBAAuBA,EAAU,cAAc;QACjE,GAAGrF;QACH,GAAG,KAAK,IAAI,GAAGC,IAAM,EAAE;QACvB,MAAM;QACN,OAAOU,EAAI,MAAM,KAAK,MAAM,KAAK,MAAM,GAAG;OAC5C,CAAC;MACH,QAAQ,CAAC;KAEb,SAAS/jC,GAAK;MACZ,QAAQ,KAAK,6CAA6CA,CAAG;KAC/D;UAMA,AAHAg4B,EAAW,cAAc;MAAE,GAAGoL;MAAK,GAAGC;MAAK,OAAOp6B;MAAG,QAAQC;MAAG,OAAO66B,EAAI,GAAG,GAAG,CAAC;MAAG,aAAaA,EAAI,MAAM,KAAK,MAAM,KAAK,MAAM,GAAG;MAAG,aAAa;KAAE,CAAC,GACxJ/L,EAAW,SAAS;MAAE,OAAO;OAAE,GAAGoL,IAAM;OAAG,GAAGC,IAAM;MAAG;MAAG,KAAK;OAAE,GAAGD,IAAMn6B,IAAI;OAAG,GAAGo6B,IAAM;MAAG;MAAG,OAAOU,EAAI,MAAM,KAAK,MAAM,KAAK,MAAM,GAAG;MAAG,WAAW;KAAE,CAAC,GAC3J/L,EAAW,SAAS,KAAK;MAAE,GAAGoL,IAAM;MAAI,GAAGC,IAAM;MAAI,MAAM;MAAI,OAAOU,EAAI,MAAM,KAAK,MAAM,KAAK,MAAM,GAAG;KAAE,CAAC,GAC5G/L,EAAW,SAASz3B,EAAM,SAAS,aAAa;MAAE,GAAG6iC,IAAM;MAAI,GAAGC,IAAM;MAAI,MAAM;MAAK,OAAOU,EAAI,MAAM,KAAK,MAAM,KAAK,MAAM,GAAG;KAAE,CAAC;IAExI,OAAO,IAAIxjC,EAAM,SAAS,qBAAqB;KAC7C,IAAMqQ,IAAW,GAAQ,OAAO63B,KAAc,YAAYA,MAAcA,EAAU,cAAcA,EAAU,mBACpGO,IAAU,OAAOP,KAAc,YAAYA,GAAW,eAAgB,OAAOA,KAAc,WAAWA,IAAYb,EAAM,eAAe,qBACvIlwB,IAAW,OAAO+wB,KAAc,YAAYA,GAAW,YAAa,IAAI,KAAKA,EAAU,SAAS,CAAC,CAAC,eAAe,OAAO,qBAAI,IAAI,KAAK,EAAA,CAAE,eAAe,OAAO,GAC7JQ,IAAU,OAAOR,KAAc,YAAYA,GAAW,UAAW,qBACjEzwB,IAAQ,KAAK,IAAI/O,IAAI,KAAM,EAAE;KAMnC,AAJA+uB,EAAW,cAAc;MAAE,GAAGoL;MAAK,GAAGC;MAAK,OAAOp6B;MAAG,QAAQC;MAAG,OAAO66B,EAAI,GAAG,GAAG,CAAC;MAAG,aAAaA,EAAI,MAAM,KAAK,MAAM,KAAK,MAAM,GAAG;MAAG,aAAa;KAAE,CAAC,GACxJ/L,EAAW,SAAS;MAAE,OAAO;OAAE,GAAGoL,IAAMprB;OAAO,GAAGqrB;MAAI;MAAG,KAAK;OAAE,GAAGD,IAAMprB;OAAO,GAAGqrB,IAAMn6B;MAAE;MAAG,OAAO66B,EAAI,MAAM,KAAK,MAAM,KAAK,MAAM,GAAG;MAAG,WAAW;KAAE,CAAC,GACzJ/L,EAAW,YAAY,qDAAqD;MAAE,GAAGoL,IAAMprB,IAAQ,IAAI;MAAI,GAAGqrB,IAAMn6B,IAAI,IAAI;MAAI,aAAa66B,EAAI,IAAI,KAAK,MAAM,KAAK,MAAM,GAAG;MAAG,aAAa;MAAG,OAAO;KAAE,CAAC,GAEnMnzB,KACFonB,EAAW,YAAY,sBAAsB;MAAE,GAAGoL,IAAMprB,IAAQ,IAAI;MAAI,GAAGqrB,IAAMn6B,IAAI,IAAI;MAAI,aAAa66B,EAAI,IAAI,KAAK,MAAM,KAAK,MAAM,GAAG;MAAG,aAAa;MAAG,OAAO;KAAE,CAAC,GACxK/L,EAAW,SAAS,uBAAuBgR,KAAU;MAAE,GAAG5F,IAAMprB,IAAQ;MAAG,GAAGqrB,IAAMn6B,IAAI;MAAI,MAAM;MAAK,OAAO66B,EAAI,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;KAAE,CAAC,GACjJ/L,EAAW,SAAS,SAAStgB,KAAW;MAAE,GAAG0rB,IAAMprB,IAAQ;MAAG,GAAGqrB,IAAMn6B,IAAI;MAAI,MAAM;MAAK,OAAO66B,EAAI,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;KAAE,CAAC,GACpI/L,EAAW,SAAS,WAAWiR,KAAU;MAAE,GAAG7F,IAAMprB,IAAQ;MAAG,GAAGqrB,IAAMn6B,IAAI;MAAI,MAAM;MAAK,OAAO66B,EAAI,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;KAAE,CAAC,KAErI/L,EAAW,SAASz3B,EAAM,SAAS,iCAAiC;MAAE,GAAG6iC,IAAMprB,IAAQ;MAAG,GAAGqrB,IAAMn6B,IAAI,IAAI;MAAG,MAAM;MAAK,OAAO66B,EAAI,MAAM,KAAK,MAAM,KAAK,MAAM,GAAG;KAAE,CAAC;IAE1K;GACF,SAAS,GAAG;IACV,QAAQ,KAAK,mDAAmDxjC,EAAM,KAAK,IAAI,CAAC;GAClF;EACF;CACF;CAEA,AAAIqnC,EAAM,WAAW,QAAM,MAAMvB,GAAc9tC,GAAQqvC,EAAM,SAAS;CAEtE,IAAMxO,IAAqBwO,EAAM,cAAc,CAAC;CAEhD,OAAO,OADUxO,EAAmB,SAAS,IAAI,MAAM4N,GAAoBzuC,GAAQ6gC,CAAkB,IAAI7gC,EAAA,CACnF,KAAK;AAC7B;;;AC3gBA,IAAa2wC,KAAU,6BAUjBC,KAAa,SAIb/+B,MAAa,MACjB5U,EAAE,QAAQ,MAAM,OAAO,CAAC,CAAC,QAAQ,MAAM,MAAM,CAAC,CAAC,QAAQ,MAAM,MAAM,CAAC,CAAC,QAAQ,MAAM,QAAQ,CAAC,CAAC,QAAQ,MAAM,QAAQ;AAErH,SAAS4zC,GAAI,GAAW,IAAI,GAAW;CACrC,OAAO,OAAOlvC,CAAC,CAAC,CAAC,SAAS+O,GAAG,GAAG;AAClC;AAGA,SAAgBogC,GAAU,GAAiC;CACzD,IAAM38C,IAAI48C,IAAM,IAAI,KAAKA,CAAG,oBAAI,IAAI,KAAK;CACzC,IAAI,OAAO,MAAM58C,EAAE,QAAQ,CAAC,GAAG,OAAO28C,GAAU,KAAA,CAAS;CACzD,IAAME,IAAK,CAAC78C,EAAE,kBAAkB,GAC1B88C,IAAOD,KAAM,IAAI,MAAM,KACvBE,IAAML,GAAI,KAAK,MAAM,KAAK,IAAIG,CAAE,IAAI,EAAE,CAAC,GACvCG,IAAMN,GAAI,KAAK,IAAIG,CAAE,IAAI,EAAE;CACjC,OAAO,KAAK78C,EAAE,YAAY,IAAI08C,GAAI18C,EAAE,SAAS,IAAI,CAAC,IAAI08C,GAAI18C,EAAE,QAAQ,CAAC,IAAI08C,GAAI18C,EAAE,SAAS,CAAC,IAAI08C,GAAI18C,EAAE,WAAW,CAAC,IAAI08C,GAAI18C,EAAE,WAAW,CAAC,IAAI88C,IAAOC,EAAI,GAAGC,EAAI;AAC7J;AAGA,SAAgBC,GAAY,GAAoD;CAC9E,IAAI,CAACC,GAAK;CACV,IAAMxkB,IAAI,gFAAgF,KAAKwkB,EAAI,KAAK,CAAC;CACzG,IAAI,CAACxkB,GAAG;EACN,IAAM,IAAI,KAAK,MAAMwkB,CAAG;EACxB,OAAO,OAAO,MAAM,CAAC,IAAI,KAAA,IAAY,IAAI,KAAK,CAAC,CAAC,CAAC,YAAY;CAC/D;CACA,IAAM,GAAGC,GAAGC,IAAK,MAAMC,IAAI,MAAM7gC,IAAI,MAAM8gC,IAAK,MAAM,IAAI,MAAMC,GAAKR,IAAM,MAAMC,IAAM,QAAQtkB,GAC3FX,IAAS;CACb,AACKA,IADDwlB,MAAQ,OAAO,CAACA,IAAc,MACpB,GAAGA,IAAMR,EAAI,GAAGC;CAC9B,IAAMpmB,IAAI,KAAK,MAAM,GAAGumB,EAAE,GAAGC,EAAG,GAAGC,EAAE,GAAG7gC,EAAE,GAAG8gC,EAAG,GAAG,IAAIvlB,GAAQ;CAC/D,OAAO,OAAO,MAAMnB,CAAC,IAAI,KAAA,IAAY,IAAI,KAAKA,CAAC,CAAC,CAAC,YAAY;AAC/D;AAEA,IAAM4mB,MAAc,MAA8C;CAChE,IAAKx4C,KAAKA,MAAM,eAChB;MAAI,kBAAkB,KAAKA,CAAC,GAAG,OAAOA,EAAE,YAAY;EACpD,IAAI,kBAAkB,KAAKA,CAAC,GAAG,OAAO,IAAIA,EAAE,KAAKA,EAAE,KAAKA,EAAE,KAAKA,EAAE,KAAKA,EAAE,KAAKA,EAAE,KAAK,YAAY;CAD5C;AAGtD,GAEMy4C,MAAQ,GAAc,MAC1BppC,KAAiC,QAAQA,MAAU,KAAK,KAAK,IAAIV,EAAK,IAAI+J,GAAU,OAAOrJ,CAAK,CAAC,EAAE;AAErG,SAASqpC,GAAkB,GAAuC;CAChE,OAAO,2BAA2BhgC,GAAU,KAAK,UAAU,GAAG++B,KAAalpC,EAAK,CAAC,CAAC,EAAE;AACtF;AAEA,SAASoqC,GAAe,GAAsC;CAC5D,IAAMvS,IAAO,MAAM,KAAKzqB,EAAG,QAAQ,CAAC,CAAC,MAAM,MAAM3b,EAAE,cAAc,iBAAiB;CAClF,IAAI,CAAComC,GAAM,OAAO,CAAC;CACnB,IAAI;EAEF,IAAM73B,IADS,KAAK,MAAM63B,EAAK,aAAa,OAAO,KAAK,IAC3C,CAAA,GAASqR;EACtB,OAAOlpC,KAAQ,OAAOA,KAAS,WAAWA,IAAO,CAAC;CACpD,QAAQ;EACN,OAAO,CAAC;CACV;AACF;AAEA,SAASqqC,GAAW,GAAyB;CAC3C,OAAOlO,EAAO,KAAK,MAAM,GAAGuH,GAAIh4C,EAAE,CAAC,EAAE,GAAGg4C,GAAIh4C,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG;AAC9D;AAEA,SAAS4+C,GAAY,GAA2B;CAE9C,OADK/0C,IACEA,EACJ,MAAM,GAAG,CAAC,CACV,KAAK,MAASg1C,EAAK,KAAK,CAAC,CAAC,MAAM,QAAQ,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CACtD,QAAQ,MAAOC,EAAG,UAAU,KAAKA,EAAG,OAAO,MAAM,OAAO,SAASvwC,CAAC,CAAC,CAAC,CAAC,CACrE,KAAK,CAACnP,GAAGE,QAAQ;EAAE;EAAG;CAAE,EAAE,IALd,CAAC;AAMlB;AAEA,SAASy/C,GAAa,GAA4B;CAEhD,OADKl1C,IACEA,EAAE,MAAM,QAAQ,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,QAAQ,MAAM,OAAO,SAAS0E,CAAC,CAAC,IADtD,CAAC;AAElB;AAEA,SAASywC,GAAY,GAAoB;CACvC,OAAOpxC,EAAE,IAAIoqC,EAAG,CAAC,CAAC,KAAK,GAAG;AAC5B;AAGA,IAAMiH,qBAAc,IAAI,IAAI;CAC1B;CAAQ;CAAQ;CAAS;CAAkB;CAAS;CAAW;CAAQ;CAAS;CAAW;CAC3F;CAAgB;CAAS;CAAU;CAAS;CAAO;CAAQ;CAAQ;CAAQ;CAAM;CAAW;AAC9F,CAAC,GAEKC,qBAAiB,IAAI,IAAI;CAAC;CAAY;CAAqB;CAAW;CAAa;CAAgB;CAAmB;CAAgB;CAAqB;CAAS;AAAU,CAAC;AAIrL,SAASC,GAAY,GAAe,GAAiB,GAA2B,GAAgC;CAC9G,IAAM9hC,IAAO+hC,KAAgBhI,GAAUF,GAAG;EAAE,GAAG/pC,EAAE;EAAG,GAAGA,EAAE;EAAG,OAAOA,EAAE;EAAO,QAAQA,EAAE;CAAO,CAAC,GACxFkyC,IAAUlyC,EAAE,cAAcA,EAAE,YAAY,IAAI,KAAKA,EAAE,SAAS,CAAC,CAAC,YAAY,IAAI,KAAA,IAC9EmyC,IAAQ,CAAC,SAAS,GAAInyC,EAAE,WAAW,CAAC,YAAY,QAAQ,IAAI,CAAC,CAAE,CAAC,CAAC,KAAK,GAAG;CAC/E,OACEqxC,GAAK,QAAQrxC,EAAE,YAAY,CAAC,IAC5BqxC,GAAK,QAAQQ,GAAY3hC,CAAI,CAAC,IAC9BmhC,GAAK,QAAQrxC,EAAE,EAAE,KAChBoyC,IAAmBf,GAAK,SAASrxC,EAAE,MAAM,IAAI,MAC9CqxC,GAAK,QAAQd,GAAUvwC,EAAE,cAAckyC,CAAO,CAAC,IAC/Cb,GAAK,gBAAgBd,GAAU2B,CAAO,CAAC,IACvCb,GAAK,SAASc,CAAK,IACnBd,GAAK,WAAWrxC,EAAE,YAAY,KAAA,KAAaA,EAAE,YAAY,IAAI6qC,GAAI7qC,EAAE,OAAO,IAAI,KAAA,CAAS;AAE3F;AAEA,SAASqyC,GAAW,GAAuB;CACzC,IAAMC,IAAQtyC,EAAE,YAAY;CAE5B,OADKsyC,IACE,OAAO,QAAQA,CAAK,CAAC,CACzB,QAAQ,CAAC3lB,OAAO,CAACmlB,GAAY,IAAInlB,CAAC,CAAC,CAAC,CACpC,KAAK,CAACA,GAAGH,OAAO6kB,GAAK1kB,GAAGH,CAAC,CAAC,CAAC,CAC3B,KAAK,EAAE,IAJS;AAKrB;AAEA,SAAS+lB,GAAc,GAAuB;CAC5C,QAAQvyC,EAAE,YAAY,YAAY,CAAC,EAAA,CAAG,KAAK,EAAE;AAC/C;AAEA,SAASwyC,GAAW,GAAe,IAAiC,CAAC,GAAW;CAC9E,IAAMrrC,IAAgC;EAAE,MAAMnH,EAAE;EAAM,GAAGyyC;CAAM;CAG/D,OAFIzyC,EAAE,aAAU,EAAK,WAAWA,EAAE,WAC9BA,EAAE,gBAAgB,KAAA,MAAW,EAAK,cAAcA,EAAE,cAC/CsxC,GAAkBnqC,CAAI;AAC/B;AAEA,IAAMurC,MAAmB,MAAsC53C,IAAO,aAAawW,GAAUxW,CAAI,EAAE,eAAe,IAE5G63C,MAAgB,GAAe,MACnC,iCAAiC93B,EAAK,+BAA+Bu2B,GAAWpxC,EAAE,KAAK,KAAK,UAAU,mDACjE6a,EAAK;AAG5C,eAAsB+3B,GAAyB,GAAe,GAA2B,IAA0B,CAAC,GAAoB;CACtI,IAAI5yC,EAAE,SAAS,YAAYA,EAAE,SAAS,OAAOA,EAAE;CAC/C,IAAM+pC,IAAI,MAAMtoC,EAAQzB,EAAE,SAAS,GAC7BoyC,IAAmBzpC,EAAK,qBAAqB,IAC7C62B,IAAQ4R,GAAWpxC,EAAE,KAAK,GAC1B6yC,IAAcxB,GAAK,SAAS7R,CAAK,IAAI6R,GAAK,SAASrxC,EAAE,WAAW,GAChE8yC,KAAU,MAAmBd,GAAYhyC,GAAG+pC,GAAGqI,GAAkBliC,CAAI,IAAImiC,GAAWryC,CAAC,GACrF+yC,KAAQ,IAAiC,CAAC,MAAMP,GAAWxyC,GAAGyyC,CAAK,IAAIF,GAAcvyC,CAAC;CAE5F,QAAQA,EAAE,MAAV;EACE,KAAK,aACH,OAAO,UAAU8yC,EAAO,IAAID,IAAcxB,GAAK,kBAAkB7R,CAAK,EAAE,uBAAuBuT,EAAK,EAAE;EACxG,KAAK,WACH,OAAO,UAAUD,EAAO,IAAID,IAAcxB,GAAK,kBAAkB7R,CAAK,EAAE,qBAAqBuT,EAAK,EAAE;EACtG,KAAK;EACL,KAAK,SAAS;GACZ,IAAMtG,IAAMzsC,EAAE,UAAUA,EAAE,OAAO,UAAU,IAAIA,EAAE,SAAS,CAAC;IAAE,GAAGA,EAAE;IAAG,GAAGA,EAAE;GAAE,GAAG;IAAE,GAAGA,EAAE,IAAIA,EAAE;IAAO,GAAGA,EAAE,IAAIA,EAAE;GAAO,CAAC,GAChH,CAACtD,GAAGiH,KAAKwmC,GAAUJ,GAAG,CAAC0C,EAAI,IAAIA,EAAI,EAAE,CAAC,GACtCv8B,IAAgB;IAAC,KAAK,IAAIxT,EAAE,GAAGiH,EAAE,CAAC;IAAG,KAAK,IAAIjH,EAAE,GAAGiH,EAAE,CAAC;IAAG,KAAK,IAAIjH,EAAE,GAAGiH,EAAE,CAAC;IAAG,KAAK,IAAIjH,EAAE,GAAGiH,EAAE,CAAC;GAAC,GAC/FqvC,IAAOhzC,EAAE,SAAS,UAAUqxC,GAAK,QAAQ,WAAW,IAAI;GAC9D,OAAO,QAAQyB,EAAO5iC,CAAI,IAAI2iC,EAAY,UAAUhI,GAAInuC,EAAE,CAAC,EAAE,GAAGmuC,GAAInuC,EAAE,CAAC,EAAE,SAASmuC,GAAIlnC,EAAE,CAAC,EAAE,GAAGknC,GAAIlnC,EAAE,CAAC,EAAE,GAAGqvC,EAAK,YAAYhzC,EAAE,SAAS,UAAU,UAAU,OAAO,IAAI+yC,EAAK,EAAE;EAC9K;EACA,KAAK,YAAY;GACf,IAAMr0B,IAAU1e,EAAE,WAAWA,EAAE,QAAQ,SAAS,IAAIA,EAAE,UAAUA,EAAE,SAAS,CAACA,EAAE,MAAM,IAAI,CAAC,GACnFizC,IAAWv0B,EAAQ,KAAK,MAAO,YAAY8yB,GAAWrH,GAAUJ,GAAGprB,CAAE,CAAC,EAAE,WAAW,CAAC,CAAC,KAAK,EAAE,GAC5Fu0B,IAAMx0B,EAAQ,KAAK;GAEzB,OAAO,OAAOo0B,EADDI,EAAI,SAASjJ,GAAUF,GAAGoJ,GAASD,GAAKlzC,EAAE,WAAW,CAAC,IAAI,KAAA,CAC9C,IAAI6yC,EAAY,gCAAgCI,EAAS,YAAYF,EAAK,EAAE;EACvG;EACA,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,YAAY;GACf,IAAM1T,IAAQr/B,EAAE,SAASA,EAAE,MAAM,SAAS,IAAIA,EAAE,QAAQ,CAAC;IAAE,GAAGA,EAAE;IAAG,GAAGA,EAAE;IAAG,OAAOA,EAAE;IAAO,QAAQA,EAAE;GAAO,CAAC,GACvGozC,IAAS/T,EAAM,SAAS,MAAMgL,GAAiBN,GAAGtpC,CAAC,CAAC,CAAC,CAAC,IAAIoqC,EAAG,CAAC,CAAC,KAAK,GAAG,GACvEwI,IAAOpJ,GAAUF,GAAGa,GAAWvL,CAAK,CAAC,GACrCiU,IAAMtzC,EAAE,MACRuzC,IAAUvzC,EAAE,SAAS,cAAc,cAAcA,EAAE,SAAS,cAAc,cAAcA,EAAE,SAAS,cAAc,cAAc;GACrI,OAAO,IAAIszC,IAAMR,EAAOO,CAAI,IAAIhC,GAAK,SAAS7R,CAAK,EAAE,WAAW4T,EAAO,aAAaG,EAAQ,IAAIR,EAAK,EAAE,IAAIO,EAAI;EACjH;EACA,KAAK,QACH,OAAO,YAAYR,EAAO,IAAIzB,GAAK,SAAS7R,CAAK,EAAE,uBAAuBkT,GAAgB1yC,EAAE,IAAI,IAAI2yC,GAAa3yC,GAAG,EAAE,IAAI+yC,EAAK,EAAE;EACnI,KAAK,WAAW;GACd,IAAMtG,IAAMzsC,EAAE,UAAUA,EAAE,OAAO,UAAU,IAAIA,EAAE,SAAS,CAAC;IAAE,GAAGA,EAAE;IAAG,GAAGA,EAAE;GAAE,GAAG;IAAE,GAAGA,EAAE;IAAG,GAAGA,EAAE;GAAE,CAAC,GAC3F,CAACtD,GAAGiH,KAAKwmC,GAAUJ,GAAG,CAAC0C,EAAI,IAAIA,EAAI,EAAE,CAAC,GACtC+G,IAAUvJ,GAAUF,GAAG;IAAE,GAAG0C,EAAI,EAAE,CAAC;IAAG,GAAGA,EAAI,EAAE,CAAC;IAAG,OAAOzsC,EAAE,OAAOA,EAAE,KAAK,SAAS,IAAI,KAAK;IAAK,QAAQ;GAAG,CAAC;GAEnH,OAAO,YAAY8yC,EAAO;IADH,KAAK,IAAIp2C,EAAE,GAAG82C,EAAQ,EAAE;IAAG,KAAK,IAAI92C,EAAE,GAAG82C,EAAQ,EAAE;IAAG,KAAK,IAAI7vC,EAAE,GAAG6vC,EAAQ,EAAE;IAAG,KAAK,IAAI7vC,EAAE,GAAG6vC,EAAQ,EAAE;GACtG,CAAI,IAAIX,EAAY,iCAAiChI,GAAInuC,EAAE,CAAC,EAAE,GAAGmuC,GAAInuC,EAAE,CAAC,EAAE,GAAGmuC,GAAIlnC,EAAE,CAAC,EAAE,GAAGknC,GAAIlnC,EAAE,CAAC,EAAE,sBAAsB+uC,GAAgB1yC,EAAE,IAAI,IAAI2yC,GAAa3yC,GAAG,EAAE,IAAI+yC,EAAK,EAAE,KAAKS,EAAQ,CAAC,EAAE;EAC3N;EACA,KAAK,QACH,OAAO,QAAQV,EAAO7I,GAAUF,GAAG;GAAE,GAAG/pC,EAAE;GAAG,GAAGA,EAAE;GAAG,OAAO;GAAI,QAAQ;EAAG,CAAC,CAAC,IAAIqxC,GAAK,SAAS7R,CAAK,EAAE,wCAAwCkT,GAAgB1yC,EAAE,IAAI,IAAI+yC,EAAK,EAAE;EACjL,KAAK,QAAQ;GACX,IAAM35C,IAAM4G,EAAE,WAAW,IACnBrD,IAASvD,EAAI,WAAW,QAAQ,IAClC,4DAA4D,KAAK,IAAI,IAAI,SAASA,EAAI,MAAM,CAAC,GAAG,EAAE,KAAK,KAAK,CAAC,EAAE,6CAC/GA,IACE,gDAAgDkY,GAAUlY,CAAG,EAAE,+BAC/D;GACN,OAAO,QAAQ05C,EAAO,IAAIzB,GAAK,SAAS7R,CAAK,EAAE,kBAAkB7iC,IAAS+1C,GAAgB1yC,EAAE,IAAI,IAAI+yC,EAAK,EAAE;EAC7G;EACA,KAAK,aACH,OAAO,SAASD,EAAO,EAAE,uBAAuB9yC,EAAE,WAAW,cAAcsR,GAAUtR,EAAE,QAAQ,EAAE,gBAAgB,KAAK+yC,EAAK;GAAE,QAAQ/yC,EAAE;GAAQ,UAAUA,EAAE;GAAU,WAAWA,EAAE;EAAU,CAAC,EAAE;EACjM,KAAK,iCACH,OAAO,SAAS8yC,EAAO,EAAE,+BAA+BC,EAAK;GAAE,QAAQ/yC,EAAE;GAAQ,WAAWA,EAAE;EAAU,CAAC,EAAE;EAC7G,KAAK,UACH,OAAOA,EAAE,WAAW;EACtB,SACE,OAAO;CACX;AACF;AAEA,SAASmzC,GAAS,GAA2B,IAAM,GAAG;CACpD,IAAM/P,IAAKE,EAAO,KAAK,MAAMzwC,EAAE,CAAC,GAC1BwwC,IAAKC,EAAO,KAAK,MAAMzwC,EAAE,CAAC,GAC1B4gD,IAAOnD,IAAM,GACbr+C,IAAI,KAAK,IAAI,GAAGmxC,CAAE,IAAIqQ,GACtBthD,IAAI,KAAK,IAAI,GAAGkxC,CAAE,IAAIoQ;CAC5B,OAAO;EAAE;EAAG;EAAG,OAAO,KAAK,IAAI,GAAGrQ,CAAE,IAAInxC,IAAIwhD;EAAM,QAAQ,KAAK,IAAI,GAAGpQ,CAAE,IAAIlxC,IAAIshD;CAAK;AACvF;AAGA,eAAsBC,GAAkB,GAA2B,GAA2B,IAA0B,CAAC,GAAoB;CAC3I,IAAM5qC,IAAOH,EAAK,aAAazF;CAE/B,OACE,sDACgBktC,GAAQ,kCAAiC,MAHnC,QAAQ,IAAItnC,EAAK,KAAK,MAAM8pC,GAAyB5yC,GAAGyB,GAASkH,CAAI,CAAC,CAAC,EAGpC,CAAU,OAAO,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;AAEhG;AAIA,SAASgrC,GAAc,GAAuC;CAC5D,IAAMrB,IAAgC,CAAC;CACvC,KAAK,IAAMtyC,KAAK,MAAM,KAAKuU,EAAG,UAAU,GACtC,AAAI,CAACu9B,GAAY,IAAI9xC,EAAE,IAAI,KAAK,CAACA,EAAE,KAAK,WAAW,OAAO,MAAG,EAAMA,EAAE,QAAQA,EAAE;CAEjF,IAAM4zC,IAAqB,CAAC;CAC5B,KAAK,IAAMh7C,KAAK,MAAM,KAAK2b,EAAG,QAAQ,GACpC,AAAKw9B,GAAe,IAAIn5C,EAAE,SAAS,KAAGg7C,EAAS,KAAK,IAAI,cAAc,CAAC,CAAC,kBAAkBh7C,CAAC,CAAC;CAG9F,IAAMi7C,IAAS,MAAM,KAAKt/B,EAAG,QAAQ,CAAC,CAAC,MAAM,MAAM3b,EAAE,cAAc,iBAAiB;CACpF,IAAIi7C,GACF,IAAI;EACF,IAAM93C,IAAS,KAAK,MAAM83C,EAAO,aAAa,OAAO,KAAK,IAAI;EAC9D,IAAI93C,KAAU,OAAOA,KAAW,UAAU;GACxC,IAAM+3C,IAAO,EAAE,GAAG/3C,EAAO;GAEzB,AADA,OAAO+3C,EAAKzD,KACR,OAAO,KAAKyD,CAAI,CAAC,CAAC,SAAS,KAC7BF,EAAS,KAAK,2BAA2BtiC,GAAU,KAAK,UAAUwiC,CAAI,CAAC,EAAE,IAAI;EAEjF;CACF,QAAQ;EACN,EAAS,KAAK,IAAI,cAAc,CAAC,CAAC,kBAAkBD,CAAM,CAAC;CAC7D;CAEF,IAAME,IAAgC,CAAC;CAGvC,OAFI,OAAO,KAAKzB,CAAK,CAAC,CAAC,WAAQ,EAAI,QAAQA,IACvCsB,EAAS,WAAQ,EAAI,WAAWA,IAC7B,OAAO,KAAKG,CAAG,CAAC,CAAC,SAASA,IAAM,KAAA;AACzC;AAEA,SAASC,GAAU,GAAa,GAAkC;CAEhE,OADU,MAAM,KAAKz/B,EAAG,QAAQ,CAAC,CAAC,MAAM,MAAMtiB,EAAE,cAAcsV,CACvD,CAAA,EAAG,eAAe,KAAA;AAC3B;AAEA,SAAS0sC,GAAgB,GAAa,GAAiE;CACrG,IAAMC,IAAWtC,GAAar9B,EAAG,aAAa,MAAM,CAAC,GAC/CrE,IAAOgkC,EAAS,WAAW,IAAIhK,GAAYH,GAAG;EAACmK,EAAS;EAAIA,EAAS;EAAIA,EAAS;EAAIA,EAAS;CAAE,CAAC,IAAI;EAAE,GAAG;EAAG,GAAG;EAAG,OAAO;EAAG,QAAQ;CAAE,GACxIL,IAAStC,GAAeh9B,CAAE,GAC1BirB,IAAQ4R,GAAW78B,EAAG,aAAa,OAAO,KAAKA,EAAG,aAAa,gBAAgB,KAAK,KAAA,CAAS,KAAK,WAClG4/B,IAAc5/B,EAAG,aAAa,SAAS,GACvCmG,IAAUy5B,MAAgB,QAAQ,OAAO,SAAS,OAAOA,CAAW,CAAC,IAAI,OAAOA,CAAW,IAAI,GAC/FC,IAAY7/B,EAAG,aAAa,OAAO,GACnCkrB,IAAc,OAAOoU,EAAO,eAAgB,WAAWA,EAAO,cAAcO,MAAc,QAAQ,OAAO,SAAS,OAAOA,CAAS,CAAC,IAAI,OAAOA,CAAS,IAAI,GAC3JjC,KAAS59B,EAAG,aAAa,OAAO,KAAK,GAAA,CAAI,YAAY,GACrDnM,IAAW+pC,EAAM,SAAS,UAAU,KAAKA,EAAM,SAAS,QAAQ;CACtE,OAAO;EACL,IAAI59B,EAAG,aAAa,MAAM,KAAKuL,GAAgB;EAC/C,YAAY,SAASvL,EAAG,aAAa,MAAM,KAAK,KAAK,EAAE,KAAK,KAAK;EACjE,GAAGrE,EAAK;EACR,GAAGA,EAAK;EACR,OAAOA,EAAK;EACZ,QAAQA,EAAK;EACb;EACA;EACA;EACA,QAAQqE,EAAG,aAAa,OAAO,KAAK,KAAA;EACpC,UAAU,OAAOs/B,EAAO,YAAa,WAAWA,EAAO,WAAW,KAAA;EAClE,WAAWhD,GAAYt8B,EAAG,aAAa,cAAc,CAAC;EACtD,YAAYs8B,GAAYt8B,EAAG,aAAa,MAAM,CAAC;EAC/C,UAAUnM,KAAY,KAAA;EACtB,YAAYurC,GAAcp/B,CAAE;CAC9B;AACF;AAEA,SAAS8/B,GAAoB,GAAa,GAAoC;CAC5E,IAAMC,IAAO//B,EAAG,UAAU,YAAY,GAChCs/B,IAAStC,GAAeh9B,CAAE,GAC1BurB,IAAOmU,GAAgB1/B,GAAIw1B,CAAC,GAE5BwK,WAA4B;EAChC,GAAGzU;EACH,MAAM;EACN,YAAYwU;EACZ,SAAS,IAAI,cAAc,CAAC,CAAC,kBAAkB//B,CAAE;EACjD,YAAY,KAAA;CACd;CAEA,QAAQ+/B,GAAR;EACE,KAAK,UACH,OAAO;GAAE,GAAGxU;GAAM,MAAM;EAAY;EACtC,KAAK,UACH,OAAO;GAAE,GAAGA;GAAM,MAAM;EAAU;EACpC,KAAK,QAAQ;GACX,IAAMpjC,IAAIk1C,GAAar9B,EAAG,aAAa,OAAO,CAAC,GACzC5Q,IAAIiuC,GAAar9B,EAAG,aAAa,KAAK,CAAC,GACvCy+B,KAAQz+B,EAAG,aAAa,MAAM,KAAK,OAAA,CAAQ,YAAY,GACvDigC,KAAYjgC,EAAG,aAAa,MAAM,KAAK,OAAA,CAAQ,YAAY;GACjE,IAAI7X,EAAE,SAAS,KAAKiH,EAAE,SAAS,GAAG,OAAO4wC,EAAO;GAChD,IAAM,CAACE,GAAIC,KAAMtK,GAAYL,GAAG,CAAC;IAAE,GAAGrtC,EAAE;IAAI,GAAGA,EAAE;GAAG,GAAG;IAAE,GAAGiH,EAAE;IAAI,GAAGA,EAAE;GAAG,CAAC,CAAC,GACtE7E,IAASq0C,GAAS,CAACsB,GAAIC,CAAE,CAAC,GAC1BC,IAAU3B,MAAS,UAAUwB,MAAa;GAChD,OAAO;IAAE,GAAG1U;IAAM,GAAGhhC;IAAQ,MAAM61C,IAAU,UAAU;IAAQ,QAAQ,CAACF,GAAIC,CAAE;GAAE;EAClF;EACA,KAAK,OAAO;GAEV,IAAMh2B,IADW,MAAM,KAAKnK,EAAG,qBAAqB,GAAG,CAAC,CAAC,CAAC,QAAQ,MAAMnT,EAAE,cAAc,SACxE,CAAA,CAAS,KAAK,MAAOgpC,GAAYL,GAAG0H,GAAYmD,EAAG,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,MAAOj2B,EAAG,SAAS,CAAC;GAC9G,IAAID,EAAQ,WAAW,GAAG,OAAO61B,EAAO;GACxC,IAAMrB,IAAMx0B,EAAQ,KAAK;GACzB,OAAO;IAAE,GAAGohB;IAAM,GAAGqT,GAASD,CAAG;IAAG,MAAM;IAAY,QAAQx0B,EAAQ;IAAI;GAAQ;EACpF;EACA,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,YAAY;GACf,IAAMisB,IAAQiH,GAAar9B,EAAG,aAAa,QAAQ,CAAC,GAC9C8qB,IAAQsL,EAAM,UAAU,IAAID,GAAkBX,GAAGY,CAAK,IAAI,CAAC;IAAE,GAAG7K,EAAK;IAAG,GAAGA,EAAK;IAAG,OAAOA,EAAK;IAAO,QAAQA,EAAK;GAAO,CAAC,GAC3HuT,IAAOzI,GAAWvL,CAAK,GACvB1vC,IAAO2kD,GACPO,IAAiBllD,MAAS,cAAc,KAAM;GACpD,OAAO;IACL,GAAGmwC;IACH,GAAGuT;IACH;IACA,OAAOhU,EAAM,SAAS,IAAIA,IAAQ,KAAA;IAClC,SAASS,EAAK,YAAY,KAAKnwC,MAAS,cAAc,KAAOmwC,EAAK,WAAW+U;GAC/E;EACF;EACA,KAAK,YAAY;GACf,IAAM/5C,IAAOk5C,GAAUz/B,GAAI,UAAU,KAAK,IACpCugC,IAAKvgC,EAAG,aAAa,IAAI,KAAK,IAC9BwgC,IAAUnD,GAAar9B,EAAG,aAAa,SAAS,CAAC;GACvD,IAAIugC,MAAO,qBAAqBjB,EAAO,SAAS,aAAakB,EAAQ,UAAU,GAAG;IAChF,IAAMtI,IAAMsI,EAAQ,UAAU,IAAI3K,GAAYL,GAAG,CAAC;KAAE,GAAGgL,EAAQ;KAAI,GAAGA,EAAQ;IAAG,GAAG;KAAE,GAAGA,EAAQ;KAAI,GAAGA,EAAQ;IAAG,CAAC,CAAC,IAAI,CAAC;KAAE,GAAGjV,EAAK;KAAG,GAAGA,EAAK;IAAE,GAAG;KAAE,GAAGA,EAAK;KAAG,GAAGA,EAAK;IAAE,CAAC;IAC5K,OAAO;KAAE,GAAGA;KAAM,MAAM;KAAW;KAAM,QAAQ2M;KAAK,GAAGA,EAAI,EAAE,CAAC;KAAG,GAAGA,EAAI,EAAE,CAAC;KAAG,OAAO,KAAK,IAAI,KAAK3xC,EAAK,SAAS,IAAI,EAAE;KAAG,QAAQ;IAAG;GACzI;GACA,OAAO;IAAE,GAAGglC;IAAM,MAAM;IAAQ;IAAM,OAAO,KAAK,IAAIA,EAAK,OAAO,GAAG;IAAG,QAAQ,KAAK,IAAIA,EAAK,QAAQ,EAAE;GAAE;EAC5G;EACA,KAAK,QACH,OAAO;GAAE,GAAGA;GAAM,MAAM;GAAQ,MAAMkU,GAAUz/B,GAAI,UAAU,KAAK;GAAI,OAAO;GAAI,QAAQ;EAAG;EAC/F,KAAK,QAAQ;GACX,IAAMygC,IAAM,MAAM,KAAKzgC,EAAG,qBAAqB,GAAG,CAAC,CAAC,CAAC,MAAM,MAAMnT,EAAE,cAAc,KAAK,GAChF6zC,IAAM,MAAM,KAAK1gC,EAAG,qBAAqB,GAAG,CAAC,CAAC,CAAC,MAAM,MAAMnT,EAAE,cAAc,SAASA,EAAE,cAAc,SAASA,EAAE,cAAc,MAAM,GACrI3H,IAAUu7C,GAAK,aAAa,MAAM,KAAK;GAE3C,OADI,CAACv7C,KAAWw7C,MAAK,IAAU,UAAU,SAASA,EAAI,aAAa,MAAM,KAAK,KAAK,EAAE,KAAK,KAAK,MACxF;IAAE,GAAGnV;IAAM,MAAM;IAAQ;IAAS,MAAMkU,GAAUz/B,GAAI,UAAU,KAAK;IAAI,OAAO;IAAe,aAAa;IAAG,SAAS;IAAG,QAAQ,CAAC;GAAE;EAC/I;EACA,KAAK,SAAS;GACZ,IAAM+4B,IAAQ0G,GAAUz/B,GAAI,WAAW;GAOvC,OANIs/B,EAAO,SAAS,kCACX;IAAE,GAAG/T;IAAM,MAAM;IAAiC,QAAQ,OAAO+T,EAAO,UAAW,WAAWA,EAAO,SAAS,KAAA;IAAW,WAAW,OAAOA,EAAO,aAAc,WAAWA,EAAO,YAAY,KAAA;GAAU,IAE7MvG,IACK;IAAE,GAAGxN;IAAM,MAAM;IAAa,UAAUwN;IAAO,QAAQ,OAAOuG,EAAO,UAAW,WAAWA,EAAO,SAAS,KAAA;IAAW,WAAW,OAAOA,EAAO,aAAc,WAAWA,EAAO,YAAY,KAAA;GAAU,IAEvMU,EAAO;EAChB;EACA,SACE,OAAOA,EAAO;CAClB;AACF;AAOA,SAASW,GAAqB,GAAuB;CACnD,IAAInB,IAAM,IACNljC,IAAM;CACV,SAAS;EACP,IAAM4wB,IAAQqN,EAAM,QAAQ,SAASj+B,CAAG;EACxC,IAAI4wB,MAAU,IAAI;EAClB,IAAMC,IAAMoN,EAAM,QAAQ,MAAMrN,IAAQ,CAAC;EACzC,IAAIC,MAAQ,IAAI;EAEhB,AADA,KAAOoN,EAAM,MAAMj+B,GAAK4wB,CAAK,GAC7B,IAAMC,IAAM;CACd;CACA,OAAOqS,IAAMjF,EAAM,MAAMj+B,CAAG;AAC9B;AAEA,eAAsBskC,GAAU,GAAa,GAAkD;CAI7F,IAAMC,IAAUF,GAAqBG,CAAG,CAAC,CAAC,KAAK;CAC/C,IAAI,CAACD,GAAS,OAAO,CAAC;CAEtB,IAAI,sBAAsB,KAAKA,CAAO,GACpC,MAAU,MAAM,iFAAiF;CAInG,IAAME,IAAU,gBAAgBlF,GAAQ,YAAYgF,EAAQ,mBACtDvU,IAAM,IAAI,UAAU,CAAC,CAAC,gBAAgByU,GAAS,iBAAiB,GAChErzC,IAAQ4+B,EAAI,qBAAqB,aAAa,CAAC,CAAC;CACtD,IAAI5+B,GAAO,MAAU,MAAM,uCAAuCA,EAAM,aAAa,MAAM,GAAG,GAAG,GAAG;CAEpG,IAAMszC,oBAAW,IAAI,IAAI;EAAC;EAAQ;EAAU;EAAU;EAAK;CAAK,CAAC,GAC3DC,IAAW,MAAM,KAAK3U,EAAI,qBAAqB,GAAG,CAAC,CAAC,CAAC,QACxD,MAAMz/B,EAAE,eAAe,cAAc,YAAY,CAACm0C,EAAS,IAAIn0C,EAAE,SAAS,CAC7E,GACM2yC,IAAoB,CAAC;CAC3B,KAAK,IAAMx/B,KAAMihC,GAAU;EAGzB,IAAMv4B,IAAMo3B,GAAoB9/B,GAAI,MADpB9S,GADF,SAAS8S,EAAG,aAAa,MAAM,KAAK,KAAK,EAAE,KAAK,KAAK,CACvC,CACS;EACrC,AAAI0I,KAAK82B,EAAI,KAAK92B,CAAG;CACvB;CACA,OAAO82B;AACT;;;AClaA,IAAM0B,KAAc,KACdC,4BAAe,IAAI,KAAK,EAAA,CAAE,YAAY,GAE/BC,KAAb,MAA+B;CAC7B,OAA6B,CAAC;CAC9B,OAA+B,CAAC;CAChC,SAAiC,CAAC;CAClC,mCAA2B,IAAI,IAAqB;CACpD,gCAAwB,IAAI,IAAgB;CAC5C,OAA+B,CAAC;CAChC,WAAmB;CACnB,gBAAwB;CACxB,WAA4C;CAI5C,YAAY,GAAoC;EAC9C,KAAK,WAAW9U,IAAM+I,GAAuB/I,CAAG,IAAI;CACtD;CAEA,cAAuB;EACrB,OAAO,KAAK,aAAa;CAC3B;CAEA,eAAe,GAAc,GAAmB;EAC9C,KAAK,OAAO;GAAE;GAAM,IAAIx9B,KAAM,KAAK,KAAK;EAAG;CAC7C;CAEA,mBAAmB,GAAwC;EACzD,KAAK,OAAO,EAAE,GAAIqF,KAAQ,CAAC,EAAG;CAChC;CAEA,iBAAyB;EACvB,OAAO,KAAK,KAAK,QAAQ;CAC3B;CAEA,qBAAqC;EACnC,OAAO,EAAE,GAAG,KAAK,KAAK;CACxB;CAEA,YAAY,GAAyB;EACnC,KAAK,WAAWN;CAClB;CAEA,aAAsB;EACpB,OAAO,KAAK;CACd;CAGA,iBAAiB,GAAsB;EACrC,KAAK,gBAAgBH;CACvB;CAGA,QAAQ,GAAwB;EAK9B,OAJI,KAAK,YAAYjI,EAAE,YAAYA,EAAE,SAAS,WAAiB,KAC3D,KAAK,iBACL,CAACA,EAAE,YAAY,CAACA,EAAE,SAAe,KACjCA,EAAE,WAAiB,EAAQ,KAAK,KAAK,MAAOA,EAAE,aAAa,KAAK,KAAK,KAClE,EAAQ,KAAK,KAAK,QAASA,EAAE,WAAW,KAAK,KAAK;CAC3D;CAEA,SAAkB;EAChB,OAAO,CAAC,KAAK;CACf;CAKA,qBAAmC;EACjC,OAAO,KAAK;CACd;CAEA,kBAAkB,GAAoC;EACpD,OAAO,KAAK,KAAK,MAAM,MAAMA,EAAE,OAAOqD,CAAE;CAC1C;CAGA,aAAa,OACX,KAAK,cAAc,IAAI5T,CAAQ,SAClB;EAAE,KAAK,cAAc,OAAOA,CAAQ;CAAG;CAGtD,oBAAkC,KAAK;CAEvC,iBAAiB,GAA2B,GAAuC;EAGjF,OAFIE,MAAS,uBACb,KAAK,iBAAiB,IAAIF,CAAQ,SACrB,KAAK,oBAAoBE,GAAMF,CAAQ,WAFL,CAAC;CAGlD;CAEA,oBAAoB,GAA2B,GAAiC;EAC9E,AAAIE,MAAS,uBACb,KAAK,iBAAiB,OAAOF,CAAQ;CACvC;CAGA,wBAAwB,GAAkC,CAAC;CAI3D,IAAI,UAAmB;EACrB,OAAO,KAAK,KAAK,SAAS;CAC5B;CAEA,IAAI,UAAmB;EACrB,OAAO,KAAK,OAAO,SAAS;CAC9B;CAEA,OAAgB;EACd,IAAM8pB,IAAQ,KAAK,KAAK,IAAI;EAC5B,IAAI,CAACA,GAAO,OAAO;EACnB,IAAMq8B,IAAW,IAAI,IAAIr8B,EAAM,MAAM,KAAK,MAAMvZ,EAAE,EAAE,CAAC,GAC/C61C,IAAS,IAAI,IAAIt8B,EAAM,SAAS,KAAK,MAAM,CAAC+S,EAAE,MAAM,IAAIA,EAAE,MAAM,CAAC,CAAC,GAClEjlB,IAAO,KAAK,KAAK,QAAQ,MAAM,CAACuuC,EAAS,IAAI51C,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,MAAM61C,EAAO,IAAI71C,EAAE,EAAE,KAAKA,CAAC;EAC1F,KAAK,IAAMpM,KAAK2lB,EAAM,SAAS,AAAKlS,EAAK,MAAM,MAAMrH,EAAE,OAAOpM,EAAE,EAAE,KAAGyT,EAAK,KAAKzT,CAAC;EAGhF,OAFA,KAAK,OAAO,QAAQ2lB,CAAK,GACzB,KAAK,MAAMlS,GAAM;GAAE,OAAO;GAAM,UAAU;GAAO,UAAU;GAAO,aAAa;EAAK,CAAC,GAC9E;CACT;CAEA,OAAgB;EACd,IAAMkS,IAAQ,KAAK,OAAO,MAAM;EAChC,IAAI,CAACA,GAAO,OAAO;EACnB,IAAMu8B,IAAa,IAAI,IAAIv8B,EAAM,QAAQ,KAAK,MAAMvZ,EAAE,EAAE,CAAC,GACnD+1C,IAAQ,IAAI,IAAIx8B,EAAM,SAAS,KAAK,MAAM,CAAC+S,EAAE,OAAO,IAAIA,EAAE,KAAK,CAAC,CAAC,GACjEjlB,IAAO,KAAK,KAAK,QAAQ,MAAM,CAACyuC,EAAW,IAAI91C,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,MAAM+1C,EAAM,IAAI/1C,EAAE,EAAE,KAAKA,CAAC;EAC3F,KAAK,IAAMg2C,KAAMz8B,EAAM,OAAO,AAAKlS,EAAK,MAAM,MAAMrH,EAAE,OAAOg2C,EAAG,EAAE,KAAG3uC,EAAK,KAAK2uC,CAAE;EAGjF,OAFA,KAAK,KAAK,KAAKz8B,CAAK,GACpB,KAAK,MAAMlS,GAAM;GAAE,OAAO;GAAM,UAAU;GAAO,UAAU;GAAO,aAAa;EAAK,CAAC,GAC9E;CACT;CASA,OAAO,GAAoB,IAAsB,CAAC,GAAiB;EACjE,OAAO,KAAK,MAAMA,GAAM;GAAE,GAAGsB;GAAM,aAAa;EAAM,CAAC;CACzD;CAEA,eAAe,GAA2B,IAAsB,CAAC,GAAiB;EAChF,IAAMstC,IAAUC,EAAO,KAAK,OAAO;GAAE,GAAG74C;GAAG,IAAIA,EAAE,MAAMyiB,GAAgB;EAAE,EAAgB;EAEzF,OADA,KAAK,OAAO,CAAC,GAAG,KAAK,MAAM,GAAGm2B,CAAO,GAAGttC,CAAI,GACrCstC,EAAQ,KAAK,MAAM,KAAK,kBAAkBj2C,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,MAAuB,EAAQA,CAAE;CACnG;CAEA,iBAAiB,GAAY,GAAiC,IAAsB,CAAC,GAA2B;EAE9G,IADiB,KAAK,kBAAkBqD,CACnC,GAEL,OADA,KAAK,OAAO,KAAK,KAAK,KAAK,MAAOrD,EAAE,OAAOqD,IAAK;GAAE,GAAGrD;GAAG,GAAGm2C;GAAO;EAAG,IAAIn2C,CAAE,GAAG2I,CAAI,GAC3E,KAAK,kBAAkBtF,CAAE;CAClC;CAEA,kBAAkB,GAAqC,IAAsB,CAAC,GAAS;EACrF,IAAM+yC,IAAM,IAAI,IAAIC,EAAQ,KAAK,MAAO,OAAO7rB,KAAM,WAAWA,IAAIA,EAAE,EAAG,CAAC;EAC1E,KAAK,OAAO,KAAK,KAAK,QAAQ,MAAM,CAAC4rB,EAAI,IAAIp2C,EAAE,EAAE,CAAC,GAAG2I,CAAI;CAC3D;CAGA,QAAc;EAGZ,AAFA,KAAK,OAAO,CAAC,GACb,KAAK,SAAS,CAAC,GACf,KAAK,MAAM,CAAC,GAAG;GAAE,UAAU;GAAM,OAAO;GAAM,UAAU;GAAO,aAAa;EAAM,CAAC;CACrF;CASA,MAAM,kBAAkB,GAAqC;EAE3D,IAAM5M,IAAS,MAAMo5C,GAAUmB,GADd,KAAK,gBACe,CAAQ;EAC7C,IAAIv6C,EAAO,WAAW,GAAG,OAAO,CAAC;EACjC,IAAMw6C,IAAW,IAAI,IAAIx6C,EAAO,KAAK,MAAM,CAACiE,EAAE,IAAIA,CAAC,CAAC,CAAC,GAC/Cw2C,IAAS,KAAK,KAAK,KAAK,MAAMD,EAAS,IAAIv2C,EAAE,EAAE,KAAKA,CAAC;EAC3D,KAAK,IAAMA,KAAKjE,GAAQ,AAAK,KAAK,KAAK,MAAM,MAAM9J,EAAE,OAAO+N,EAAE,EAAE,KAAGw2C,EAAO,KAAKx2C,CAAC;EAEhF,OADA,KAAK,OAAOw2C,GAAQ;GAAE,UAAU;GAAM,OAAO;GAAM,UAAU;EAAM,CAAC,GAC7Dz6C,EAAO,KAAK,MAAM,KAAK,kBAAkBiE,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,MAAuB,EAAQA,CAAE;CAClG;CAMA,MAAM,kBAAkB,IAA0B,CAAC,GAAoB;EACrE,IAAMy2C,IAAW,KAAK,gBAAgB;EAKtC,OAJI9tC,EAAK,aAEA,MADa,QAAQ,IAAIA,EAAK,UAAU,KAAK,MAAMiqC,GAAyB5yC,GAAGy2C,GAAU9tC,CAAI,CAAC,CAAC,EAAA,CACzF,KAAK,EAAE,IAEf+qC,GAAkB,KAAK,MAAM+C,GAAU9tC,CAAI;CACpD;CAGA,8BAAsC;EACpC,OAAO,KAAK,UAAU,KAAK,MAAM,MAAM,CAAC;CAC1C;CAIA,kBAA4C;EAC1C,IAAI,CAAC,KAAK,UAAU,MAAU,MAAM,qEAAqE;EACzG,OAAO,KAAK;CACd;CAEA,MAAc,GAAoB,GAA8D;EAC9F,IAAMvB,IAAO,KAAK,MACZsvC,IAAW,EAAQ/tC,EAAK,UACxBguC,IAAQ,EAAQhuC,EAAK,OACrBiuC,IAAW,IAAI,IAAIxvC,EAAK,KAAK,MAAM,CAACpH,EAAE,IAAIA,CAAC,CAAC,CAAC,GAC7C62C,IAAU,IAAI,IAAIxvC,EAAK,KAAK,MAAMrH,EAAE,EAAE,CAAC,GAEvC82C,IAAsB,CAAC,GACvBC,IAAyB,CAAC,GAC1BC,IAAkE,CAAC,GACnEC,IAAwB,CAAC,GACzBC,IAA0B,CAAC;EAEjC,KAAK,IAAMl3C,KAAKqH,GAAM;GACpB,IAAMxU,IAAI+jD,EAAS,IAAI52C,EAAE,EAAE;GAC3B,IAAI,CAACnN,GAAG;IACN,IAAI,CAAC6jD,KAAY,CAACC,KAAS,KAAK,UAAU;IAC1C,IAAMQ,IAAU,KAAK,SAASn3C,GAAG02C,CAAQ;IAEzC,AADAI,EAAM,KAAKK,CAAO,GAClBD,EAAU,KAAKC,CAAO;GACxB,OAAO,IAAItkD,MAAMmN,GAAG;IAClB,IAAI,CAAC02C,KAAY,CAACC,KAAS,CAAC,KAAK,QAAQ9jD,CAAC,GAAG;KAC3C,EAAU,KAAKA,CAAC;KAChB;IACF;IACA,IAAMy5B,IAAgBoqB,IAAW12C,IAAI;KAAE,GAAGA;KAAG,YAAY01C,GAAO;IAAE;IAGlE,AAFAqB,EAAS,KAAKzqB,CAAC,GACf0qB,EAAc,KAAK;KAAE,QAAQnkD;KAAG,OAAOy5B;IAAE,CAAC,GAC1C4qB,EAAU,KAAK5qB,CAAC;GAClB,OACE,EAAU,KAAKtsB,CAAC;EAEpB;EACA,KAAK,IAAMnN,KAAKuU,GACd,IAAI,GAAQ,IAAIvU,EAAE,EAAE,GACpB;OAAI,CAAC6jD,KAAY,CAACC,KAAS,CAAC,KAAK,QAAQ9jD,CAAC,GAAG;IAC3C,EAAU,KAAKA,CAAC;IAChB;GACF;GACA,EAAQ,KAAKA,CAAC;EADd;EAIF,IAAIikD,EAAM,WAAW,KAAKC,EAAS,WAAW,KAAKE,EAAQ,WAAW,GAEpE,OAAO,KAAK;EASd,AANI,CAACtuC,EAAK,gBAAgBA,EAAK,YAAY,CAAC+tC,OAC1C,KAAK,KAAK,KAAK;GAAE;GAAO,UAAUM;GAAe;EAAQ,CAAC,GACtD,KAAK,KAAK,SAASvB,MAAa,KAAK,KAAK,MAAM,GACpD,KAAK,SAAS,CAAC,IAGjB,KAAK,OAAOyB;EACZ,KAAK,IAAM5uC,KAAK,MAAM,KAAK,KAAK,aAAa,GAC3C,IAAI;GAAE,EAAE;EAAG,SAASpB,GAAK;GAAE,QAAQ,MAAM,6CAA6CA,CAAG;EAAG;EAK9F,OAHI4vC,EAAM,UAAQ,KAAK,KAAK;GAAE,aAAaA;GAAO,QAAQ;GAAO;EAAS,CAAC,GACvEC,EAAS,UAAQ,KAAK,KAAK;GAAE,aAAaA;GAAU,QAAQ;GAAU;EAAS,CAAC,GAChFE,EAAQ,UAAQ,KAAK,KAAK;GAAE,aAAaA;GAAS,QAAQ;GAAU;EAAS,CAAC,GAC3E,KAAK;CACd;CAEA,SAAiB,GAAe,GAA+B;EAC7D,IAAIP,GAAU,OAAO12C;EACrB,IAAMkyC,IAAUlyC,EAAE,aAAa01C,GAAO;EACtC,OAAO;GACL,GAAG11C;GACH,QAAQA,EAAE,UAAU,KAAK,KAAK;GAC9B,UAAUA,EAAE,YAAY,KAAK,KAAK;GAClC,WAAWkyC;GACX,YAAYlyC,EAAE,cAAckyC;EAC9B;CACF;CAEA,KAAa,GAAqC;EAChD,KAAK,IAAM5pC,KAAK,MAAM,KAAK,KAAK,gBAAgB,GAC9C,IAAI;GAAE,EAAExU,CAAK;EAAG,SAASoT,GAAK;GAAE,QAAQ,MAAM,0DAA0DA,CAAG;EAAG;CAElH;AACF,GCtQMkwC,WAAyB;CAC7B,MAAU,MAAM,qEAAqE;AACvF,GAEaC,KAAb,MAAaA,EAAkB;CAC7B,OAAe,4BAAY,IAAI,IAA+B;CAG9D,OAAO,YAAY,GAA2C;EAC5D,OAAOA,EAAkB,UAAU,IAAIh0C,CAAE;CAC3C;CAGA,OAAO,iBAAiB,GAAY,GAAmC;EACrE,EAAkB,UAAU,IAAIA,GAAIygC,CAAQ;CAC9C;CAGA,OAAO,mBAAmB,GAAkB;EAC1C,EAAkB,UAAU,OAAOzgC,CAAE;CACvC;CAGA,OAAO,iBAAuB;EAC5B,EAAkB,UAAU,MAAM;CACpC;CAEA;CAEA;CAEA;CAEA,UAA8B;CAE9B;CAEA,UAAwC;CACxC,cAA2C;CAC3C,YAAoB;CACpB,qBAKW;CAEX,YACE,GACA,IAAuC,IAAIsyC,GAAkB,GAC7D,GACA,IAA2B,IAAI/uC,GAAY,GAC3C;EAIA,AAHA,KAAK,MAAMxX,GACX,KAAK,oBAAoBwrC,GACzB,KAAK,cAAcloB,GACfrP,MACF,KAAK,KAAKA,GACVg0C,EAAkB,iBAAiBh0C,GAAI,IAAI;CAE/C;CAGA,gBACE,GAMM;EACN,KAAK,qBAAqBq3B;CAC5B;CAGA,kBAA4C;EAC1C,IAAM,IAAI,KAAK;EAWf,OAVK,IACD,OAAO,KAAM,WACR2c,EAAkB,YAAY,CAAC,KAAK,OAEzC,OAAO,KAAM,aACR,EAAE,IAEP,OAAO,KAAM,YAAY,aAAa,IACjC,EAAE,UAEJ,IAVQ;CAWjB;CAKA,MAAM,GAAwB,GAAmC;EAE/D,AADA,KAAK,UAAUC,GACf,KAAK,UAAUC;CACjB;CAGA,UAAgB;EACd,KAAK,UAAU;CACjB;CAGA,YAAY,GAAsB;EAChC,KAAK,cAAcp7C;CACrB;CAEA,IAAI,cAAuB;EACzB,OAAO,KAAK;CACd;CAEA,IAAI,YAAqB;EACvB,OAAO,KAAK,YAAY;CAC1B;CAMA,UAAgB;EACd,IAAI,MAAK,WAET;GADA,KAAK,YAAY,IACb,KAAK,MACPk7C,EAAkB,mBAAmB,KAAK,EAAE;GAE9C,IAAI;IACF,KAAK,IAAI,KAAK,WAAW,CAAC,CAAC;GAC7B,UAAU;IACR,IAAMG,IAAU,KAAK;IAKrB,AAJA,KAAK,cAAc,MACnB,KAAK,UAAU,MACf,KAAK,UAAU,MACf,KAAK,IAAI,QAAQ,GACbA,KAEF,QAAQ,QAAQ,CAAC,CAAC,KAAKA,CAAO;GAElC;EAd8C;CAehD;CAIA,GAA8B,GAAS,GAA2D;EAChG,OAAO,KAAK,IAAI,GAAG7nD,GAAMF,CAAgC;CAC3D;CAEA,IAA+B,GAAS,GAAqD;EAC3F,KAAK,IAAI,IAAIE,GAAMF,CAAgC;CACrD;CAKA,aACE,GACA,GAC4C;EAC5C,IAAMwQ,IAAI,KAAK,WAAWm3C,GAAU,GAC9BlY,IAAat0B,GAAS,QAAQA,GAAS;EAC7C,OAAO,IAAI,SAAS,GAAS,MAAW;GACtC,IAAM6sC,IAAY,KAAK,IAAI,GAAqC,mBAAmB,MAAM;IACvF,AAAI7jD,EAAE,QAAQwF,MACds+C,EAAQ,GACJxY,KAAcA,IAAa,KAC7B,iBAAiB;KACf,IAAI;MACF,KAAK,SAASA,GAAY,EAAE,QAAQ,GAAK,CAAC;KAC5C,QAAQ,CAAC;IACX,GAAG,EAAE,GAEPz9B,EAAQ7N,CAAC;GACX,CAAC,GACK+jD,IAAW,KAAK,IAAI,GAAwC,sBAAsB,MAAM;IAC5F,AAAI/jD,EAAE,QAAQwF,MACds+C,EAAQ,GACRE,EAAOhkD,EAAE,KAAK;GAChB,CAAC,GACK8jD,UAAgB;IAEpB,AADAD,EAAU,GACVE,EAAS;GACX;GACA,EAAE,aAAav+C,GAAKwR,CAAO;EAC7B,CAAC;CACH;CAMA,MAAM,eACJ,GACA,GACmD;EACnD,IAAMs0B,IAAat0B,GAAS,QAAQA,GAAS;EAC7C,IAAI,KAAK,eAAe,MAAMxR,GAAK;GACjC,AAAI8lC,KAAcA,IAAa,KAC7B,KAAK,SAASA,GAAY,EAAE,QAAQ,GAAK,CAAC;GAE5C;EACF;EACA,OAAO,KAAK,aAAa9lC,GAAKwR,CAAO;CACvC;CAMA,SAAS,GAAuB;EAC9B,KAAK,IAAI,KAAK,oBAAoB,EAAE,KAAKnR,EAAQ,CAAC;CACpD;CAEA,iBAAqC;EACnC,OAAO,KAAK,SAAS,eAAe;CACtC;CAEA,iBAAmD;EACjD,OAAO,KAAK,SAAS,eAAe,KAAK;CAC3C;CAEA,iBAAyB;EACvB,OAAO,KAAK,SAAS,eAAe,KAAK;CAC3C;CAEA,eAAuB;EACrB,OAAO,KAAK,SAAS,aAAa,KAAK;CACzC;CAGA,SAAS,GAAoB,IAAgC,CAAC,GAAS;EACrE,IAAMwG,IAAI,KAAK;EACf,AAAIA,IACFA,EAAE,SAAStG,GAAYiR,CAAO,IAE9B,KAAK,IAAI,KAAK,qBAAqB;GAAE,MAAMjR;GAAY,QAAQiR,EAAQ;EAAO,CAAC;CAEnF;CAGA,eAAe,GAA0B;EACvC,KAAK,SAASjR,CAAU;CAC1B;CAQA,SAAS,GAAsB;EAC7B,KAAK,IAAI,KAAK,uBAAuB,OAAO7I,KAAU,WAAW,EAAE,SAAM,IAAI,KAAA,CAAS;CACxF;CAGA,WAAW,GAAsB;EAC/B,KAAK,SAASA,CAAK;CACrB;CAGA,UAAgB;EACd,KAAK,IAAI,KAAK,oBAAoB;CACpC;CAGA,YAAkB;EAChB,KAAK,QAAQ;CACf;CASA,MAAM,WAAW,GAAe,IAAgC,CAAC,GAA4B;EAC3F,IAAMggD,IAAM,KAAK,eAAe;EAChC,IAAI,CAACA,GAAK,OAAO,CAAC;EAClB,IAAM7wC,IAAI,KAAK;EAEf,OAAOT,GAAcsxC,GAAKpxC,GADPO,IAAIA,EAAE,cAAc,IAAI,CAAC,GACC,KAAA,GAAW2K,EAAQ,KAAK;CACvE;CAKA,yBAA+C;EAC7C,OAAO,KAAK,SAAS,uBAAuB,KAAK,CAAC;CACpD;CAOA,uBAAuB,GAAwC;EAC7D,IAAM3K,IAAI,KAAK;EAMf,AALIA,IACFA,EAAE,uBAAuB43C,CAAU,IAEnC,KAAK,IAAI,KAAK,mCAAmC,EAAE,cAAW,CAAC,GAEjE,KAAK,IAAI,KAAK,8BAA8B,EAAE,cAAW,CAAC;CAC5D;CAGA,sBAAsB,GAAqC;EACzD,IAAMC,IAAU,KAAK,uBAAuB;EAC5C,KAAK,uBAAuB,CAAC,GAAGA,GAASC,CAAS,CAAC;CACrD;CAGA,2BAAiC;EAC/B,KAAK,uBAAuB,CAAC,CAAC;CAChC;CAiBA,MAAM,iBACJ,GACA,IAOI,CAAC,GACyB;EAC9B,IAAMC,IAAsC,CAAC;EAC7C,AAAIptC,EAAQ,UAAU,UAAUA,EAAQ,cACtC,EAAc,QAAQ,CAACA,EAAQ,SAAS;EAE1C,IAAMjL,IAAU,MAAM,KAAK,WAAWD,GAAOs4C,CAAa,GACtD14C,IAAQK,EAAQ;EAIpB,IAHIiL,EAAQ,cACV,IAAQjL,EAAQ,MAAK,MAAKc,EAAE,cAAcmK,EAAQ,SAAS,KAAKtL,IAE9D,CAACA,GAAO,OAAO;EAEnB,IAAMy4C,IAAgC;GACpC,IAAIz4C,EAAM;GACV,WAAWA,EAAM;GACjB,QAAQA,EAAM;GACd,OAAOsL,EAAQ,SAAS;GACxB,aAAa;GACb,OAAOA,EAAQ,UAAU;GACzB,SAASA,EAAQ,WAAWtL,EAAM;EACpC;EAQA,OANA,KAAK,uBAAuB,CAACy4C,CAAS,CAAC,GAEnCntC,EAAQ,aAAa,MACvB,KAAK,SAAStL,EAAM,WAAW,EAAE,QAAQ,GAAK,CAAC,GAG1CA;CACT;CAIA,iBAA+B;EAC7B,OAAO,KAAK,kBAAkB,mBAAmB;CACnD;CAGA,gBAA6B;EAC3B,OAAO,KAAK,SAAS,cAAc,KAAK,CAAC;CAC3C;CAGA,QAAc;EACZ,KAAK,IAAI,KAAK,cAAc;CAC9B;CAKA,gBAA6B;EAC3B,OAAO,KAAK,YAAY,UAAU;CACpC;CAGA,cAAc,GAA2B;EACvC,KAAK,YAAY,UAAUkI,CAAM;CACnC;CAGA,cAA8B;EAC5B,OAAO,KAAK,YAAY,UAAU;CACpC;CAGA,YAAY,GAA4B;EACtC,KAAK,YAAY,UAAUL,CAAI;CACjC;CAGA,gBAAsB;EACpB,KAAK,YAAY,YAAY;CAC/B;CAGA,aAAa,GAA8C;EACzD,OAAO,KAAK,YAAY,SAASsB,CAAM;CACzC;CAGA,MAAM,eAAe,IAAkB,QAAyB;EAC9D,OAAO,KAAK,YAAY,eAAe;CACzC;CAGA,eAAe,GAAqC;EAClD,AAAI,OAAOtB,KAAS,WAClB,KAAK,YAAY,eAAeA,CAAI,IAEpC,KAAK,YAAY,UAAUA,CAAI;CAEnC;CAGA,eAA2B;EACzB,OAAO,KAAK,YAAY,SAAS;CACnC;CAGA,aAAa,GAAyB;EACpC,KAAK,YAAY,SAASkB,CAAK;CACjC;CAGA,YAAY,GAAsB;EAChC,KAAK,YAAY,QAAQE,CAAI;CAC/B;CAGA,eAAe,GAAY,GAA8C;EACvE,KAAK,YAAY,WAAWlF,GAAI0E,CAAO;CACzC;CAGA,eAAe,GAAkB;EAC/B,KAAK,YAAY,WAAW1E,CAAE;CAChC;CAGA,iBAAgC;EAC9B,OAAO,KAAK,YAAY,eAAe;CACzC;CAGA,eAAe,GAA6B;EAC1C,KAAK,YAAY,eAAeoF,CAAM;CACxC;CAGA,iBAAoC;EAClC,OAAO,KAAK,YAAY,eAAe;CACzC;CAMA,eAAe,GAA+B;EAC5C,KAAK,YAAY,eAAeC,CAAI;CACtC;CAGA,iBAAqC;EACnC,OAAO,KAAK,YAAY,WAAW;CACrC;CAOA,eAAe,GAA4C;EACzD,KAAK,YAAY,WAAWkC,CAAO;CACrC;CAGA,cAAc,GAA0C;EACtD,OAAO,KAAK,YAAY,cAAcnC,CAAM;CAC9C;CAGA,kBAAkB,GAA0C;EAC1D,OAAO,KAAK,YAAY,kBAAkBA,CAAM;CAClD;CAGA,eAAe,GAAuB;EACpC,KAAK,YAAY,iBAAiBG,CAAO;CAC3C;CAMA,MAAM,YAAY,IAAyB,CAAC,GAAwB;EAClE,IAAM3I,IAAI,KAAK,WAAWm3C,GAAU,GAC9BtG,IAAM7wC,EAAE,eAAe,GACvB7G,IAAM6G,EAAE,eAAe;EAC7B,IAAI,CAAC6wC,KAAO,CAAC13C,GAAK,MAAU,MAAM,oBAAoB;EAStD,OAAOy1C,GACL;GACE,4BAT+B;IACjC,IAAIiC,GAAK,OAAOA,EAAI,QAAQ;IAC5B,IAAMmH,IAAW,MAAM,MAAM7+C,CAAa;IAC1C,IAAI,CAAC6+C,EAAS,IAAI,MAAU,MAAM,6BAA6BA,EAAS,OAAO,EAAE;IACjF,OAAOA,EAAS,YAAY;GAC9B;GAKI,iBAAiBnH,IAAMlH,GAAuBkH,CAAG,IAAI,KAAA;GACrD,aAAa,KAAK,kBAAkB,mBAAmB;GACvD,YAAY7wC,EAAE,cAAc;GAC5B,WAAWA,EAAE,aAAa;GAC1B,YAAY,KAAK,YAAY,uBAAuB,KAAKA,EAAE,mBAAmB;GAC9E,YAAY,KAAK,YAAY,UAAU;GACvC,UAAU,KAAK,YAAY,UAAU;EACvC,GACA2K,CACF;CACF;CAKA,kBAA0B;EACxB,IAAI,OAAO,SAAW,KAAa,OAAO;EAC1C,IAAM+V,IAAY,OAAO,aAAa;EACtC,OAAOA,IAAYA,EAAU,SAAS,IAAI;CAC5C;CAMA,MAAM,mBAAqC;EACzC,IAAM7lB,IAAO,KAAK,gBAAgB;EAClC,IAAI,CAACA,GAAM,OAAO;EAClB,IAAMo9C,IAAU,MAAMl4B,GAAoBllB,CAAI;EAI9C,OAHIo9C,KACF,KAAK,IAAI,KAAK,cAAc,EAAE,QAAK,CAAC,GAE/BA;CACT;CAIA,KAAc;EAEZ,WAAW,MAAmB,CAAC;EAC/B,WAAW,MAAuB,KAAK,SAASv+C,CAAU;EAC1D,uBAAuB,MAAuB,KAAK,SAASA,CAAU;EACtE,eAAe,MAAuB,KAAK,IAAI,KAAK,wBAAwB,EAAE,YAAS,CAAC;EACxF,gBAAgB,MAAuB,KAAK,IAAI,KAAK,yBAAyB,EAAE,YAAS,CAAC;EAC1F,iBAAiB,MAAuB,KAAK,IAAI,KAAK,wBAAwB,EAAE,YAAS,CAAC;EAC1F,kBAAkB,MAAuB,KAAK,IAAI,KAAK,yBAAyB,EAAE,YAAS,CAAC;EAC5F,qBAAqB,MAAkB,KAAK,IAAI,KAAK,gCAAgC,EAAE,SAAM,CAAC;EAC9F,cAAc,MAAwB;GACpC,IAAIw+C,IAAsB3T;GAM1B,AALIA,MAASA,EAAK,YAAY,MAAM,YAAYA,EAAK,YAAY,MAAM,gBACrE,IAAiB,WACRA,KAAQA,EAAK,YAAY,MAAM,UACxC,IAAiB,QAEnB,KAAK,IAAI,KAAK,mBAAmB,EAAE,MAAM2T,EAAe,CAAC;EAC3D;EACA,uBAAuB,KAAK,gBAAgB;EAC5C,wBAAwB,KAAK,iBAAiB;EAC9C,WAAW,MAAmB,KAAK,IAAI,KAAK,uBAAuB,OAAOrnD,KAAU,WAAW,EAAE,SAAM,IAAI,KAAA,CAAS;EACpH,eAAe,KAAK,IAAI,KAAK,oBAAoB;EACjD,aAAa,MAAmB,KAAK,IAAI,KAAK,uBAAuB,OAAOA,KAAU,WAAW,EAAE,SAAM,IAAI,KAAA,CAAS;EACtH,iBAAiB,KAAK,IAAI,KAAK,oBAAoB;EACnD,eAAe,GAAW,GAAW,MAAkB;GACrD,AAAI,OAAO,SAAW,OACpB,OAAO,cAAc,IAAI,YAAY,wBAAwB,EAAE,QAAQ;IAAE;IAAM;IAAM;GAAQ,EAAE,CAAC,CAAC;EAErG;EACA,mBAAmB;GACjB,AAAI,OAAO,SAAW,OACpB,OAAO,cAAc,IAAI,YAAY,qBAAqB,CAAC;EAE/D;EACA,iBAAiB,MAAkD;GACjE,AAAI,OAAO,SAAW,OACpB,OAAO,cAAc,IAAI,YAAY,2BAA2B,EAAE,QAAQ,EAAE,QAAK,EAAE,CAAC,CAAC;EAEzF;EACA,mBAAmB,GAAgB,MAAmB;GACpD,AAAI,OAAO,SAAW,OACpB,OAAO,cAAc,IAAI,YAAY,6BAA6B,EAAE,QAAQ;IAAE;IAAQ;GAAO,EAAE,CAAC,CAAC;EAErG;CACF;CAEA,SAAkB,OAA6B;EAE7C,IAAI,oBAAuC;GACzC,OAAOsnD,EAAK;EACd;EAEA,IAAI,cAA2B;GAC7B,OAAOA,EAAK;EACd;EACA,gBAAgB;GACd,mBAAmB,GAAe,MAChCA,EAAK,IAAI,GAAGtkD,GAAOukD,CAAQ;GAC7B,sBAAsB,GAAe,MACnCD,EAAK,IAAI,IAAItkD,GAAOukD,CAAQ;GAC9B,sBAA8BD,EAAK,eAAe;GAClD,oBAA4BA,EAAK,aAAa;GAC9C,WAAW,MAA6BA,EAAK,SAASz+C,CAAU;GAChE,iBAAiB,MAA6By+C,EAAK,SAASz+C,CAAU;GACtE,uBAAuB,MAA6By+C,EAAK,SAASz+C,CAAU;GAC5E,oBAAoB,EAClB,cAAc,MAA4By+C,EAAK,YAAYxtC,CAAO,EACpE;EACF;CACF,GAAA,CAAI,IAAI;AACV;;;ACrsBA,eAAsB0tC,GAAc,GAAmB,IAAqB,CAAC,GAAkB;CAC7F,IAAI,OAAO,WAAa,KAAa,MAAU,MAAM,gDAAgD;CACrG,IAAMzmB,IAAO,IAAI,KAAK,CAAC9hB,CAAiB,GAAG,EAAE,MAAM,kBAAkB,CAAC,GAChE3W,IAAM,IAAI,gBAAgBy4B,CAAI,GAC9B0mB,IAAS,SAAS,cAAc,QAAQ;CAK9C,AAJA,EAAO,MAAM,UAAU,gFACvB,EAAO,QAAQ5vC,EAAK,SAAS,SAC7B4vC,EAAO,aAAa,eAAe,MAAM,GAEzC,MAAM,IAAI,SAAe,GAAS,MAAW;EAC3C,IAAIC,IAAU,IACRd,UAAgB;GAEpB,AADAa,EAAO,OAAO,GACd,IAAI,gBAAgBn/C,CAAG;EACzB,GACMq/C,UAAe;GACnB,AAAID,MACJ,IAAU,IACV,WAAWd,GAAS/uC,EAAK,aAAa,GAAK,GAC3ClH,EAAQ;EACV;EAqBA,AApBA,EAAO,eAAe;GACpB,IAAI;IACF,IAAM0O,IAAIooC,EAAO;IACjB,IAAI,CAACpoC,GAAG,MAAU,MAAM,iBAAiB;IAEzC,AADAA,EAAE,MAAM,GACRA,EAAE,MAAM;GACV,QAAQ;IAEN,OAAO,KAAK/W,GAAK,UAAU,UAAU;GACvC;GACA,EAAO;EACT,GACA,EAAO,gBAAgB;GAErB,AADAs+C,EAAQ,GACHc,MACH,IAAU,IACVZ,EAAO,gBAAI,MAAM,kDAAkD,CAAC;EAExE,GACA,SAAS,KAAK,YAAYW,CAAM,GAChC,EAAO,MAAMn/C;CACf,CAAC;AACH;;;AChDA,IAAMs/C,KAA2C;CAE/C,2EAA2E;CAC3E,sBAAsB;CAEtB,6EAA6E;CAC7E,iCAAiC;CAEjC,qEAAqE;CACrE,4BAA4B;AAC9B,GAEMC,KAAgD;CACpD,MAAM;CACN,KAAK;CACL,MAAM;CACN,KAAK;CACL,MAAM;CACN,KAAK;AACP;AAMA,SAASC,GAAiB,GAAkC;CAC1D,IAAI;EACF,IAAMC,IAAQC,EAAU,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;EAGjD,IAAID,EAAM,SAAS,cAAc,KAAKA,EAAM,SAAS,UAAU,GAC7D,OAAO;EAIT,IAAME,IAAWD,EAAU,MAAM,uCAAuC;EACxE,IAAIC,KAAYA,EAAS,IAAI;GAE3B,IAAMC,IAAMC,GADI,mBAAmBF,EAAS,EACD,CAAO;GAClD,IAAIC,GAAK,OAAOA;EAClB;EAGA,OAAOC,GAA+BJ,CAAK;CAC7C,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAASI,GAA+B,GAA6B;CACnE,IAAMC,IAAY,KAAK,IAAI3xC,EAAK,YAAY,GAAG,GAAGA,EAAK,YAAY,IAAI,CAAC,GAClE4xC,IAAWD,KAAa,IAAI3xC,EAAK,MAAM2xC,IAAY,CAAC,IAAI3xC,GACxD6xC,IAAUD,EAAS,YAAY,GAAG;CAExC,OADIC,KAAW,KAAKA,MAAYD,EAAS,SAAS,IAAU,OACrDA,EAAS,MAAMC,IAAU,CAAC,CAAC,CAAC,YAAY;AACjD;AAKA,SAAgBC,GAAkB,GAAwC;CACxE,IAAI,CAAC3e,GAAQ,OAAO;CAGpB,IAAY,WAAmB,SAAS,UAAeA,aAAkB,MAAM;EAC7E,IAAY,WAAmB,SAAS,UAAeA,aAAkB,QAAQA,EAAO,MAAM;GAC5F,IAAMse,IAAMJ,GAAiBle,EAAO,IAAI;GACxC,IAAIse,KAAOA,KAAOL,IAChB,OAAOA,GAAcK;EAEzB;EAIA,OAHIte,EAAO,QAAQA,EAAO,QAAQge,KACzBA,GAAShe,EAAO,QAElB;CACT;CAGA,IAAI,OAAOA,KAAW,UAAU;EAC9B,IAAMse,IAAMJ,GAAiBle,CAAM;EACnC,IAAIse,KAAOA,KAAOL,IAChB,OAAOA,GAAcK;CAEzB;CAEA,OAAO;AACT;AAKA,SAAgBM,GAAiB,GAA0B;CACzD,OAAOD,GAAkB3e,CAAM,MAAM;AACvC;AAKA,SAAgB6e,GAA0B,GAAkD;CAC1F,QAAQC,GAAR;EACE,KAAK;EACL,KAAK,OACH,OAAO;EACT,KAAK;EACL,KAAK,OACH,OAAO;EACT,KAAK;EACL,KAAK,OACH,OAAO;CACX;AACF;AAKA,SAAgBC,GAAkB,GAAkC;CAClE,QAAQD,GAAR;EACE,KAAK,QACH,OAAO;EACT,KAAK,OACH,OAAO;EACT,KAAK,QACH,OAAO;EACT,KAAK,OACH,OAAO;EACT,KAAK,QACH,OAAO;EACT,KAAK,OACH,OAAO;CACX;AACF;AAKA,SAAgBE,GAAmB,GAA2C;CAE5E,QADiBH,GAA0BC,CACnC,GAAR;EACE,KAAK,QACH,OAAO;GACL,UAAU;GACV,MAAMA,MAAa,SAAS,0BAA0B;GACtD,WAAWA,EAAS,YAAY;GAChC,YAAY;GACZ,gBAAgB;GAChB,UAAU;EACZ;EACF,KAAK,cACH,OAAO;GACL,UAAU;GACV,MAAMA,MAAa,SAAS,oCAAoC;GAChE,WAAWA,EAAS,YAAY;GAChC,YAAY;GACZ,gBAAgB;GAChB,UAAU;EACZ;EACF,KAAK,SACH,OAAO;GACL,UAAU;GACV,MAAMA,MAAa,SAAS,2BAA2B;GACvD,WAAWA,EAAS,YAAY;GAChC,YAAY;GACZ,gBAAgB;GAChB,UAAU;EACZ;CACJ;AACF;AAKA,SAAgBG,GAAsB,GAA4C;CAChF,IAAMH,IAAWH,GAAkB3e,CAAM;CACzC,IAAI,CAAC8e,GAAU,OAAO;CAEtB,IAAMI,IAAWL,GAA0BC,CAAQ,GAC7CK,IAAWJ,GAAkBD,CAAQ,GAEvCM,GACAC;CAEJ,IAAY,WAAmB,SAAS,UAAerf,aAAkB,MACvE,IAAWA,EAAO;MACb,IAAI,OAAOA,KAAW,UAAU;EACrC,IAAcA;EACd,IAAMme,IAAQne,EAAO,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,IACxCwe,IAAY,KAAK,IAAIL,EAAM,YAAY,GAAG,GAAGA,EAAM,YAAY,IAAI,CAAC;EAC1E,IAAWK,KAAa,IAAIL,EAAM,MAAMK,IAAY,CAAC,IAAIL;CAC3D;CAEA,OAAO;EACL;EACA;EACA;EACA;EACA;CACF;AACF;AAEA,IAAamB,KAAsBV,IACtBW,KAAeX,IACfY,KAAmBb;AAChC,SAAgBc,GAAkB,GAAsB;CACtD,OAAOd,GAAkB,QAAQL,EAAI,QAAQ,OAAO,EAAE,GAAG,MAAM;AACjE;AACA,IAAaoB,KAA8B;CAAC;CAAQ;CAAO;CAAQ;CAAO;CAAQ;AAAK,GChNjFC,qBAAc,IAAI,IAAyB;AAKjD,eAAeC,GACb,GACA,GACiB;CAiBjB,OAhBI,OAAOC,KAAc,WAChB,gBAAgBf,EAAS,GAAGe,MAGzB,WAAmB,SAAS,UAAeA,aAAqB,OACnE,gBAAgBf,EAAS,GAAGe,EAAU,KAAK,GAAGA,EAAU,KAAK,GAAGA,EAAU,iBAGvE,WAAmB,SAAS,UAAeA,aAAqB,OACnE,gBAAgBf,EAAS,QAAQe,EAAU,KAAK,GAAGA,EAAU,SAGlEA,aAAqB,cAChB,gBAAgBf,EAAS,UAAUe,EAAU,eAG/C,gBAAgBf,EAAS,GAAG,OAAOe,CAAS;AACrD;AAEA,SAAS3rD,GAAc,GAAoB;CACzC,IAAI;EACF,OAAO,IAAI,gBAAgBijC,CAAI;CACjC,QAAQ;EACN,OAAO,eAAe,KAAK,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC;CAC7D;AACF;AAKA,eAAsB4oB,GACpB,GACA,GACA,IAA4C,UACf;CAC7B,IAAIC,MAAc,UAAUA,MAAc,IAAO,OAAO;CAExD,IAAM5T,IAAM,MAAMwT,GAAgBC,GAAWf,CAAQ;CAErD,IAAIa,GAAY,IAAIvT,CAAG,GACrB,OAAOuT,GAAY,IAAIvT,CAAG,CAAC,CAAE,MAAM,CAAC;CAGtC,IAAI4T,MAAc,aAAa,OAAO,SAAW,OAAe,OAAO,gBACrE,IAAI;EACF,IAAMC,IAAS,OAAO,eAAe,QAAQ7T,CAAG;EAChD,IAAI6T,GAAQ;GACV,IAAMnP,IAAS,KAAKmP,CAAM,GACpB5qC,IAAQ,IAAI,WAAWy7B,EAAO,MAAM;GAC1C,KAAK,IAAInuC,IAAI,GAAGA,IAAImuC,EAAO,QAAQ,KACjC,EAAMnuC,KAAKmuC,EAAO,WAAWnuC,CAAC;GAGhC,OADAg9C,GAAY,IAAIvT,GAAK/2B,EAAM,MAAM,GAC1BA,EAAM;EACf;CACF,QAAQ,CAER;CAGF,OAAO;AACT;AAKA,eAAsB6qC,GACpB,GACA,GACA,GACA,IAA4C,UAC7B;CACf,IAAIF,MAAc,UAAUA,MAAc,IAAO;CAEjD,IAAM5T,IAAM,MAAMwT,GAAgBC,GAAWf,CAAQ;CAGrD,IAFAa,GAAY,IAAIvT,GAAK+T,EAAU,MAAM,CAAC,CAAC,GAEnCH,MAAc,aAAa,OAAO,SAAW,OAAe,OAAO,gBACrE,IAAI;EAEF,IAAIG,EAAU,aAAa,SAAiB;GAC1C,IAAM9qC,IAAQ,IAAI,WAAW8qC,CAAS,GAClCrP,IAAS,IACPsP,IAAY;GAClB,KAAK,IAAIz9C,IAAI,GAAGA,IAAI0S,EAAM,QAAQ,KAAK+qC,GACrC,KAAU,OAAO,aAAa,MAAM,MAAM,MAAM,KAAK/qC,EAAM,SAAS1S,GAAGA,IAAIy9C,CAAS,CAAC,CAAC;GAExF,OAAO,eAAe,QAAQhU,GAAK,KAAK0E,CAAM,CAAC;EACjD;CACF,QAAQ,CAER;AAEJ;AAKA,SAAgBuP,KAAyB;CAEvC,IADAV,GAAY,MAAM,GACd,OAAO,SAAW,OAAe,OAAO,gBAC1C,IAAI;EACF,IAAMW,IAAyB,CAAC;EAChC,KAAK,IAAI39C,IAAI,GAAGA,IAAI,OAAO,eAAe,QAAQ,KAAK;GACrD,IAAMsvB,IAAI,OAAO,eAAe,IAAItvB,CAAC;GACrC,AAAIsvB,KAAKA,EAAE,WAAW,eAAe,KACnCquB,EAAa,KAAKruB,CAAC;EAEvB;EACA,EAAa,SAAS,MAAM,OAAO,eAAe,WAAWA,CAAC,CAAC;CACjE,QAAQ,CAAC;AAEb;AAeA,eAAsBsuB,GACpB,GACA,GACA,GACsC;CACtC,IAAMzB,IAAWH,GAAkBkB,CAAS;CAC5C,IAAI,CAACf,GACH,MAAU,MACR,wFACF;CAIF,IAAMkB,IAAYQ,EAAO,SAAS,UAC5BC,IAAS,MAAMV,GAAmBF,GAAWf,GAAUkB,CAAS;CACtE,IAAIS,GAGF,OAAO;EAAE,WAAWA;EAAQ,WADVvsD,GAAc,IADf,KAAK,CAACusD,CAAM,GAAG,EAAE,MAAM,kBAAkB,CAC1B,CACJ;EAAW,WAAW;CAAK;CAGzD,IAAIN;CAGJ,IAAIK,EAAO,SAAS;EAClB,IAAME,IAAY,MAAMF,EAAO,QAAQX,GAAWf,GAAU;GAC1D;GACA,cAAc0B,EAAO;EACvB,CAAC;EAED,IAAI,OAAOE,KAAc,UAAU;GACjC,IAAIA,EAAU,WAAW,OAAO,KAAKA,EAAU,WAAW,OAAO,KAAKA,EAAU,WAAW,MAAM,GAE/F,IAAY,OAAM,MADC,MAAMA,CAAS,EAAA,CACX,YAAY;QAEnC,MAAU,MAAM,oDAAoDA,GAAW;EAEnF,OAAO,IAAIA,aAAqB,aAC9B,IAAYA;OACP,IAAIA,aAAqB,YAAY;GAC1C,IAAMluC,IAAO,IAAI,WAAWkuC,EAAU,UAAU;GAEhD,AADAluC,EAAK,IAAIkuC,CAAS,GAClB,IAAYluC,EAAK;EACnB,OAAO,IAAI,OAAO,OAAS,OAAekuC,aAAqB,MAC7D,IAAY,MAAMA,EAAU,YAAY;OAExC,MAAU,MAAM,qDAAqD;CAEzE,OAAO;EAEL,IAAI,CAACF,EAAO,UACV,MAAU,MACR,4KACF;EAIF,IAAIplB,IAAwC,CAAC;EAK7C,IAJIolB,EAAO,YACT,IAAgB,OAAOA,EAAO,WAAY,aAAa,MAAMA,EAAO,QAAQ,IAAI,EAAE,GAAGA,EAAO,QAAQ,IAGlGA,EAAO,WAAW;GACpB,IAAMG,IAAQ,OAAOH,EAAO,aAAc,aAAa,MAAMA,EAAO,UAAU,IAAIA,EAAO;GACzF,AAAIG,MACF,EAAcC,gBACZD,EAAM,WAAW,SAAS,KAAKA,EAAM,WAAW,QAAQ,IAAIA,IAAQ,UAAUA;EAEpF;EAGA,IAAIE,GACAC,IAAiB1B,KAAY,YAAYN;EAE7C,IAAI,OAAOe,KAAc,UAAU;GAEjC,IAAMkB,IAAa,MAAM,MAAMlB,CAAS;GACxC,IAAI,CAACkB,EAAW,IACd,MAAU,MACR,6CAA6ClB,EAAU,SAASkB,EAAW,OAAO,EACpF;GAGF,IADA,IAAa,MAAMA,EAAW,KAAK,GAC/B,CAAC3B,GAAU;IACb,IAAMx6C,IAAQi7C,EAAU,MAAM,uCAAuC;IACrE,IAAIj7C,KAASA,EAAM,IAAI;KACrB,IAAM2wC,IAAU,mBAAmB3wC,EAAM,EAAE,GACrC45C,IAAY,KAAK,IAAIjJ,EAAQ,YAAY,GAAG,GAAGA,EAAQ,YAAY,IAAI,CAAC;KAC9E,IAAiBiJ,KAAa,IAAIjJ,EAAQ,MAAMiJ,IAAY,CAAC,IAAIjJ;IACnE,OAAO;KACL,IAAM4I,IAAQ0B,EAAU,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,IAC3CrB,IAAY,KAAK,IAAIL,EAAM,YAAY,GAAG,GAAGA,EAAM,YAAY,IAAI,CAAC;KAC1E,AAAIK,KAAa,MACf,IAAiBL,EAAM,MAAMK,IAAY,CAAC;IAE9C;GACF;EACF,OAAO,IAAY,WAAmB,SAAS,UAAeqB,aAAqB,MAEjF,AADA,IAAaA,GACb,IAAiBA,EAAU;OACtB,IAAY,WAAmB,SAAS,UAAeA,aAAqB,MACjF,IAAaA;OACR,IAAIA,aAAqB,aAC9B,IAAa,IAAI,KAAK,CAACA,CAAS,GAAG,EAAE,MAAMd,GAAkBD,CAAQ,EAAE,CAAC;OAExE,MAAU,MAAM,2CAA2C;EAI7D,CAAI,CAACgC,EAAe,SAAS,GAAG,KAAKA,EAAe,SAAS,GAAG,OAC9D,IAAiB,GAAGA,EAAe,QAAQ,OAAO,EAAE,EAAE,GAAGhC;EAK3D,IAAMkC,IAAW,IAAI,SAAS;EAG9B,AAFAA,EAAS,OAAO,SAASH,GAAYC,CAAc,GAE/CN,EAAO,iBACLA,EAAO,aAAa,kBACtBQ,EAAS,OAAO,kBAAkB,MAAM,GAEtCR,EAAO,aAAa,oBACtBQ,EAAS,OAAO,oBAAoB,MAAM;EAI9C,IAAMC,IAAc,MAAM,MAAMT,EAAO,UAAU;GAC/C,QAAQ;GACR,SAASplB;GACT,MAAM4lB;EACR,CAAC;EAED,IAAI,CAACC,EAAY,IAAI;GACnB,IAAIC,IAAc;GAClB,IAAI;IACF,IAAc,MAAMD,EAAY,KAAK;GACvC,QAAQ,CAAC;GACT,MAAU,MACR,gDAAgDA,EAAY,OAAO,IAAIC,KAAeD,EAAY,YACpG;EACF;EAEA,IAAY,MAAMA,EAAY,YAAY;CAC5C;CAGA,MAAMf,GAAmBL,GAAWf,GAAUqB,GAAWH,CAAS;CAGlE,IAAMmB,IAAYjtD,GAAc,IADf,KAAK,CAACisD,CAAS,GAAG,EAAE,MAAM,kBAAkB,CAC7B,CAAI;CAEpC,OAAO;EACL;EACA;EACA,WAAW;CACb;AACF;AAKA,eAAsBiB,GACpB,GACA,GACA,GACsC;CACtC,OAAOb,GAAsB7hD,GAAK8hD,GAAQpB,CAAQ;AACpD;AAKA,eAAsBiC,GACpB,GACA,GACA,GACsC;CACtC,OAAOd,GAAsBtpC,GAAMupC,GAAQpB,CAAQ;AACrD;AAKA,IAAakC,KAAkB;CAC7B,SAASf;CACT,iBAAiBA;CACjB,YAAYa;CACZ,aAAaC;CACb,WAAWtB;CACX,WAAWG;CACX,YAAYG;AACd,GCjUakB,MAA6D,EACxE,aACA,aACA,UACA,iBACI;CACJ,IAAMh/C,IAAOy8C,GAAmBF,CAAQ;CAExC,OACE,kBAAC,OAAD;EACE,OAAO;GACL,UAAU;GACV,OAAO;GACP,iBAAiB;GACjB,gBAAgB;GAChB,QAAQ;GACR,SAAS;GACT,eAAe;GACf,YAAY;GACZ,gBAAgB;GAChB,SAAS;GACT,OAAO;GACP,YACE;EACJ;EAfF,UAAA,CAiBE,kBAAC,OAAD;GACE,OAAO;IACL,UAAU;IACV,OAAO;IACP,iBAAiB;IACjB,cAAc;IACd,WAAW;IACX,QAAQ;IACR,SAAS;IACT,SAAS;IACT,eAAe;IACf,YAAY;IACZ,WAAW;GACb;GAbF,UAAA;IAgBE,kBAAC,OAAD;KACE,OAAO;MACL,SAAS;MACT,YAAY;MACZ,KAAK;MACL,iBAAiBv8C,EAAK;MACtB,OAAO;MACP,SAAS;MACT,cAAc;MACd,UAAU;MACV,YAAY;MACZ,eAAe;MACf,eAAe;MACf,cAAc;MACd,WAAW,cAAcA,EAAK,WAAW;KAC3C;KAfF,UAAA;MAiBE,kBAAC,OAAD;OACE,OAAM;OACN,QAAO;OACP,SAAQ;OACR,MAAK;OACL,QAAO;OACP,aAAY;OACZ,eAAc;OACd,gBAAe;OARjB,UAAA;QAUE,kBAAC,QAAD,EAAM,GAAE,6DAA8D,CAAA;QACtE,kBAAC,YAAD,EAAU,QAAO,iBAAkB,CAAA;QACnC,kBAAC,QAAD;SAAM,IAAG;SAAK,IAAG;SAAK,IAAG;SAAI,IAAG;QAAM,CAAA;QACtC,kBAAC,QAAD;SAAM,IAAG;SAAK,IAAG;SAAK,IAAG;SAAI,IAAG;QAAM,CAAA;QACtC,kBAAC,YAAD,EAAU,QAAO,eAAgB,CAAA;OAC9B;;MACJA,EAAK;MAAU;KACb;;IAGHgF,IA8CA,kBAAC,OAAD;KACE,OAAO;MACL,OAAO;MACP,QAAQ;MACR,cAAc;MACd,iBAAiB;MACjB,OAAO;MACP,SAAS;MACT,YAAY;MACZ,gBAAgB;MAChB,cAAc;KAChB;KAEA,UAAA,kBAAC,OAAD;MACE,OAAM;MACN,QAAO;MACP,SAAQ;MACR,MAAK;MACL,QAAO;MACP,aAAY;MACZ,eAAc;MACd,gBAAe;MARjB,UAAA;OAUE,kBAAC,UAAD;QAAQ,IAAG;QAAK,IAAG;QAAK,GAAE;OAAM,CAAA;OAChC,kBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAI,IAAG;QAAK,IAAG;OAAM,CAAA;OACtC,kBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAK,IAAG;QAAQ,IAAG;OAAM,CAAA;MACvC;;IACF,CAAA,IAxEL,kBAAC,OAAD;KAAK,OAAO;MAAE,UAAU;MAAY,OAAO;MAAQ,QAAQ;MAAQ,cAAc;KAAO;KAAxF,UAAA,CACE,kBAAC,OAAD;MACE,OAAO;OACL,WAAW;OACX,OAAO;OACP,QAAQ;MACV;MACA,SAAQ;MANV,UAAA,CAQE,kBAAC,UAAD;OACE,IAAG;OACH,IAAG;OACH,GAAE;OACF,MAAK;OACL,QAAO;OACP,aAAY;MACb,CAAA,GACD,kBAAC,UAAD;OACE,IAAG;OACH,IAAG;OACH,GAAE;OACF,MAAK;OACL,QAAQhF,EAAK;OACb,aAAY;OACZ,iBAAgB;OAChB,kBAAiB;OACjB,eAAc;MACf,CAAA,CACE;KACL,CAAA,GAAA,kBAAC,OAAD;MACE,OAAO;OACL,UAAU;OACV,OAAO;OACP,SAAS;OACT,YAAY;OACZ,gBAAgB;OAChB,YAAY;OACZ,UAAU;OACV,OAAOA,EAAK;MACd;MAEC,UAAAA,EAAK,UAAU;KACb,CAAA,CACF;IAEL,CAAA;IA+BF,kBAAC,MAAD;KACE,OAAO;MACL,QAAQ;MACR,UAAU;MACV,YAAY;MACZ,OAAO;KACT;KAEC,UAAAgF,IAAQ,sBAAsB,aAAahF,EAAK;IAC/C,CAAA;IAGH68C,KACC,kBAAC,KAAD;KACE,OAAO;MACL,QAAQ;MACR,UAAU;MACV,OAAO;MACP,YAAY;MACZ,UAAU;MACV,UAAU;MACV,cAAc;MACd,YAAY;KACd;KACA,OAAOA;KAEN,UAAAA;IACA,CAAA;IAIL,kBAAC,KAAD;KACE,OAAO;MACL,QAAQ;MACR,UAAU;MACV,YAAY;MACZ,OAAO73C,IAAQ,YAAY;KAC7B;KAEC,UAAAA,IACGA,EAAM,WAAW,4DACjB;IACH,CAAA;IAGFA,KAASi6C,KACR,kBAAC,UAAD;KACE,SAASA;KACT,OAAO;MACL,SAAS;MACT,YAAY;MACZ,KAAK;MACL,iBAAiBj/C,EAAK;MACtB,OAAO;MACP,QAAQ;MACR,cAAc;MACd,SAAS;MACT,UAAU;MACV,YAAY;MACZ,QAAQ;MACR,YAAY;KACd;KACA,cAAc,MAAO,EAAG,cAA8B,MAAM,UAAU;KACtE,aAAa,MAAO,EAAG,cAA8B,MAAM,UAAU;KAjBvE,UAAA,CAmBE,kBAAC,OAAD;MACE,OAAM;MACN,QAAO;MACP,SAAQ;MACR,MAAK;MACL,QAAO;MACP,aAAY;MACZ,eAAc;MACd,gBAAe;MARjB,UAAA,CAUE,kBAAC,YAAD,EAAU,QAAO,gBAAiB,CAAA,GAClC,kBAAC,QAAD,EAAM,GAAE,oCAAqC,CAAA,CAC1C;KAAC,CAAA,GAAA,kBAEA;;GAEP;EAEL,CAAA,GAAA,kBAAC,SAAD,EAAA,UAAQ,oJAKC,CAAA,CACN;;AAET;;;AClNA,SAASk/C,GAAc,GAAoB;CACzC,IAAI;EACF,OAAO,IAAI,gBAAgBtqB,CAAI;CACjC,QAAQ;EACN,OAAO,eAAe,KAAK,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC;CAC7D;AACF;AAEA,SAAgBuqB,GACd,GACA,IAAoC,CAAC,GACZ;CACzB,IAAM,EAAE,iBAAc,OAASxxC,GACzByxC,IAAa7sD,EAAOob,CAAO;CACjC,EAAW,UAAUA;CAErB,IAAM,CAAC0xC,GAAcC,KAAmBrpD,EAAkB,EAAK,GACzD,CAACspD,GAAQC,KAAavpD,QAEtB,OAAOqnD,KAAc,YAAY,CAACjB,GAAiBiB,CAAS,IACvDA,IAEF,IACR,GACK,CAACM,GAAW6B,KAAgBxpD,EAA6B,IAAI,GAC7D,CAACypD,GAAWC,KAAgB1pD,EAAkB,EAAK,GACnD,CAAC+O,GAAO46C,KAAY3pD,EAAuB,IAAI,GAE/C4pD,IAAsBttD,EAAsB,IAAI,GAEhDutD,IAAWxC,IAAYjB,GAAiBiB,CAAS,IAAI,IACrDf,IAAWe,IAAYlB,GAAkBkB,CAAS,IAAI,MACtDyC,IAAezC,IAAYZ,GAAsBY,CAAS,IAAI,MAE9D0C,IAAazgD,QAAkB;EACnC,AAEEsgD,EAAoB,aADpB,IAAI,gBAAgBA,EAAoB,OAAO,GACjB;CAElC,GAAG,CAAC,CAAC,GAECI,IAAgB1gD,EAAY,YAAoC;EACpE,IAAI,CAAC+9C,GAIH,OAHA0C,EAAW,GACXR,EAAU,IAAI,GACdC,EAAa,IAAI,GACV;EAGT,IAAM,EAAE,qBAAkB,CAAC,GAAG,gBAAaL,EAAW;EAGtD,IAAI,CAACU,GAAU;GACb,IAAI,OAAOxC,KAAc,UAMvB,OALA0C,EAAW,GACXR,EAAUlC,CAAS,GACnBmC,EAAa,IAAI,GACjBE,EAAa,EAAK,GAClBC,EAAS,IAAI,GACNtC;GAET,IAAY,WAAmB,SAAS,UAAeA,aAAqB,MAAM;IAChF,EAAW;IACX,IAAMnhD,IAAM+iD,GAAc5B,CAAS;IAKnC,OAJA,EAAoB,UAAUnhD,GAC9BqjD,EAAUrjD,CAAG,GACbwjD,EAAa,EAAK,GAClBC,EAAS,IAAI,GACNzjD;GACT;GACA,OAAO;EACT;EAGA,AADAmjD,EAAgB,EAAI,GACpBM,EAAS,IAAI;EAEb,IAAI;GACF,IAAM/4C,IAAS,MAAMm3C,GAAsBV,GAAW4C,GAAiBrD,CAAQ;GAQ/E,OAPAmD,EAAW,GACX,EAAoB,UAAUn5C,EAAO,WAErC24C,EAAU34C,EAAO,SAAS,GAC1B44C,EAAa54C,EAAO,SAAS,GAC7B84C,EAAa94C,EAAO,SAAS,GAC7By4C,EAAgB,EAAK,GACdz4C,EAAO;EAChB,SAASoD,GAAU;GACjB,IAAMk2C,IAAiBl2C,aAAe,QAAQA,IAAU,MAAM,OAAOA,CAAG,CAAC;GAGzE,OAFA21C,EAASO,CAAc,GACvBb,EAAgB,EAAK,GACd;EACT;CACF,GAAG;EAAChC;EAAWwC;EAAUE;CAAU,CAAC;CAWpC,OATAvtD,SACM2tD,KAAe9C,KACjB2C,EAAc,SAEH;EACX,EAAW;CACb,IACC;EAAC3C;EAAW8C;EAAaH;EAAeD;CAAU,CAAC,GAE/C;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,SAASC;CACX;AACF;AAMA,eAAsBI,GACpB,GACA,GACA,GAMC;CACD,IAAI,CAAChE,GAAiBiB,CAAS,GAAG;EAChC,IAAI,OAAOA,KAAc,UAGvB,OAAO;GAAE,QAAQA;GAAW,WAAW,OADlB,MADF,MAAMA,CAAS,EAAA,CACR,YAAY;GACS,WAAW;GAAO,UAAU;EAAM;EAEnF,IAAY,WAAmB,SAAS,UAAeA,aAAqB,MAAM;GAChF,IAAMgD,IAAS,MAAMhD,EAAU,YAAY;GAE3C,OAAO;IAAE,QADG4B,GAAc5B,CACT;IAAK,WAAWgD;IAAQ,WAAW;IAAO,UAAU;GAAM;EAC7E;EACA,IAAIhD,aAAqB,aAEvB,OAAO;GAAE,QAAQ4B,GAAc,IADd,KAAK,CAAC5B,CAAS,GAAG,EAAE,MAAM,kBAAkB,CAC9B,CAAI;GAAG,WAAWA;GAAW,WAAW;GAAO,UAAU;EAAM;CAElG;CAEA,IAAMf,IAAWH,GAAkBkB,CAAS,KAAK,QAC3Cz2C,IAAS,MAAMm3C,GAAsBV,GAAWW,GAAQpB,CAAQ;CAEtE,OAAO;EACL,QAAQh2C,EAAO;EACf,WAAWA,EAAO;EAClB,WAAWA,EAAO;EAClB;CACF;AACF;;;ACrGA,IAAM05C,WACJ,OAAO,SAAW,OAAe,gBAAgB,SAAS,OAAO,WAAW,IAAI,GAAG,KAAK,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,KAE3HC,KAAiB5uD,EAAM,WAAmD,SAAwB,GAAO,GAAK;CACzH,IAAM,EACJ,YAAS,eAAY,iBAAc,sBAAmB,eAAY,gBAAa,IAAM,gBAAa,SAAM,qBAAqB6uD,GAC7H,YAAS,eAAY,oBACrB,sBAAmB,gBAAa,IAAO,cAAW,gBAAa,sBAC/D,sBAAmB,uBAAoB,yBAAsB,cAAW,IACxE,WAAQ,sBAAkB,IAAO,gBAAa,mBAAe,mBAAgB,mBAAe,qBAAkB,iBAAc,cAAU,IAAM,cAAW,IAAM,mBAAgB,IAC7K,eAAW,WAAO,uCAAmC,IACrD,yBAAsB,IAAM,iBAAc,UAAU,2BAAuB,IAC3E,OAAI,kBAAc,mBAAgB,iBAClC,qBAAiB,wBAAoB,uBAAmB,6BACxD,iBACA,aAAaC,IACb,gBACA,iBACA,eACA,gBACA,iBACEC,GAGEC,IAASruD,EAAOouD,CAAK;CAC3B,EAAO,UAAUA;CAEjB,IAAME,KAAUtuD,EAAuB,IAAI,GACrCJ,IAAMqkC,QAAc,IAAI2U,GAAU,GAAG,CAAC,CAAC,GACvCxN,IAAoBnH,QAAc,IAAIkiB,GAAkB,GAAG,CAAC,CAAC,GAG7D,CAACoI,MAAuB7qD,QACtB,IAAI0T,GAAYo3C,IAAYtC,IAAUuC,IAAWC,GAAavvC,EAAW,CACjF,GACM+D,IAAcirC,MAAmBI,IACjCI,KAAc3uD,EAAiC,IAAI;CACzD,AAA0B2uD,GAAY,YAAU,IAAI9G,GAAkBjoD,GAAKwrC,GAAmBv3B,GAAIqP,CAAW;CAC7G,IAAMoxB,KAAWqa,GAAY;CAiE7B,AAhEAC,EAAoB7uD,SAAWu0C,IAAU,CAACA,EAAQ,CAAC,GAGnDp0C,QAAgB;EACd,AAAIsuD,MACFtrC,EAAY,UAAUsrC,EAAU;CAEpC,GAAG,CAACtrC,GAAasrC,EAAU,CAAC,GAG5BtuD,QAAgB;EACd,AAAIgsD,MACFhpC,EAAY,UAAUgpC,EAAQ;CAElC,GAAG,CAAChpC,GAAagpC,EAAQ,CAAC,GAG1BhsD,QAAgB;EACd,AAAIuuD,MACFvrC,EAAY,SAASurC,EAAS;CAElC,GAAG,CAACvrC,GAAaurC,EAAS,CAAC,GAG3BvuD,QAAgB;EACd,AAAIwuD,KACFxrC,EAAY,WAAWwrC,CAAW;CAEtC,GAAG,CAACxrC,GAAawrC,CAAW,CAAC,GAG7BxuD,QAAgB;EACd,AAAIif,OAAgB,KAAA,KAClB+D,EAAY,eAAe/D,MAAe,IAAI;CAElD,GAAG,CAAC+D,GAAa/D,EAAW,CAAC,GAG7Bjf,QAAgB;EACd,AAAI4iC,OAAgB,KAAA,KAClB5f,EAAY,eAAe4f,EAAW;CAE1C,GAAG,CAAC5f,GAAa4f,EAAW,CAAC,GAG7B5iC,QAAgB;EACd,IAAMqY,IAAgE,CAAC;EAGvE,AAFIjR,GAAa,mBAAmB,KAAA,MAAW,EAAQ,iBAAiBA,EAAY,iBAChFA,GAAa,iBAAiB,KAAA,MAAW,EAAQ,eAAeA,EAAY,eAC5E,OAAO,KAAKiR,CAAO,CAAC,CAAC,SAAS,KAChC2K,EAAY,WAAW3K,CAAO;CAElC,GAAG;EAAC2K;EAAa5b,GAAa;EAAgBA,GAAa;CAAY,CAAC,GAExEpH,QAAgB;EACd,IAAI2T,GAGF,OAFA,GAAS,KAAKA,GACdg0C,GAAkB,iBAAiBh0C,GAAIygC,EAAQ,SAClC;GACX,GAAkB,mBAAmBzgC,CAAE;EACzC;CAEJ,GAAG,CAACygC,IAAUzgC,CAAE,CAAC,GAEjB3T,QAAgB;EACd,AAAIy0C,OAAiB,KAAA,KACnBL,GAAS,gBAAgBK,EAAY;CAEzC,GAAG,CAACL,IAAUK,EAAY,CAAC;CAG3B,IAAMka,KAAeC,KAAW3d,GAC1B,CAAC9mC,IAAQc,MAAazH,EAA6BmrD,EAAY,GAC/D,CAACE,IAAmBC,MAAwBtrD,EAA0C,KAAA,CAAS,GAC/F,CAAC8tC,GAAWyd,MAAgBvrD,EAAS,CAAC;CAC5C,QAAgB;EAEd,AADAyH,GAAU0jD,EAAY,GACtBG,GAAqB,KAAA,CAAS;CAChC,GAAG,CAACH,EAAY,CAAC;CACjB,IAAMK,KAAeliD,GAAa,GAAa,MAAkC;EAG/E,AAFA7B,GAAUvB,CAAG,GACbolD,GAAqB5zC,CAAO,GAC5B6zC,IAAc,MAAMr9C,IAAI,CAAC;CAC3B,GAAG,CAAC,CAAC,GAGCu9C,KAAalrB,QAAckmB,GAAsB9/C,EAAM,GAAG,CAACA,EAAM,CAAC,GAClE,CAAC+kD,IAAuBC,MAA4B3rD,EAA6B,KAAA,CAAS,GAC1F4rD,KAAiBH,KAAaC,KAAwB/kD,IACtD,CAACklD,IAAuBC,MAA4B9rD,EAExDyrD,KAAa,eAAe,MAAM,GAC9B,CAACM,GAAuBC,MAA4BhsD,EAAuB,IAAI;CAErF,QAAgB;EACd,IAAI,CAAC2G,IAAQ;GAGX,AAFAglD,GAAyB,KAAA,CAAS,GAClCG,GAAyB,MAAM,GAC/BE,GAAyB,IAAI;GAC7B;EACF;EAEA,IAAI,CAACP,IAAY;GAIf,AAFAE,GAAyB,KAAA,CAAS,GAClCG,GAAyB,MAAM,GAC/BE,GAAyB,IAAI;GAC7B;EACF;EAGA,IAAI,CAAClD,IAAiB;GACpB,IAAM90C,IAAM,gBAAI,MACd,aAAay3C,GAAW,YAAY,WAAW,mBAAmBA,GAAW,SAAS,aAAaA,GAAW,SAAS,YAAY,EAAE,2GACvI;GAKA,AAJAE,GAAyB,KAAA,CAAS,GAClCG,GAAyB,OAAO,GAChCE,GAAyBh4C,CAAG,GAC5B9X,EAAI,KAAK,yBAAyB;IAAE,UAAUuvD,GAAW;IAAU,OAAOz3C;IAAK,KAAKrN;GAAO,CAAC,GAC5FgkD,EAAO,QAAQ,0BAA0B;IAAE,UAAUc,GAAW;IAAU,OAAOz3C;IAAK,KAAKrN;GAAO,CAAC;GACnG;EACF;EAEA,IAAIo9B,IAAY,IACZkoB,IAAoC;EAqDxC,OAnDAH,GAAyB,YAAY,GACrCE,GAAyB,IAAI,GAC7B9vD,EAAI,KAAK,oBAAoB;GAC3B,UAAUuvD,GAAW;GACrB,KAAK9kD;GACL,UAAU8kD,GAAW;EACvB,CAAC,GACDd,EAAO,QAAQ,qBAAqB;GAClC,UAAUc,GAAW;GACrB,KAAK9kD;GACL,UAAU8kD,GAAW;EACvB,CAAC,GAED1D,GAAsBphD,IAAQmiD,IAAiB2C,GAAW,QAAQ,CAAC,CAChE,MAAM,MAAQ;GACb,IAAI1nB,GAAW;IACb,IAAI,gBAAgBnE,EAAI,SAAS;IACjC;GACF;GASA,AARA,IAAqBA,EAAI,WACzB+rB,GAAyB/rB,EAAI,SAAS,GACtCksB,GAAyB,WAAW,GACpC5vD,EAAI,KAAK,mBAAmB;IAC1B,UAAUuvD,GAAW;IACrB,KAAK9kD;IACL,WAAWi5B,EAAI;GACjB,CAAC,GACD+qB,EAAO,QAAQ,oBAAoB;IACjC,UAAUc,GAAW;IACrB,KAAK9kD;IACL,WAAWi5B,EAAI;GACjB,CAAC;EACH,CAAC,CAAC,CACD,OAAO,MAAQ;GACd,IAAImE,GAAW;GACf,IAAMh1B,IAAQiF,aAAe,QAAQA,IAAU,MAAM,OAAOA,CAAG,CAAC;GAShE,AARA23C,GAAyB,KAAA,CAAS,GAClCG,GAAyB,OAAO,GAChCE,GAAyBj9C,CAAK,GAC9B7S,EAAI,KAAK,yBAAyB;IAChC,UAAUuvD,GAAW;IACrB;IACA,KAAK9kD;GACP,CAAC,GACDgkD,EAAO,QAAQ,0BAA0B;IACvC,UAAUc,GAAW;IACrB;IACA,KAAK9kD;GACP,CAAC;EACH,CAAC,SAEU;GAEX,AADA,IAAY,IACRslD,KACF,IAAI,gBAAgBA,CAAkB;EAE1C;CACF,GAAG;EAACtlD;EAAQmnC;EAAW2d;EAAY3C;EAAiB5sD;CAAG,CAAC;CAGxD,IAAM,CAAC4H,IAAWD,MAAgB7D,EAAS,MAAM,GAC3C,CAAC8B,IAAiBC,MAAsB/B,EAASqxC,KAAY6a,CAAa,GAC1E,CAAC7nD,IAAkB8nD,MAAuBnsD,EAAS,EAAK,GACxD,CAACsE,IAAYivC,MAAiBvzC,EAAgC,UAAU,GACxE,CAACxC,IAAO8sC,KAAYtqC,EAAS,OAAO8pC,KAAiB,WAAWA,IAAe,CAAG,GAClF,CAACsiB,IAAgBC,MAAqBrsD,EAAS,EAAK,GACpD,CAACssD,IAAkBC,MAAuBvsD,EAAS,EAAK,GACxD,CAACkC,IAAgBC,MAAqBnC,EAAwC,YAAY,GAC1F,CAACwC,IAAYC,MAAiBzC,EAA+C,QAAQ,GACrF,CAACsC,GAAUD,MAAerC,EAAS,CAAC,GAEpC,CAACunB,GAAektB,MAAoBz0C,EAAS,EAAE,GAE/CwsD,KAAuBjsB,QACvBrrB,IACK;EACL,mBAAmB;EACnB,oBAAoB;EACpB,sBAAsB;EACtB,WAAW;EACX,gBAAgB;EAChB,cAAc;CAChB,IAEK;EACL,mBAAmBtR,GAAa,qBAAqB6oD,KAAqB9oD,MAAsB;EAChG,oBAAoBC,GAAa,sBAAsB8oD,KAAsB/oD,MAAsB;EACnG,sBAAsBC,GAAa,wBAAwB+oD,KAAwBhpD,MAAsB;EACzG,WAAWC,GAAa,aAAagpD,MAAoB;EACzD,gBAAgBhpD,GAAa,kBAAkB;EAC/C,cAAcA,GAAa,gBAAgB;CAC7C,GACC;EAACsR;EAAUtR;EAAa6oD;EAAmBC;EAAoBC;EAAsBhpD;EAAmBipD;CAAgB,CAAC,GACtHC,KAAqB,CAAC33C,KAAYvR,MAAsB;CAE9D,QAAgB;EACd,EAAY,YAAY6oD,GAAqB,iBAAiB,EAAK;CACrE,GAAG,CAAChtC,GAAagtC,GAAqB,YAAY,CAAC;CAGnD,IAAMM,KAAgBpC,EAAM,aAAa,IACnCqC,KAAkBrC,EAAM,aAAa;CAoB3C,AAnBAluD,QAAgB;EACd,EAAkB,mBAAmBswD,MAAiBC,KAAkB;GAAE,IAAID;GAAe,MAAMC;EAAgB,IAAI,KAAA,CAAS;CAClI,GAAG;EAACrlB;EAAmBolB;EAAeC;CAAe,CAAC,GACtDvwD,QAAgB;EACd,EAAkB,YAAY0Y,CAAQ;CACxC,GAAG,CAACwyB,GAAmBxyB,CAAQ,CAAC,GAChC1Y,QAAgB;EACd,EAAkB,iBAAiB,EAAQoH,GAAa,aAAc;CACxE,GAAG,CAAC8jC,GAAmB9jC,GAAa,aAAa,CAAC,GAGlDpH,QAAgB;EAEd,AADAkrC,EAAkB,MAAM,GACxBA,EAAkB,YAAY,IAAI;CACpC,GAAG,CAACA,GAAmB/gC,EAAM,CAAC,GAG9BnK,QAAgBkrC,EAAkB,iBAAiB,sBAAsB,MAAMxrC,EAAI,KAAK,qBAAqB,CAAC,CAAC,GAAG,CAACwrC,GAAmBxrC,CAAG,CAAC,GAE1IM,QAAgB;EAEd,AADIgwD,GAAqB,sBAAsB,MAAS1oD,OAAc,cAAYD,GAAa,MAAM,GACjG2oD,GAAqB,mBAAmB,MAAS1oD,OAAc,WAASD,GAAa,MAAM;CACjG,GAAG;EAAC2oD,GAAqB;EAAmBA,GAAqB;EAAgB1oD;CAAS,CAAC;CAG3F,IAAMkpD,KAAgB1wD,EAAoB,CAAC,CAAC,GACtC2wD,KAAY3wD,EAAyC,IAAI,GACzD4wD,KAAU5wD,EAAO;EAAE,SAAS;EAAG,OAAO;CAAE,CAAC,GACzC6wD,KAAY7wD,EAAOqK,EAAM;CAC/B,GAAU,UAAUA;CACpB,IAAMymD,KAAiB9wD,EAA0B,IAAI,GAC/C+wD,KAAuB/wD,EAAO,EAAK,GAGnC,CAACgxD,IAA6BC,MAAkCvtD,EAA+B,CAAC,CAAC,GACjGmpB,KAAsBoX,QACnBiqB,KAA2B8C,IACjC,CAAC9C,GAAyB8C,EAA2B,CAAC,GACnDE,KAAyBlxD,EAAO6sB,EAAmB;CACzD,GAAuB,UAAUA;CAEjC,IAAMskC,KAAyBnkD,GAAa,MAAqC;EAE/E,AADAikD,GAA+B5I,CAAU,GACzCgG,EAAO,QAAQ,8BAA8BhG,CAAU;CACzD,GAAG,CAAC,CAAC;CAEL,SACE/T,GAAS,MACP;EACE,sBAAsBlJ,EAAkB,mBAAmB;EAC3D,qBAAqBslB,GAAc;EACnC,oBAAoBrC,EAAO,QAAQ;EACnC,sBAAsBsC,GAAU;EAChC,sBAAsBE,GAAU;EAChC,mBAAmBxC,EAAO,QAAQ;EAClC,0BAA0BA,EAAO,QAAQ,aAAa;EACtD,sBAAsBuC,GAAQ,QAAQ;EACtC,oBAAoBA,GAAQ,QAAQ;EACpC;EACA,WAAW,GAAiB,MAAmC;GAC7D,EAAI,KAAK,qBAAqB;IAAE,MAAM9/C;IAAS,QAAQsK,GAAS;GAAO,CAAC;EAC1E;EACA,8BAA8B81C,GAAuB;EACrD;CACF,GACA5C,GAAQ,OACV,SACaha,GAAS,QAAQ,IAC7B;EAACA;EAAUlJ;EAAmB8jB;EAActvD;EAAKuxD;CAAsB,CAAC;CAG3E,IAAMC,KAAWpxD,EAAO,EAAK;CAS7B,AARAE,QAAgB;EACd,AAAIkxD,GAAS,YACb,GAAS,UAAU,IACf/C,EAAO,QAAQ,aAAWC,GAAQ,SAAS,MAAM,EAAE,eAAe,GAAK,CAAC,GAC5ED,EAAO,QAAQ,UAAU/Z,EAAQ;CACnC,GAAG,CAACA,EAAQ,CAAC,GAGbp0C,QAAgB;EACd,IAAMmxD,KAAa,MAA+B;GAEhD,AADAxB,GAAoB,EAAI,GACxB5Y,GAAc7vC,CAAG;EACnB,GAEMkqD,IAAO;GACX1xD,EAAI,GAA4B,yBAAyB,MAAM;IAC7D,IAAMomD,IAAW5hD,GAAG,YAAY,CAAC;IAGjC,AAFI4hD,EAAS,SAAS,WAAW,KAAGvgD,GAAmB,EAAI,GACvDugD,EAAS,SAAS,YAAY,KAAGqL,EAAU,UAAU,GACrDrL,EAAS,SAAS,aAAa,KAAGqL,EAAU,QAAQ;GAC1D,CAAC;GACDzxD,EAAI,GAA4B,0BAA0B,MAAM;IAC9D,IAAMomD,IAAW5hD,GAAG,YAAY,CAAC;IAEjC,AADI4hD,EAAS,SAAS,WAAW,KAAGvgD,GAAmB,EAAK,IACxDugD,EAAS,SAAS,YAAY,KAAKA,EAAS,SAAS,aAAa,MAAG6J,GAAoB,EAAK;GACpG,CAAC;GACDjwD,EAAI,GAAuB,iCAAiC,MAAM;IAChE,IAAM2xD,IAAQntD,GAAG;IACjB,AAAImtD,MAAU,eAAcF,EAAU,UAAU,IACvCE,MAAU,gBAAeF,EAAU,QAAQ,IAC/C5rD,GAAmB,EAAI;GAC9B,CAAC;GACD7F,EAAI,GAA4B,wBAAwB,MAAMA,EAAI,KAAK,eAAe,EAAE,MAAMwE,GAAG,QAAQ,KAAK,CAAC,CAAC;GAChHxE,EAAI,GAAG,gBAAgB,YAAY;IACjC,IAAI;KAEF,MAAMkpD,GAAc,MADDxU,GAAS,YAAY,GACd,EAAE,OAAO+Z,EAAO,QAAQ,SAAS,CAAC;IAC9D,SAAS32C,GAAK;KAEZ,AADA,QAAQ,MAAM,sCAAsCA,CAAG,GACvD9X,EAAI,KAAK,sBAAsB,EAAE,OAAO8X,EAAI,CAAC;IAC/C;GACF,CAAC;GACD9X,EAAI,GAAG,mBAAmB,YAAY;IACpC,IAAI;KACF,IAAI+X,IAAOm5C,GAAe;KAG1B,IAFIn5C,IAAM,GAAe,UAAU,OAC9B,IAAO,MAAM28B,GAAS,YAAY,GACnC,CAAC38B,GAAM;KACX,IAAM0qB,IAAO,IAAI,KAAK,CAAC1qB,CAAgB,GAAG,EAAE,MAAM,kBAAkB,CAAC,GAC/D/N,IAAM,IAAI,gBAAgBy4B,CAAI,GAC9B7xB,IAAI,SAAS,cAAc,GAAG;KAIpC,AAHA,EAAE,OAAO5G,GACT,EAAE,WAAWykD,EAAO,QAAQ,YAAY,0BACxC79C,EAAE,MAAM,GACR,iBAAiB,IAAI,gBAAgB5G,CAAG,GAAG,GAAI;IACjD,SAAS8N,GAAK;KAEZ,AADA,QAAQ,MAAM,yCAAyCA,CAAG,GAC1D9X,EAAI,KAAK,yBAAyB,EAAE,OAAO8X,EAAI,CAAC;IAClD;GACF,CAAC;GACD9X,EAAI,GACF,oCACA,OAAO,MAAM;IACX,IAAI;KACF,IAAM,EAAE,cAAW,MAAG,MAAG,UAAO,cAAWwE,GACrCotD,IAAsB;MAC1B,IAAIxD,GAAM;MACV,MAAM;MACN;MAAW;MAAG;MAAG;MAAO;MACxB,OAAO;MAAW,aAAa;MAAG,SAAS;MAC3C,QAAQK,EAAO,QAAQ,aAAa,QAAQ;MAC5C,WAAW,KAAK,IAAI;KACtB,GACMoD,IAAsB,CAAC,GAAGnd,GAAS,eAAe,GAAGkd,CAAO;KAClE,EAAI,KAAK,8BAA8B;KACvC,IAAM75C,IAAO,MAAM28B,GAAS,YAAY,EAAE,uBAAoB,CAAC;KAE/D,IADA10C,EAAI,KAAK,4BAA4B,GACjC,CAAC+X,GAAM;KAEX,AADA,GAAe,UAAUA,GACzB/X,EAAI,KAAK,mCAAmC,EAAE,WAAQ,CAAC;IACzD,SAAS8X,GAAU;KAEjB,AADA9X,EAAI,KAAK,gCAAgC,EAAE,OAAO8X,GAAK,WAAW,OAAOA,CAAG,EAAE,CAAC,GAC/E,QAAQ,MAAM,kDAAkDA,CAAG;IACrE;GACF,CACF;GACA9X,EAAI,GAAyC,oCAAoC,MAAM;IACrF,GAAuBwE,GAAG,cAAc,CAAC,CAAC;GAC5C,CAAC;GACDxE,EAAI,GAAG,2CAA2C;IAChD,GAAuB,CAAC,CAAC;GAC3B,CAAC;GAEDA,EAAI,GAA4B,oCAAoC,MAClEA,EAAI,KAAK,yCAAyCwE,CAAC,CACrD;GACAxE,EAAI,GAAqB,yBAAyB,MAAM;IAEtD,AADAA,EAAI,KAAK,gBAAgB,EAAE,MAAMwE,EAAE,KAAK,CAAC,GACzCiqD,EAAO,QAAQ,iBAAiB,EAAE,MAAMjqD,EAAE,KAAK,CAAC;GAClD,CAAC;GACDxE,EAAI,GAAqB,uBAAuB,MAAM;IAEpD,AADAA,EAAI,KAAK,cAAc,EAAE,MAAMwE,EAAE,KAAK,CAAC,GACvCiqD,EAAO,QAAQ,eAAe,EAAE,MAAMjqD,EAAE,KAAK,CAAC;GAChD,CAAC;EACH;EACA,aAAaktD,EAAK,SAAS,MAAQxY,EAAI,CAAC;CAC1C,GAAG;EAACl5C;EAAK00C;EAAU6c;CAAsB,CAAC;CAG1C,IAAMO,KAAuB1kD,GAC1B,GAAgC,MAAgB;EAI/C,AAHA,GAAU,UAAUqkC,GACpBjG,EAAkB,YAAYiG,CAAG,GACjC,GAAQ,UAAU;GAAE,SAAS;GAAG,OAAOA,EAAI;EAAS,GACpD,GAAqB,UAAU;EAC/B,IAAMsgB,IAAcd,GAAU,WAAWjnD;EAEzC,AADAhK,EAAI,KAAK,kBAAkB;GAAE,KAAK+xD;GAAa,UAAUtgB,EAAI;EAAS,CAAC,GACvEgd,EAAO,QAAQ,mBAAmB;GAAE,KAAKsD;GAAa,UAAUtgB,EAAI;EAAS,CAAC;CAChF,GACA,CAACzxC,GAAKwrC,CAAiB,CACzB,GAEMwmB,KAAkB5kD,GACrB,GAAc,MAAgC;EAK7C,AAJA,GAAU,UAAU,MACpBo+B,EAAkB,YAAY,IAAI,GAClCxrC,EAAI,KAAK,qBAAqB;GAAE,KAAKiyD,EAAK;GAAK;GAAO,kBAAkBA,EAAK;EAAiB,CAAC,GAC3FA,EAAK,oBAAkBxD,EAAO,QAAQ,qBAAqB,EAAE,KAAKwD,EAAK,IAAI,CAAC,GAChFxD,EAAO,QAAQ,sBAAsB57C,IAAQ,MAAWy8C,GAAa4C,KAAUD,EAAK,GAAG,GAAGA,CAAI;CAChG,GACA;EAACjyD;EAAKsvD;EAAc9jB;CAAiB,CACvC,GAEM2mB,KAA0B/kD,GAC7B,MAAuB;EACtB,IAAMpD,IAAMinD,GAAU,WAAW;EACjC,IAAI,CAACE,GAAqB,SAAS;GACjC,GAAqB,UAAU;GAC/B,IAAMtL,IAAM4I,EAAO,QAAQ,gBAAgB,aACrC2D,IACJ3D,EAAO,QAAQ,qBACfA,EAAO,QAAQ,eACd,OAAO5I,KAAQ,YAAYA,KAAgBA,EAAI,SAAS,cAAcA,EAAI,QAAQ,KAAA;GACrF,AAAI,OAAOuM,KAAe,YAAY,OAAO,SAASA,CAAU,KAAKA,IAAa,IAChF,iBAAiBpyD,EAAI,KAAK,uBAAuB,EAAE,OAAOoyD,EAAW,CAAC,GAAG,CAAC,IACjEvM,MAAQ,cACjB,iBAAiB7lD,EAAI,KAAK,qBAAqB,GAAG,CAAC,IAC1C6lD,MAAQ,cACjB,iBAAiB7lD,EAAI,KAAK,oBAAoB,GAAG,CAAC;EAEtD;EAEA,AADAA,EAAI,KAAK,qBAAqB;GAAE;GAAK;EAAW,CAAC,GACjDyuD,EAAO,QAAQ,sBAAsB;GAAE;GAAK;EAAW,CAAC;CAC1D,GACA,CAACzuD,CAAG,CACN,GAEM6xC,KAAqBzkC,GACxB,MAAuB;EACtB,IAAMpD,IAAMinD,GAAU,WAAW;EAEjC,AADAjxD,EAAI,KAAK,gBAAgB;GAAE;GAAK;EAAW,CAAC,GAC5CyuD,EAAO,QAAQ,iBAAiB;GAAE;GAAK;EAAW,CAAC;CACrD,GACA,CAACzuD,CAAG,CACN,GAEMqyD,KAAmBjlD,GACtB,GAAoB,MAAqB;EAGxC,AAFA,GAAQ,UAAU;GAAE,SAAS7C;GAAY,OAAOkG;EAAS,GACzDzQ,EAAI,KAAK,eAAe;GAAE;GAAY;EAAS,CAAC,GAChDyuD,EAAO,QAAQ,eAAelkD,GAAYkG,CAAQ;CACpD,GACA,CAACzQ,CAAG,CACN,GAEMsyD,KAA0BllD,GAC7B,MAAuB;EAEtB,AADApN,EAAI,KAAK,sBAAsB,EAAE,aAAa6/C,EAAK,CAAC,GACpD4O,EAAO,QAAQ,sBAAsB5O,CAAI;CAC3C,GACA,CAAC7/C,CAAG,CACN,GAEMuyD,KAAyBnlD,GAC5B,MAAsB;EAGrB,AAFA,GAAc,UAAUolD,GACxBxyD,EAAI,KAAK,qBAAqB,EAAE,YAAYwyD,EAAK,CAAC,GAClD/D,EAAO,QAAQ,qBAAqB+D,CAAI;CAC1C,GACA,CAACxyD,CAAG,CACN,GAEMyyD,KAA0BrlD,GAC7B,MAAsB;EAErB,AADApN,EAAI,KAAK,qBAAqB,EAAE,YAAYwyD,EAAK,CAAC,GAClD/D,EAAO,QAAQ,sBAAsB+D,CAAI;CAC3C,GACA,CAACxyD,CAAG,CACN,GAEM,EAAE,mBAAegN,GAAa,GAC9By0B,KAAerhC,EAAyB,IAAI,GAE5CsyD,KAAoBtlD,QAAkB;EAC1C,AAAI+nC,MACF8a,GAAoB,EAAI,GACxB5Y,GAAc,QAAQ,GACtB,iBAAiBr3C,EAAI,KAAK,qBAAqB,GAAG,EAAE;CAExD,GAAG,CAACm1C,GAAUn1C,CAAG,CAAC,GAEZ2yD,KAAiBvlD,QAAkB;EACvC,GAAa,SAAS,MAAM;CAC9B,GAAG,CAAC,CAAC;CAwGL,OAtGA9M,QAAgB;EACd,IAAMsyD,IAAY5yD,EAAI,GAAG,sBAAsB0yD,EAAiB,GAC1DG,IAAgB7yD,EAAI,GAAG,2BAA2B2yD,EAAc;EACtE,aAAa;GAEX,AADAC,EAAU,GACVC,EAAc;EAChB;CACF,GAAG;EAAC7yD;EAAK0yD;EAAmBC;CAAc,CAAC,GAG3CryD,QAAgB;EACd,AAAIouD,GAAQ,YAAY,SAAS,kBAAkB,SAAS,QAAQ,CAAC,SAAS,kBAC5EA,GAAQ,QAAQ,MAAM,EAAE,eAAe,GAAK,CAAC;CAEjD,GAAG,CAAC,CAAC,GAGLpuD,QAAgB;EACd,IAAMwyD,KAAuB,MAAqB;GAChD,IAAMxnB,IAAS,EAAE;GACjB,IACEA,GAAQ,YAAY,WACpBA,GAAQ,YAAY,cACpBA,GAAQ,mBAER;GAGF,IAAMynB,IAAOrE,GAAQ;GACrB,IAAKqE,MAGH,SAAS,kBAAkB,SAAS,QACpC,SAAS,kBAAkB,SAAS,mBACpC,SAAS,kBAAkB,QAC3BA,EAAK,SAAS,SAAS,aAAa,MAEhC,CAACA,EAAK,SAAS,SAAS,aAAa,GAAG;IAC1C,IAAI5kD,GAAc,GAAGqiC,GAAW,QAAQ,CAAC,GAAG;KAE1C,AADA,EAAE,eAAe,GACjBkiB,GAAkB;KAClB;IACF;IACA,IAAIvkD,GAAc,GAAGqiC,GAAW,aAAa,CAAC,GAAG;KAE/C,AADA,EAAE,eAAe,GACjBmiB,GAAe;KACf;IACF;IACA,EAAI,KAAK,kBAAkB,CAAC;GAC9B;EAEJ;EAGA,OADA,OAAO,iBAAiB,WAAWG,CAAmB,SACzC;GACX,OAAO,oBAAoB,WAAWA,CAAmB;EAC3D;CACF,GAAG;EAAC9yD;EAAKwwC;EAAYkiB;EAAmBC;CAAc,CAAC,GA8CrD,kBAAC9yD,GAAiB,UAAlB;EAA2B,OAAOG;EAChC,UAAA,kBAAC,OAAD;GACE,KAAK0uD;GACL,WAAW,CAAC,cAAcsE,EAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;GACtD;GACP,UAAU;GACV,4BAAyB;GACzB,mBAlD4B,MAA2C;IAC3E,IAAI7kD,GAAc,EAAE,aAAaqiC,GAAW,QAAQ,CAAC,GAAG;KAEtD,AADA,EAAE,eAAe,GACjBkiB,GAAkB;KAClB;IACF;IACA,IAAIvkD,GAAc,EAAE,aAAaqiC,GAAW,aAAa,CAAC,GAAG;KAE3D,AADA,EAAE,eAAe,GACjBmiB,GAAe;KACf;IACF;IACA,EAAI,KAAK,kBAAkB,EAAE,WAAW;GAC1C;GAuCM,0BApCmC;IACvC,IAAMI,IAAOrE,GAAQ;IACrB,AAAIqE,KAAQ,CAACA,EAAK,SAAS,SAAS,aAAa,KAAGA,EAAK,MAAM,EAAE,eAAe,GAAK,CAAC;GACxF;GA0BI,UAAA;IASGE,MACC,kBAAC5vD,IAAD;KACa;KACX,eAAe,MAAQ;MACrB,CAAIitD,GAAqB,sBAAsB,MAAS9oD,MAAQ,eAChEG,GAAaH,CAAG;KAClB;KACiB;KACjB,qBAAqB,MAAS;MAAE,AAAI2tC,KAAUtvC,GAAmBqtD,CAAI;KAAG;KACtD;KACG;KACT;KACL;KACP,gBAAgB9kB,GAAU,MAAMptC,GAAoBsM,CAAC,CAAC;KACtD,iBAAiB8gC,GAAU,MAAMjtC,GAAqBmM,CAAC,CAAC;KACxD,YAAY,MAAM8gC,EAAS/sC,GAAWiM,CAAC,CAAC;KACxC,YAAYqlD;KACZ,kBAAkB3yD,EAAI,KAAK,iBAAiB;KAC5C,oBAnDqB;MAC7B,IAAMsrC,IAASojB,GAAQ,WAAW,SAAS;MAC3C,AAAK,SAAS,oBAGZ,SAAS,iBAAiB,CAAC,CAAC,YAAY,CAAC,CAAC,IAF1CpjB,EAAO,oBAAoB,CAAC,CAAC,YAAY,CAAC,CAAC;KAI/C;KA6CU,gBAAgBtrC,EAAI,KAAK,iBAAiB;KAC1C,eAAeA,EAAI,KAAK,cAAc;KACtC,sBAAsBmwD,GAAkB,EAAI;KAC5C,mBAAmBE,GAAoB,EAAI;KAC3C,mBA/Cc,MAA+B;MACrD,AAAKlb,MACDhtC,MAAoBC,OAAeZ,IACrCyoD,GAAoB,EAAK,KAEzBA,GAAoB,EAAI,GACxB5Y,GAAc7vC,CAAG,GACbA,MAAQ,YACV,iBAAiBxH,EAAI,KAAK,qBAAqB,GAAG,EAAE;KAG1D;KAqC0B;KACG;KACP;KACG;KACL;KACG;KACb,mBAAmB2wD;KACP;KACH;KACT,aAAaL;IACd,CAAA;IAEH,kBAAC,SAAD;KACE,KAAK7uB;KACL,MAAK;KACL,QAAO;KACP,OAAO,EAAE,SAAS,OAAO;KACzB,WAAW,MAAM;MACf,IAAMlf,IAAO,EAAE,OAAO,QAAQ;MAC9B,IAAIA,GAAM;OACR,IAAMvY,IAAM,IAAI,gBAAgBuY,CAAI;OACpC,GAAa,GAAGvY,EAAI,YAAY,mBAAmBuY,EAAK,IAAI,GAAG;MACjE;MACA,EAAE,OAAO,QAAQ;KACnB;KACA,eAAY;IACb,CAAA;IACD,kBAAC,OAAD;KAAK,OAAO;MAAE,SAAS;MAAQ,MAAM;MAAG,WAAW;MAAG,UAAU;MAAU,UAAU;KAAW;KAA/F,UAAA;MACGgtC,MAAcI,OAA0B,gBACvC,kBAAC9C,IAAD;OACE,UAAU0C,GAAW;OACrB,UAAUA,GAAW;MACtB,CAAA;MAEFA,MAAcI,OAA0B,WACvC,kBAAC9C,IAAD;OACE,UAAU0C,GAAW;OACrB,UAAUA,GAAW;OACrB,OAAOM;OACP,eAAeR,IAAc,MAAMr9C,IAAI,CAAC;MACzC,CAAA;MAEH,kBAACizB,IAAD;OACE,iBAAiBkQ,KAAYvvC;OAC7B,kBAAkBuvC,KAAYhtC;OAClB;OACG;OACL;OACC;OACQ;OACnB,YAAYunD;OACD;OACX,iBAAiBP,IAAmB,mBAAmB1nB;OACvD,aAAa0nB,IAAmB,eAAe3oB;OAC/C,eAAe2oB,IAAmB,iBAAiBzoB;OACnD,gBAAgByoB,IAAmB,kBAAkBvoB;OACrD,eAAeuoB,IAAmB,iBAAiBroB;OACnD,kBAAkBqoB,IAAmB,oBAAoBnoB;OACzD,cAAcmoB,IAAmB,gBAAgBjoB;OACjD,UAAUioB,IAAmB;OACrB;OACI;OACK;OACV;OACG;OACV,qBAAqBmD;OACrB,oBAAoBC;OACpB,qBAAqBE;OACrB,kBAAkBX;OAClB,aAAaE;OACb,qBAAqBG;OACrB,gBAAgBtgB;OAChB,cAAcwgB;OACE;OACJ;OACF;OACG;OACF;OACI;OACf,mBAAmB1B;OACN;OACP;OACe;OACrB,aAAaL;OACqB;OACb;OACR;OACS;OACR;OACd,mBAAmB3iB,KAAqBykB;OAC5B;OACF;OACI;OACE;OACH;OACA;OACC;OACd,2BAA2BpyD,EAAI,KAAK,iBAAiB;MACtD,CAAA;KACE;;IACJkwD,MACC,kBAAC3Y,IAAD;KAAe,eAAe4Y,GAAkB,EAAK;KAAkB;KAAiC;IAAmB,CAAA;IAE5HC,MAAoB,kBAAC3X,IAAD,EAAY,eAAe4X,GAAoB,EAAK,EAAI,CAAA;GAC1E;;CACoB,CAAA;AAE/B,CAAC;;;AC33BD,SAAgB8C,GAAgB,GAA2B,GAAwD;CAQjH,OAPI,OAAO,SAAW,OAAe,OAAO,WAAa,MAChD,QAAQ,OAAO,gBAAI,MAAM,yEAAyE,CAAC,IAEvGC,IAIE,IAAI,SAAS,MAAY;EAC9B,IAAML,IAAOrzD,EAAS,WAAW0zD,CAAa,GACxC,EAAE,MAAMC,GAAO,GAAG3O,MAASlpC;EACjC,EAAK,OACH,kBAAC6yC,IAAD;GACE,GAAI3J;GACJ,OAAO;IAAE,OAAO;IAAQ,QAAQ;GAAO;GACvC,UAAU,MAAa;IAErB,AADAhQ,EAAS,kBAAkBqe,EAAK,QAAQ,CAAC,GACzC1gD,EAAQqiC,CAAQ;GAClB;EACD,CAAA,CACH;CACF,CAAC,IAhBQ,QAAQ,OAAO,gBAAI,MAAM,oEAAoE,CAAC;AAiBzG;AAGA,IAAa4e,KAAYH"}